📦 Flujo Completo: OC SAP → Recepción WMS → Stock Disponible

XPert WMS · COMFAR Paraguay · Cumplimiento DINAVISA / GAMP 5 / 21 CFR Part 11
📋 9 Etapas 🔒 Audit Trail 👤 Roles segregados 🏥 Trazabilidad farmacéutica 🔄 Sync bidireccional SAP B1
9
Etapas del flujo
~30
Eventos audit
5
Roles
15+
Endpoints API

Flujo de alto nivel

SAP B1
Compras
Importar OC
Modal pro
Agenda
Auto-asignada
Operador RF
Escanea
Cerrar
PDN SAP
Disponible
Para picking
Putaway
Bin definitivo
QA Liberar
Control calidad
Cuarentena
QA
Stock QA
CEN-REC

Tiempo total estimado

  • Importación OC + agenda: ~10 segundos
  • Asignación automática: instantánea
  • Recepción física (por línea): 30s/item
  • Cierre + sync SAP: ~5 segundos
  • QA aprobación: 1-3 minutos
  • Putaway por unidad: ~45 segundos

Garantías regulatorias

  • Audit trail por cada acción → 21 CFR Part 11
  • Lote en cuarentena automática → BPM farmacéutica
  • Trazabilidad lote/vencimiento → DINAVISA
  • Segregación de funciones por rol → GAMP 5
  • Reconciliación SAP ↔ WMS → integridad
👥

Roles involucrados

  • Comprador SAP Crea OC en SAP B1
  • supervisor Importa OC a WMS
  • op_recepcion Auto-asignado, escanea
  • qa_liberador Aprueba lote QA
  • op_almacen Ejecuta putaway
1

Crear Orden de Compra en SAP B1

Comprador SAP

Acción

  • Usuario de Compras crea OC en SAP B1 (módulo OPOR)
  • Define Proveedor (CardCode)
  • Define Sucursal (BPLId — ej: 1 = Central)
  • Carga líneas: ItemCode, Quantity, BaseLine, UoM, Almacén destino
  • Documento queda en estado bost_Open

Resultado en SAP

DocEntry: 24047 DocNum: 10728 CardCode: "P1276" CardName: "MACRO SCIENCE S.A." BPL_IDAssignedToInvoice: 1 BPLName: "Central" DocumentStatus: "bost_Open" DocumentLines: [...]
2

Importar OC al WMS

supervisor / admin

Acción usuario

  • Login WMS → menú 7 - Sistema → Integración SAP
  • Click Órdenes de Compra → lista vía Service Layer
  • Click "Importar" en la OC deseada
  • Modal profesional muestra: cabecera, líneas, validación catálogo, BPL, indicador de op_recepcion online
  • Click "Confirmar e Importar"

Acción backend

  • POST /api/agendas/import-sap-po
  • Crea reception_agendas (DRAFT)
  • Llama addReference → trae OC de SAP, persiste líneas y BPLId
  • Si user.role=op_recepcion → auto-asigna a sí mismo
  • Si no → busca op_recepcion online (last_activity ≤ 15min) con menor carga
  • Audit: AGENDA_CREATE + AGENDA_ADD_REF + AGENDA_ASSIGN
3

Agenda creada y asignada

Sistema

Estado en BD

TablaRegistrosStatus
reception_agendas1 (AG-00000001)DRAFT
reception_agenda_refs1 (OC 10728, bpl_id=1)PENDING
reception_agenda_linesN (líneas de la OC)PENDING
audit_log3 eventos
4

Operador entra en RF y comienza recepción

op_recepcion

Acción usuario

  • Login en rf.html con su usuario op_recepcion
  • Filtro automático: solo ve agendas asignadas a él
  • Selecciona la agenda → auto-abre (DRAFT → OPEN)
  • Pantalla muestra: número de OC, líneas esperadas, totales
  • Escanea código de barras del producto

Acción backend

  • POST /api/agendas/{id}/open
  • Cambia status DRAFT → OPEN
  • Audit: AGENDA_OPEN
  • Heartbeat users.last_activity_at actualizado
5

Escanear líneas de mercadería

op_recepcion

Acción

  • Operador escanea EAN: 4711228420285
  • Ingresa cantidad, lote, vencimiento, lote proveedor
  • Confirma escaneo
  • UI actualiza progreso visual (% recibido)

Backend resuelve barcode

// Resolución contra catálogo: SELECT id, item_code FROM items WHERE barcode = '4711228420285' OR item_code = '4711228420285' OR sap_item_code = '4711228420285'; // → resuelve a item_code 154906 // Match con línea de agenda por item_id // Status: PENDING → PARTIAL / COMPLETED / OVER
📝 Cada escaneo genera audit AGENDA_SCAN con: línea, cantidad, lote, status nuevo, IP del operador.
6

Cerrar agenda → Crear PDN en SAP

op_recepcion / supervisor

UI Modal de cierre

  • Modal muestra resumen: líneas COMPLETAS / PARCIALES / NO RECIBIDAS / EXCEDENTES
  • Tabla de discrepancias con badges por estado
  • Aviso de qué se enviará a SAP (PDN por cada OC con líneas recibidas)
  • Click "Confirmar Cierre"

Backend

  • POST /api/agendas/{id}/close
  • Por cada ref con líneas: arma payload PDN con BPL_IDAssignedToInvoice
  • POST /PurchaseDeliveryNotes al Service Layer
  • Si OK → ref.status=COMPLETED, sap_sync_log SUCCESS, DocEntry guardado
  • Si error → ref.status=ERROR, sap_sync_log ERROR (retry disponible)
  • Llama createStockEntries → genera stock + movimientos
  • Audit: AGENDA_CLOSE + BATCH_INTO_QA
// Payload enviado a SAP: { "CardCode": "P1276", "DocDate": "2026-04-30", "BPL_IDAssignedToInvoice": 1, "DocumentLines": [ { "ItemCode": "154906", "Quantity": 1, "BaseType": 22, // PurchaseOrder "BaseEntry": 24047, "BaseLine": 0, "BatchNumbers": [ { "BatchNumber": "L-BPL-OK", "Quantity": 1, "ExpiryDate": "2027-12-31" } ] } ] }
7

Stock generado en cuarentena

Sistema

Estado posterior al cierre

Tabla / SAPResultado
reception_agendasAG-00000001 CLOSED
reception_agenda_refsOC 10728 COMPLETED
batchesL-BPL-OK QA (vto 2027-12-31)
stock1 unidad en bin CEN-REC QA
stock_movementsRECEIPT registrado
sap_sync_logDOC_RECEPTION_AGENDA SUCCESS
SAP B1PDN DocEntry 7310 / DocNum 2907 ✓
⚠️ El stock NO está disponible aún. Está en cuarentena (QA) en el bin de recepción CEN-REC. Requiere aprobación de Calidad para liberarse.
8

Control de Calidad — Aprobar / Rechazar / Cuarentena

qa_liberador

UI Modal QA

  • Login con rol qa_liberador
  • Menú 2 - Calidad → Control QA
  • Lista lotes en cuarentena → click "Liberar"
  • Modal profesional con 3 opciones:
    • Aprobar → QA → AVAILABLE
    • Rechazar → QA → BLOCKED (motivo obligatorio)
    • Cuarentena ext. → QA + fecha re-evaluación

Backend

  • POST /api/qa/batches/{id}/approve
  • Cambia batches.status y todo el stock asociado
  • Inserta registro en qa_decisions
  • Movimiento QA_APPROVE en stock_movements
  • Audit doble: QA_APPROVE (en qa_decisions) + BATCH_QA_APPROVED (en batches, para timeline)
9

Putaway → Stock disponible para venta

op_almacen

Acción

  • Sistema generó tarea WT-XXXXXXXX tipo PUT (auto si auto_putaway=1)
  • op_almacen entra a rf.htmlAlmacenamiento
  • Escanea LPN/item desde CEN-REC
  • Sistema sugiere bin destino o operador escanea libre
  • Confirma → stock se mueve al bin definitivo

Estado final

CampoValor
binCEN-A01 (storage)
stock_statusAVAILABLE
quantity1 UND
batchL-BPL-OK (vto 2027-12-31)
warehouse_taskCOMPLETED
Listo para picking, packing y despacho. El item es vendible y aparece en consultas FEFO.

⚙️ Endpoints API utilizados

EtapaMétodoEndpointPropósito
2GET/api/sap/purchase-ordersListar OCs abiertas en SAP
2GET/api/sap/purchase-orders/{e}/linesLíneas de OC + BPL
2GET/api/users/online?role=op_recepcionOp_recepcion online
2POST/api/agendas/import-sap-poCrear agenda + ref + asign
4GET/api/agendas?warehouse_id=XLista agendas (rf filtra por user)
4POST/api/agendas/{id}/openAbrir agenda
5POST/api/agendas/{id}/scanRegistrar escaneo
6GET/api/agendas/{id}/differencesDiscrepancias para modal
6POST/api/agendas/{id}/closeCerrar + crear PDN SAP
6POST/api/agenda-refs/{id}/retry-sapReintentar PDN si SAP rechazó
8GET/api/qa/pendingLotes en cuarentena
8POST/api/qa/batches/{id}/approveLiberar lote
8POST/api/qa/batches/{id}/rejectRechazar lote
8POST/api/qa/batches/{id}/quarantineCuarentena extendida
9POST/api/tasks/{id}/completeCerrar tarea PUT
*GET/api/audit?table_name=X&record_id=YAudit trail por entidad

🗄️ Tablas BD impactadas

📋 Agendas

  • • reception_agendas
  • • reception_agenda_refs (con bpl_id)
  • • reception_agenda_lines
  • • reception_scans

📦 Stock

  • • batches
  • • stock
  • • stock_movements
  • • stock_blocks

🔍 Calidad

  • • qa_decisions
  • • sampling_requests
  • • qc_external_requests

🔄 Sincronización

  • • sap_sync_log
  • • inventory_documents
  • • warehouse_tasks (PUT)

🌐 Integraciones externas

SistemaURLAuth
SAP B1 Service Layerhttps://200.10.10.151:50000/b1s/v1izi / Sap1234. / DB COMFAR20260422
SAP HANA200.10.10.151:30015SAPINST / CFR!Art205
WMS públicohttps://comfar-middleware.duckdns.org:8443/WMS/JWT Bearer
Middleware webhook/WebhookClient/CallbackHMAC + secret

🔍 Audit Trail completo del flujo

#Acción auditTablaCuándoQuién
1AGENDA_CREATEreception_agendasImportar OC SAPimportador
2AGENDA_ADD_REFreception_agenda_refsAsociar OC a agendaimportador
3AGENDA_ASSIGNreception_agendasAuto-asignar a op_recepcionimportador → asignee
4AGENDA_OPENreception_agendasOperador abre agenda RFop_recepcion
5AGENDA_SCANreception_agenda_linesCada escaneo de líneaop_recepcion
6AGENDA_CLOSEreception_agendasCierre de agendaop_recepcion / supervisor
7BATCH_INTO_QAbatchesStock entra a cuarentenasistema
8QA_APPROVE / REJECT / QUARANTINEqa_decisionsDecisión calidadqa_liberador
9BATCH_QA_APPROVEDbatchesEspejo en timeline loteqa_liberador
10PUT_CONFIRMwarehouse_tasksTarea putaway completadaop_almacen
📌 Cada evento guarda: table_name, record_id, action, old_values, new_values (JSON), user_id, ip_address, created_at. Listo para auditoría DINAVISA inmutable.

📊 Cumplimiento DINAVISA / GAMP 5

✓ Cubierto

  • ✓ Audit trail efectivo (Anexo 11 / Part 11)
  • ✓ Trazabilidad lote → cliente
  • ✓ Cuarentena automática
  • ✓ Segregación de funciones por rol
  • ✓ SOPs vigentes (7 documentos)
  • ✓ Protocolos IQ/OQ/PQ redactados
  • ✓ Sincronización bidireccional SAP
  • ✓ Validación de vida útil mínima

⏳ Pendiente

  • ○ Firma electrónica (reauth + motivo)
  • ○ URS / FS / RA documentos formales
  • ○ Versionado git del código
  • ○ Test suite PHPUnit
  • ○ IQ/OQ/PQ ejecutados con evidencia
  • ○ Change Control formal
  • ○ Training records por usuario/SOP
  • ○ Sensores temperatura conectados