Files
GeorgeandClaude Sonnet 5 c2503745bf Reemplaza logging por consola/archivo, agrega historial de intentos y soporte para notas de crédito
- Nuevo logger_manager.py (reemplaza logger_utilities.py): logging con formato de árbol,
  rotación diaria a sunat.log, y consola por stdout (antes iba por stderr y se duplicaba
  en logs/error.log del launchd).
- Nuevo historial_manager.py: registra cada intento de consulta/descarga en historial.db
  para auditoría, con limpieza automática de registros de más de 180 días.
- consulta_cpe.py: corrige el id de notas de crédito/débito (usa F7/F8, no 07/08) y
  agrega reintentos ante errores 5xx.
- hana_manager.py: suma consulta a ORPC para notas de crédito (Indicator 07) y soporte
  de ObjType para actualizar la tabla correcta (OPCH/ORPC) al marcar PDF/XML descargado.
- gestor_fallas.py / main.py: propagan objtype end-to-end y dejan constancia de cada
  intento en historial_manager.
- Elimina login_api.py y reporte_fallas.py (código no usado / script manual sin uso reciente).
- Actualiza .gitignore (sunat-venv/, historial.db*) y docs/ para reflejar el estado real
  del proyecto.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-31 12:31:48 -05:00

2.2 KiB

Despliegue

systemd (Linux)

Requisitos adicionales

  • Mozilla Firefox instalado (para get_token_headless.py)
  • rsync y cifs-utils (para montar SMB y sincronizar)

Servicio

[Unit]
Description=SUNAT CPE Downloader Daemon
After=network.target

[Service]
Type=simple
User=tu_usuario
WorkingDirectory=/ruta/a/descarga_xml_sunat
ExecStart=/usr/bin/python3 main.py
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target
# Guarda el bloque [Unit]/[Service]/[Install] de arriba en un archivo, ej. sunat-cpe.service
sudo cp sunat-cpe.service /etc/systemd/system/
sudo systemctl enable sunat-cpe
sudo systemctl start sunat-cpe

NSSM (Windows)

Requisitos

  • Mozilla Firefox instalado (cualquier versión) — necesario para get_token_headless.py
  • Python 3.12+ con dependencias instaladas
  • Unidad de red mapeable (SMB) para sincronizar descargas

Instalación como servicio

:: Instalar servicio
nssm install SUNAT-CPE "C:\Python312\python.exe" "C:\ruta\descarga_xml_sunat\main.py"

:: Configurar directorio de trabajo
nssm set SUNAT-CPE AppDirectory "C:\ruta\descarga_xml_sunat"

:: Configurar reinicio automático
nssm set SUNAT-CPE AppExit Default Exit
nssm set SUNAT-CPE AppThrottle 30000

:: Iniciar servicio
nssm set SUNAT-CPE Start SERVICE_AUTO_START
nssm start SUNAT-CPE

Logs

NSSM redirige stdout/stderr a C:\ruta\descarga_xml_sunat\logs\ por defecto (el logger del daemon también escribe allí).

Renovación de token

Como servicio, el daemon usa get_token_headless() (headless, Firefox real) para renovar el token automáticamente sin intervención. Si Firefox no está instalado, el daemon lo detecta y usa get_token.py headless=False como respaldo (requiere escritorio). Para renovar manualmente:

C:\ruta\descarga_xml_sunat\sunat-venv\Scripts\python get_token.py

Actualización

nssm stop SUNAT-CPE
:: actualizar archivos
nssm start SUNAT-CPE

Docker (opcional)

FROM python:3.12-slim
RUN pip install -r requirements.txt && playwright install firefox
WORKDIR /app
COPY . .
CMD ["python", "main.py"]

Asegúrate de que requirements.txt incluya: playwright, python-dotenv, requests, hdbcli.