Ir al contenido

Pipeline de Productividad

Flujo completo: Excel OneDrive → Parser openpyxl → RAW → fact_productividad (SQLite)

┌─────────────────────┐ ┌──────────────┐ ┌───────────────────────────┐ ┌──────────────────────┐
│ PRODUCTIVIDAD*.xlsx│────►│ %TEMP% copy │────►│ productividad_excel_ │────►│ fact_productividad │
│ (OneDrive / PBI) │ │ (anti-lock) │ │ parser.py │ │ (data_warehouse.db) │
└─────────────────────┘ └──────────────┘ └───────────────────────────┘ └──────────────────────┘
  1. Entry Point: scripts/db/data_warehouse.py → función export_productividad() (flag --productividad o incluido en --populate).
  2. Módulo de dominio: domains/facturacion/productividad_excel_parser.py (parser activo).
  3. Módulo deprecado (shim): domains/facturacion/excel_productividad_to_procesos.py — no usar, reemplazado por el parser activo.
  4. Fuente: Excel PRODUCTIVIDAD*.xlsx en OneDrive/.../Power BI/PRODUCTIVIDAD/.
  5. Salida: tabla fact_productividad en data_warehouse.db.
  1. find_productividad_excel() — localiza el Excel más reciente en la carpeta fuente por mtime.
  2. Copia a %TEMP% — necesario por el lock que OneDrive aplica a archivos sincronizados; openpyxl no puede abrirlos directamente.
  3. select_data_sheet() — descarta la hoja HH PROYECTOS, selecciona la hoja con mayor cantidad de filas (el nombre cambia cada mes, ej. “MARZO 2026”).
  4. parse_productividad_sheet() — itera filas detectando procesos (bold sin “OT”) y headers de tabla (bold con “OT”); soporta merged cells.
  5. load_and_parse_productividad() — orquesta el parseo completo, retorna (df, fecha_reporte).
  6. export_productividad() — escribe el DataFrame final en la tabla fact_productividad de SQLite (replace).
ColumnaDescripción
procesoCategoría de trabajo (ej. “NUEVO SUMINISTRO”)
ot_limpiaIdentificador de OT normalizado (FK a dim_ot)
nombre_proyectoNombre del proyecto según la planilla
supervisorNombre del supervisor responsable
hh_proyectoHoras-hombre presupuestadas para el proyecto
fecha_reporteFecha del archivo fuente (mes del reporte)
  • Lock de OneDrive: openpyxl no puede abrir archivos que OneDrive tiene sincronizando. Solución: copiar a %TEMP% antes de leer.
  • Nombre de hoja dinámico: El nombre de la hoja de datos cambia cada mes (ej. “MARZO 2026”, “ABRIL 2026”). Solución: select_data_sheet() elige la hoja con más filas, ignorando HH PROYECTOS.
  • Ambigüedad bold: Tanto los títulos de proceso como los headers de tabla usan negrita. Solución: si la celda bold contiene "OT" es un header de tabla; de lo contrario es un título de proceso.
  • Mapeo de columnas: La columna "HH" debe mapearse antes que "PROYECTO" para evitar que el mapeo parcial de "NOMBRE PROYECTO" colisione con "PROYECTO".
  • OTs sin cruce (~21%): Son OTs nuevas aún no registradas en dim_ot más una fila con valor literal "SIN OT". Es comportamiento esperado y no indica error de parseo.
  • Script deprecado: excel_productividad_to_procesos.py fue el parser original. Está reemplazado por productividad_excel_parser.py. Mantener solo como referencia histórica.

Ver: Modelo-Productividad-Rentabilidad

fact_productividad representa el Presupuesto Inicial (HH OT) en el modelo estrella: es la fuente del eje “Lo Presupuestado” que se cruza contra facturación y costos por brigada en Power BI.

Tags: #productividad #pipeline #excel #sqlite #data-warehouse #openpyxl

1. Localización del Excel fuente (mtime más reciente)

Sección titulada «1. Localización del Excel fuente (mtime más reciente)»

6. Escritura en fact_productividad (SQLite replace)

Sección titulada «6. Escritura en fact_productividad (SQLite replace)»