se completan los horarios, se fijan las rutas al código y se muestra la versión

- HORARIOS cubre las 24 horas: 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. Se corrigen los comentarios, que no coincidían con los valores.
  tests/test_horarios.py garantiza que no haya huecos ni solapes.
- La carpeta de resultados se resuelve junto al código, no relativa al cwd
  (un servicio de Windows puede arrancar desde cualquier carpeta).
- copiar_a_red no crea carpetas locales cuando RUTA_RED_FACTURACION no es una
  ruta absoluta en el sistema operativo (una UNC fuera de Windows); antes el
  draft podía referenciar archivos que no estaban en el recurso compartido.
- El log muestra la versión del proyecto (pyproject.toml) al arrancar.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
GeorgeandClaude Sonnet 5.5 committed 2026-10-22 12:08:38 -05:00
1 parent 1c57988f54
commit fcce30eda6
7 files changed
+128 -10

No files matched your search

+57
View File
@@ -92,6 +92,21 @@ def test_copiar_a_red_deshabilitada_si_no_hay_ruta(tmp_path, monkeypatch):
assert "ruta_red_xml" not in data and "ruta_red_pdf" not in data
def test_copiar_a_red_con_una_ruta_que_no_es_absoluta_no_crea_carpetas_ni_apunta_el_draft_a_la_nada(tmp_path, monkeypatch, caplog):
"""Fuera de Windows una ruta UNC no es absoluta: antes se creaba como una carpeta local con ese nombre."""
monkeypatch.chdir(tmp_path)
monkeypatch.setenv("RUTA_RED_FACTURACION", "red_relativa")
monkeypatch.setenv("RUC_EMPRESA", "20999")
data = _comprobante(tmp_path)
with caplog.at_level(logging.WARNING, logger="pipeline"):
documentos.copiar_a_red(data)
assert not (tmp_path / "red_relativa").exists() # no se creó nada
assert "ruta_red_xml" not in data and "ruta_red_pdf" not in data # el draft no referencia archivos inexistentes
assert any("no es una ruta absoluta" in r.getMessage() for r in caplog.records)
def test_copiar_a_red_fecha_invalida_no_falla(tmp_path, monkeypatch):
red = tmp_path / "red"
monkeypatch.setenv("RUTA_RED_FACTURACION", str(red))
@@ -121,3 +136,45 @@ def test_filtrar_sin_pdf_ni_xml_borra_todo(tmp_path):
assert adjuntos.filtrar_y_limpiar(email, str(tmp_path)) is False
assert os.listdir(tmp_path) == []
# ============================================================================
# Rutas: no dependen del directorio de trabajo
# ============================================================================
def test_la_base_de_datos_va_junto_al_codigo_aunque_se_lance_desde_otra_carpeta(tmp_path, monkeypatch):
import importlib.util
import database_utilities
monkeypatch.chdir(tmp_path) # un servicio puede arrancar desde cualquier carpeta
spec = importlib.util.spec_from_file_location("database_utilities_nueva", database_utilities.__file__)
nueva = importlib.util.module_from_spec(spec)
spec.loader.exec_module(nueva) # DB_NAME se calcula al importar
carpeta_del_codigo = os.path.dirname(os.path.abspath(database_utilities.__file__))
assert nueva.DB_NAME == os.path.join(carpeta_del_codigo, "emails.db")
def test_ruta_carpeta_no_depende_del_directorio_actual(tmp_path, monkeypatch):
import pipeline_utils
monkeypatch.chdir(tmp_path)
esperado = os.path.join(os.path.dirname(os.path.abspath(pipeline_utils.__file__)), "resultado")
assert pipeline_utils.ruta_carpeta("resultado") == esperado
def test_los_resultados_relativos_se_guardan_con_ruta_carpeta_no_en_el_cwd(tmp_path, monkeypatch):
import persistencia
proyecto, otro = tmp_path / "proyecto", tmp_path / "otro"
proyecto.mkdir(), otro.mkdir()
monkeypatch.chdir(otro)
monkeypatch.setattr(persistencia, "ruta_carpeta", lambda r: os.path.join(proyecto, r))
persistencia.guardar_draft_json({"a": 1}, "F002", "1", "resultado")
assert any(n.startswith("draft_sapb1_F002-1") for n in os.listdir(proyecto / "resultado"))
assert os.listdir(otro) == [] # nada en el directorio desde el que se lanzó
def test_una_carpeta_de_resultados_absoluta_se_respeta(tmp_path):
import persistencia
persistencia.guardar_draft_json({"a": 1}, "F002", "2", str(tmp_path / "salida"))
assert any(n.startswith("draft_sapb1_F002-2") for n in os.listdir(tmp_path / "salida"))