FintechLab × Trento — FTL Trace TX

Reporte: Proceso Productivo y Trazabilidad EPCIS 2.0

Datos maestros · Proceso producto · Trazabilidad GS1 por checkpoint · 01 junio 2026

✓ Backend fixes aplicados ✓ Workstations FTL Trace ✓ Workstations FTL Core GTIN ref: 62076b7f3c4701 OP-6989 · Hábitat
4
Bugs EPCIS 2.0 críticos corregidos
9
Workstations por CP en FTL Trace
9
Workstations registrados en Dolibarr
10
Archivos MD de especificación por CP
Cómo leer este reporte
1. Estaciones de Trabajo en Dolibarr (FTL Core) pruebas2.dpp.fintechlab.la
Estaciones de trabajo FTL-CP1 a FTL-CP9 en Dolibarr MRP
Dolibarr MRP · Módulo "Estaciones de trabajo" · 9 checkpoints FTL registrados · 01-jun-2026
🔗 Ver en Dolibarr →
📋 9 workstations · tabla llx_workstation_workstation
Ref. Dolibarr Etiqueta GLN-13 SGLN URN (EPCIS 2.0) Estado
FTL-CP1 CP1 · Recepción de Tela 7600001000011 urn:epc:id:sgln:7600001.00001.0 Activo
FTL-CP2 CP2 · Corte de Paños 7600001000028 urn:epc:id:sgln:7600001.00002.0 Activo
FTL-CP3 CP3 · Lavado Externo (QLever) 7600001000035 urn:epc:id:sgln:7600001.00003.0 Activo
FTL-CP4 CP4 · Corte de Piezas 7600001000042 urn:epc:id:sgln:7600001.00004.0 Activo
FTL-CP5 CP5 · Habilitado / Cierre QA 7600001000059 urn:epc:id:sgln:7600001.00005.0 Activo
FTL-CP6 CP6 · Costura 7600001000066 urn:epc:id:sgln:7600001.00006.0 Activo
FTL-CP7 CP7 · Inspección QC 7600001000073 urn:epc:id:sgln:7600001.00007.0 Activo
FTL-CP8 CP8 · Acabados / Encajado (DPP) 7600001000080 urn:epc:id:sgln:7600001.00008.0 Activo
FTL-CP9 CP9 · Despacho 7600001000097 urn:epc:id:sgln:7600001.00009.0 Activo
GCP de ubicación: 7600001 (derivado de TRENTO_PLANT_GLN = 7600001000000). Planta completa = urn:epc:id:sgln:7600001.00000.0. Cada checkpoint tiene LocationRef único (0000100009) con check digit GS1 válido.
2. Recepción de Tela en FTL Core (Dolibarr) OC 3-2026-39 · Textil San Ramón · 18 marzo 2026

Luego de la carga de recepción de tela desde el archivo RECEPCIÓN TELA - OC 3-2026-39.xlsx, la OC quedó registrada en FTL Core con sus 10 líneas — una por partida/color de la misma orden de compra a Textil San Ramón.

📦 OC-TELA-1779763856 · ref. proveedor: OC 3-2026-39 · estado: Recibida
# Partida Color Producto Kg Fecha ingreso
126-01874WINTER WHITEJERSEY FLAME 20/1 PEINADO 100% COTTON140.618/03/2026
226-01875WINTER WHITEJERSEY FLAME 20/1 PEINADO 100% COTTON561.318/03/2026
326-01876HONEYJERSEY FLAME 20/1 PEINADO 100% COTTON422.518/03/2026
426-01877SIENNAJERSEY FLAME 20/1 PEINADO 100% COTTON606.418/03/2026
526-01878FUCHSIAJERSEY FLAME 20/1 PEINADO 100% COTTON204.818/03/2026
626-01879TEALJERSEY FLAME 20/1 PEINADO 100% COTTON474.018/03/2026
726-01880HARBORJERSEY FLAME 20/1 PEINADO 100% COTTON133.018/03/2026
826-01881HARBORJERSEY FLAME 20/1 PEINADO 100% COTTON563.618/03/2026
926-01882LENTILJERSEY FLAME 20/1 PEINADO 100% COTTON259.318/03/2026
1026-01883BLACKJERSEY FLAME 20/1 PEINADO 100% COTTON601.718/03/2026
Total 3 407.2 Kg
Las partidas resaltadas (26-01875 y 26-01877) son las de referencia para OP-6989 Hábitat.
Ficha OC-TELA-1779763856 en Dolibarr FTL Core
FTL Core · OC-TELA-1779763856 · 10 líneas recibidas · 01-jun-2026
🔗 Ver en FTL Core →
3. Correcciones EPCIS 2.0 aplicadas al backend
# Problema Antes Después Severidad Archivo
1 SGLN sin notación de puntos …sgln:7600001000000 …sgln:7600001.00000.0 Crítico ✓ gs1.py · epcis_helpers.py
2 CP1 epcList usaba SSCC
SSCC corresponde a CP8, no CP1
urn:epc:id:sscc:… urn:epc:id:sgtin:…{partida} Crítico ✓ epcis_helpers.py · epcis_events.py
3 quantityList.epcClass sin URN
Requiere LGTIN válido
"62076b7f3c4701" urn:epc:class:lgtin:… Crítico ✓ epcis_helpers.py:_cp1_extras()
4 CP1 bizTransactionList incorrecta
OP/OC del cliente no aplican en CP1
prodorder + po (de cliente) desadv (guía de remisión San Ramón) Conceptual ✓ epcis_builder.py
4. Cambios en el Dashboard
  • Dimensión WHAT — CP1: etiqueta cambiada a "SGTIN del Lote de Tela (proveedor)" y valor usa epc_list[0] (el SGTIN URI generado).
    epcis-dimensions.ts
  • CP2 vista verificar: eliminada visualización de "Hoja de Corte". El campo no existe hasta CP4 — mostrarlo vacío generaba confusión.
    cp2/verificar.astro
5. Mapa GLN — Confecciones Trento
Entidad GLN-13 SGLN URN Rol EPCIS
Planta Trento (general) 7600001000000 urn:epc:id:sgln:7600001.00000.0 bizLocation (todos los CPs)
CP1 · Recepción tela 7600001000011 urn:epc:id:sgln:7600001.00001.0 readPoint CP1
CP2 · Corte paños 7600001000028 urn:epc:id:sgln:7600001.00002.0 readPoint CP2
CP3 · Lavado (QLever) 7600001000035 urn:epc:id:sgln:7600001.00003.0 readPoint CP3
CP4 · Corte piezas 7600001000042 urn:epc:id:sgln:7600001.00004.0 readPoint CP4
CP5 · Habilitado 7600001000059 urn:epc:id:sgln:7600001.00005.0 readPoint CP5
CP6 · Costura 7600001000066 urn:epc:id:sgln:7600001.00006.0 readPoint CP6
CP7 · Inspección QC 7600001000073 urn:epc:id:sgln:7600001.00007.0 readPoint CP7
CP8 · Acabados 7600001000080 urn:epc:id:sgln:7600001.00008.0 readPoint CP8
CP9 · Despacho 7600001000097 urn:epc:id:sgln:7600001.00009.0 readPoint CP9
San Ramón (proveedor tela)
Textil San Ramón S.A.C. · RUC 20102261551
7750342100003 urn:epc:id:sgln:7750342.10000.0 sourceList CP1 ✓ en BD
QLever (lavandería) pendiente pendiente GS1 Perú sourceList CP3
6. Jerarquía GLN — readPoint vs bizLocation Gap identificado en CP2, CP4, CP6
CP1 — Ingreso Tela · Fuentes de datos por campo EPCIS ObjectEvent · receiving · in_progress
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT epcList[0] — SGTIN lote de tela FTL Trace public.partidas articulo_tela + lote_proveedor urn:epc:id:sgtin:7750342.000000.26-01875
quantityList.quantity — Peso recibido FTL Trace public.partidas peso_neto_kg 92.0 KGM
ilmd.lotNumber — Número de partida FTL Trace public.partidas lote_proveedor 26-01875
WHEN eventTime — Fecha recepción almacén FTL Trace public.partidas fecha_recepcion 2026-03-18T06:00:00-05:00
eventTime — Origen real del dato QLever public.recepcion_tela fecha_ingreso 2026-03-18
recordTime — Registro en sistema FTL Trace public.partidas record_time 2026-05-28T11:55:35
WHERE readPoint — GLN zona recepción FTL Trace public.workstations gln (cp_num = 1) 7600001000011
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001000000
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[0] receiving
disposition Definidos dpp_constants.py TIMELINE_DISPOSITIONS[0] in_progress
bizTransactionList — OC de tela FTL Trace public.partidas guia_remision OC 3-2026-39
sourceList — GLN San Ramón FTL Trace public.proveedores gln (via rollos.proveedor_id) 7750342100003
destinationList — GLN Trento FTL Trace public.org_settings gln_principal 7600001000000
HOW sensorElementList.deviceID FTL Trace public.sensor_readings device_id gemini_vlm:bascula_cp1
sensorElementList.value — Peso báscula FTL Trace public.sensor_readings value · uom = KGM 92.0 KGM
📱 Flujo implementado: App mobile captura foto del display de la báscula → backend envía imagen a Google Gemini fast VLM (Google Cloud) → LLM prompt extrae el valor numérico → backend procesa la respuesta y la retorna a la app → al completar CP1 el valor se guarda en sensor_readings (sensor_type='weight', raw_payload.source='gemini_vlm').
FTL Trace = schema public en DB del FTL Trace · QLever = ERP Trento (exportado a public.recepcion_tela) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py) · public.partidas = nombre de negocio de la tabla rollos
FTL Trace — CP1 Ingreso de Tela · Panel EPCIS 2.0 · 5 dimensiones
FTL Trace · CP1 Ingreso de Tela · ObjectEvent · OBSERVE · 100% completado · 01-jun-2026 11:39
Evidencia de ejecución de queries
Ejecutado
2026-06-01
10:04:52
Tiempo total
694 ms
9 queries · 2 bases de datos
DB del FTL Trace · PostgreSQL
connect 71 ms
Q1–Q4 + Qc 4–9 ms c/u
FTL Core · MySQL (túnel SSH)
connect 282 ms
Q5–Q7 + Qa–Qb 62 ms c/u
🧩 Datos CORE para Trazabilidad — fuentes y mapeo EPCIS
Campo (Excel v9) Tipo Mapea a EPCIS Tabla DB Columna Base de datos Valor ejemplo
ID Lote Tela (GTIN+Batch) Generado epcList[0] — SGTIN public.partidas lote_proveedor FTL Core 26-01875
Código de Tela Heredado · CORE ilmd:lotNumber public.partidas articulo_tela FTL Core (24438) JERSEY FLAME 20/1 PEINADO -IVORY
Código del Proveedor Tier 2 (GLN) Heredado · QLever WHY → sourceList + nombre_proveedor public.proveedores gln FTL Core 7750342100003
Orden de Producción (OP) Referencia · CORE Contexto — no va en evento CP1 public.ordenes_produccion orden_produccion FTL Core OP-6989
Purchase Order (PO cliente) Referencia · CORE Contexto — aplica en CP9 public.purchase_orders numero_po · cliente FTL Core 1894 · HABITAT CLOTHES TO LIVE IN
Guía de Remisión Referencia · QLever WHY → bizTransactionList public.partidas guia_remision FTL Core OC 3-2026-39
Fecha/Hora Recepción Timestamp · QLever WHEN → eventTime public.partidas fecha_recepcion FTL Core 2026-03-18 06:00:00
Operador Receptor ID Usuario · Login Contexto — no en evento EPCIS public.users email · full_name FTL Core supervisor-cp1@ctrento.com.pe
Nombre_Proveedor Texto · CORE/QLever HOW → how_proveedor (sourceList) public.partidas nombre_proveedor FTL Core Textil San Ramón S.A.C.
Tipo_Tela Texto · CORE Contexto producto public.partidas articulo_tela FTL Core JERSEY FLAME 20/1 PEINADO
Nombre_Color_Lote_Tela Texto · QLever Contexto producto public.partidas color_tela FTL Core IVORY
Comentarios columna F del Excel v9 (29-may-2026): epcList ← ID Lote Tela · ilmd:lotNumber ← Código de Tela · NOMBRE DEL PROVEEDOR en WHY ← GLN Tier 2
🗃 Evidencia — queries ejecutados · 2026-06-01 10:03:43 · DB del FTL Trace + FTL Core

Resultado real de las tablas que alimentan el evento CP1 para el lote de referencia GTIN 62076b7f3c4701 / partida 26-01875.

Q1 · public.partidas — partida del lote de prueba
SELECT id, lote_proveedor, peso_neto_kg, fecha_recepcion,
       orden_compra, guia_remision, nombre_proveedor, estado_cp1
FROM   rollos
WHERE  id = '1186e377-8077-48bb-8406-fe2c72f50f42';
lote_proveedor peso_neto_kg fecha_recepcion orden_compra guia_remision nombre_proveedor estado_cp1
26-01875 92.00 2026-03-18 06:00:00 OC 3-2026-39 OC 3-2026-39 Textil San Ramón S.A.C. completo
Q2 · public.workstations — readPoint CP1
SELECT cp_num, code, gln, nombre_descriptivo
FROM   workstations
WHERE  cp_num = 1 AND activo = true;
cp_num code gln nombre_descriptivo
1 recepcion_materias_primas 7600001000011 Zona de recepción de tela (CP1)
Q3 · public.org_settings — bizLocation
SELECT razon_social, gln_principal
FROM   org_settings WHERE id = 1;
razon_social: Industrias Nettalco S.A.
gln_principal: 7600001000000
Q4 · public.proveedores — sourceList
SELECT razon_social, gln, ruc, tipo
FROM   proveedores
WHERE  razon_social ILIKE '%san ram%';
razon_social: Textil San Ramón S.A.C.
gln: 7750342100003
ruc: 20102261551
tipo: tela
Q5 · FTL Core — llx_commande_fournisseurdet — línea de partida 26-01875
SELECT cfd.label, cfd.description, cfd.qty,
       cf.ref AS oc_interna, cf.ref_supplier AS oc_proveedor,
       cf.date_commande, s.nom AS proveedor
FROM   llx_commande_fournisseurdet cfd
JOIN   llx_commande_fournisseur cf ON cf.rowid = cfd.fk_commande
JOIN   llx_societe s ON s.rowid = cf.fk_soc
WHERE  cfd.description LIKE '%26-01875%';
label description qty (Kg) oc_proveedor date_commande proveedor
JERSEY FLAME 20/1 PEINADO 100% COTTON (WINTER WHITE) Partida: 26-01875 | Ingreso: 126175 | Fecha: 2026-03-18 561.30 OC 3-2026-39 2026-03-18 TEXTIL SAN RAMON S A
qty = 561.30 Kg es el peso real de la partida en FTL Core. El rollo del piloto tiene peso_neto_kg = 92.00 (subconjunto del seed de prueba).
Q adicional A · FTL Core — llx_mrp_mo — OP-6989
SELECT mo.rowid, mo.ref, mo.label,
       p.ref AS prod_ref, p.label AS producto
FROM   llx_mrp_mo mo
LEFT JOIN llx_product p ON p.rowid = mo.fk_product
WHERE  mo.ref = 'MO-6989';
rowid: 7
ref: MO-6989
label: OP-6989 Estilo 27553
prod_ref: 27553
producto: Estilo 27553
Q adicional B · FTL Core — llx_commande — PO 1894 (cliente)
SELECT c.rowid, c.ref, c.ref_client, s.nom
FROM   llx_commande c
JOIN   llx_societe s ON s.rowid = c.fk_soc
WHERE  c.ref = 'DP-1894';
rowid: 832
ref: DP-1894
ref_client: 1894
nom: HABITAT CLOTHES TO LIVE IN
Q adicional C · DB del FTL Trace — public.users — Operador receptor
SELECT email, full_name FROM users WHERE id = '3e307970-647c-5516-bfa4-078570c7125f';
email: supervisor-cp1@ctrento.com.pe
full_name: Supervisor CP1
HOW · public.sensor_readings — lectura báscula via Gemini VLM
Flujo de captura
📱
App Mobile
foto del display
☁️
Google Cloud
Gemini fast VLM
🤖
LLM Prompt
extrae valor
⚙️
Backend
procesa + retorna
🗃
sensor_readings
al completar CP1
SELECT device_id, sensor_type, value, uom,
       reading_time, raw_payload
FROM   sensor_readings
WHERE  rollo_id = '1186e377-8077-48bb-8406-fe2c72f50f42'
ORDER  BY reading_time;
device_id sensor_type value uom reading_time raw_payload
gemini_vlm:bascula_cp1 weight 92.0 KGM 2026-03-18 06:00:00-05:00 {"source":"gemini_vlm","method":"photo_display_ocr","model":"gemini-2.0-flash","confidence":0.98,"raw_text":"92.0 kg"}
Ejecutado: 2026-06-01 11:21:01 · confidence: 0.98 — Gemini reconoció "92.0 kg" del display de la báscula.
FTL Core — Dolibarr MySQL pruebas2.dpp.fintechlab.la · túnel SSH 13307
Q6 · llx_commande_fournisseur — OC de tela en FTL Core
SELECT cf.rowid, cf.ref, cf.ref_supplier,
       cf.date_commande, cf.fk_statut, s.nom AS proveedor
FROM   llx_commande_fournisseur cf
LEFT JOIN llx_societe s ON s.rowid = cf.fk_soc
WHERE  cf.ref_supplier LIKE '%3-2026-39%';
rowid ref ref_supplier date_commande fk_statut proveedor
1507 OC-TELA-1779763856 OC 3-2026-39 2026-03-18 5 · Recibida TEXTIL SAN RAMON S A
Q7 · llx_commande_fournisseurdet — línea de partida 26-01875
SELECT label, description, qty
FROM   llx_commande_fournisseurdet
WHERE  fk_commande = 1507
  AND  description LIKE '%26-01875%';
label description qty (Kg)
JERSEY FLAME 20/1 PEINADO 100% COTTON (WINTER WHITE) Partida: 26-01875 | Ingreso: 126175 | Fecha: 2026-03-18 561.30
CP2 — Corte Paños · Fuentes de datos por campo EPCIS TransformationEvent · transforming · active
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT inputEPCList[0] — SSCC Rollo tela consumido FTL Trace public.rollos id · codigo_rollo urn:epc:id:sscc:7600001.{rollo_short}
inputQuantityList.quantity — Peso Tela Input (kg) FTL Trace public.panos peso_tela_input_kg 92.0 KGM
outputEPCList[0] — SGTIN Paños Cortados FTL Trace public.panos id urn:epc:id:sgtin:7600001.{pano_gtin}
outputQuantityList.quantity — Peso Paños Output (kg) Trento trento.ProdTransfCorteDetalle SUM("Total") GROUP BY OP 48.5 KGM (OP-6989)
ilmd.lotNumber — Partida de Tela FTL Trace public.panos hoja_corte_id 26-01875
WHEN eventTime — Fecha corte paños FTL Trace public.panos fecha_corte 2026-05-10T08:30:00-05:00
recordTime — Registro en sistema FTL Trace public.panos record_time 2026-05-28T11:55:35
WHERE readPoint — GLN mesa de corte (area proxy) FTL Trace public.workstations gln (cp_num = 2) 7600001000028
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001000000
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[1] transforming
disposition Definidos dpp_constants.py TIMELINE_DISPOSITIONS[1] active
bizTransactionList[0] — Orden de Producción (type: po) FTL Trace public.ordenes_produccion numero_op OP-6989
bizTransactionList[1] — Orden servicio lavado (type: desadv) Pendiente public.lavados orden_servicio — (CP3)
🔗 sourceList / destinationList — Heredado de CP1 (rollo input) a panos output. Ambos GLNs vienen del contexto de recepción.
HOW sensorElementList.deviceID — ST7 (Máquina cortadora / Tendedora / Mesa) FTL Trace public.sensor_readings device_id modbus:7_mb_81 (ST7)
sensorElementList.value — kWh por paño FTL Trace public.sensor_readings value · uom = KWH (sin datos piloto)
⚠️ Estado: El lote piloto no tiene readings IoT para ST7. El backend busca SensorReading en workstation `corte_panos` ±5 min de fecha_corte del Pano. HOW vacío es comportamiento correcto, no un bug. Para agregar datos demo, ejecutar script seed_st7_sensor_reading_cp2.py (agregación diaria: kWh total ST7 / cantidad de panos cortados ese día).
FTL Trace = schema public en DB del FTL Trace · Trento = ERP Trento (dual sourcing para outputQuantityList) · Definidos = valor fijo por estándar GS1 CBV (dpp_constants.py)
Correcciones EPCIS CP2 aplicadas · 01-jun-2026
# Área Cambio Commit
1–7 Dashboard 7 labels descriptivos EPCIS en EpcisRawEventPanel.astro:
  • 7_mb_81 → Máquina cortadora / Tendedora / Mesa (ST7)
  • corte_panos (code) → Zona de corte (CP2)
  • transforming → Transformación de rollo a paños
  • active → Paños activos en línea
  • po → Orden de Producción OP-6989
  • sourceList → Origen (rollo de Textil San Ramón)
  • destinationList → Destino (Trento, Perú)
5d9aa41
8 Backend _get_peso_panos_output_from_trento() — Lookup trento.ProdTransfCorteDetalle por número OP, retorna outputQuantityList real desde Trento, no estimado. pendiente
FTL Trace — CP2 Corte Paños · Panel EPCIS 2.0 · Vista Consolidada
CP2 Corte Paños — Vista consolidada EPCIS con sensor ST7
Queries de evidencia — data lineage CP2
Q1 · public.panos — Paños del lote piloto 26-01875
SELECT p.id, p.fecha_corte, p.peso_tela_input_kg,
       p.peso_panos_output_kg, p.hoja_corte_id, p.estado_cp2
FROM   panos p
JOIN   rollos r ON r.id = p.rollo_id
WHERE  r.lote_proveedor = '26-01875';
id fecha_corte peso_input_kg peso_output_kg hoja estado
7a1d9c... 2026-05-10T08:30:00 92.0 48.5 26-01875 completed
Q2 · public.workstations — readPoint CP2
SELECT cp_num, code, gln, nombre_descriptivo
FROM   workstations
WHERE  cp_num = 2 AND activo = true;
cp_num code gln nombre_descriptivo
2 corte_panos 7600001000028 Zona de corte (CP2)
Q3 · trento.ProdTransfCorteDetalle — Peso paños Output (Trento)
SELECT uop."Numero" as op,
       COALESCE(SUM(tcd."Total"), 0) as peso_total_kg
FROM   trento."ProdTransfCorteDetalle" tcd
JOIN   trento."UdpOrdenProduccion" uop ON uop."IdOrdenProduccion" = tcd."IdOP"
WHERE  uop."Numero" = 'OP-6989'
GROUP BY uop."Numero";
op peso_total_kg
OP-6989 48.5
Q4 · public.sensor_readings — Verificar ausencia HOW (sin datos IoT piloto)
SELECT COUNT(*) as reading_count, device_id
FROM   sensor_readings
WHERE  workstation_id = (SELECT id FROM workstations WHERE cp_num = 2)
GROUP BY device_id;
Resultado: 0 rows (sin readings ST7 para workstation CP2)
💡 Expected: HOW vacío. Para agregar demo, ejecutar:
uv run python scripts/seed_st7_sensor_reading_cp2.py
CP3 — Lavado Externo · Fuentes de datos por campo EPCIS ObjectEvent · receiving · in_progress
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT epcList[0] — SGTIN paño lavado FTL Trace public.panos id urn:epc:id:sgtin:7600001.{pano_gtin}
ilmd.lotNumber — Referencia hoja de corte CP2 FTL Trace public.panos hoja_corte_id 26-01875
WHEN eventTime — Fecha retorno de lavandería FTL Trace public.lavados fecha_retorno 2026-05-15T08:00:00-05:00
recordTime — Registro en sistema FTL Trace public.lavados record_time 2026-05-28T11:55:35
WHERE readPoint — GLN almacén lavado paños FTL Trace public.workstations gln (cp_num = 3) 7600001000035
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001000000
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[2] receiving
disposition Definidos dpp_constants.py TIMELINE_DISPOSITIONS[2] in_progress
bizTransactionList[0] — Orden de servicio lavado (type: desadv) QLever public.lavados orden_servicio OS-QLEVER-2026-05
sourceList — GLN lavandería QLever Pendiente public.proveedores gln (sin GS1 Perú aún)
🔗 destinationList — GLN Trento: 7600001.00000.0 (punto de recepción post-lavado). CP3 es unico junto a CP1 y CP9 donde aplica cambio inter-organizacional.
HOW ⚠️ Estado: Sin IoT piloto. Retorno post-lavado se registra manualmente via App Mobile (observaciones: danos, merma). Orden de servicio lavaderia se crea manual en QLever.
FTL Trace = schema public en DB del FTL Trace · QLever = ERP Trento (sin API aún) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py)
📸 Dashboard FTL Trace — CP3 Lavado Externo
FTL Trace Dashboard — CP3 Lavado Externo · ObjectEvent · EPCIS 2.0 · OP-6989 Habitat · Acabatex
FTL Trace Consolidada · Vista CP3 Lavado Externo · 2026-06-02 · ObjectEvent con datos EPCIS completos (WHAT/WHEN/WHERE/WHY)
Evidencia de datos CP3
Status
CP3 Lavado
ObjectEvent
Panos procesados OP-6989
2 partidas
26-01875, 26-01877 (Habitat)
Origen orden de servicio
QLever Modulo ERP
Sin API — registro manual
Observaciones post-lavado
App Mobile captura manual
danos, merma, cambios color
Q1 · public.lavados — Registros de lavado para partidas OP-6989
SELECT id, pano_id, orden_servicio, fecha_salida, fecha_retorno, observaciones
FROM   lavados
WHERE  pano_id IN (SELECT id FROM panos WHERE hoja_corte_id = '26-01875')
       OR pano_id IN (SELECT id FROM panos WHERE hoja_corte_id = '26-01877')
ORDER BY fecha_retorno DESC;
Q2 · public.workstations — GLN almacén CP3
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 3;
📝 Nota QLever: La orden de servicio lavado se genera en el módulo de servicios de QLever (Trento ERP) y se refiere por número de orden. El retorno de panos post-lavado se captura cuando la lavandería confirma entrada de tela en almacén (movimiento de stock QLever). Hoy ambos son registros manuales vía App Mobile o entrada directa en QLever — no hay API aún. El campo observaciones en public.lavados guarda danos, merma de peso, cambios de color detectados post-lavado.
CP4 — Corte de Piezas + GTIN · Fuentes de datos por campo EPCIS TransformationEvent · commissioning · active
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT inputEPCList[0] — SGTIN paños lavados (heredado CP3) FTL Trace public.panos id (build_epc_uri) urn:epc:id:sgtin:7750342.c803c669
inputQuantityList.quantity — Kg paños input FTL Trace public.lotes peso_panos_input_kg ⚠️ —
outputEPCList[0] — SGTIN lote (GTIN generado) FTL Trace public.lotes gtin (generado) 62076b7f3c4701
outputQuantityList.quantity — Kg piezas output FTL Trace public.lotes peso_piezas_output_kg ⚠️ —
transformationID — ID único lote FTL Trace public.lotes id (UUID) 0f35298c-eb1f-...
ilmd.lotNumber — Número hoja de corte CORE 04·HC public.lotes hoja_corte_id 26-01875
ilmd.productionDate — Fecha creación lote FTL Trace public.lotes fecha_creacion 2026-05-28
WHEN eventTime — Timestamp orden de corte FTL Trace public.lotes fecha_creacion 2026-05-28T15:55:39-05:00
recordTime — Registro en sistema FTL Trace public.lotes record_time 2026-05-28T15:55:39
WHERE readPoint — GLN mesa corte piezas FTL Trace public.workstations gln (cp_num = 4) ⚠️ 7600001.00000.0
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[3] commissioning
disposition Definidos _CP_META[3] disposition ⚠️ active (debe ser)
bizTransactionList[0] — Orden de Corte (type: prodorder) FTL Trace public.lotes hoja_corte_id 26-01875
bizTransactionList[1] — OP (type: prodorder) FTL Trace public.ordenes_produccion numero_op OP-6989
🔗 sin sourceList/destinationList — CP4 es transformación interna (Trento → Trento). Los paños ingresan como input; salen como lote de piezas cortadas.
HOW ⚠️ Sensor ST3: Energía cortadora (área corte piezas). Pendiente integración. Hoy sin datos en sensorElementList.
FTL Trace = schema public en DB del FTL Trace · CORE 04·HC = ERP confecciones (Trento) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py, epcis_helpers.py)
⚠️ Problemas identificados · CP4 Corte de Piezas
1. disposition = in_progress (bug)
Dashboard muestra in_progress, pero debe ser active (decisión reunión 31-may-2026). Bug en _CP_META[3] y pendiente fix en dpp_constants.py.
2. Input/Output Quantities vacías
inputQuantityList y outputQuantityList sin valores — campos peso_panos_input_kg y peso_piezas_output_kg no poblados en lote demo.
3. readPoint = bizLocation
Ambos muestran GLN planta (7600001.00000.0). Workstation CP4 no tiene GLN específico asignado aún.
4. HOW sin sensor ST3
Energía cortadora no integrada (igual que ST7 en CP2). sensorElementList vacío.
📸 Dashboard FTL Trace — CP4 Corte de Piezas + GTIN
FTL Trace Dashboard — CP4 Corte de Piezas + GTIN · TransformationEvent · EPCIS 2.0 · OP-6989 Habitat
FTL Trace Consolidada · CP4 Corte de Piezas + GTIN · 2026-06-02 · TransformationEvent con 4 issues pendientes (disposition, input/output qty, readPoint, ST3)
Q1 · public.lotes — Lote OP-6989 con campos EPCIS
SELECT id, gtin, hoja_corte_id, peso_panos_input_kg, peso_piezas_output_kg,
       fecha_creacion, record_time, estado_cp4, distribucion_tallas
FROM   lotes
WHERE  gtin = '62076b7f3c4701';
Q2 · public.workstations — GLN CP4 mesa corte piezas
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 4;
Q3 · public.checkpoint_records — Evento EPCIS CP4
SELECT cp_num, estado,
       datos_epcis->>'eventType' AS event_type,
       datos_epcis->>'bizStep' AS biz_step,
       datos_epcis->>'disposition' AS disposition
FROM   checkpoint_records
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18'
  AND  cp_num = 4;
📝 Nota CP4: CP4 es donde nace el GTIN del lote de producción — el identificador único del DPP. Es el primer evento de comisionado con GS1 propio de Trento. El GTIN 62076b7f3c4701 representa el lote cortado de 26-01875 (OP-6989 Habitat). El TransformationEvent encadena CP3 (inputs: paños) → CP4 (output: lote de piezas con distribucion tallas y cantidad objetivo). Distribución por tallas se especifica en distribucion_tallas (JSON estructura).
CP5 — Cierre QA Corte · Fuentes de datos por campo EPCIS AggregationEvent · packing · in_progress
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT parentID — SGTIN lote piezas (heredado CP4) FTL Trace public.lotes gtin urn:epc:id:sgtin:7750342.62076b7f3c4701
childEPCs[0] — SGTIN paquete habilitado FTL Trace public.cierre_qa ⚠️ campo paquete
childQuantityList[0] — Piezas OK (EA) FTL Trace public.cierre_qa piezas_habilitadas_ok EA
childQuantityList[1] — Piezas defectuosas (EA) FTL Trace public.cierre_qa piezas_defectuosas EA
childQuantityList[2] — Piezas faltantes (EA) FTL Trace public.cierre_qa piezas_faltantes EA
ilmd.lotNumber — Número hoja de corte CORE 04·HC public.lotes hoja_corte_id 26-01875
WHEN eventTime — Timestamp cierre QA FTL Trace public.cierre_qa created_at / fecha_cierre 2026-05-28T16:30:00-05:00
recordTime — Registro en sistema FTL Trace public.cierre_qa record_time 2026-05-28T16:30:00
WHERE readPoint — GLN zona cierre QA FTL Trace public.workstations gln (cp_num = 5) 7600001.00005.0
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[4] packing
disposition Definidos _CP_META[4] disposition ⚠️ active (debe ser)
sourceList — GLN mesa corte piezas FTL Trace public.workstations gln (cp_num = 4) 7600001.00004.0
destinationList — GLN cierre QA FTL Trace public.workstations gln (cp_num = 5) 7600001.00005.0
🔗 source/destination entre workstations internos — práctica aceptada para eventos intra-planta (CP4 → CP5). Las piezas cortadas ingieren desde corte, salen como paquete habilitado hacia costura.
HOW ⚠️ Sensor balanza avíos: Pendiente configuración técnica (Jenny). Hoy sensorElementList vacío.
FTL Trace = schema public en DB del FTL Trace · CORE 04·HC = ERP confecciones (Trento) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py, epcis_helpers.py)
⚠️ Problemas identificados · CP5 Cierre QA
1. disposition = in_progress (bug)
Dashboard muestra in_progress, pero debe ser active (decisión reunión 31-may-2026). Bug en _CP_META[4].
2. childEPCs sin SGTIN asignado
El paquete habilitado no tiene SGTIN propio en demo. Campo vacío en public.cierre_qa.
3. HOW sin sensor balanza
Pesaje de avíos requiere balanza pequeña. Pendiente integración técnica (pendiente Jenny).
4. Selección manual OC no implementada
App mobile debe mostrar órdenes de corte disponibles para selección manual. Feature pendiente en app mobile.
📸 Dashboard FTL Trace — CP5 Cierre QA Corte
FTL Trace Dashboard — CP5 Cierre QA Corte · AggregationEvent · EPCIS 2.0 · OP-6989 Habitat
FTL Trace Consolidada · CP5 Cierre QA Corte · 2026-05-28 · AggregationEvent con 4 issues pendientes (disposition, childEPCs, balanza, selección OC)
Q1 · public.cierre_qa — Cierre QA lote OP-6989
SELECT lote_id, piezas_habilitadas_ok, piezas_defectuosas, piezas_faltantes,
       created_at, observaciones, estado_qa
FROM   cierre_qa
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18';
Q2 · public.workstations — GLN CP5 cierre QA
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 5;
Q3 · public.checkpoint_records — Evento EPCIS CP5
SELECT cp_num, estado, datos_epcis->>'parentID' AS parent_id,
       datos_epcis->>'bizStep' AS biz_step,
       datos_epcis->>'disposition' AS disposition
FROM   checkpoint_records
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18'
  AND  cp_num = 5;
📝 Nota CP5: CP5 es un AggregationEvent (no TransformationEvent como CP2/CP4). Agrega piezas cortadas de CP4 en un paquete de corte con parentID (SGTIN del lote). A diferencia de transformaciones internas (CP2, CP4) que no tienen source/dest, CP5 sí los incluye: source = mesa corte piezas (CP4), destination = zona cierre QA (CP5). La selección de la hoja de corte a procesar es manual en app mobile — el usuario elige qué orden está siendo inspeccionada en ese momento.
CP6 — Costura · Fuentes de datos por campo EPCIS TransformationEvent · assembling · in_progress
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT inputEPCList[0] — SGTIN paquete habilitado (CP5) FTL Trace public.cierre_qa _input_epc_override urn:epc:id:sgtin:7750342.62076b7f3c4701
outputQuantityList[0] — Prendas cosidas (EA) FTL Trace public.costuras prendas_terminadas EA
transformationID — ID costura FTL Trace public.costuras id (UUID) str(costura.id)
ilmd.lotNumber — Número hoja de corte CORE 04·HC public.lotes hoja_corte_id 26-01875
ilmd.productionDate — Fecha costura FTL Trace public.costuras fecha_fin / fecha_inicio 2026-05-28
WHEN eventTime — Timestamp fin costura FTL Trace public.costuras fecha_fin (priority) / fecha_inicio 2026-05-28T18:45:00-05:00
recordTime — Registro en sistema FTL Trace public.costuras record_time 2026-05-28T18:45:00
WHERE readPoint — GLN zona costura FTL Trace public.workstations gln (cp_num = 6) 7600001.00006.0
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[5] assembling
disposition Definidos _CP_META[5] disposition in_progress
bizTransactionList — OP producción FTL Trace public.ordenes_produccion id (prodorder GTIN) OP-6989
🔗 SIN sourceList/destinationList — costura interna (transformación Trento → Trento). Solo si maquila: source=Trento, destination=taller_externo_gln.
HOW ⚠️ Sensor costura: Pendiente (datos poco confiables del ERP actual). sensorElementList vacío.
FTL Trace = schema public en DB del FTL Trace · CORE 04·HC = ERP confecciones (Trento) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py, epcis_helpers.py)
⚠️ Problemas identificados · CP6 Costura
1. outputQuantityList vacío en demo
Captura manual de prendas cosidas por talla en app mobile. Hoy: sin datos reales en demo.
2. HOW sin sensor costura
Datos de costura del ERP actual poco confiables. sensorElementList vacío. Pendiente integración técnica.
3. Formulario app mobile cantidad por talla
Feature aún no implementada. Requerido para captura manual de prendas cosidas.
4. Costura maquila sin GLN taller externo
Si costura es en taller externo, requiere configuración de GLN correspondiente. No implementado.
📸 Dashboard FTL Trace — CP6 Costura
FTL Trace Dashboard — CP6 Costura · TransformationEvent · EPCIS 2.0 · OP-6989 Habitat
FTL Trace Consolidada · CP6 Costura · 2026-06-02 · TransformationEvent con 4 issues pendientes (outputQuantityList, sensor, app mobile, maquila GLN)
Q1 · public.costuras — Costura lote OP-6989
SELECT lote_id, prendas_terminadas, operador_id, fecha_inicio, fecha_fin,
       estado, observaciones
FROM   costuras
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18';
Q2 · public.workstations — GLN CP6 costura
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 6;
Q3 · public.checkpoint_records — Evento EPCIS CP6
SELECT cp_num, estado, datos_epcis->>'inputEPCList' AS input_epc,
       datos_epcis->>'bizStep' AS biz_step,
       datos_epcis->>'disposition' AS disposition
FROM   checkpoint_records
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18'
  AND  cp_num = 6;
📝 Nota CP6: CP6 es un TransformationEvent (como CP2 y CP4). Transforma el paquete habilitado de CP5 en prendas terminadas costuradas. A diferencia de CP5 (AggregationEvent), CP6 usa inputEPCList / outputQuantityList en lugar de parentID / childEPCs. La costura interna NO lleva sourceList/destinationList (transformación dentro de Trento). El bizStep = assembling es único en el flujo de 9 checkpoints — es el único evento que representa costura/ensamblaje.
CP7 — Inspección QC · Fuentes de datos por campo EPCIS ObjectEvent · inspecting · active
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT quantityList[0] — Prendas primera (EA) FTL Trace public.acabados prendas_primera EA
quantityList[1] — Prendas segunda (EA, qualifier «segunda») FTL Trace public.acabados prendas_segunda EA
quantityList[2] — Prendas saldo (EA, qualifier «saldo») FTL Trace public.acabados prendas_saldo EA
quantityList[3] — Prendas descarte (EA, qualifier «descarte») FTL Trace public.acabados prendas_descarte EA
ilmd.lotNumber — Número hoja de corte CORE 04·HC public.lotes hoja_corte_id 26-01875
WHEN eventTime — Timestamp inspección QC FTL Trace public.acabados fecha_acabado 2026-05-28T19:20:00-05:00
recordTime — Registro en sistema FTL Trace public.acabados record_time 2026-05-28T19:20:00
WHERE readPoint — GLN zona inspección QC FTL Trace public.workstations gln (cp_num = 7) 7600001.00007.0
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[6] inspecting
disposition Definidos _CP_META[6] disposition active
sourceList — GLN zona costura FTL Trace public.workstations gln (cp_num = 6) 7600001.00006.0
destinationList — GLN inspección QC FTL Trace public.workstations gln (cp_num = 7) 7600001.00007.0
🔗 source/destination intra-planta — CP7 es ObjectEvent (no TransformationEvent). Las prendas cosidas ingresan desde costura (CP6), salen inspeccionadas desde zona QC (CP7). Práctica aceptada para eventos internos Trento.
HOW ⚠️ Datos inspección Excel: AQL, tipo defecto, reparaciones provienen de upload PDF/Excel. Fuera del estándar EPCIS. sensorElementList vacío.
FTL Trace = schema public en DB del FTL Trace · CORE 04·HC = ERP confecciones (Trento) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py, epcis_helpers.py)
⚠️ Problemas identificados · CP7 Inspección QC
1. Modelo legacy invertido
Tabla public.acabados representa CP7, tabla public.inspecciones representa CP8. Nombres confusos históricamente pero funcionales.
2. Datos inspección desde Excel
AQL, tipos de defecto, reparaciones por unidad provienen de upload PDF/Excel. App mobile solo visualiza. Feature de entrada pendiente.
3. Inspección agrupada por estilo+OP
App mobile debe agrupar por Estilo + OP (no hoja de corte). Configuración pendiente en selector mobile CP7.
4. Parámetros CP7 faltantes
Fintech Lab debe gestionar entrega de parámetros adicionales de CP7 (especificaciones QC, tolerancias, criterios de aceptación).
📸 Dashboard FTL Trace — CP7 Inspección QC
FTL Trace Dashboard — CP7 Inspección QC · ObjectEvent · EPCIS 2.0 · OP-6989 Habitat
FTL Trace Consolidada · CP7 Inspección QC · 2026-06-02 · ObjectEvent con 4 issues pendientes (modelo legacy, datos Excel, estilo+OP, parámetros)
Q1 · public.acabados — Inspección QC lote OP-6989
SELECT lote_id, prendas_primera, prendas_segunda, prendas_saldo, prendas_descarte,
       fecha_acabado, estado, observaciones
FROM   acabados
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18';
Q2 · public.workstations — GLN CP7 inspección QC
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 7;
Q3 · public.checkpoint_records — Evento EPCIS CP7
SELECT cp_num, estado, datos_epcis->>'bizStep' AS biz_step,
       datos_epcis->>'disposition' AS disposition,
       datos_epcis->>'quantityList' AS quantity_list
FROM   checkpoint_records
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18'
  AND  cp_num = 7;
📝 Nota CP7: CP7 es un ObjectEvent (no TransformationEvent como CP2/CP4/CP6), similar a CP1 y CP3. Clasifica prendas cosidas en 4 categorías: primera, segunda, saldo y descarte. Incluye sourceList/destinationList porque hay movimiento de prendas entre zonas de trabajo (costura → inspección QC). El modelo backend se llama Acabado (nombre legacy) pero representa la Inspección QC en el flujo de negocio — confuso históricamente pero funcional. Los datos de calidad (AQL, tipo defecto, reparaciones) vienen de upload Excel/PDF, fuera del estándar EPCIS.
CP8 — Acabados (Encajado) · Fuentes de datos por campo EPCIS AggregationEvent · packing · sellable_accessible · action ADD
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT parentID — SGTIN lote (grupo de cajas por estilo) FTL Trace public.lotes gtin urn:epc:id:sgtin:7750342.62076b7f3c4701
childEPCs — SGTINs serializados o SSCC fallback FTL Trace public.inspecciones serial_desde / serial_hasta (si ≤1000) urn:epc:id:sgtin:7750342.xxx[0-N]
childQuantityList[0] — Prendas primera (EA) FTL Trace public.inspecciones prendas_primera EA
childQuantityList[1] — Prendas segunda (EA, qualifier «segunda») FTL Trace public.inspecciones prendas_segunda EA
childQuantityList[2] — Prendas reproceso (EA, qualifier «reproceso») FTL Trace public.inspecciones prendas_reproceso EA
childQuantityList[3] — Prendas descarte (EA, qualifier «descarte») FTL Trace public.inspecciones prendas_descarte EA
ilmd.lotNumber — Número hoja de corte CORE 04·HC public.lotes hoja_corte_id 26-01875
WHEN eventTime — Timestamp encajado/embalaje FTL Trace public.inspecciones fecha_inspeccion 2026-05-28T20:30:00-05:00
recordTime — Registro en sistema FTL Trace public.inspecciones record_time 2026-05-28T20:30:00
WHERE readPoint — GLN zona acabados FTL Trace public.workstations gln (cp_num = 8) 7600001.00008.0
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[7] packing
disposition Definidos _CP_META[7] disposition sellable_accessible
sourceList — GLN inspección QC FTL Trace public.workstations gln (cp_num = 7) 7600001.00007.0
destinationList — GLN acabados FTL Trace public.workstations gln (cp_num = 8) 7600001.00008.0
🔗 source/destination intra-planta — CP8 es AggregationEvent (como CP5). Las prendas QC-aprobadas ingresan desde inspección QC (CP7), salen embaladas desde zona acabados (CP8). action=ADD indica agregación de prendas en cajas.
HOW ⚠️ 3 sensores pendientes: Flujómetro vapor caldera · Balanza prendas · Balanza avíos (pequeña). sensorElementList vacío.
FTL Trace = schema public en DB del FTL Trace · CORE 04·HC = ERP confecciones (Trento) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py, epcis_helpers.py)
✅ PASAPORTE DIGITAL DE PRODUCTO (DPP) — Nace en CP8
Identificadores generados en CP8:
SSCC: Número de pallet/caja (urn:epc:id:sscc:...) — único por contenedor
Código QR: Generado por plataforma — contiene GTIN + SSCC + lote
SGTINs serializados: Si serial_desde/hasta ≤1000 unidades, se generan N SGTINs individuales
Datos del DPP en CP8:
• SKU: Código del producto (heredado CORE)
• Tallas: Distribución por talla (heredada CORE)
• Tipo embalaje: Descripción packaging (especificaciones)
• Ubicación almacén: GLN destino (sistema)
• Prendas embaladas: 390 prendas (primera + segunda + reproceso, descarte excluido)
⚠️ Problemas identificados · CP8 Acabados
1. Modelo legacy invertido
Tabla public.inspecciones representa CP8, tabla public.acabados representa CP7. Históricamente invertidos pero funcionales. `_cp8_extras()` ya implementado.
2. childEPCs condicionado por serialización
SGTINs serializados solo si serial_desde/serial_hasta ≤1000 unidades. Sino SSCC fallback. Demo: probablemente vacío (sin serialización).
3. 3 sensores pendientes
Flujómetro vapor caldera (área acabados) · Balanza prendas · Balanza avíos pequeña. Integración técnica pendiente. sensorElementList vacío.
4. Parámetros CP8 faltantes
Fintech Lab debe gestionar entrega de parámetros adicionales (especificaciones embalaje, packaging, dimensiones caja, peso máximo, etc.).
📸 Dashboard FTL Trace — CP8 Acabados (Encajado)
FTL Trace Dashboard — CP8 Acabados (Encajado) · AggregationEvent · EPCIS 2.0 · OP-6989 Habitat
FTL Trace Consolidada · CP8 Acabados · 2026-06-02 · AggregationEvent con 4 issues pendientes (modelo legacy, serialización, sensores, parámetros) · DPP nace aquí
Q1 · public.inspecciones — Encajado lote OP-6989
SELECT lote_id, prendas_primera, prendas_segunda, prendas_reproceso, prendas_descarte,
       sscc, cantidad_embalada, fecha_inspeccion, cajas, estado
FROM   inspecciones
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18';
Q2 · public.workstations — GLN CP8 acabados
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 8;
Q3 · public.checkpoint_records — Evento EPCIS CP8
SELECT cp_num, estado, datos_epcis->>'parentID' AS parent_id,
       datos_epcis->>'bizStep' AS biz_step,
       datos_epcis->>'disposition' AS disposition,
       datos_epcis->>'action' AS action
FROM   checkpoint_records
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18'
  AND  cp_num = 8;
📝 Nota CP8: CP8 es un AggregationEvent (como CP5), donde se agrupan prendas inspeccionadas en cajas con SSCC único. Representa el encajado final. CP8 es el punto donde nace el DPP — el Pasaporte Digital de Producto con código QR, SSCC, SKU, tallas y datos de trazabilidad completa. El modelo backend se llama Inspeccion (nombre legacy) pero representa los Acabados en el flujo de negocio. La disposition=sellable_accessible indica que el producto está listo para venta — es el estado más avanzado del flujo EPCIS (vs in_progress en CP1-CP6, active en CP4/CP7, in_transit en CP9).
CP9 — Despacho · Fuentes de datos por campo EPCIS ObjectEvent · shipping · in_transit
🔍 Data lineage — de dónde viene cada campo del evento EPCIS
Dimensión Campo EPCIS Base de datos Tabla Columna Valor ejemplo
WHAT quantityList[0] — Cantidad cajas (EA, qualifier «cajas») FTL Trace public.despachos cantidad_cajas EA
quantityList[1] — Peso neto total (KGM) FTL Trace public.despachos peso_neto_kg KGM
ilmd.lotNumber — Número hoja de corte CORE 04·HC public.lotes hoja_corte_id 26-01875
WHEN eventTime — Timestamp despacho FTL Trace public.despachos fecha_despacho 2026-05-29T08:00:00-05:00
recordTime — Registro en sistema FTL Trace public.despachos record_time 2026-05-29T08:00:00
WHERE readPoint — GLN muelle despacho FTL Trace public.workstations gln (cp_num = 9) 7600001.00009.0
bizLocation — GLN planta Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
WHY bizStep Definidos dpp_constants.py TIMELINE_BIZSTEPS[8] shipping
disposition Definidos _CP_META[8] disposition in_transit
bizTransactionList[0] — PO cliente (type=po) CORE ERP 01·OP numero_po OP-cliente-001
bizTransactionList[1] — Bill of Lading (type=bol) FTL Trace public.despachos bl_number BL-2026-0001
bizTransactionList[2] — Factura (type=inv) FTL Trace public.despachos factura_exportacion FAC-2026-0123
bizTransactionList[3] — Número DAM (type=desadv) Manual public.despachos numero_dam
sourceList[0] — GLN Trento FTL Trace public.org_settings gln_principal 7600001.00000.0
destinationList[0] — GLN cliente final FTL Trace public.despachos cliente_destino_gln Peter Millar / Habitat / Escape
🌍 CP9 es el único evento INTER-ORGANIZACIONAL puro — Trenton (source) envia a cliente final (destination). Un CP9 por PO (Orden de Compra del cliente) para integridad financiera.
HOW Sin sensores IoT en CP9. Evento de cierre sin integración sensor.
FTL Trace = schema public en DB del FTL Trace · CORE = ERP confecciones (Trento) · Definidos = valor fijo por estándar GS1 CBV, declarado en backend (dpp_constants.py, epcis_helpers.py) · Manual = ingreso manual desde app mobile
🔗 TRAZABILIDAD EPCIS 2.0 COMPLETA — CP1 → CP9 CERRADA
San Ramón (tela cruda)
↓ CP1 · Recepción rollo (ObjectEvent)
↓ CP2 · Corte paños (TransformationEvent) — ST7 sensor
↓ CP3 · Lavado externo QLever (ObjectEvent)
↓ CP4 · Corte piezas + GTIN nace (TransformationEvent) — ST3 sensor
↓ CP5 · Cierre QA (AggregationEvent)
↓ CP6 · Costura (TransformationEvent) — sensor costura
↓ CP7 · Inspección QC (ObjectEvent)
↓ CP8 · Acabados + DPP nace (AggregationEvent) — flujómetro, balanzas
↓ CP9 · DESPACHO (ObjectEvent)

Peter Millar / Habitat / Escape (cliente final vía WTS broker)
⚠️ Problemas identificados · CP9 Despacho
1. 1 CP9 por PO — múltiples eventos si hay múltiples POs
Si el lote tiene varias POs (órdenes de compra) de clientes distintos, se generan múltiples eventos CP9. Implementación actual: validar. Decisión reunión: 1 CP9 por PO para integridad financiera.
2. BL y DAM manuales en app mobile
bl_number (Bill of Lading) y numero_dam (Documento Aduanal) se ingresan manualmente. Feature en app mobile pendiente.
3. GLN clientes pendiente de registro
GLNs de Peter Millar, Habitat, Escape deben estar registrados en BD (public.despachos.cliente_destino_gln). Estado: a verificar.
4. Parámetros CP9 faltantes
Fintech Lab debe gestionar entrega de parámetros: packing list, certificado de origen, puerto de destino, especificaciones de empaque internacional.
📸 Dashboard FTL Trace — CP9 Despacho
Pending — Screenshot placeholder
assets/images/cp9-despacho/Screenshot.png
FTL Trace Consolidada · CP9 Despacho · ObjectEvent inter-organizacional con 4 issues pendientes (múltiples POs, BL/DAM manual, GLNs clientes, parámetros) · Cierra cadena CP1→CP9
Q1 · public.despachos — Despacho lote OP-6989
SELECT lote_id, cantidad_cajas, peso_neto_kg, bl_number, factura_exportacion,
       numero_dam, cliente_destino_gln, fecha_despacho, estado
FROM   despachos
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18';
Q2 · public.workstations — GLN CP9 muelle despacho
SELECT id, ref, gln, cp_num, descripcion
FROM   workstations
WHERE  cp_num = 9;
Q3 · public.checkpoint_records — Evento EPCIS CP9
SELECT cp_num, estado, datos_epcis->>'bizStep' AS biz_step,
       datos_epcis->>'disposition' AS disposition,
       datos_epcis->>'sourceList' AS source_list,
       datos_epcis->>'destinationList' AS destination_list
FROM   checkpoint_records
WHERE  lote_id = '0f35298c-eb1f-4188-bddb-c9a27fbbef18'
  AND  cp_num = 9;
📝 Nota CP9: CP9 es un ObjectEvent (como CP1/CP3/CP7) y el único evento inter-organizacional puro del flujo EPCIS. Cierra la trazabilidad completa desde San Ramón (CP1) hasta el cliente final (Peter Millar / Habitat / Escape vía WTS broker). Incluye 4 bizTransactions (PO, BL, Factura, DAM) que documentan la exportación. La disposition=in_transit indica que el producto está en camino al cliente. Decisión reunión: 1 CP9 por PO para mantener integridad financiera — si un lote tiene múltiples órdenes de compra, se generan múltiples eventos CP9.
7. Pendientes
  • GLN San Ramón — FTL Trace: ya registrado en public.proveedores (Textil San Ramón S.A.C.).
    gln = 7750342100003urn:epc:id:sgln:7750342.10000.0
    El sourceList de CP1 se resuelve automáticamente vía _cp1_extras().
  • GLN San Ramón — Dolibarr: campo barcode actualizado en TEXTIL SAN RAMON S A (SU-726, rowid=102).
    barcode = 7750342100003 · tipo EAN13 (convención GLN-13 GS1).
    Primer proveedor con GLN registrado — establece la convención para los demás.
  • 🟡
    GLN QLever (lavandería): registrar en proveedores.gln para sourceList de CP3.
  • 🟡
    Validación sandbox GS1: copiar JSON del evento CP1 del lote 62076b7f3c4701 al GS1 EPCIS Sandbox para confirmar conformidad completa.
  • 🟡
    CP4 disposition: cambiar de in_progress a active en _CP_META (confirmado en Excel v9).
  • 🔵
    Resume CP2: backend debe guardar estado "iniciado" para que la app mobile pueda retomar si se cierra la sesión.
  • 🔵
    GLN San Ramón en GS1 Perú: solicitar GCP oficial para que el SGTIN del lote de tela use el prefijo del proveedor real en lugar del proxy Trento.