Files
GeorgeandClaude Sonnet 5.5 1d23e87b9b versión 1.2.2: horarios nocturnos unificados en dos tramos
HORARIOS pasa a 5 bloques que siguen cubriendo las 24 horas: 00:00-06:30 cada
30 minutos (antes 00:00-05:00 cada 60 s y 05:00-06:30 cada 30 min) y
18:30-24:00 cada 60 minutos (antes dos bloques iguales). El día no cambia.
De madrugada un correo puede esperar hasta 30 minutos y los reintentos por
SAP fuera de línea, uno por ciclo, van igual de espaciados.

Se ordena el formato de la lista, test_horarios fija el primer y el último
minuto de cada bloque (y que nunca se devuelva None en el día), y se
actualizan docs/main.md, la guía de despliegue y el CHANGELOG.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-22 15:36:48 -05:00

5.2 KiB
Raw Permalink Blame History

Historial de cambios

Las versiones siguen SemVer y se publican como etiquetas de git (v1.2.2). La versión vigente está en pyproject.toml y se muestra en el log al arrancar.

[1.2.2] — 2026-10-22

Cambiado

  • Horarios del demonio: la noche pasa a dos tramos, 00:00–06:30 cada 30 minutos y 18:30–24:00 cada 60 (antes: 00:00–05:00 cada 60 segundos, 05:00–06:30 cada 30 minutos, 18:30–21:30 y 21:30–24:00 cada 60). El día sigue igual. De madrugada un correo puede esperar hasta 30 minutos y los reintentos por SAP fuera de línea (uno por ciclo) van igual de espaciados. Los 5 bloques siguen cubriendo las 24 horas sin huecos.

[1.2.1] — 2026-10-22

Corregido

  • Tolerancia de importes: la diferencia entre el importe de la factura y el de SAP se redondea a 2 decimales (lo que muestra un comprobante) y se admite hasta 1 céntimo (pipeline_utils.importes_coinciden). Antes se comparaba abs(a - b) < 0.01 sin redondear, y por la coma flotante el mismo céntimo se aceptaba o se rechazaba según el importe: por ejemplo 431.41 contra 431.40 se rechazaba y 624.39 contra 624.38 se aceptaba. Con datos reales de SAP, ninguna línea cambió de resultado, así que no se acepta nada que antes se rechazara con razón. También se aplica a la comparación del valor referencial del correo técnico.

[1.2.0] — 2026-10-22

Agregado

  • Respuesta al proveedor con las plantillas HTML de aceptado y rechazado (plantilla/), enviada a quien envió el correo. Ver docs/respuesta_proveedor.md.
    • NOTIFICACION_MODO: prueba (por defecto; la respuesta va al equipo, no al proveedor) o real (al remitente, con copia oculta al equipo).
    • Protecciones: no responde a remitentes desconocidos o sin dominio válido, al propio buzón, a no-reply, a mensajes automáticos ni rebotes, a respuestas de nuestras notificaciones, y limita a 3 respuestas por remitente cada 24 h en correos sin comprobante.
    • Rechazo con observaciones estructuradas (título, detalle, cómo corregir) también para correos sin comprobante válido.
  • Se valida si la factura ya existe en SAP (factura de compra no anulada o draft) antes de crear el draft; si existe, no se duplica y se responde que ya está registrada.
  • Servicio fuera de línea: si SAP Service Layer o HANA no responden, se avisa una vez al proveedor ("en cola, no necesita reenviar") y el correo se reintenta en los ciclos siguientes, hasta 24 veces. Plantilla plantilla-fuera-de-linea.html.
  • Código de seguimiento (ABR-AAMMDD-NNNNN) por comprobante, con su resultado y el estado de la notificación (seguimiento.py, tabla comprobantes).
  • Despliegue en Windows como servicio con NSSM (deploy/, docs/despliegue_windows.md).
  • Validación del .env al arrancar (config_validator.py), que además anuncia el modo de notificación.
  • Versión del proyecto en el log al arrancar y tools/verificar_conexiones.py (comprueba el .env, Microsoft Graph, SAP, HANA y la ruta de red sin modificar nada).
  • Suite de pruebas pytest (más de 280) y herramientas de vista previa y envío de prueba de las plantillas (tools/previsualizar_plantillas.py).
  • Documentación: README.md, guía de MSAL (docs/configurar_msal.md) y una página por módulo principal.

Cambiado

  • El correo técnico (tablas de SAP y JSON adjuntos) va solo al equipo; antes iba también al remitente.
  • Un error de SAP/HANA o un fallo inesperado ya no se le comunica al proveedor como rechazo y ya no interrumpe el ciclo: solo esa factura.
  • "Guía no encontrada" exige que HANA responda: si no, se trata como servicio fuera de línea.
  • DueDate de las cuotas del draft = fecha de vencimiento (antes, fecha de emisión).
  • Horarios sin huecos: se agregan 21:30–24:00 (cada 60 min) y 05:00–06:30 (cada 30 min); antes el demonio dormía hasta las 06:30 en esos tramos.
  • La base emails.db y la carpeta de resultados se resuelven junto al código, no relativas al directorio de trabajo.
  • copiar_a_red ya no crea carpetas locales cuando RUTA_RED_FACTURACION no es una ruta absoluta en el sistema operativo (una ruta UNC fuera de Windows); antes el draft podía referenciar archivos que no estaban en el recurso compartido.
  • pipeline.py se divide en módulos (adjuntos, documentos, persistencia, draft_sap, notificaciones).
  • Los print de los módulos pasan a logging con nivel explícito (LOG_LEVEL filtra por severidad).
  • pyproject.toml y requirements.txt alineados, con las dependencias directas fijadas.
  • consulta_rapida.py y los scripts manuales pasan a tools/; los correos de ejemplo, a tests/fixtures/.

Eliminado

  • tools/documento.json (token de ngrok sin uso). El token sigue en el historial de git: revóquelo.

Seguridad

  • Se elimina tools/aberio.http, que llevaba escrita una contraseña de SAP, y se reescribe el historial de git para enmascarar esa contraseña y el token de ngrok. Aun así deben rotarse: el historial anterior pudo haberse copiado en otros equipos o servidores.

[1.1.0]

Versión anterior a este registro: descarga de adjuntos, extracción de XML y PDF, validación de precios contra SAP B1, creación del draft y notificación por correo.