Zgodność konsumencka

Przegląd

Obowiązki sklepu internetowego wynikające z prawa konsumenckiego UE i Polski, obsłużone w Medusie v2 - historia cen Omnibus, ceny jednostkowe, dane bezpieczeństwa GPSR, funkcja odstąpienia od umowy oraz informacje o opiniach i personalizacji cen.

@zanreal/medusa-consumer-compliance to plugin do Medusy v2 dla sklepu, który sprzedaje konsumentom w Polsce (a na tych samych zasadach także w innych krajach UE). Przechowuje dane i prowadzi procesy, których prawo konsumenckie oczekuje od zaplecza sklepu, a frontowi sklepu oddaje wszystko, co trzeba pokazać klientowi.

Plugin jest headless: nie zawiera kodu frontu, a wszystko, czego front potrzebuje, jest w Store API opisanym w Kontrakcie API dla frontu.

To nie jest porada prawna. Plugin wspiera zgodność z przepisami, ale jej nie gwarantuje. Etykiety, regulamin, pouczenie o odstąpieniu i każda decyzja z listy otwartych pytań prawnych wymagają sprawdzenia przez prawnika. Podstawę prawną każdej reguły podaje strona Podstawa prawna i macierz zgodności.

Co obejmuje

ObowiązekCo robi plugin
Omnibus: najniższa cena z 30 dni przed obniżkąZapisuje każdą zmianę ceny wariantu w każdym kontekście cenowym, liczy cenę odniesienia według polskich zasad i zwraca ją z etykietą, którą sklep musi wyświetlić. Zob. Omnibus.
Cena jednostkowaPrzechowuje ilość netto, jednostkę i wyłączenia dla wariantu, liczy cenę jednostkową z bieżącej ceny. Zob. Ceny jednostkowe.
Informacje GPSRProducenci i osoby odpowiedzialne w UE jako wspólne rekordy, ostrzeżenia po polsku, lista braków. Zob. Bezpieczeństwo produktu.
Funkcja odstąpienia od umowy (dyrektywa 2023/2673)Dwuetapowy proces w Store API, uprawnienie i termin dla każdej pozycji, potwierdzenie na trwałym nośniku, rejestr w panelu. Zob. Odstąpienie.
Zgody przy zamówieniuZgody dobierane według koszyka, egzekwowane przy finalizacji, zamrażane dosłownie na zamówieniu. Zob. Zgody przy zamówieniu.
Opinie i personalizacja cenEdytowalne teksty udostępniane przez Store API. Zob. Informacje dla konsumenta.

Czego plugin nie robi: nie renderuje niczego w sklepie, nie rozstrzyga, czy produkt szybko się psuje albo czy podlega GPSR, i nie klasyfikuje kodów rabatowych. To decyzje sklepu, a plugin zamienia każdą z nich w jawne pole zamiast zgadywać.

Jak to działa

 moduł cen ──zdarzenia──> subskrybent historii cen ──┐
 cenniki (z harmonogramem) ──co godzinę──────────────┤
                                                      v
                                  consumer_compliance_price_history
                                                      │
 sklep ── GET /store/products/:id/compliance ─────────┤──> cena odniesienia Omnibus + cena jednostkowa + blok GPSR
 sklep ── POST /store/consumer-compliance/withdrawals (+ /confirm) ──> rekord odstąpienia ──> e-mail z potwierdzeniem
 panel ── widżety produktu, Ustawienia > Zgodność konsumencka, rejestr odstąpień

Całość to moduł Medusy z własnymi tabelami i migracjami, a zapisy przechodzą przez workflowy. Plugin nie dodaje linków między modułami, więc instalacja nie dotyka żadnej tabeli rdzenia.

Instalacja

Tego pakietu nie ma jeszcze na npmie. Instaluje się go jako zależność gitową, przypiętą do konkretnego commitu:

package.json
{
  "dependencies": {
    "@zanreal/medusa-consumer-compliance": "github:zanreal-labs/medusa-consumer-compliance#ee3a8f2db91d3845a61d3c4e57d59f47ad7a318a"
  }
}

Przypnij commit, na którym testowałeś. Opublikowanego tagu jeszcze nie ma, więc #main przesunąłby Ci się pod ręką przy najbliższym pushu; przypięty commit jutro znaczy to samo co dziś.

Pakiet buduje się sam przy instalacji: prepare uruchamia medusa plugin:build, co zamienia pobrane źródła w katalog .medusa/server, na który wskazuje pole exports. pnpm w wersji 10 i nowszej domyślnie nie uruchamia takiego skryptu dla zależności, której jeszcze nie ufa, więc świeża instalacja wymaga jednorazowej zgody:

pnpm-workspace.yaml
allowBuilds:
  "@zanreal/medusa-consumer-compliance@https://codeload.github.com/zanreal-labs/medusa-consumer-compliance/tar.gz/ee3a8f2db91d3845a61d3c4e57d59f47ad7a318a": true

Kluczem jest dokładny adres archiwum, na który pnpm rozwiązuje przypięty commit, dlatego niesie ten sam SHA co linia zależności. Przesuwając pin, zmień oba miejsca naraz. Następnie zarejestruj wtyczkę:

medusa-config.ts
module.exports = defineConfig({
  plugins: [
    {
      resolve: "@zanreal/medusa-consumer-compliance",
      options: {
        withdrawal: {
          seller: { name: "Sklep sp. z o.o.", address: "ul. Prosta 1, 00-001 Warszawa", email: "sklep@example.com" },
        },
      },
    },
  ],
});

Następnie uruchom migracje i raz zapisz bieżące ceny:

npx medusa db:migrate
# potem w panelu: Ustawienia > Zgodność konsumencka > Historia cen > Zapisz aktualne ceny teraz

To samo w ciągu godziny zrobi cogodzinny przegląd. Wszystkie opcje opisuje strona Opcje i API panelu.

Panel administracyjny

  • Strona produktu: karta zgodności (GPSR, traktowanie obniżek, wyjątek od prawa odstąpienia, ceny jednostkowe wariantów) i karta historii cen (wykres, tabela, cena odniesienia, ceny zewnętrzne).
  • Strona zamówienia: zgody klienta i odstąpienia złożone dla zamówienia.
  • Odstąpienia (menu boczne): rejestr wszystkich oświadczeń.
  • Ustawienia > Zgodność konsumencka: teksty informacji, producenci i osoby odpowiedzialne, produkty z brakami GPSR, stan historii cen.

Panel jest przetłumaczony na polski i angielski.

Spis treści