FTL TRACE TX — Plan CP7 · CP8 · CP9

Sesiones 2026-06-15 (demo CP7) · 2026-06-16 (demo CP8/CP9 + socialización) · Confecciones Trento S.A.C.

CP7 backend ✓ CP7 AQL PDF CP8 packing list CP9 expediente Mobile Android
4
CP7 commits
1
CP7 gaps
4
CP8/CP9 tasks
3
Mobile tasks
CP7

Inspección de Calidad — Confirmaciones y Gaps

2 gaps
Backend implementado (15-Jun, 4 commits en develop) Validación no bloquea · Auto-deriva prendas desde cp7_inspecciones · GS1-128 (10)OP-6989(240)T001-22621 resuelto · resultado_calidad guardado en acabados.resultado_aql
📎
A1 — PDF AQL attachment (metadata only)

Adjuntar reportes de inspección por color (hasta 8 PDFs) al cerrar CP7. Solo se guarda metadata en upload_audits con upload_type="cp7_aql" y lote_id.
Backend: nuevo endpoint POST /api/v1/checkpoints/cp7/aql-archivos.
Dashboard: sección multi-upload PDF en inspeccion-calidad.astro.

Sprint actual

ℹ️
Regla de negocio confirmada Primeras efectivas = qty_primeras + qty_manchas + qty_zurcido + qty_composturas (las reparadas cuentan como primera calidad). Las segundas se depuran antes — no se suman. Auto-derivado desde cp7_inspecciones sin input manual del operario.
ArchivoCambioParte
apps/backend/src/api/routers/ (nuevo endpoint)POST /cp7/aql-archivos → upload_auditsA1
pages/data-upload/inspeccion-calidad.astroSección multi-upload PDF (8 slots por color)A1
CP8

Acabados — Packing List autocompletar

Por implementar
Fuente packing list
trento."ProdDatosBultoPedidoDetalle" — Packing List FINAL agrupado por NomColor. Total 1,941 uds OP-6989 (incluye sobreproducción vs 1,884 del pedido original).
Total cajas
Extraído del packing list, no se digita manualmente
Display
Mobile — pantalla Verificar CP8 en handheld de Víctor (tabla colores_cp8: CP7 + packing list por color)
Cierre
Virtual — auto-completa desde los datos del packing list
B1 — Backend: tabla combinada CP7 + Packing List FINAL en verificar CP8

Implementado — commit ec6a9cf. El verificar CP8 retorna colores_cp8 con 3 columnas:
1. Primeras efectivas — de cp7_inspecciones (qty_primeras + manchas + zurcido + composturas)
2. Qty Packing List FINAL — de trento."ProdDatosBultoPedidoDetalle" agrupado por NomColor — fuente real del despacho
3. Diferencia — packing − primeras_ef (positivo = sobreproducción acordada)
Query nueva: Q_CP8_PACKING_POR_COLOR en trento_queries_cp6_9.py. Fallback gracioso si Trento no disponible.

✓ Done
📱
B2 — Mobile: mostrar tabla combinada en Verificar CP8 (= D3)

La tabla colores_cp8 que retorna B1 se muestra en la pantalla Verificar de CP8 del handheld de Víctor — Verificar implementado en VerificarFragment.java cuando cp_num == 8.
Columnas: COLOR | PRIMERAS EFECTIVAS | PACKING LIST | DIFERENCIA
Bloqueado por B1 — implementar en mobile cuando el backend esté en develop.

Post B1 · Mobile
// Response CP8 verificar enriquecido (nuevo)
{
  "session_id": "uuid...",
  "cantidad_prendas": 1845,
  // CP7 inspection summary (reusar helper existente)
  // Tabla combinada por color — fuentes reales OP-6989
  "colores_cp8": [
    {
      "color": "BLACK",
      "primeras_efectivas": 299,  // cp7_inspecciones (208+74+15+2)
      "qty_pedido": 321,          // ProdDatosBultoPedidoDetalle (Packing List FINAL)
      "diferencia": 22            // positivo = más empacado que inspeccionado OK
    },
    { "color": "FUCHSIA",      "primeras_efectivas": 119, "qty_pedido": 130, "diferencia": 11 },
    { "color": "HARBOR",       "primeras_efectivas": 313, "qty_pedido": 320, "diferencia": 7  },
    { "color": "HONEY",        "primeras_efectivas": 166, "qty_pedido": 181, "diferencia": 15 },
    { "color": "LENTIL",       "primeras_efectivas": 139, "qty_pedido": 153, "diferencia": 14 },
    { "color": "SIENNA",       "primeras_efectivas": 299, "qty_pedido": 304, "diferencia": 5  },
    { "color": "TEAL",         "primeras_efectivas": 141, "qty_pedido": 158, "diferencia": 17 },
    { "color": "WINTER WHITE", "primeras_efectivas": 338, "qty_pedido": 374, "diferencia": 36 }
  ],
  "total_primeras_efectivas": 1814,
  "total_pedido": 1941  // packing list FINAL > plan (reposiciones/sobreproducción)
}
CP9

Despacho — Expediente y documentos por PO

Por implementar (dashboard)
⚠️
Cambio de nivel: PO (no OP) CP2–CP8 operan por Orden de Producción (OP). CP9 opera por Orden de Compra/Pedido (PO). Hábitat tiene 3 POs → 3 cierres CP9 separados. La tabla despachos ya existe (40+ columnas, 2 filas de prueba).
🗄️
C1 — Migración: agregar campos expediente a despachos

La tabla despachos ya existe. Agregar 2 campos con nueva migración:
codigo_expediente VARCHAR — ID interno agrupador (ej. "DES-2026-HBT-001")
fecha_guia_remision DATE — fecha oficial de cierre CP9 (trigger = Guía de Remisión, no factura)

Sprint actual
📁
C2 — Dashboard: agrupación por expediente

En documentos-exportacion.astro agregar flujo:
1. Selector de PO → genera/busca codigo_expediente.
2. Upload de 6 tipos de documento (solo metadata en upload_audits).
3. Estado del expediente (pendiente/completo).
4. Botón "Cerrar CP9" — activo cuando docs obligatorios subidos.

Post C1
🚢
C3 — Despachos parciales (PO parte 1/2)

Una PO puede dividirse en envíos aéreo + marítimo. Lógica similar al archivo de reasignación de CP1.

Post-piloto
DocumentoTipoParser backendUpload type
OC Cliente (PO)Trento Core DBAuto
Factura electrónicaPDFparse_factura_exportacion_pdfcp9_factura
Guía de RemisiónPDFparse_guia_remision_despacho_pdf → extrae fecha cierrecp9_guia_remision
Bill of LadingPDFparse_bl_pdfcp9_bl
DAMPDFparse_dam_pdfcp9_dam
DUAPDFSolo metadata (*)cp9_dua
BookingPDFparse_booking_pdfcp9_booking
MOB

App Mobile (Android Java) — Tareas para Andrés

Handoff
📱
Stack: Android Java nativo · Retrofit 2.9.0 · Flujo genérico CP7/CP8/CP9 usan CheckpointFragmentVerificarFragmentCompletarFragment. Solo CP6 tiene screens dedicadas. CP9 es backoffice/dashboard — out of scope para mobile.
🎨
D1 — CP7 Verificar: tabla inspección por color

El backend ya retorna inspecciones_por_color: {"BLACK": 299, ...} en la respuesta precargada.
Actualizar VerificarFragment.java: cuando cp_num == 7 y inspecciones_por_color != null, mostrar RecyclerView con columnas COLOR | PRIMERAS EFECTIVAS + fila de totales.
Si porcentaje_primeras < 95.0: badge rojo "⚠ {porcentaje}%".
Verificar si PrecargadoResponse ya tiene estos campos o agregarlos al modelo Gson.

CP7
D2 — CP7 Completar: botón Aprobado/Rechazado + alerta desglose

En CheckpointConfig.java (CP7): quitar campos manuales de prendas (el backend los auto-deriva). Agregar resultado_calidad con valores ["aprobado", "rechazado"].
En CompletarFragment.java: renderizar resultado_calidad como dos botones toggle (Aprobado verde / Rechazado rojo).
Al recibir response: si desglose.alerta == true, mostrar Snackbar: "Diferencia vs CP6: {diferencia} prendas ({porcentaje_variacion}%). Puede continuar."

CP7
📦
D3 — CP8 Verificar: tabla combinada colores (= B2)

Cuando cp_num == 8 y backend retorna colores_cp8: mostrar RecyclerView con columnas COLOR | PRIMERAS EFECTIVAS | PACKING LIST | DIFERENCIA.
Diferencias negativas en rojo. Label "Total cajas: {N}" debajo.
Bloqueado por B1 — implementar cuando backend esté en develop.

Post B1

Datos de prueba

// OP-6989 · Hábitat · Estilo 27553
GS1-128 checkin: "(10)OP-6989(240)T001-22621"
Backend:         https://dev-back.dpp.fintechlab.la

// CP7 Completar — payload mínimo
POST /api/v1/checkpoints/7/lote/{lote_id}/completar
{
  "resultado_calidad": "aprobado"
  // prendas_* se auto-derivan desde cp7_inspecciones
}

// CP7 Completar — response desglose
{
  "desglose": {
    "primeras": 1814, "segundas": 31,
    "diferencia": 0, "porcentaje_variacion": 0.0, "alerta": false
  }
}

// inspecciones_por_color (en GET precargado CP7)
{
  "BLACK": 299, "FUCHSIA": 119, "HARBOR": 313,
  "HONEY": 166, "LENTIL": 139, "SIENNA": 299,
  "TEAL": 141, "WINTER WHITE": 338
}
// total_pedido: 1884 · total_primeras_efectivas: 1814 · porcentaje_primeras: 96.3
ArchivoCambioTarea
fragment/VerificarFragment.javaRecyclerView tabla colores CP7 + badge %D1
checkpoint/CheckpointConfig.javaCP7 fields: quitar prendas manuales, agregar resultado_calidadD2
fragment/CompletarFragment.javaToggle Aprobado/Rechazado + Snackbar alertaD2
network/model/PrecargadoResponse.java (verificar)Agregar campos inspecciones_por_color si no existenD1
fragment/VerificarFragment.javaRecyclerView packing list CP8D3
⚙️

Decisiones técnicas confirmadas

Storage PDFs
Solo metadata en upload_audits. Sin almacenamiento de contenido.
Tabla despachos
Ya existe (40+ campos). Agregar codigo_expediente + fecha_guia_remision via migración.
Despachos parciales
Post-piloto. No implementar para Hábitat.
CP9 en mobile
Out of scope. Es backoffice/dashboard.
AQL CP7
No transcribir datos retroactivos. Solo adjuntar PDF + marcar Aprobado/Rechazado.
Fecha cierre CP9
Fecha Guía de Remisión (no fecha factura). Parser existente la extrae del PDF.