Sprawdzanie zgodności z przepisami UE
Sprawdzanie zgodności z przepisami UE
qr3.app zawiera zintegrowany walidator UE dla Digital Product Passports. Sprawdza on Twoje DPP pod kątem odpowiednich unijnych aktów prawnych (ESPR, Loi AGEC) und dostarcza ustrukturyzowane problemy (issues) wraz z poziomem ważności (severity), ścieżką pola, wskazówkami oraz opcjonalną odznaką ESPR-ready.
Istnieją trzy punkty wejścia:
- Po stronie serwera, już zapisane DPP —
GET /v1/dpp/:id/eu-compliance - Podgląd na żywo w formularzu tworzenia —
POST /v1/dpp/validate - Symulator na żywo w szczegółach —
POST /v1/dpp/:id/validate-update
Wszystkie trzy zwracają ten sam kształt (EuComplianceResult-Shape) — musisz więc zaimplementować obsługę wyniku tylko raz.
Kształt wyniku
{ "compliant": false, "espr_ready": true, "issues": [ { "code": "TEXTILE_AGEC_REQUIRED", "severity": "error", "field": "textile_data.country_weaving_knitting", "message": "AGEC chain country is required for products sold on the French market", "hints": { "market": "FR" } }, { "code": "TEXTILE_GREENWASHING", "severity": "warning", "field": "product_name", "message": "\"natural\" is a prohibited term under AGEC", "hints": { "term": "natural", "locale": "en", "category": "generic" } } ], "summary": { "errors": 1, "warnings": 1, "info": 0 }}compliant: true⇔summary.errors === 0espr_ready: true⇔ wszystkie pola ESPR-Opt-in są ustawione (patrz DPP dla tekstyliów)issues[]jest stabilnie sortowane według poziomu ważności (error→warning→info), a następnie według kodu
Poziomy ważności (Severity)
| Severity | Znaczenie | Przykład |
|---|---|---|
error | Blokuje zgodność z przepisami UE; powinien zostać naprawiony przed publikacją | TEXTILE_AGEC_REQUIRED, gdy FR jest na rynku, a łańcuch pochodzenia jest niekompletny |
warning | Rekomendacja; klient może zapisać, ale powinien podjąć działania | TEXTILE_GREENWASHING poza FR |
info | Sygnał statusu bez konieczności podejmowania działań | TEXTILE_ESPR_READY — wszystkie pola ESPR-Opt-in są kompletne |
Katalog reguł (tekstylia + baterie)
Tekstylia (Q3.3.4)
| Kod | Poziom ważności | Wyzwalacz |
|---|---|---|
TEXTILE_AGEC_REQUIRED | error (FR) · warning (w innych przypadkach) | Łańcuch AGEC (tkanie/farbowanie/konfekcjonowanie) niekompletny, FR na rynku |
TEXTILE_MICROPLASTICS_CONSISTENCY | error | Syntetyki ≥ 50%, ale contains_microplastics !== true |
TEXTILE_SVHC_THRESHOLD | warning | Wpis SVHC bez numeru CAS lub stężenia |
TEXTILE_GREENWASHING | error (FR) · warning (w innych przypadkach) | Termin z listy zakazanych w product_name/material |
TEXTILE_ESPR_READY | info | Wszystkie pola ESPR B7–B15 kompletne |
Baterie (Faza 4a)
Walidator sprawdza wartości graniczne z unijnego rozporządzenia w sprawie baterii 2023/1542 (progi zawartości materiałów z recyklingu, klasy śladu węglowego, minimalna gwarancja itp.). Szczegóły w dokumentacji DPP dla baterii.
Podgląd na żywo w formularzu tworzenia
Gdy tylko utworzysz DPP w panelu nawigacyjnym (/dashboard/dpp/new), ten sam walidator działa w sposób bezstanowy (stateless) przy każdym żądaniu walidacji — bez konieczności zapisywania paszportu. Sekcja eu_compliance pojawia się bezpośrednio pod istniejącym panelem walidacji i wyróżnia błędy oraz ostrzeżenia przed wysłaniem (submit).
Bezpośredni dostęp do API:
curl -X POST https://qr3.app/v1/dpp/validate \ -H "Authorization: Bearer $API_KEY" \ -H "X-Workspace-Id: $WS_ID" \ -H "Content-Type: application/json" \ -d '{ "category": "textile", "gtin": "04012345678901", "product_name": "Natural Cotton T-Shirt", "manufacturer": "EcoWear GmbH", "origin_country": "PT", "market_countries": ["FR"], "textile_data": { "fiber_composition": [{ "material": "cotton", "percentage": 100, "recycled_pct": 0 }] } }'Odpowiedź zawiera:
data.valid— ważność syntaktyczna (Zod)data.errors[]— klasyczne błędy Zoddata.jsonld_preview— podgląd JSON-LDdata.eu_compliance— wynik walidatora UE (null, jeśli walidacja Zod się nie powiedzie)
Jeśli eu_compliance.summary.errors > 0, panel nawigacyjny renderuje baner Save-Guard bezpośrednio nad przyciskiem wysyłania — zapis nie jest blokowany, ale widzisz konsekwencje przed kliknięciem.
Szczegółowy symulator na żywo
Na stronie /dashboard/dpp/:dppId, poniżej sekcji zgodności, znajduje się karta symulatora. Pozwala ona na zmianę dwóch najważniejszych dla zgodności pól (status i market_countries) i natychmiastowe zobaczenie efektu — bez modyfikowania istniejących danych. Typowy przepływ (flow):
- Podgląd: „Co się stanie, jeśli dodam FR do asortymentu?” → wybierz chip „FR” → „Preview EU impact” →
TEXTILE_AGEC_REQUIREDstaje się widoczne - Naprawa: Uzupełnij łańcuch pochodzenia (poza symulatorem, w przepływie tworzenia lub masowym)
- Zapis: „Save changes” zapisuje status/listę rynków bezpośrednio przez
PUT /v1/dpp/:id
Bezpośredni dostęp do API:
curl -X POST https://qr3.app/v1/dpp/$DPP_ID/validate-update \ -H "Authorization: Bearer $API_KEY" \ -H "X-Workspace-Id: $WS_ID" \ -H "Content-Type: application/json" \ -d '{ "market_countries": ["DE", "FR"], "status": "live" }'Odpowiedź rozszerza standardowy wynik o obiekt preview:
{ "data": { "compliant": false, "espr_ready": false, "issues": [/* … */], "summary": { "errors": 1, "warnings": 0, "info": 0 }, "preview": { "status": "live", "landing_locale": "de", "market_countries": ["DE", "FR"], "changed_fields": ["status", "market_countries"] } }}changed_fields[] wymienia tylko te pola, które rzeczywiście uległyby zmianie — dzięki temu możesz np. wyróżnić w interfejsie użytkownika tylko zmienione chipy.
Dozwolona jest pusta treść żądania (empty body), co zwraca aktualną ocenę zgodności (ponowne sprawdzenie stanu faktycznego).
Automatyzacja
Potok CI (CI Pipeline)
Typowy test w CI:
STATUS=$(curl -s -o /tmp/out.json -w "%{http_code}" \ https://qr3.app/v1/dpp/$DPP_ID/eu-compliance \ -H "Authorization: Bearer $API_KEY" \ -H "X-Workspace-Id: $WS_ID")
if [ "$STATUS" != "200" ]; then exit 1fi
jq -e '.data.summary.errors == 0' /tmp/out.json > /dev/nullSerwer MCP
Dostarczany w pakiecie @qr3/mcp-server oferuje między innymi narzędzie validate_dpp — agenci AI mogą go użyć przed wywołaniem tworzenia, aby sprawdzić, czy istniejące dane są zgodne z regułami AGEC.
Częste błędy
| Problem (Issue) | Przyczyna | Rozwiązanie (Fix) |
|---|---|---|
TEXTILE_MICROPLASTICS_CONSISTENCY | Udział poliestru ≥ 50%, ale flaga ustawiona na false | Ustaw contains_microplastics: true |
TEXTILE_AGEC_REQUIRED z hints.market: "FR" | FR na rynku, łańcuch niekompletny | Ustaw country_weaving_knitting, country_dyeing_printing, country_assembly |
TEXTILE_GREENWASHING jako error | Zakazany termin + FR na rynku | Usuń termin z product_name lub dostosuj rynki |
TEXTILE_SVHC_THRESHOLD | Substancja SVHC bez CAS | Wpisz numer CAS z listy REACH |
Kolejne kroki
- DPP dla tekstyliów — schemat, łańcuch pochodzenia, ostrzeżenie o mikroplastiku
- DPP dla baterii — wymagane pola paszportu baterii
- Dokumentacja API — szczegółowy opis wszystkich punktów końcowych zgodności z przepisami UE