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
@@ -233,3 +233,48 @@ def test_valor_referencial_consulta_una_vez_por_guia(monkeypatch):
|
||||
|
||||
assert llamadas == [("T001", "1"), ("T001", "2")]
|
||||
assert [r["valor_sap"] for r in resultado] == [7.5, 7.5]
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# Caídas de SAP y errores de consulta
|
||||
# ============================================================================
|
||||
def test_validate_prices_deja_pasar_una_caida_de_sap(sap, monkeypatch):
|
||||
def cae(**k):
|
||||
raise draft_sap.sapb1_manager.SapNoDisponible("sin conexión")
|
||||
monkeypatch.setattr(draft_sap.sapb1_manager, "get_delivery_notes", cae)
|
||||
factura = {"lineas": [{"cantidad": 1, "total_linea": 100.0, "guias_remision": [_guia()]}]}
|
||||
|
||||
with pytest.raises(draft_sap.sapb1_manager.SapNoDisponible): # no se disfraza de "error de la guía"
|
||||
draft_sap.validate_prices(factura)
|
||||
|
||||
|
||||
def test_validate_prices_marca_el_error_de_consulta_de_la_guia(sap, monkeypatch):
|
||||
def falla(**k):
|
||||
raise ValueError("respuesta rara de SAP")
|
||||
monkeypatch.setattr(draft_sap.sapb1_manager, "get_delivery_notes", falla)
|
||||
factura = {"lineas": [{"cantidad": 1, "total_linea": 100.0, "guias_remision": [_guia()]}]}
|
||||
|
||||
_, resultados = draft_sap.validate_prices(factura)
|
||||
|
||||
assert resultados[0]["guias_lt"][0]["error"] == "respuesta rara de SAP"
|
||||
assert draft_sap.hay_error_de_consulta(resultados) == "respuesta rara de SAP"
|
||||
|
||||
|
||||
def test_hay_error_de_consulta_sin_errores():
|
||||
assert draft_sap.hay_error_de_consulta([]) is None
|
||||
assert draft_sap.hay_error_de_consulta([{"guias_lt": [{"guia": {}, "line_total": 0.0}]}, {"guias_lt": []}]) is None
|
||||
|
||||
|
||||
def test_hana_disponible(monkeypatch):
|
||||
cerrada = []
|
||||
|
||||
class Conexion:
|
||||
def close(self):
|
||||
cerrada.append(True)
|
||||
|
||||
monkeypatch.setattr(draft_sap.hana_manager, "get_connection", lambda: Conexion())
|
||||
assert draft_sap.hana_disponible() is True and cerrada == [True] # abre y cierra: no deja conexiones colgando
|
||||
|
||||
monkeypatch.setattr(draft_sap.hana_manager, "get_connection", lambda: None)
|
||||
assert draft_sap.hana_disponible() is False
|
||||
|
||||
Reference in new issue
Block a user