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
4deb9d4e4d
commit
f0ad6aa78e
20 files changed
+991
-130
No files matched your search
+11
-3
@@ -1,10 +1,13 @@
|
||||
import os
|
||||
import sqlite3
|
||||
|
||||
# ============================================================================
|
||||
# CONFIGURACIÓN
|
||||
# ============================================================================
|
||||
|
||||
DB_NAME = "emails.db"
|
||||
# Junto al código, no relativa al directorio de trabajo: el demonio (por ejemplo como servicio de
|
||||
# Windows) puede lanzarse desde cualquier carpeta y debe encontrar siempre la misma base.
|
||||
DB_NAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "emails.db")
|
||||
|
||||
# ============================================================================
|
||||
def init_db() -> None:
|
||||
@@ -48,14 +51,19 @@ def init_db() -> None:
|
||||
notificacion_error TEXT,
|
||||
notificacion_fecha TEXT,
|
||||
notificacion_destinatario TEXT,
|
||||
intentos INTEGER NOT NULL DEFAULT 0,
|
||||
creado_en TEXT NOT NULL,
|
||||
actualizado_en TEXT NOT NULL
|
||||
)
|
||||
''')
|
||||
# Bases creadas antes de agregar una columna: se añade sin tocar los datos.
|
||||
columnas = {fila[1] for fila in cursor.execute("PRAGMA table_info(comprobantes)")}
|
||||
if "notificacion_destinatario" not in columnas:
|
||||
cursor.execute("ALTER TABLE comprobantes ADD COLUMN notificacion_destinatario TEXT")
|
||||
for columna, definicion in (
|
||||
("notificacion_destinatario", "TEXT"),
|
||||
("intentos", "INTEGER NOT NULL DEFAULT 0"),
|
||||
):
|
||||
if columna not in columnas:
|
||||
cursor.execute(f"ALTER TABLE comprobantes ADD COLUMN {columna} {definicion}")
|
||||
|
||||
cursor.execute('''
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS ux_comprobantes_documento
|
||||
|
||||
Reference in new issue
Block a user