Zgodność konsumencka

Opcje i API panelu

Każda opcja pluginu z wartością domyślną i progiem ustawowym, zadania cykliczne, emitowane zdarzenie i trasy API panelu.

Opcje

medusa-config.ts
{
  resolve: "@zanreal/medusa-consumer-compliance",
  options: {
    defaultLocale: "pl",
    externalSalesChannelIds: [],
    externalOrderMetadataKeys: ["allegro_checkout_form_id"],
    omnibus: {
      windowDays: 30,
      gradualReductions: "per_change",
      reductionDetection: "sale_price_list",
      priceContexts: undefined,
      ignoredPriceListIds: [],
      retentionDays: 400,
    },
    withdrawal: {
      periodDays: 14,
      rejectOutsidePeriod: false,
      extendOverNonWorkingDays: true,
      digitalOnly: false,
      digitalConsentMetadataKey: "digital_content_consent_at",
      confirmationTtlMinutes: 60,
      notificationChannel: "email",
      notificationTemplate: "consumer-compliance-withdrawal-acknowledgement",
      merchantNotificationEmail: null,
      seller: { name: "", address: "", email: "" },
    },
  },
}
OpcjaDomyślnieUwagi
defaultLocaleplJęzyk zapasowy dla tekstów w wersjach językowych.
externalSalesChannelIds[]Kanały sprzedaży, których zamówienia należą do serwisu zewnętrznego (w naszym backendzie env CONSUMER_COMPLIANCE_EXTERNAL_SALES_CHANNELS). Takie zamówienia nie dostają zapisu zgód ani oznaczenia braku zgody, a wyszukiwanie odstąpienia odpowiada external_marketplace_order.
externalOrderMetadataKeys["allegro_checkout_form_id"]Klucze metadanych oznaczające zamówienie z serwisu zewnętrznego. Klucz Allegro jest zawsze dołączony.
omnibus.windowDays30Może być dłuższy, nigdy krótszy: wartości poniżej 30 są podnoszone do 30.
omnibus.gradualReductionsper_changePrawo polskie. keep_first tylko tam, gdzie przyjęto art. 6a ust. 5 dyrektywy 98/6/WE.
omnibus.reductionDetectionsale_price_listlower_than_original liczy też cenniki typu override poniżej ceny regularnej.
omnibus.priceContextspo jednym na region[{ currency_code: "pln", region_id?: "reg_..." }], żeby zapisywać wybrane konteksty.
omnibus.ignoredPriceListIds[]Cenniki, które nigdy nie są obniżką (na przykład B2B).
omnibus.retentionDays400Co najmniej windowDays + 1. Historia potrzebna trwającej obniżce zostaje niezależnie od tego.
withdrawal.periodDays14Może być dłuższy (hojniejsza polityka), nigdy krótszy.
withdrawal.rejectOutsidePeriodfalsetrue odrzuca spóźnione oświadczenia w API zamiast je oznaczać.
withdrawal.extendOverNonWorkingDaystrueArt. 115 Kodeksu cywilnego.
withdrawal.digitalOnlyfalseKażda pozycja to treść cyfrowa (kody ESD). Przy zapisanej zgodzie prawo odstąpienia nie przysługuje (art. 38 ust. 1 pkt 13); bez niej obowiązuje 14 dni, a rejestr to oznacza. Zob. Odstąpienie.
withdrawal.digitalConsentMetadataKeydigital_content_consent_atKlucz metadanych zamówienia z chwilą zgody (art. 38 ust. 1 pkt 13).
withdrawal.confirmationTtlMinutes60Jak długo można potwierdzić etap pierwszy.
withdrawal.notificationChannelemailKanał potwierdzenia.
withdrawal.notificationTemplatejak wyżejPrzekazywany dostawcom z własnymi szablonami; gotowe content jest dołączane zawsze.
withdrawal.merchantNotificationEmailnullDostaje kopię każdego potwierdzenia.
withdrawal.sellerpusteDrukowane w potwierdzeniu.

Zadania i zdarzenia

NazwaHarmonogramCo robi
consumer-compliance-price-sweep17 * * * *Zapisuje bieżącą cenę każdego wariantu; wyłapuje start i koniec cenników z harmonogramem.
Hook completeCartWorkflow.validateprzy finalizacji koszykaBlokuje finalizację, gdy brakuje wymaganej zgody albo jest nieaktualna. Tylko ścieżka koszyka: zamówienia tworzone przez createOrderWorkflow (import z Allegro) nie są sprawdzane.
consumer-compliance-housekeeping41 3 * * *Unieważnia niepotwierdzone żądania odstąpienia, usuwa historię po okresie przechowywania.

Subskrybenci słuchają zdarzeń produktów, wariantów, cen i cenników (historia cen) oraz product.deleted (usuwa dane zgodności produktu; historia zostaje do końca okresu przechowywania) i order.placed (zapisuje zgody z zamówienia, z pominięciem zamówień z serwisów zewnętrznych). Każdy subskrybent jest odporny na błędy: błąd jest logowany i nigdy nie trafia do emitera zdarzeń. Plugin emituje consumer_compliance.withdrawal.confirmed z { id, order_id }.

Workflowy

Eksportowane z @zanreal/medusa-consumer-compliance/workflows: recordPriceHistoryWorkflow, upsertProductComplianceWorkflow, upsertUnitPricingWorkflow, upsertEconomicOperatorWorkflow, deleteEconomicOperatorWorkflow, updateComplianceSettingsWorkflow, requestWithdrawalWorkflow, confirmWithdrawalWorkflow, resendWithdrawalAcknowledgementWorkflow, updateWithdrawalStatusWorkflow, upsertConsentDefinitionWorkflow, deleteConsentDefinitionWorkflow, recordConsentAcceptancesWorkflow, snapshotOrderConsentsWorkflow.

API panelu

Wszystko pod /admin/consumer-compliance, z uwierzytelnieniem jak każda trasa panelu.

Metoda i ścieżkaCo robi
GET /products/:idRekord zgodności, braki GPSR, podmioty, ceny jednostkowe wariantów.
POST /products/:idTworzy lub aktualizuje rekord zgodności.
POST /products/:id/unit-pricing{ variants: [{ variant_id, net_quantity, net_unit, reference_unit, drained_quantity, exempt_reason, deposit_amount }] }
GET /variants/:id/price-history?context_key=pln|reg_...Historia, ocena na teraz, dostępne konteksty.
POST /variants/:id/price-history/external{ context_key, amount, valid_from, valid_to, note }: cena zewnętrzna.
POST /price-history/backfillZapisuje wszystkie bieżące ceny w tle (202).
GET /operators, POST /operatorsLista i tworzenie podmiotów gospodarczych.
POST /operators/:id, DELETE /operators/:idZmiana; usunięcie (odmowa, gdy podmiot jest przypisany).
GET /settings, POST /settingsTeksty informacji oraz obowiązujące opcje.
GET /gpsr-report?offset=0Opublikowane produkty z brakami GPSR, po 50.
GET /withdrawals?status=&order_id=&offset=&limit=Rejestr.
GET /withdrawals/:id, POST /withdrawals/:idOdczyt; ustawienie status na processed, rejected lub z powrotem confirmed, z note.
POST /withdrawals/:id/resendPonowna wysyłka potwierdzenia.
GET /consents, POST /consentsDefinicje zgód z historią wersji; tworzenie.
POST /consents/:id, DELETE /consents/:idZmiana (zmiana treści lub odnośnika podnosi wersję); usunięcie.
GET /orders/:id/consentsZgody zapisane na zamówieniu albo external_marketplace_order dla zamówienia z serwisu.
GET /order-consents?order_id=&key=&from=&to=&format=csvEksport wszystkich zgód z zamówień, JSON lub CSV.

Spis treści