Przejdź do głównej zawartości

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:

  1. Po stronie serwera, już zapisane DPPGET /v1/dpp/:id/eu-compliance
  2. Podgląd na żywo w formularzu tworzeniaPOST /v1/dpp/validate
  3. Symulator na żywo w szczegółachPOST /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: truesummary.errors === 0
  • espr_ready: true ⇔ wszystkie pola ESPR-Opt-in są ustawione (patrz DPP dla tekstyliów)
  • issues[] jest stabilnie sortowane według poziomu ważności (errorwarninginfo), a następnie według kodu

Poziomy ważności (Severity)

SeverityZnaczeniePrzykład
errorBlokuje zgodność z przepisami UE; powinien zostać naprawiony przed publikacjąTEXTILE_AGEC_REQUIRED, gdy FR jest na rynku, a łańcuch pochodzenia jest niekompletny
warningRekomendacja; klient może zapisać, ale powinien podjąć działaniaTEXTILE_GREENWASHING poza FR
infoSygnał 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)

KodPoziom ważnościWyzwalacz
TEXTILE_AGEC_REQUIREDerror (FR) · warning (w innych przypadkach)Łańcuch AGEC (tkanie/farbowanie/konfekcjonowanie) niekompletny, FR na rynku
TEXTILE_MICROPLASTICS_CONSISTENCYerrorSyntetyki ≥ 50%, ale contains_microplastics !== true
TEXTILE_SVHC_THRESHOLDwarningWpis SVHC bez numeru CAS lub stężenia
TEXTILE_GREENWASHINGerror (FR) · warning (w innych przypadkach)Termin z listy zakazanych w product_name/material
TEXTILE_ESPR_READYinfoWszystkie 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:

Okno terminala
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 Zod
  • data.jsonld_preview — podgląd JSON-LD
  • data.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):

  1. Podgląd: „Co się stanie, jeśli dodam FR do asortymentu?” → wybierz chip „FR” → „Preview EU impact” → TEXTILE_AGEC_REQUIRED staje się widoczne
  2. Naprawa: Uzupełnij łańcuch pochodzenia (poza symulatorem, w przepływie tworzenia lub masowym)
  3. Zapis: „Save changes” zapisuje status/listę rynków bezpośrednio przez PUT /v1/dpp/:id

Bezpośredni dostęp do API:

Okno terminala
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:

Okno terminala
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 1
fi
jq -e '.data.summary.errors == 0' /tmp/out.json > /dev/null

Serwer 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)PrzyczynaRozwiązanie (Fix)
TEXTILE_MICROPLASTICS_CONSISTENCYUdział poliestru ≥ 50%, ale flaga ustawiona na falseUstaw contains_microplastics: true
TEXTILE_AGEC_REQUIRED z hints.market: "FR"FR na rynku, łańcuch niekompletnyUstaw country_weaving_knitting, country_dyeing_printing, country_assembly
TEXTILE_GREENWASHING jako errorZakazany termin + FR na rynkuUsuń termin z product_name lub dostosuj rynki
TEXTILE_SVHC_THRESHOLDSubstancja SVHC bez CASWpisz numer CAS z listy REACH

Kolejne kroki