Sistema automatizado para generar Weekly Sales Report (WSR) de DYM
Este sistema genera automáticamente reportes semanales de ventas (WSR) para DYM, consolidando datos de:
- Ventas por marca, ciudad y canal
- Proyecciones y presupuestos
- Hit Rate y eficiencia
- Stock y cobertura
- Análisis de tendencias comparativas
- Comentarios de gerentes
El reporte se genera en formato HTML con tablas interactivas y gráficos de tendencia.
- Python: Versión 3.8 o superior
- PostgreSQL: Acceso a base de datos DWH (servidor 192.168.80.85)
- Sistema Operativo: Linux/Windows
Ver archivo requirements.txt para lista completa. Principales dependencias:
- pandas >= 1.5.0
- numpy >= 1.23.0
- psycopg2-binary >= 2.9.0
- python-dotenv >= 0.20.0
- openai >= 1.0.0
- requests >= 2.28.0
- colorlog >= 6.6.0
- pydantic >= 1.10.0
git clone https://github.com/FabiolaBowlesDiaz/dym-wsr-generator.git
cd dym-wsr-generator# En Linux/Mac
python3 -m venv venv
source venv/bin/activate
# En Windows
python -m venv venv
venv\Scripts\activatepip install -r requirements.txtCrear archivo .env en la raíz del proyecto con la siguiente configuración:
# OpenRouter Configuration (para análisis de comentarios con IA)
OPENROUTER_API_KEY=sk-or-v1-[YOUR_API_KEY]
OPENROUTER_BASE_URL=https://openrouter.ai/api/v1
DEFAULT_MODEL=anthropic/claude-opus-4.1
FALLBACK_MODEL=anthropic/claude-sonnet-4
# Database Configuration
DB_HOST=192.168.80.85
DB_PORT=5432
DB_NAME=dwh_saiv
DB_SCHEMA=auto
DB_USER=automatizacion
DB_PASSWORD=Aut0SAIV.
DB_TYPE=postgresql
# Report Configuration
REPORT_OUTPUT_PATH=./output/
COMPANY_NAME=DYM
CURRENT_YEAR=2025
PREVIOUS_YEAR=2024
# Logging
LOG_LEVEL=INFO
LOG_FILE=wsr_generator.logIMPORTANTE: Las credenciales de base de datos y API key deben ser provistas por el equipo de TI/Administración.
# Activar entorno virtual
source venv/bin/activate # Linux/Mac
# o
venv\Scripts\activate # Windows
# Ejecutar el generador
python wsr_generator_main.pyEl sistema mostrará mensajes de progreso en consola:
==================================================
WSR GENERATOR - DYM
==================================================
📅 Fecha: 30/09/2025
📊 Período: Mes 9/2025
📈 Análisis hasta el día: 30
🔗 Conectando a la base de datos...
📥 Obteniendo datos...
🔄 Procesando datos...
📊 Calculando métricas del resumen ejecutivo...
💬 Analizando comentarios de gerentes...
📊 Generando gráfico de tendencia comparativa...
📈 Obteniendo datos de Hit Rate y Eficiencia...
📄 Generando reporte HTML...
✅ Reporte generado exitosamente: output/WSR_DYM_2025_09_20250930_143022.html
- Ubicación:
./output/ - Formato:
WSR_DYM_{YEAR}_{MONTH}_{TIMESTAMP}.html - Ejemplo:
WSR_DYM_2025_09_20250930_143022.html - Contenido: Reporte HTML completo con tablas y gráficos interactivos
- Ubicación:
./wsr_generator.log - Contenido: Logs detallados de cada ejecución (conexión DB, queries, procesamiento, errores)
El sistema debe ejecutarse todos los lunes para generar el reporte semanal.
# Editar crontab
crontab -e
# Agregar la siguiente línea para ejecutar todos los lunes a las 6:00 AM
0 6 * * 1 cd /ruta/completa/al/proyecto && /ruta/completa/al/proyecto/venv/bin/python wsr_generator_main.py >> /ruta/logs/wsr_cron.log 2>&1# Ejecutar todos los lunes a las 6:00 AM
0 6 * * 1 cd /opt/dym-wsr-generator && /opt/dym-wsr-generator/venv/bin/python wsr_generator_main.py >> /var/log/wsr_cron.log 2>&1# Listar cron jobs activos
crontab -l
# Ver logs del cron
cat /var/log/wsr_cron.log-
Abrir Task Scheduler
- Presionar
Win + R, escribirtaskschd.msc
- Presionar
-
Crear Nueva Tarea
- Clic en "Create Task" (Crear tarea)
- Nombre: DYM WSR Generator
- Descripción: Genera reporte semanal de ventas todos los lunes
-
Configurar Trigger (Disparador)
- Tab "Triggers" → "New"
- Begin the task: On a schedule
- Settings: Weekly
- Days: Monday (Lunes)
- Time: 06:00:00
- Enabled: ✓
-
Configurar Action (Acción)
- Tab "Actions" → "New"
- Action: Start a program
- Program/script:
C:\ruta\completa\al\proyecto\venv\Scripts\python.exe - Add arguments:
wsr_generator_main.py - Start in:
C:\ruta\completa\al\proyecto
-
Configurar Condiciones
- Tab "Conditions"
- Desmarcar "Start the task only if the computer is on AC power"
-
Configurar Settings
- Tab "Settings"
- ✓ Allow task to be run on demand
- ✓ Run task as soon as possible after a scheduled start is missed
- ✓ If the task fails, restart every: 10 minutes
Crear archivo run_wsr_generator.bat:
@echo off
cd /d "C:\ruta\completa\al\proyecto"
call venv\Scripts\activate
python wsr_generator_main.py >> logs\wsr_execution.log 2>&1
deactivateConfigurar Task Scheduler para ejecutar este archivo .bat
NOTA: El sistema actualmente genera el reporte HTML pero NO incluye funcionalidad de envío automático por correo.
El equipo de sistemas deberá implementar el envío de correo mediante una de estas opciones:
Agregar configuración SMTP al archivo .env:
# Email Configuration
SMTP_HOST=smtp.empresa.com
SMTP_PORT=587
SMTP_USER=wsr-generator@empresa.com
SMTP_PASSWORD=password_seguro
SMTP_USE_TLS=True
# Recipients
EMAIL_TO=director1@empresa.com,director2@empresa.com
EMAIL_CC=gerencia@empresa.com
EMAIL_SUBJECT_PREFIX=[WSR DYM]Crear script que envíe el último archivo generado:
# send_wsr_email.sh (Linux)
#!/bin/bash
LATEST_REPORT=$(ls -t output/WSR_DYM_*.html | head -1)
echo "Adjunto encontrará el reporte WSR de DYM" | mail -s "WSR DYM - Semana $(date +%V)" -a "$LATEST_REPORT" director1@empresa.com,director2@empresa.com# send_wsr_email.ps1 (Windows PowerShell)
$latestReport = Get-ChildItem -Path "output\WSR_DYM_*.html" | Sort-Object LastWriteTime -Descending | Select-Object -First 1
Send-MailMessage -From "wsr-generator@empresa.com" -To "director1@empresa.com", "director2@empresa.com" -Subject "WSR DYM - Semana $(Get-Date -UFormat %V)" -Body "Adjunto encontrará el reporte WSR de DYM" -Attachments $latestReport.FullName -SmtpServer "smtp.empresa.com"Configurar flujo que detecte nuevos archivos en carpeta output/ y los envíe automáticamente.
IMPORTANTE: Coordinar con el área correspondiente la lista completa de destinatarios (directores y gerentes).
- Ubicación:
./wsr_generator.log - Rotación: Manual (considerar implementar rotación automática)
- Nivel de detalle: INFO (configurable en
.envconLOG_LEVEL)
- Errores de Conexión DB: Buscar "❌ No se pudo conectar a la base de datos"
- Errores de Queries: Verificar mensajes de error en queries SQL
- Datos Vacíos: Alertas sobre tablas sin datos
- Finalización Exitosa: Buscar "✅ Reporte generado exitosamente"
# Ver últimas 50 líneas del log
tail -50 wsr_generator.log
# Buscar errores específicos
grep "ERROR" wsr_generator.log
grep "❌" wsr_generator.logCausa: Credenciales incorrectas o servidor inaccesible Solución:
- Verificar que el servidor 192.168.80.85 sea accesible
- Confirmar credenciales en
.env - Verificar firewall/reglas de red
- Probar conexión manual:
psql -h 192.168.80.85 -U automatizacion -d dwh_saiv
Causa: Dependencias no instaladas o entorno virtual no activado Solución:
source venv/bin/activate # o venv\Scripts\activate en Windows
pip install -r requirements.txtCausa: API key de OpenRouter incorrecta o vencida Solución:
- Verificar
OPENROUTER_API_KEYen.env - Contactar al administrador para obtener nueva key
- Verificar que la cuenta tenga créditos disponibles
Causa: Datos no disponibles en la base de datos para el período Solución:
- Revisar
wsr_generator.logpara ver qué queries fallaron - Verificar que las tablas en la base de datos tengan datos actualizados
- Contactar al equipo de Data Warehouse
Causa: Permisos, rutas incorrectas o entorno no configurado Solución:
- Verificar logs del cron:
/var/log/syslogo/var/log/cron - Probar ejecución manual del comando del cron
- Verificar permisos de ejecución:
chmod +x wsr_generator_main.py - Asegurar rutas absolutas en cron job
dym-wsr-generator/
├── core/ # Módulos principales
│ ├── database.py # Gestión de conexiones y queries DB
│ ├── data_processor.py # Procesamiento y cálculos de datos
│ ├── html_generator.py # Generación de HTML del reporte
│ └── trend_chart_generator.py # Gráficos de tendencia interactivos
├── utils/ # Utilidades
│ └── html_tables.py # Generación de tablas HTML
├── templates/ # Plantillas HTML (si aplica)
├── data/ # Datos temporales/cache
├── output/ # Reportes HTML generados
├── logs/ # Logs adicionales
├── tests/ # Tests unitarios
├── test_*.py # Tests funcionales
├── wsr_generator_main.py # Punto de entrada principal
├── generate_report.py # Script alternativo de generación
├── setup.py # Configuración del paquete
├── requirements.txt # Dependencias Python
├── .env # Variables de entorno (NO versionar)
├── .gitignore # Archivos ignorados por git
└── README.md # Este archivo
cd /ruta/al/proyecto
git pull origin main
source venv/bin/activate
pip install -r requirements.txt --upgrade# Hacer backup del .env
cp .env .env.backup
# Backup de reportes generados
tar -czf backup_reportes_$(date +%Y%m%d).tar.gz output/# Eliminar reportes con más de 90 días
find output/ -name "WSR_DYM_*.html" -mtime +90 -delete
# Rotar logs
mv wsr_generator.log wsr_generator_$(date +%Y%m%d).log
gzip wsr_generator_$(date +%Y%m%d).log- Archivo .env: NO versionar ni compartir públicamente (contiene credenciales)
- Permisos del archivo .env:
chmod 600 .env(solo lectura para owner) - Credenciales DB: Usar usuario con permisos de solo lectura
- API Keys: Rotar periódicamente
- Logs: Los logs pueden contener información sensible, proteger acceso
- Usuario del sistema:
wsr-automation(sin privilegios sudo) - Directorio de instalación:
/opt/dym-wsr-generatorcon permisos 750 - Propietario archivos:
wsr-automation:wsr-automation
Desarrollador/Responsable: Fabiola Bowles Email: fbowles@theblankinc.com Empresa: The Blank Inc. - IA Consulting
Para problemas técnicos o dudas sobre:
- Funcionalidad del reporte: Contactar a Fabiola Bowles
- Acceso a base de datos: Contactar al equipo de Data Warehouse/DBA
- Infraestructura/servidores: Contactar al equipo de Sistemas/IT
- Contenido de negocio: Contactar al área de Análisis Comercial DYM
- v1.0 (Septiembre 2025): Versión inicial con todas las funcionalidades core
- Generación automática de WSR
- Soporte multi-ciudad y multi-marca
- Gráficos de tendencia interactivos
- Análisis de Hit Rate y cobertura de stock
- Integración con OpenRouter/Claude para análisis de comentarios
- Tiempo de ejecución promedio: 2-5 minutos
- Consumo de memoria: ~200-500 MB
- Tamaño del reporte HTML: ~500 KB - 2 MB
- Actualizar
CURRENT_YEARyPREVIOUS_YEARen.enval inicio de cada año - Verificar que las tablas de presupuesto del nuevo año estén cargadas en la DB
El sistema automáticamente excluye:
- Ciudad/Canal: "Turismo"
- Marcas: "Ninguna", "Sin marca asignada"
- Estas exclusiones están hardcodeadas en
data_processor.py
Última actualización: Septiembre 2025 Versión del documento: 1.0