2026-03-24

Cadena de Trazabilidad

Lote
LT-35328D54
35328d54-6ea4-4859-8b38-c7e852ce7a94
Orden Produccion
OP-7223
70283e25-27c6-419d-ac09-3c4a9a77719f
Checkpoints 9 / 9 completos

Cadena de Checkpoints

Secuencia completa CP1 → CP9 con hashes SHA-256 y linkeo secuencial

CP1
Rolloed602948
CP2
Pano9770cd96
CP3
Lavado5ea4f576
CP4
Loteecfc0e35
CP5
QA64c5becc
CP6
Costuraa2fafc56
CP7
Inspeccionf142e182
CP8
Acabado067bba18
CP9
Despachof36c40a1
CP Checkpoint ID Tipo Evento EPCIS Estado Hash (8) Timestamp UTC
CP167a07c0arolloObjectEventcompletoed6029482026-03-23 17:03
CP2889eeab4panoTransformationEventcompleto9770cd962026-03-23 21:29
CP3cb525505lavadoObjectEventcompleto5ea4f5762026-03-23 21:30
CP4e2f23e51loteTransformationEventcompletoecfc0e352026-03-23 21:31
CP5f57cd8e0cierre_qaAggregationEventcompleto64c5becc2026-03-23 21:32
CP6b421adcccosturaTransformationEventcompletoa2fafc562026-03-23 21:33
CP7f0b4e151inspeccionObjectEventcompletof142e1822026-03-23 21:54
CP89f79ed4dacabadoObjectEventcompleto067bba182026-03-23 22:30
CP968504788despachoShippingEventcompletof36c40a12026-03-23 22:31

Materia Prima

Datos del rollo de origen — CP1

Tela
Jersey Listado Full Lycra 93% Pima Cotton Organico 7% Spandex
Proveedor
Textil San Ramon S.A.
Lote Proveedor
27-06432
Peso Neto
9.05 kg
Metraje
28.65 m
GSM
162
Color
White

Observaciones Tecnicas

1 critico · 2 advertencias · 3 informativos

Critico
prev_checkpoint_id vacio en CP3 (cb525505). Confirmado en DB: CP4 (e2f23e51) apunta a CP2 (889eeab4) saltando CP3 — la cadena CP2→CP3→CP4 esta rota.
CP3 · Lavado
Advertencia
orden_pedido y cliente_destino_gln vacios en CP9 — campos criticos para la generacion del Digital Product Passport (DPP).
CP9 · Despacho
Advertencia
prendas_primera, prendas_segunda, prendas_reproceso en 0 e inspector_id vacio — datos de inspeccion AQL no registrados.
CP8 · Acabado
Informativo
link_dpp hardcodeado en ftltrace.com — confirmar dominio productivo vs dpp.fintechlab.la.
CP7 · Inspeccion
Informativo
eficiencia_corte: 0.0 y marker_id vacio — datos PEF incompletos para calculo de huella ambiental.
CP2 · Pano
Informativo
peso_salida_kg: 0.0 — perdida de masa post-lavado no registrada, afecta calculo de merma.
CP3 · Lavado
🔒
Triple Cerradura — Integridad
9/9 hashes SHA-256 presentes y distintos
Linkeo secuencial de hashes previos CP1 → CP9
!
CP3 (cb525505) sin prev_checkpoint_id — CP4 enlaza directamente a CP2, saltando CP3

Plan de Correccion

Analisis de causa raiz y cambios propuestos para los 6 hallazgos

1 Critico
2 Advertencias
3 Informativos
5 Archivos
H1
CP3 prev_event_id vacio
CP3
Causa Raiz

epcis_snapshot.py:build_epcis_payload no incluye prev_event_id en el bloque accion. El prev_checkpoint_id se almacena en CheckpointRecord pero no se propaga al payload EPCIS. Confirmado en DB: CP3 (cb525505) tiene prev_checkpoint_id = NULL, y CP4 (e2f23e51) apunta a CP2 (889eeab4) saltando CP3.

Archivos
domain/services/epcis_snapshot.py

domain/services/checkpoint_lifecycle.py

api/routers/checkpoint_records.py
Cambio
def build_epcis_payload(entity, cp_num, lote, prev_event_id=None): ... "accion": { "tipo_evento": _EVENT_TYPES.get(cp_num, "ObjectEvent"), "timestamp": datetime.now(UTC).isoformat(), "prev_event_id": prev_event_id, # <-- nuevo }

En checkpoint_lifecycle.py:113, pasar prev.checkpoint_id al builder. En _cerrar_cp1, pasar None.

H2
CP9 campos DPP vacios
CP9
Causa Raiz

_ensure_cp_entity crea Despacho con orden_pedido="" y cliente_destino_gln="". La validacion _REQUIRED["cp9"] solo exige ["lote_id"].

Archivo
api/validation.py
Cambio
"cp9": ["lote_id", "orden_pedido", "cliente_destino_gln"],
H3
CP8 inspeccion sin datos
CP8
Causa Raiz

_ensure_cp_entity crea Inspeccion con defaults prendas_primera=0, inspector_id="". Validacion _REQUIRED["cp8"] solo exige ["lote_id"].

Archivo
api/validation.py
Cambio
"cp8": ["lote_id", "inspector_id", "prendas_primera"],
H4
link_dpp hardcodeado
CP7
Causa Raiz

Dominio ftltrace.com hardcodeado en cp7_acabado.py:67 y checkpoint_records.py:334.

Archivos
api/routers/checkpoints/cp7_acabado.py

api/routers/checkpoint_records.py
Cambio
DPP_BASE_URL = os.environ.get("DPP_BASE_URL", "https://dpp.fintechlab.la") # Uso: link_dpp = f"{DPP_BASE_URL}/dpp/{data.lote_id}"
H5
CP2 datos PEF incompletos
CP2
Causa Raiz

_crear_pano_cp2 usa defaults marker_id="" y eficiencia_corte=0. El flujo mobile omite estos campos que son required en el dashboard.

Archivo
api/validation.py
Cambio
"cp2": ["rollo_id", "hoja_corte_id", "marker_id", "eficiencia_corte"],
H6
CP3 peso salida en cero
CP3
Causa Raiz

_ensure_cp_entity usa peso_salida_kg=datos.get("peso_salida_kg", 0) como default.

Archivo
api/validation.py
Cambio
"cp3": ["pano_id", "peso_salida_kg"],

Archivos a Modificar

1 domain/services/epcis_snapshot.py Agregar prev_event_id al bloque accion
2 domain/services/checkpoint_lifecycle.py Pasar prev_event_id al builder
3 api/routers/checkpoint_records.py prev_event_id en _cerrar_cp1 + DPP_BASE_URL
4 api/validation.py Fortalecer _REQUIRED para CP2, CP3, CP8, CP9
5 api/routers/checkpoints/cp7_acabado.py Usar DPP_BASE_URL en vez de hardcode