Verificar la conformidad con la UE
Verificar la conformidad con la UE
qr3.app incluye un validador de la UE integrado para Digital Product Passports. Evalúa tus DPP frente a las normativas pertinentes de la UE (ESPR, Loi AGEC) y devuelve problemas estructurados con gravedad, ruta del campo, sugerencias y una insignia opcional ESPR-ready.
Existen tres puntos de entrada:
- Del lado del servidor, DPP ya guardados —
GET /v1/dpp/:id/eu-compliance - Vista previa en vivo en el formulario de creación —
POST /v1/dpp/validate - Simulador en vivo en el detalle —
POST /v1/dpp/:id/validate-update
Los tres devuelven la misma estructura (EuComplianceResult), por lo que solo necesitas implementar la evaluación una vez.
Estructura del resultado
{ "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⇔ todos los campos de exclusión voluntaria (opt-in) de ESPR están definidos (ver DPP de textiles)issues[]está ordenado de forma estable por gravedad (error→warning→info) y luego por código
Niveles de gravedad
| Severity | Significado | Ejemplo |
|---|---|---|
error | Bloquea la conformidad con la UE; debería corregirse antes del lanzamiento | TEXTILE_AGEC_REQUIRED si FR está en el mercado y la cadena de origen está incompleta |
warning | Recomendación; el cliente puede guardar, pero debería tomar medidas | TEXTILE_GREENWASHING fuera de FR |
info | Señal de estado sin necesidad de acción | TEXTILE_ESPR_READY — todos los campos de exclusión voluntaria (opt-in) de ESPR están completos |
Catálogo de reglas (Textiles + Baterías)
Textiles (Q3.3.4)
| Code | Gravedad | Desencadenante |
|---|---|---|
TEXTILE_AGEC_REQUIRED | error (FR) · warning (de lo contrario) | Cadena AGEC (tejido/teñido/confección) incompleta, FR en el mercado |
TEXTILE_MICROPLASTICS_CONSISTENCY | error | Sintético ≥ 50 % pero contains_microplastics !== true |
TEXTILE_SVHC_THRESHOLD | warning | Entrada de SVHC sin número CAS o concentración |
TEXTILE_GREENWASHING | error (FR) · warning (de lo contrario) | Término de la lista de prohibiciones en product_name/material |
TEXTILE_ESPR_READY | info | Todos los campos ESPR B7–B15 completos |
Baterías (Fase 4a)
El validador comprueba los valores límite del Reglamento de Baterías de la UE 2023/1542 (umbrales de contenido reciclado, clases de huella de carbono, garantía mínima, etc.). Detalles en la documentación del DPP de baterías.
Vista previa en vivo en el formulario de creación
Tan pronto como creas un DPP en el panel de control (/dashboard/dpp/new), el mismo validador se ejecuta de forma sin estado (stateless) en cada ciclo de validación, sin necesidad de guardar el pasaporte. La sección eu_compliance aparece directamente debajo del panel de validación existente y resalta los errores y advertencias antes del envío (submit).
Acceso directo a la 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 }] } }'La respuesta contiene:
data.valid— validez sintáctica (Zod)data.errors[]— errores clásicos de Zoddata.jsonld_preview— vista previa de JSON-LDdata.eu_compliance— resultado del validador de la UE (nullsi falla la validación de Zod)
Si eu_compliance.summary.errors > 0, el panel de control muestra un banner de Save-Guard justo encima del botón de envío; el guardado no se bloquea, pero verás las consecuencias antes de hacer clic.
Simulador en vivo en el detalle
En /dashboard/dpp/:dppId, debajo de la sección de conformidad, hay una tarjeta de simulador. Permite modificar los dos campos más relevantes para la conformidad (status y market_countries) y ver el impacto de inmediato, sin alterar los datos existentes. Flujo típico:
- Vista previa: “¿Qué pasa si incluyo FR en el catálogo?” → seleccionar el chip “FR” → “Preview EU impact” →
TEXTILE_AGEC_REQUIREDse vuelve visible - Corrección: Completar la cadena de origen (fuera del simulador, en el flujo de creación o de carga masiva)
- Guardar: “Save changes” guarda el estado/lista de mercados directamente a través de
PUT /v1/dpp/:id
Acceso directo a la 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" }'La respuesta amplía el resultado estándar con un objeto 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[] enumera solo los campos que realmente cambiarían; de este modo, por ejemplo, puedes resaltar únicamente los chips modificados en una interfaz de usuario.
Se permite un cuerpo vacío y devuelve la evaluación de conformidad actual (volver a comprobar el estado real).
Automatización
Pipeline de CI
Un chequeo típico de 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/nullServidor MCP
El @qr3/mcp-server incluido ofrece, entre otras cosas, una herramienta validate_dpp; los agentes de IA pueden usarla antes de la llamada de creación para verificar si los datos disponibles cumplen con las reglas de AGEC.
Errores comunes
| Issue | Causa | Solución |
|---|---|---|
TEXTILE_MICROPLASTICS_CONSISTENCY | Proporción de poliéster ≥ 50 %, pero la bandera es false | Establecer contains_microplastics: true |
TEXTILE_AGEC_REQUIRED con hints.market: "FR" | FR en el mercado, cadena incomple | Establecer country_weaving_knitting, country_dyeing_printing, country_assembly |
TEXTILE_GREENWASHING als error | Término prohibido + FR en el mercado | Eliminar el término de product_name o ajustar el mercado |
TEXTILE_SVHC_THRESHOLD | Sustancia SVHC sin CAS | Introducir el número CAS de la lista REACH |
Siguientes pasos
- DPP de textiles — esquema, cadena de origen, cuadro de advertencia de microplásticos
- DPP de baterías — campos obligatorios del pasaporte de batería
- Referencia de la API — todos los endpoints de conformidad con la UE en detalle