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
@@ -210,3 +210,45 @@ def test_init_db_agrega_la_columna_a_una_tabla_creada_antes():
|
||||
seguimiento.registrar_notificacion("ABR-261001-00001", "enviada", destinatario="a@x.com")
|
||||
assert seguimiento.obtener("ABR-261001-00001")["notificacion_destinatario"] == "a@x.com"
|
||||
|
||||
|
||||
def test_registrar_intento_cuenta_de_uno_en_uno():
|
||||
r = seguimiento.registrar_comprobante("correo-1", *COMPROBANTE)
|
||||
assert r["intentos"] == 0
|
||||
|
||||
assert seguimiento.registrar_intento(r["codigo_seguimiento"]) == 1
|
||||
assert seguimiento.registrar_intento(r["codigo_seguimiento"]) == 2
|
||||
assert seguimiento.obtener(r["codigo_seguimiento"])["intentos"] == 2
|
||||
|
||||
|
||||
def test_registrar_intento_de_un_codigo_inexistente():
|
||||
with pytest.raises(LookupError):
|
||||
seguimiento.registrar_intento("ABR-000000-99999")
|
||||
|
||||
|
||||
def test_en_espera_es_un_estado_de_notificacion_valido():
|
||||
r = seguimiento.registrar_comprobante("correo-1", *COMPROBANTE)
|
||||
seguimiento.registrar_notificacion(r["codigo_seguimiento"], "en_espera", destinatario="a@x.com")
|
||||
assert seguimiento.obtener(r["codigo_seguimiento"])["notificacion_estado"] == "en_espera"
|
||||
|
||||
|
||||
def test_init_db_agrega_la_columna_intentos_a_una_tabla_anterior():
|
||||
conn = sqlite3.connect(database_utilities.DB_NAME)
|
||||
conn.executescript("""
|
||||
DROP TABLE comprobantes;
|
||||
CREATE TABLE comprobantes (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT, codigo_seguimiento TEXT UNIQUE, email_id TEXT NOT NULL,
|
||||
ruc_emisor TEXT, tipo TEXT, serie TEXT, numero TEXT, estado TEXT NOT NULL DEFAULT 'pendiente',
|
||||
observaciones TEXT, doc_entry INTEGER, veces_recibido INTEGER NOT NULL DEFAULT 1,
|
||||
notificacion_estado TEXT NOT NULL DEFAULT 'pendiente', notificacion_error TEXT, notificacion_fecha TEXT,
|
||||
notificacion_destinatario TEXT, creado_en TEXT NOT NULL, actualizado_en TEXT NOT NULL);
|
||||
INSERT INTO comprobantes (codigo_seguimiento, email_id, creado_en, actualizado_en)
|
||||
VALUES ('ABR-261001-00001', 'viejo', '2026-10-01 10:00:00', '2026-10-01 10:00:00');
|
||||
""")
|
||||
conn.commit()
|
||||
conn.close()
|
||||
|
||||
database_utilities.init_db()
|
||||
|
||||
assert seguimiento.obtener("ABR-261001-00001")["intentos"] == 0 # el valor por defecto se aplica a lo existente
|
||||
assert seguimiento.registrar_intento("ABR-261001-00001") == 1
|
||||
|
||||
Reference in new issue
Block a user