se valida si la factura ya existe en SAP y se avisa cuando SAP está fuera de línea
- sapb1_manager.buscar_factura_existente busca la factura (proveedor, tipo, serie, número) en facturas de compra no anuladas y en drafts; si existe no se crea otro draft y se responde "ya está registrada" sin pisar el registro de una aceptación anterior. - SapNoDisponible (subclase de ConnectionError) distingue una caída (timeout, sin conexión, HTTP 5xx) de un rechazo normal de SAP (HTTP 4xx). Una caída de Service Layer con HANA sin resultados ya no se lee como "guía no existe". - Con SAP o HANA caídos se avisa una sola vez al proveedor con la plantilla "En cola" y el correo se reintenta en los ciclos siguientes (hasta 24), sin repetir avisos; al agotarse se avisa al equipo. - La lógica por factura pasa a _procesar_factura; lo ya resuelto dentro de un correo no se repite al reintentarlo. - seguimiento: columna intentos (con migración), registrar_intento y el estado de notificación en_espera. - database_utilities.DB_NAME pasa a ser absoluto (junto al código). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
5e533b7a9f
commit
1c57988f54
20 files changed
+991
-130
No files matched your search
+11
-6
@@ -70,12 +70,15 @@ flowchart TD
|
||||
O -- No --> RC
|
||||
O -- Sí --> P[Bucle: por cada factura]
|
||||
|
||||
P --> Q[12. validate_prices]:::highlight
|
||||
P --> P2{11.5 ¿Ya existe en SAP?}
|
||||
P2 -- Sí --> V
|
||||
P2 -- No --> Q[12. validate_prices]:::highlight
|
||||
Q --> Q2[12.5 obtener_valor_referencial_sap]
|
||||
Q2 --> R[13. build_sap_draft]:::highlight
|
||||
R --> S[14. guardar_draft_json]
|
||||
S --> T{¿Error de SAP/HANA?}
|
||||
T -- Sí --> X[estado error]
|
||||
S --> T{¿SAP/HANA caídos<br>u otro error?}
|
||||
T -- Caída --> FL[estado fuera de línea:<br>aviso 'En cola' una vez<br>y el correo se reintenta]
|
||||
T -- Otro error --> X[estado error]
|
||||
T -- No --> T2{Todas coinciden?}
|
||||
T2 -- Sí --> U[15. sapb1_manager.create_draft]
|
||||
T2 -- No --> V[estado rechazado + observaciones]
|
||||
@@ -83,6 +86,7 @@ flowchart TD
|
||||
U2 --> W[16. Correo técnico al equipo<br>+ respuesta con plantilla al remitente]
|
||||
V --> W
|
||||
X --> W2[16. Correo técnico al equipo<br>NO se responde al proveedor]
|
||||
FL --> P
|
||||
W --> P
|
||||
W2 --> P
|
||||
|
||||
@@ -193,12 +197,13 @@ run_pipeline
|
||||
| Resultado de la factura | Correo técnico (tablas de SAP, JSON adjuntos) | Respuesta con plantilla |
|
||||
|-------------------------|-----------------------------------------------|-------------------------|
|
||||
| `aceptado` (draft creado) | Equipo | Aceptado, al remitente |
|
||||
| `rechazado` (precio, guía…) | Equipo | Rechazado con observaciones, al remitente |
|
||||
| `error` (SAP/HANA, fallo inesperado) | Equipo | **Ninguna**: es una falla nuestra, no del proveedor |
|
||||
| `rechazado` (precio, guía, o la factura **ya existe en SAP**) | Equipo | Rechazado con observaciones, al remitente |
|
||||
| `fuera_de_linea` (SAP o HANA no responden) | Equipo (primer intento y al agotarse) | "En cola", **una sola vez**; el correo se reintenta |
|
||||
| `error` (fallo inesperado, rechazo normal de SAP) | Equipo | **Ninguna**: es una falla nuestra, no del proveedor |
|
||||
| Correo sin comprobante válido (sin PDF/XML, sin XML, sin factura) | — | Rechazado sin comprobante, al remitente |
|
||||
| Correo sin adjuntos | — | Ninguna |
|
||||
|
||||
"Al remitente" depende de `NOTIFICACION_MODO` (en modo `prueba` va al equipo) y de las protecciones. Todo en [respuesta_proveedor.md](respuesta_proveedor.md).
|
||||
|
||||
Un fallo inesperado al procesar una factura ya no interrumpe el ciclo: se registra como `error`, se avisa al equipo y se sigue con la siguiente.
|
||||
Un fallo inesperado al procesar una factura ya no interrumpe el ciclo: se registra como `error`, se avisa al equipo y se sigue con la siguiente. La lógica por factura vive en `_procesar_factura`; `_procesar_un_correo` la llama una vez por factura y, si alguna pide reintento, deja el correo en cola.
|
||||
|
||||
Reference in new issue
Block a user