Zum Inhalt springen

EU-Compliance prüfen

EU-Compliance prüfen

qr3.app enthält einen integrierten EU-Validator für Digital Product Passports. Er prüft deine DPPs gegen die relevanten EU-Regelwerke (ESPR, Loi AGEC) und liefert strukturierte Issues mit Severity, Feldpfad, Hinweisen und einem optionalen ESPR-ready-Badge.

Es gibt drei Einstiegspunkte:

  1. Server-seitig, bereits gespeicherte DPPsGET /v1/dpp/:id/eu-compliance
  2. Live-Vorschau im Create-FormularPOST /v1/dpp/validate
  3. Live-Simulator im DetailPOST /v1/dpp/:id/validate-update

Alle drei liefern dieselbe EuComplianceResult-Shape — du musst die Auswertung also nur einmal implementieren.

Shape des Ergebnisses

{
"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 ⇔ alle ESPR-Opt-in-Felder gesetzt (siehe Textil-DPP)
  • issues[] ist nach Severity (errorwarninginfo) und dann nach Code stabil sortiert

Severity-Stufen

SeverityBedeutungBeispiel
errorBlockiert die EU-Konformität; sollte vor Release gefixt werdenTEXTILE_AGEC_REQUIRED wenn FR im Markt ist und die Herkunftskette unvollständig ist
warningEmpfehlung; Kunde kann speichern, sollte aber handelnTEXTILE_GREENWASHING außerhalb FR
infoStatus-Signal ohne HandlungsbedarfTEXTILE_ESPR_READY — alle ESPR-Opt-in-Felder vollständig

Regel-Katalog (Textil + Batterie)

Textil (Q3.3.4)

CodeSchweregradAuslöser
TEXTILE_AGEC_REQUIREDerror (FR) · warning (sonst)AGEC-Chain (Weben/Färben/Konfektion) unvollständig, FR im Markt
TEXTILE_MICROPLASTICS_CONSISTENCYerrorSynthetik ≥ 50 % aber contains_microplastics !== true
TEXTILE_SVHC_THRESHOLDwarningSVHC-Eintrag ohne CAS-Nummer oder Konzentration
TEXTILE_GREENWASHINGerror (FR) · warning (sonst)Begriff aus der Verbotsliste in product_name/material
TEXTILE_ESPR_READYinfoAlle ESPR-Felder B7–B15 vollständig

Batterie (Phase 4a)

Der Validator prüft Grenzwerte aus der EU-Batterieverordnung 2023/1542 (Recycled Content Schwellen, Carbon-Footprint-Klassen, Mindestgarantie etc.). Details in der Batterie-DPP-Doku.

Live-Preview im Create-Formular

Sobald du einen DPP im Dashboard anlegst (/dashboard/dpp/new), läuft derselbe Validator stateless bei jedem Validate-Roundtrip mit — ohne dass der Pass gespeichert werden muss. Die eu_compliance-Sektion erscheint direkt unter dem bestehenden Validation-Panel und hebt Fehler und Warnungen vor dem Submit hervor.

Direkter API-Zugriff:

Terminal-Fenster
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 }] }
}'

Die Antwort enthält:

  • data.valid — syntaktische Gültigkeit (Zod)
  • data.errors[] — klassische Zod-Fehler
  • data.jsonld_preview — JSON-LD-Vorschau
  • data.eu_compliance — EU-Validator-Ergebnis (null, wenn die Zod-Validierung fehlschlägt)

Ist eu_compliance.summary.errors > 0, rendert das Dashboard einen Save-Guard-Banner unmittelbar über dem Submit-Button — der Save wird nicht blockiert, aber du siehst die Konsequenzen vor dem Klick.

Live-Simulator im Detail

Auf /dashboard/dpp/:dppId gibt es unterhalb der Compliance-Section eine Simulator-Karte. Sie erlaubt es, die beiden compliance-relevantesten Felder (status und market_countries) zu verändern und die Auswirkung sofort zu sehen — ohne die bestehenden Daten anzufassen. Typischer Flow:

  1. Preview: “Was passiert, wenn ich FR ins Sortiment aufnehme?” → Chip “FR” wählen → “Preview EU impact” → TEXTILE_AGEC_REQUIRED wird sichtbar
  2. Fix: Herkunftskette vervollständigen (außerhalb des Simulators im Create- oder Bulk-Flow)
  3. Save: “Save changes” speichert Status/Markt-Liste direkt via PUT /v1/dpp/:id

Direkter API-Zugriff:

Terminal-Fenster
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" }'

Die Response erweitert das Standard-Ergebnis um ein preview-Objekt:

{
"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[] listet nur Felder, die sich tatsächlich ändern würden — so kannst du z. B. in einer UI nur die geänderten Chips hervorheben.

Ein leerer Body ist erlaubt und liefert die aktuelle Compliance-Bewertung (Ist-Zustand neu prüfen).

Automatisierung

CI-Pipeline

Ein typischer CI-Check:

Terminal-Fenster
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

MCP-Server

Der mitgelieferte @qr3/mcp-server bietet unter anderem ein validate_dpp-Tool — KI-Agenten können damit vor dem Create-Call prüfen, ob die vorliegenden Daten den AGEC-Regeln genügen.

Häufige Fehler

IssueUrsacheFix
TEXTILE_MICROPLASTICS_CONSISTENCYPolyesteranteil ≥ 50 %, Flag aber falsecontains_microplastics: true setzen
TEXTILE_AGEC_REQUIRED mit hints.market: "FR"FR im Markt, Chain unvollständigcountry_weaving_knitting, country_dyeing_printing, country_assembly setzen
TEXTILE_GREENWASHING als errorVerbotsbegriff + FR im MarktBegriff aus product_name entfernen oder Markt anpassen
TEXTILE_SVHC_THRESHOLDSVHC-Stoff ohne CASCAS-Nummer aus der REACH-Liste eintragen

Nächste Schritte