Pipeline de Productividad
Flujo completo: Excel OneDrive → Parser openpyxl → RAW →
fact_productividad(SQLite)
Overview
Sección titulada «Overview»┌─────────────────────┐ ┌──────────────┐ ┌───────────────────────────┐ ┌──────────────────────┐│ PRODUCTIVIDAD*.xlsx│────►│ %TEMP% copy │────►│ productividad_excel_ │────►│ fact_productividad ││ (OneDrive / PBI) │ │ (anti-lock) │ │ parser.py │ │ (data_warehouse.db) │└─────────────────────┘ └──────────────┘ └───────────────────────────┘ └──────────────────────┘Arquitectura de Capas
Sección titulada «Arquitectura de Capas»- Entry Point:
scripts/db/data_warehouse.py→ funciónexport_productividad()(flag--productividado incluido en--populate). - Módulo de dominio:
domains/facturacion/productividad_excel_parser.py(parser activo). - Módulo deprecado (shim):
domains/facturacion/excel_productividad_to_procesos.py— no usar, reemplazado por el parser activo. - Fuente: Excel
PRODUCTIVIDAD*.xlsxenOneDrive/.../Power BI/PRODUCTIVIDAD/. - Salida: tabla
fact_productividadendata_warehouse.db.
Capas de Procesamiento
Sección titulada «Capas de Procesamiento»find_productividad_excel()— localiza el Excel más reciente en la carpeta fuente pormtime.- Copia a
%TEMP%— necesario por el lock que OneDrive aplica a archivos sincronizados; openpyxl no puede abrirlos directamente. select_data_sheet()— descarta la hojaHH PROYECTOS, selecciona la hoja con mayor cantidad de filas (el nombre cambia cada mes, ej. “MARZO 2026”).parse_productividad_sheet()— itera filas detectando procesos (bold sin “OT”) y headers de tabla (bold con “OT”); soporta merged cells.load_and_parse_productividad()— orquesta el parseo completo, retorna(df, fecha_reporte).export_productividad()— escribe el DataFrame final en la tablafact_productividadde SQLite (replace).
Esquema de Salida: fact_productividad
Sección titulada «Esquema de Salida: fact_productividad»| Columna | Descripción |
|---|---|
proceso | Categoría de trabajo (ej. “NUEVO SUMINISTRO”) |
ot_limpia | Identificador de OT normalizado (FK a dim_ot) |
nombre_proyecto | Nombre del proyecto según la planilla |
supervisor | Nombre del supervisor responsable |
hh_proyecto | Horas-hombre presupuestadas para el proyecto |
fecha_reporte | Fecha del archivo fuente (mes del reporte) |
Gotchas Técnicos / Bugs Conocidos
Sección titulada «Gotchas Técnicos / Bugs Conocidos»- 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, ignorandoHH 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_otmás una fila con valor literal"SIN OT". Es comportamiento esperado y no indica error de parseo. - Script deprecado:
excel_productividad_to_procesos.pyfue el parser original. Está reemplazado porproductividad_excel_parser.py. Mantener solo como referencia histórica.
Contexto de Negocio
Sección titulada «Contexto de Negocio»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