first commit

This commit is contained in:
Eidan T.
2026-05-09 14:00:04 -04:00
commit e0ec11977c
42 changed files with 4596 additions and 0 deletions
+301
View File
@@ -0,0 +1,301 @@
# Flujo de Datos
## Pipeline ETL General
DataTransferV2 sigue un patrón ETL clásico con etapas bien definidas y manejo de errores resiliente.
```
EXTRACT → TRANSFORM → LOAD → NOTIFY
```
## Diagrama de Flujo
```
Inicio
Cargar Configuraciones (PG, FEDURO)
Para cada Proyecto:
┌─────────────────────────────────────┐
│ Para cada Reporte: │
│ Para cada Fecha (3 días): │
│ ┌─────────────────────────────┐ │
│ │ EJECUTAR ETL │ │
│ │ ┌─────────┐ ┌──────────┐ │ │
│ │ │ EXTRACT │→ │TRANSFORM│ │ │
│ │ └─────────┘ └──────────┘ │ │
│ │ ↓ │ │
│ │ ┌─────────┐ │ │
│ │ │ LOAD │ │ │
│ │ └─────────┘ │ │
│ └─────────────────────────────┘ │
└─────────────────────────────────────┘
Agregar Resultados
Enviar Notificación
Fin
```
## Etapa EXTRACT
### Proceso
1. **Conectar a Base de Datos**
- Usar pyodbc para conexión SQL Server
- Pooling de conexiones para eficiencia
2. **Construir Query**
```sql
SELECT * FROM {TableName} WHERE Fecha = '{YYYY-MM-DD}'
```
3. **Ejecutar Consulta**
- Timeout de 30 segundos
- Manejo de excepciones de conexión
4. **Validar Resultados**
- Contar registros obtenidos
- Verificar integridad de datos
### Estados Posibles
- **SUCCESS:** Datos encontrados (>0 registros)
- **WARNING:** Sin datos (=0 registros)
- **FAILED:** Error de conexión/query
## Etapa TRANSFORM
### Proceso
1. **Crear DataFrame**
- Usar pandas para manipulación de datos
- Validar tipos de datos
2. **Generar Excel**
- Usar openpyxl para formato Excel
- Crear hoja única con datos tabulares
- Aplicar formato básico (headers en negrita)
3. **Guardar Archivo**
```
Reportes/{PROJECT}/{REPORT}/{REPORT}-{YYYYMMDD}.xlsx
```
4. **Validar Archivo**
- Verificar que se creó correctamente
- Comprobar tamaño del archivo
### Formato de Salida
- **Nombre:** `{Reporte}-{Fecha}.xlsx`
- **Estructura:** Hoja única con headers
- **Encoding:** UTF-8
- **Separador:** Sin separador (datos crudos)
## Etapa LOAD
### Destinos Múltiples
Cada reporte puede distribuirse a múltiples destinos según flags de configuración.
#### FTP Upload
1. **Conectar al Servidor**
```python
ftp = FTP(host, user, password)
```
2. **Crear Directorios**
```
/TranferData_APP_PYTHON/{PROJECT}/{REPORT}/
```
3. **Subir Archivo**
- Batch de 100 archivos
- Reintentos automáticos en caso de fallo
4. **Verificar Upload**
- Comparar tamaños local/remoto
#### SFTP Upload (FEDURO)
1. **Conectar via SSH**
```python
ssh = paramiko.SSHClient()
ssh.connect(host, username, password)
sftp = ssh.open_sftp()
```
2. **Navegar a Directorio**
- Mapeo específico por reporte en `feduroConfig.py`
3. **Subir Archivo**
- Transferencia segura
- Verificación de integridad
#### SharePoint Upload (PG)
1. **Autenticar con Office365**
```python
ctx = ClientContext(site_url).with_credentials(credentials)
```
2. **Subir a Document Library**
- Mapeo de carpetas por reporte
- Sobrescribir archivos existentes
3. **Verificar Upload**
- Confirmar presencia en SharePoint
#### N8N Webhook
1. **Construir Payload**
```json
{
"project": "pg",
"report": "Cobertura",
"date": "2024-01-15",
"file_path": "/path/to/file.xlsx"
}
```
2. **Enviar POST Request**
- Trigger automatización N8N
- No espera respuesta
### Estrategia de Distribución
- **Paralelo:** Todos los destinos se procesan simultáneamente
- **Resiliente:** Fallo en un destino no afecta otros
- **Logging:** Cada upload se registra individualmente
## Agregación de Resultados
### Reglas de Negocio
1. **Éxito (SUCCESS)**
- Datos encontrados, Excel creado, todos los uploads exitosos
2. **Completado con Errores (COMPLETED_WITH_ERRORS)**
- Datos procesados, pero algunos uploads fallaron
- No bloquea el pipeline
3. **Advertencia (WARNING)**
- Sin datos para la fecha
- Ignorado si es domingo
4. **Fallo (FAILED)**
- Error en consulta DB o creación de Excel
- Detiene procesamiento del reporte
### Lógica de Consolidación
```python
# Reglas de negocio para warnings
if consecutive_warnings >= 3:
status = "FAILED"
elif is_sunday and no_data:
status = "IGNORED"
elif no_data:
status = "WARNING"
else:
status = "SUCCESS"
```
## Notificaciones
### WhatsApp Summary
Después de completar cada proyecto:
```
✅ PG - Completado
Total: 16, Éxito: 15, Errores: 1, Advertencias: 0
Tiempo de ejecución: 45 minutos
Detalles de errores: Cobertura-2024-01-15 (FTP timeout)
```
### Contenido del Mensaje
- **Estado del proyecto:** ✅ ⚠️ ❌
- **Estadísticas:** Total, éxito, errores, advertencias
- **Tiempo:** Duración total
- **Errores específicos:** Lista de reportes/fechas con problemas
## Manejo de Errores
### Tipos de Error
1. **Errores de Conexión**
- DB: Reintentar conexión
- FTP/SFTP: Reintentar upload
- SharePoint: Reautenticar
2. **Errores de Datos**
- Sin datos: Advertencia (no error)
- Datos corruptos: Fallo crítico
3. **Errores de Sistema**
- Disco lleno: Fallo crítico
- Memoria insuficiente: Reinicio automático
### Recuperación
- **Reintentos:** Hasta 3 intentos para operaciones de red
- **Fallback:** Continuar con otros destinos si uno falla
- **Logging:** Todos los errores se registran con contexto completo
## Rendimiento
### Métricas Típicas
- **Tiempo por reporte:** 30-120 segundos
- **Throughput:** 16-18 reportes por proyecto (~30-60 min)
- **Uso de memoria:** 100-500MB por ejecución
- **I/O:** 10-50MB por reporte Excel
### Optimizaciones
- **Conexiones pool:** Reutilización de conexiones DB
- **Procesamiento por lotes:** Múltiples fechas en una ejecución
- **Compresión:** Archivos Excel optimizados
- **Paralelización:** Uploads simultáneos
## Auditoría
### Logging a Base de Datos
Cada ejecución se registra en `ExecutionLog`:
```sql
INSERT INTO ExecutionLog (
ProcedureID, Name, Status, Message,
StartTime, EndTime, Duration
) VALUES (
1001, 'Cobertura', 'SUCCESS', 'Processed 1500 records',
'2024-01-15 08:00:00', '2024-01-15 08:02:30', 150
)
```
### Logs de Aplicación
- `Logs/etl.log`: Progreso detallado
- `Logs/api.log`: Requests API
- `Logs/reports.log`: Generación de reportes
## Monitoreo
### KPIs Principales
- **Tasa de éxito:** % de reportes procesados correctamente
- **Tiempo promedio:** Duración por reporte/proyecto
- **Errores por tipo:** DB, red, sistema
- **Volumen de datos:** Registros/filas procesadas
### Alertas
- Error rate > 10%
- Duración > 2x promedio
- Fallos consecutivos en mismo reporte