- 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>
88 lines
2.2 KiB
Markdown
88 lines
2.2 KiB
Markdown
# Despliegue
|
|
|
|
## systemd (Linux)
|
|
|
|
### Requisitos adicionales
|
|
- **Mozilla Firefox** instalado (para `get_token_headless.py`)
|
|
- **rsync** y **cifs-utils** (para montar SMB y sincronizar)
|
|
|
|
### Servicio
|
|
|
|
```ini
|
|
[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
|
|
```
|
|
|
|
```bash
|
|
# 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
|
|
|
|
```cmd
|
|
:: 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:
|
|
|
|
```cmd
|
|
C:\ruta\descarga_xml_sunat\sunat-venv\Scripts\python get_token.py
|
|
```
|
|
|
|
### Actualización
|
|
```cmd
|
|
nssm stop SUNAT-CPE
|
|
:: actualizar archivos
|
|
nssm start SUNAT-CPE
|
|
```
|
|
|
|
## Docker (opcional)
|
|
|
|
```dockerfile
|
|
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`.
|