Módulo de Pagos a Proveedores — Requerimientos¶
Estado: Cerrado para entrega (2026-07-08). Las definiciones fueron validadas por las pruebas de los docs 02 (Service Layer) y
03(en_borradores/, no publicado) (banco). Fecha de inicio: 2026-07-07 Actualizado 2026-08-06: Def. 11 — reintento ante fallo de la carga bancaria.
Requerimiento del negocio¶
Usuarios de compras solicitan una solución que permita solicitar pagos a proveedores.
- Las solicitudes deben ser aprobadas por encargados de pagos.
- Luego de la confirmación, el sistema deberá registrar un pago efectuado para que SAP efectúe el asiento contable correspondiente.
Modelo de referencia¶
Se seguirá el modelo ya implementado en el módulo de cobros (src/modules/payments/):
solicitud como borrador en SAP (sin impacto contable) → aprobación → conversión en pago
efectuado (documento contable en SAP).
Flujo funcional¶
- El usuario de Compras crea una solicitud de pago a un proveedor (si es transferencia, se carga también la operación en el banco).
- La transferencia se autoriza en la aplicación del banco (fuera del OMS — esa es la aprobación real del dinero).
- El sistema detecta la transferencia ejecutada en el extracto y confirma automáticamente la solicitud: registra el pago efectuado en SAP, que genera el asiento contable. Si no puede determinar el egreso de forma inequívoca, la confirmación la hace Tesorería manualmente mirando los egresos del extracto.
Definiciones funcionales¶
1. Roles¶
Dos roles: Compras (solicitante) y Tesorería (confirma manualmente cuando la confirmación automática no aplica — ver Def. 6 — y registra pagos directos). No habrá más roles por ahora.
2. Datos de la solicitud¶
- Se infieren de la entidad
VendorPaymentsde SAP; serán básicamente los mismos datos que la solicitud de cobros, más los datos del proveedor para la transferencia (BPBankAccounts+ moneda de la cuenta — detallado en doc 03 §6b). - Integración bancaria: la solicitud de pago (PaymentDraft) con tipo de pago transferencia produce la carga de la operación en la API del Banco Continental al momento de solicitar (detallado en doc 03).
3. Medios de pago¶
Los soportados por el pago de SAP: tarjetas, transferencias, etc.
4. Aplicación del pago (regla central)¶
El alta de facturas de compra queda fuera del OMS: se registran en SAP. Aquí solo se asignan facturas existentes al pago al solicitar, de la misma forma que hoy se hace en cobros con invoices:
- La solicitud debe tener siempre al menos un
PaymentInvoice: o una factura, o un anticipo. - Contra factura: el monto aplicado puede ser inferior o igual al saldo de la factura. Nunca superior.
- Sin factura: deberá existir/crearse un anticipo (DownPayment) por el valor del pago. Es lo que SAP soporta para la conciliación posterior del anticipo contra una factura.
Fundamento (validado en pruebas, ver doc 02 § B2b): SAP no impide el sobrepago — lo
acepta, recorta lo aplicado al saldo y registra el excedente como pago a cuenta del
proveedor. Ese pago a cuenta no se reconcilia automáticamente, porque no tiene un
documento de anticipo que luego pueda aplicarse contra una factura: queda como saldo
suelto a conciliar manualmente. Por eso la validación del monto es responsabilidad del
OMS (contra DocTotal - PaidToDate) y todo pago sin factura debe canalizarse por la vía
del anticipo explícito, nunca como pago a cuenta.
5. Ciclo de vida¶
- La solicitud puede ser borrada (se elimina el borrador).
- Un pago confirmado no puede borrarse ni anularse desde el OMS: eso lo hace el departamento de contabilidad directamente en SAP. No es competencia de este sistema.
6. Proceso de confirmación¶
La confirmación completa en el pago los datos de la transacción bancaria, obtenidos del extracto (egresos) del banco según la cuenta (PYG o USD) correspondiente a la moneda del pago. La regla (definida 2026-07-08, ver doc 03 §G4c):
- Automática (flujo principal): cuando el egreso del extracto puede determinarse de forma inequívoca — número de comprobante de la operación bancaria + monto iguales, reforzados por atributos extra (moneda, cuenta débito, RUC del beneficiario). La idea es quitar pasos siempre que se pueda.
- Manual (fallback): si no puede determinarse, Tesorería confirma seleccionando el egreso desde los extractos disponibles.
7. Visibilidad¶
Al ser solo dos roles y un grupo reducido de usuarios, no se aplican reglas de visibilidad por ahora: todos ven todas las solicitudes y pagos.
8. Notificaciones¶
Se utilizarán de la misma forma que en cobros, por medio de un grupo de Google, igual que se hace actualmente en cobros.
9. Trazabilidad¶
- Origen del pago: confirmado — el UDF
U_SalesPersonIDexiste en drafts y enVendorPayments(doc 02 §C1); ademásReference2guarda el ticket bancario. - Aprobación: la autorización real queda trazada en el banco (la consulta por ticket
expone
cargayautoriza, doc 03 §G4); en la confirmación manual, el confirmador queda registrado en la notificación (patrón cobros). La colecciónPayments_ApprovalRequestsde SAP queda fuera del MVP.
10. Registro directo de pagos ya efectuados¶
Se dará soporte para crear pagos ya efectuados (sin circuito de aprobación), siempre seleccionando el extracto del banco o el número de ticket correspondiente a la transacción (p. ej. si es por transferencia).
11. Fallo en la carga de la operación bancaria (definido 2026-08-06)¶
Cuando la solicitud se crea pero la carga en el banco falla, la solicitud no se descarta: queda registrada y el usuario puede reintentar la carga sin rehacer el formulario. El detalle técnico está en el doc 04 §5b; funcionalmente:
- La solicitud aparece en la bandeja como "Carga bancaria fallida", con acción de reintento disponible para Compras y Tesorería.
- El sistema nunca reintenta sin verificar antes contra el banco si la operación ya existe. Una doble carga es una transferencia real duplicada al proveedor, no anulable por API. Si esa verificación no puede hacerse, el reintento se bloquea y se informa el motivo — se prefiere trabar el circuito antes que arriesgar un pago doble.
- Caso aceptado sin solución (decisión): si la operación sí se cargó en el banco pero el sistema no llegó a guardar el número de ticket, no hay forma general de vincularlos desde el OMS por limitaciones de la API del banco. Se resuelve fuera del sistema. La verificación previa al reintento debe reconocer este caso para no duplicar, aunque no lo repare.
Temas profundizados / pendientes¶
| Tema | Estado |
|---|---|
| Datos del proveedor (cuenta bancaria + moneda) en la solicitud | ✅ Resuelto — doc 03 §6b; UDF U_Moneda creado en dev y producción (2026-08-06). Falta la carga de datos por cuenta |
| Integración con la API del Banco Continental | ✅ Resuelto — doc 03 (endpoints validados en sandbox) |
| Consulta de extractos (egresos) por cuenta PYG/USD | ✅ Resuelto — doc 03 §4.1 (sondeo condicional) y §6b (mapeo de cuentas) |
| Trazabilidad de la aprobación | ✅ Resuelto — Def. 9 actualizada |
| Mecanismo del "grupo de Google" (Def. 8) | ⏳ Abierto — no está en el backend de cobros; relevar |
| Reintento ante fallo de carga bancaria (Def. 11) | ✅ Resuelto — doc 04 §5b (dependen de él: doc 02 B7 y doc 03 G6, ambos pendientes) |
Historial¶
| Fecha | Cambio |
|---|---|
| 2026-07-07 | Versión inicial: requerimiento funcional del usuario. |
| 2026-07-07 | Definiciones funcionales 1–10 (roles, datos, medios de pago, regla de aplicación, ciclo de vida, aprobación, visibilidad, notificaciones, trazabilidad, pago directo). |
| 2026-07-08 | Def. 4: regla de sobrepago con fundamento (doc 02 §B2b); alcance de facturas (alta en SAP). Def. 6: confirmación automática como flujo principal, manual como fallback. Flujo funcional actualizado al modelo bancario. |
| 2026-07-08 | Pasada final: Def. 9 (trazabilidad confirmada), Def. 2 (referencias al doc 03), tabla de temas con estados. Cierre para entrega. |
| 2026-08-06 | Def. 11: la solicitud sobrevive al fallo de carga bancaria y es reintentable; verificación previa obligatoria contra el banco (nunca reintentar a ciegas); caso "cargado sin ticket" aceptado sin solución. Diseño en doc 04 §5b. |