Ga naar inhoud

EU-compliance controleren

EU-compliance controleren

qr3.app bevat een geïntegreerde EU-validator voor Digital Product Passports. Deze controleert je DPP’s tegen de relevante EU-regelgeving (ESPR, Loi AGEC) und levert gestructureerde issues met severity, veldpad, aanwijzingen en een optionele ESPR-ready-badge.

Er zijn drie toegangspunten:

  1. Server-side, al opgeslagen DPP’sGET /v1/dpp/:id/eu-compliance
  2. Live preview in het aanmaakformulierPOST /v1/dpp/validate
  3. Live simulator in detailPOST /v1/dpp/:id/validate-update

Alle drie leveren dezelfde EuComplianceResult-shape — je hoeft de verwerking dus maar één keer te implementeren.

Vorm van het resultaat

{
"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-velden ingesteld (zie Textiel-DPP)
  • issues[] is stabiel gesorteerd op severity (errorwarninginfo) en vervolgens op code

Severity-niveaus

SeverityBetekenisVoorbeeld
errorBlokkeert de EU-conformiteit; moet voor de release worden opgelostTEXTILE_AGEC_REQUIRED als FR in de markt is en de herkomstketen onvolledig is
warningAanbeveling; klant kan opslaan, maar moet actie ondernemenTEXTILE_GREENWASHING buiten FR
infoStatussignaal zonder actievereisteTEXTILE_ESPR_READY — alle ESPR-opt-in-velden volledig

Regelcatalogus (textiel + batterij)

Textiel (Q3.3.4)

CodeErnstgraadTrigger
TEXTILE_AGEC_REQUIREDerror (FR) · warning (anders)AGEC-chain (weven/verven/confectie) onvolledig, FR in de markt
TEXTILE_MICROPLASTICS_CONSISTENCYerrorSynthetisch ≥ 50% maar contains_microplastics !== true
TEXTILE_SVHC_THRESHOLDwarningSVHC-vermelding zonder CAS-nummer of concentratie
TEXTILE_GREENWASHINGerror (FR) · warning (anders)Term uit de verbodslijst in product_name/material
TEXTILE_ESPR_READYinfoAlle ESPR-velden B7–B15 volledig

Batterij (Fase 4a)

De validator controleert grenswaarden uit de EU-batterijverordening 2023/1542 (drempels voor gerecyclede inhoud, carbon footprint-klassen, minimale garantie, enz.). Details in de Batterij-DPP-documentatie.

Live preview in het aanmaakformulier

Zodra je een DPP aanmaakt in het dashboard (/dashboard/dpp/new), draait dezelfde validator stateless mee bij elke validate-roundtrip — zonder dat de pas hoeft te worden opgeslagen. De eu_compliance-sectie verschijnt direct onder het bestaande validation-paneel en markeert fouten en waarschuwingen vóór de submit.

Directe API-toegang:

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

Het antwoord bevat:

  • data.valid — syntactische geldigheid (Zod)
  • data.errors[] — klassieke Zod-fouten
  • data.jsonld_preview — JSON-LD-preview
  • data.eu_compliance — EU-validatorresultaat (null als de Zod-validatie mislukt)

Als eu_compliance.summary.errors > 0 is, rendert het dashboard een Save-Guard-banner direct boven de submit-knop — het opslaan wordt niet geblokkeerd, maar je ziet de gevolgen vóór de klik.

Live simulator in detail

Op /dashboard/dpp/:dppId bevindt zich onder de compliance-sectie een simulatorkaart. Hiermee kun je de twee meest compliance-relevante velden (status en market_countries) wijzigen en het effect direct zien — zonder de bestaande gegevens aan te raken. Typische flow:

  1. Preview: “Wat gebeurt er als ik FR in het assortiment opneem?” → Chip “FR” selecteren → “Preview EU impact” → TEXTILE_AGEC_REQUIRED wordt zichtbaar
  2. Fix: Herkomstketen voltooien (buiten de simulator in de create- of bulk-flow)
  3. Save: “Save changes” slaat de status/markt-lijst direct op via PUT /v1/dpp/:id

Directe API-toegang:

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

De response breidt het standaardresultaat uit met een preview-object:

{
"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[] toont alleen velden die daadwerkelijk zouden veranderen — zo kun je bijvoorbeeld in een UI alleen de gewijzigde chips markeren.

Een lege body is toegestaan en levert de huidige compliance-beoordeling (actuele status opnieuw controleren).

Automatisering

CI-pipeline

Een typische CI-check:

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

De meegeleverde @qr3/mcp-server biedt onder andere een validate_dpp-tool — AI-agents kunnen hiermee vóór de create-call controleren of de aanwezige gegevens voldoen aan de AGEC-regels.

Veelvoorkomende fouten

IssueOorzaakOplossing
TEXTILE_MICROPLASTICS_CONSISTENCYPolyesteraandeel ≥ 50%, vlag echter falsecontains_microplastics: true instellen
TEXTILE_AGEC_REQUIRED met hints.market: "FR"FR in de markt, chain onvolledigcountry_weaving_knitting, country_dyeing_printing, country_assembly instellen
TEXTILE_GREENWASHING als errorVerboden term + FR in de marktTerm uit product_name verwijderen of markt aanpassen
TEXTILE_SVHC_THRESHOLDSVHC-stof zonder CASCAS-nummer uit de REACH-lijst invoeren

Volgende stappen