Integracion con Procura
Flujo: De Requisicion Interna a Compra
Cuando un item de una requisicion de material no tiene stock disponible en el almacen, se enruta al modulo de Procura para iniciar el proceso de compra. El sistema crea un Analisis de Procura (ProcurementAnalysis) que gestiona todo el ciclo hasta la recepcion del material.
graph LR
A[Requisicion de Material] -->|Sin stock| B[Enrutar a Procura]
B --> C[Analisis de Procura]
C --> D[Cotizacion y Analisis]
D --> E[Asignacion de Proveedores]
E --> F[Ordenes de Compra]
F --> G[Recepcion de Material]
G -->|STOCK_REPLENISHMENT| H[Requisicion FULFILLED]
G -->|Otro proposito| I[Requisicion READY_FOR_DISPATCH]
I --> J[Logistica despacha]
J --> H
Creacion del Analisis de Procura
Cuando logistica enruta items a procura (via /fulfill-and-procure o /route-procurement), el sistema crea automaticamente un ProcurementAnalysis:
Datos que se propagan
| Dato | Origen | Destino |
|---|---|---|
| Titulo | Auto-generado | "Analisis de Procura - {codigo_requisicion}" |
| Requisicion origen | MaterialRequisition.id | ProcurementAnalysis.materialRequisitionId |
| Items | MaterialRequisitionItem | ProcurementAnalysisItem |
| Descripcion del item | MaterialRequisitionItem.description | ProcurementAnalysisItem.description |
| Cantidad | Cantidad pendiente (no despachada) | ProcurementAnalysisItem.quantity |
| Unidad | MaterialRequisitionItem.unit | ProcurementAnalysisItem.unit |
| Item de inventario | MaterialRequisitionItem.inventoryItemId | ProcurementAnalysisItem.inventoryItemId |
| Vinculo de trazabilidad | MaterialRequisitionItem.id | ProcurementAnalysisItem.materialRequisitionItemId |
Actualizacion de Items
Al enrutarse a procura, cada item de la requisicion se actualiza:
fulfillmentStatuscambia aPROCUREMENT(oPARTIALsi ya tenia despacho parcial)procurementQuantityse incrementa con la cantidad enrutadametadataregistra: quien enruto, cuando, y el ID/codigo del analisis de procura creado
Estado de la Requisicion
Segun el resultado de la operacion:
| Escenario | Estado resultante |
|---|---|
| Todos los items enrutados a procura, ninguno despachado | AWAITING_PROCUREMENT |
| Algunos despachados, otros en procura | PARTIALLY_FULFILLED |
| Todos despachados | FULFILLED |
Trazabilidad
El sistema mantiene trazabilidad completa en toda la cadena:
MaterialRequisitionItem
-> ProcurementAnalysisItem.materialRequisitionItemId
-> SupplierAllocation.procurementAnalysisItemId
-> PurchaseOrderItem
-> InventoryMovement (ENTRY al recibir)
- La vista de detalle de la requisicion muestra el estado de cada item: si fue despachado del almacen o si esta en proceso de compra
- El
fulfillmentStatusdel item se actualiza automaticamente a traves del ciclo
Cierre de Ciclo: Recepcion de OC
Cuando la Orden de Compra generada desde el analisis de procura se recibe completamente, el sistema cierra el ciclo automaticamente:
Segun proposito de la requisicion
| Proposito | Accion al recibir OC | Estado final |
|---|---|---|
STOCK_REPLENISHMENT | Items marcados como FULFILLED automaticamente. Stock ya actualizado por la recepcion | FULFILLED |
Otros (DEPARTMENT_ASSIGNMENT, PROJECT_ASSIGNMENT, ASSET_ASSIGNMENT) | Requisicion pasa a READY_FOR_DISPATCH. Logistica debe despachar manualmente | READY_FOR_DISPATCH |
Proceso automatico
- El
PurchaseOrderReceiptServicedetecta que la OC esta completa (todos los items recibidos) - Busca el
ProcurementAnalysisvinculado a la OC (viametadata.purchaseOrderIds) - Obtiene la
MaterialRequisitionvinculada al analisis - Sincroniza
inventoryItemIdde items de OC -> items de analisis -> items de requisicion - Actualiza el estado de la requisicion segun el proposito
- Registra la transicion en el
ActivityTimeline - Envia notificaciones
Notificacion por recepcion parcial
Cada vez que se recibe material de una OC (aunque sea parcial), si la requisicion esta en estado AWAITING_PROCUREMENT:
- La requisicion pasa automaticamente a
READY_FOR_DISPATCH - Se notifica a usuarios con permiso
requisitions:fulfill(equipo de logistica) - El mensaje incluye el codigo de la OC y la requisicion
Notificaciones
Al enrutar a procura
- Destinatario 1: Solicitante original -- se le informa que sus items requieren compra
- Destinatario 2: Personal de procura (usuarios con permiso
procurement:createoprocurement:*) - Contenido: Numero de items, codigo de requisicion, estimado total
Al recibir material (AWAITING_PROCUREMENT -> READY_FOR_DISPATCH)
- Destinatario: Personal de logistica (usuarios con permiso
requisitions:fulfill) - Contenido: Material recibido de OC {codigo}, requisicion {codigo} tiene items listos para despacho
- Prioridad: Alta
Al completar ciclo (STOCK_REPLENISHMENT -> FULFILLED)
- Destinatario: Solicitante original
- Contenido: Los materiales de tu requisicion {codigo} han sido recibidos y el stock ha sido actualizado
Ejemplo Completo
- Juan del departamento de Produccion solicita 50 metros de tuberia 4" y 10 valvulas check
- Su gerente aprueba -> director aprueba -> requisicion RM-2026-0015 en estado
APPROVED - El almacenista Pedro verifica stock:
- Tuberia 4": 30m disponibles (parcial)
- Valvulas check: 0 disponibles
- Pedro usa Despacho + Procura combinado:
- Despacha 30m de tuberia (movimiento EXIT generado)
- Enruta a procura: 20m de tuberia + 10 valvulas check
- Se crea Analisis de Procura PA-2026-0008 vinculado a RM-2026-0015
- Requisicion pasa a
PARTIALLY_FULFILLED - Contratacion analiza, asigna proveedores, director aprueba
- Se genera OC-2026-0033 al proveedor
- Al recibir el material, la requisicion pasa a
READY_FOR_DISPATCH - Pedro recibe notificacion, abre la requisicion y despacha los items restantes
- Requisicion RM-2026-0015 pasa a estado
FULFILLED