Datos maestros · Proceso producto · Trazabilidad GS1 por checkpoint · 01 junio 2026
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 |
7600001 (derivado de TRENTO_PLANT_GLN = 7600001000000).
Planta completa = urn:epc:id:sgln:7600001.00000.0.
Cada checkpoint tiene LocationRef único (00001–00009) con check digit GS1 válido.
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.
| # | Partida | Color | Producto | Kg | Fecha ingreso |
|---|---|---|---|---|---|
| 1 | 26-01874 | WINTER WHITE | JERSEY FLAME 20/1 PEINADO 100% COTTON | 140.6 | 18/03/2026 |
| 2 | 26-01875 | WINTER WHITE | JERSEY FLAME 20/1 PEINADO 100% COTTON | 561.3 | 18/03/2026 |
| 3 | 26-01876 | HONEY | JERSEY FLAME 20/1 PEINADO 100% COTTON | 422.5 | 18/03/2026 |
| 4 | 26-01877 | SIENNA | JERSEY FLAME 20/1 PEINADO 100% COTTON | 606.4 | 18/03/2026 |
| 5 | 26-01878 | FUCHSIA | JERSEY FLAME 20/1 PEINADO 100% COTTON | 204.8 | 18/03/2026 |
| 6 | 26-01879 | TEAL | JERSEY FLAME 20/1 PEINADO 100% COTTON | 474.0 | 18/03/2026 |
| 7 | 26-01880 | HARBOR | JERSEY FLAME 20/1 PEINADO 100% COTTON | 133.0 | 18/03/2026 |
| 8 | 26-01881 | HARBOR | JERSEY FLAME 20/1 PEINADO 100% COTTON | 563.6 | 18/03/2026 |
| 9 | 26-01882 | LENTIL | JERSEY FLAME 20/1 PEINADO 100% COTTON | 259.3 | 18/03/2026 |
| 10 | 26-01883 | BLACK | JERSEY FLAME 20/1 PEINADO 100% COTTON | 601.7 | 18/03/2026 |
| Total | 3 407.2 Kg | ||||
| # | 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 |
epc_list[0] (el SGTIN URI generado).
| 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 |
| 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').
| |||||
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
| 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 |
epcList ← ID Lote Tela ·
ilmd:lotNumber ← Código de Tela · NOMBRE DEL PROVEEDOR en WHY ← GLN Tier 2
Resultado real de las tablas que alimentan el evento CP1 para el lote de referencia GTIN 62076b7f3c4701 / partida 26-01875.
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 |
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) |
public.org_settings — bizLocation
SELECT razon_social, gln_principal
FROM org_settings WHERE id = 1; public.proveedores — sourceList
SELECT razon_social, gln, ruc, tipo
FROM proveedores
WHERE razon_social ILIKE '%san ram%'; 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).
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'; 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'; public.users — Operador receptor
SELECT email, full_name FROM users WHERE id = '3e307970-647c-5516-bfa4-078570c7125f'; public.sensor_readings — lectura báscula via Gemini VLM
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"} |
confidence: 0.98 — Gemini reconoció "92.0 kg" del display de la báscula.
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 |
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 |
| 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).
| |||||
public en DB del FTL Trace ·
Trento = ERP Trento (dual sourcing para outputQuantityList) ·
Definidos = valor fijo por estándar GS1 CBV (dpp_constants.py)
| # | Área | Cambio | Commit |
|---|---|---|---|
| 1–7 | Dashboard | 7 labels descriptivos EPCIS en EpcisRawEventPanel.astro:
| 5d9aa41 |
| 8 | Backend | _get_peso_panos_output_from_trento() — Lookup trento.ProdTransfCorteDetalle por número OP, retorna outputQuantityList real desde Trento, no estimado. | pendiente |
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 |
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) |
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 |
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; uv run python scripts/seed_st7_sensor_reading_cp2.py | 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. | ||||
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)
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; public.workstations — GLN almacén CP3
SELECT id, ref, gln, cp_num, descripcion
FROM workstations
WHERE cp_num = 3; observaciones en public.lavados guarda danos, merma de peso, cambios de color detectados post-lavado.
public.proveedores (Textil San Ramón S.A.C.).sourceList de CP1 se resuelve automáticamente vía _cp1_extras().
barcode actualizado en
TEXTIL SAN RAMON S A (SU-726, rowid=102).proveedores.gln
para sourceList de CP3.
62076b7f3c4701 al
GS1 EPCIS Sandbox
para confirmar conformidad completa.
in_progress a
active en _CP_META (confirmado en Excel v9).