- Nueva página docs/sapb1_manager.md: sesión, funciones, clasificación de
errores (SapNoDisponible frente a rechazo de SAP), búsqueda de facturas
existentes y cómo se ubica una guía.
- procesar_pdfs.md y procesar_xmls.md usaban los nombres anteriores a la
división de pipeline.py (_procesar_pdfs, _ruta_carpeta...) y números de
línea que envejecen; ahora apuntan a documentos.py.
- inventario.md: árbol de dependencias con los módulos nuevos.
- pipeline.md: _procesar_factura, importes_coinciden, hana_disponible y
buscar_factura_existente; validar_precios.md, hana_manager.md, main.md y
procesar_xmls.md con las notas que faltaban; README sin la cifra de pruebas
vieja.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- 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>
El sistema contesta a quien envió el correo con la plantilla que corresponda.
Por defecto (NOTIFICACION_MODO=prueba) la respuesta va solo al equipo con el
asunto "[PRUEBA → remitente]"; en modo real va al remitente con copia oculta
al equipo. El correo técnico (tablas de SAP, JSON) pasa a ir solo al equipo.
- respuesta_proveedor.py: contextos de las plantillas, envío y protecciones
(remitente desconocido o sin dominio, propio buzón, no-reply, mensajes
automáticos, respuestas a notificaciones, límite de 3 por remitente/24 h).
- observaciones.py: motivos de rechazo con título, filas y cómo corregir
(borrador de textos); también para correos sin comprobante válido.
- Un error de SAP/HANA o un fallo inesperado no se le comunica al proveedor y
ya no tumba el ciclo; "guía no encontrada" exige que HANA responda.
- outlook_utilities: es_mensaje_automatico y copia oculta en send_email.
- seguimiento: notificacion_destinatario (con migración) y
contar_respuestas_correo.
- config_validator anuncia el modo activo; documentación y pruebas.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Las funciones anidadas de _procesar_un_correo pasan a funciones de módulo
con parámetros explícitos; pipeline.py queda solo como orquestador.
copiar_a_red lee las variables de entorno al ejecutarse. Se actualizan docs.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
- hana_manager.get_delivery ahora busca en ODLN y, si no encuentra, en OWTR
- sapb1_manager resuelve StockTransfers -> Orders (via U_IDC_NUMOV) para
validar precios de flete cuando la guia es un traslado de inventario
- se corrige el orden de parametros tipo/serie/numero (sin cruces) en
get_delivery, get_delivery_notes y _get_delivery_entries
- se agrega sapb1_manager.obtener_condicion_pago (BusinessPartners +
PaymentTermsTypes) y pipeline._calcular_fecha_vencimiento para que
DocDueDate del draft sea fecha de contabilizacion + dias de la condicion
de pago del proveedor
- se agrega variante de regex para "VALOR REFER" truncado en sunat_schema.py
- se actualiza documentacion (docs/) reflejando estos cambios
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>