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>
5.2 KiB
5.2 KiB
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:30cada 30 minutos y18:30–24:00cada 60 (antes:00:00–05:00cada 60 segundos,05:00–06:30cada 30 minutos,18:30–21:30y21:30–24:00cada 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 comparabaabs(a - b) < 0.01sin 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. Verdocs/respuesta_proveedor.md.NOTIFICACION_MODO:prueba(por defecto; la respuesta va al equipo, no al proveedor) oreal(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, tablacomprobantes). - Despliegue en Windows como servicio con NSSM (
deploy/,docs/despliegue_windows.md). - Validación del
.enval 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.
DueDatede 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.dby la carpeta de resultados se resuelven junto al código, no relativas al directorio de trabajo. copiar_a_redya no crea carpetas locales cuandoRUTA_RED_FACTURACIONno 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.pyse divide en módulos (adjuntos,documentos,persistencia,draft_sap,notificaciones).- Los
printde los módulos pasan aloggingcon nivel explícito (LOG_LEVELfiltra por severidad). pyproject.tomlyrequirements.txtalineados, con las dependencias directas fijadas.consulta_rapida.pyy los scripts manuales pasan atools/; los correos de ejemplo, atests/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.