Ir al contenido

v1-Operativa — Presentación del Hito

Hito que cierra el ciclo: IMAP → procesamiento incremental → publicación trazable. Un solo comando, auditoría completa, reproducibilidad garantizada.


El sistema pasó de 5 scripts independientes a un orquestador unificado que ejecuta todos los pipelines de forma incremental, publica automáticamente y deja rastro de cada operación.

actualizar_pipelines.bat
└─ run_pipeline_v2.py
├─ facturacion ─┐
├─ pedidos_hes ─┤ en paralelo (ThreadPoolExecutor)
├─ pedidos_sap ─┤
├─ gantt ─┤
└─ valorizaciones ─┘
├─ SALIDAS/*.xlsx (Excel por pipeline)
├─ data_warehouse.db (SQLite con 5 tablas de auditoría)
└─ Google Sheets (cruce_facturacion como post-paso único)

Tiempo típico: ~3-5 min incremental · ~9-15 min full-rebuild.


Ventana de terminal
actualizar_pipelines.bat

Comportamiento por defecto: incremental (calcula ventana automáticamente desde el último run).

flagcomportamiento
(sin flags)incremental (ventana automática)
--devtarget dev, sin tocar prod
--full-rebuilddesde __scope_initial_date__
--reprocessoffline desde data_raw/, sin IMAP
--publish-statusdiagnóstico de publicaciones recientes
--scope-statusestado de scopes activos + next_window
  • run_pipeline_v2.py — orquestador Python
  • actualizar_pipelines.bat — wrapper Windows (prod)
  • actualizar_pipelines_dev.bat — wrapper dev (--dev --target dev)

El sistema mantiene 3 versiones ortogonales: hacer bump en una no invalida las demás.

ejecontrolabump cuando…
scope_versioncriterio de búsqueda IMAPcambia “qué se captura”
pipeline_versionlógica de transformacióncambia “cómo se procesa”
code_versionhash git del commit activocualquier commit
  • scope_versiondomains/<x>/scope.py::__scope_version__
  • pipeline_versiondomains/<x>/__init__.py::__version__
  • code_versiongit rev-parse --short HEAD (runtime)
¿hay --FECHA_DESDE? → fecha_source = 'cli'
¿hay --full-rebuild? → fecha_source = 'full_rebuild' (desde __scope_initial_date__)
¿hay --reprocess? → fecha_source = 'reprocess' (lee data_raw/, sin IMAP)
¿run previo bajo scope actual?
SÍ → fecha_source = 'incremental' (last_run.raw_date_to - 3d overlap)
NO → fecha_source = 'seed_initial' (desde __scope_initial_date__)

Cada fila procesada queda etiquetada con metadatos de auditoría inyectados pre-save_processed.

campodestinodesde
fecha_ingresoDataFrame + GSheetsPR #15 / #19
code_versionDataFrame + GSheetsPR #15 / #19
processed_by_versionSQLite (solo)PR #15
fecha_sourcepipeline_runs.parametersPR #16
scope_versionpipeline_runs columnaPR #16

Deuda registrada: processed_by_version aún no llega al DataFrame de GSheets. Tarea pendiente post-v1.


Todas en SALIDAS/db/ingeldata.db (base operacional — escrita por core/sqlite_store.py).

tablagranularidadqué registra
pipeline_runs1 fila/runstatus, ventana, fecha_source, scope_version
pipeline_stage_runsN filas/run1 por stage: ingest/store/process/…
publish_log1 fila/pub.success/failed, error_msg, rows_published
raw_files1 fila/archivoarchivos descargados + scope_version
scope_rebuild_history1 fila/bumpold/new scope, reason, bumped_by
pipeline_runs
id, pipeline_name, status, started_at, finished_at,
raw_date_from, raw_date_to, fecha_source, scope_version,
pipeline_version, code_version, parameters (JSON)
pipeline_stage_runs
id, run_id (FK), stage_name, status, started_at, finished_at,
rows_processed, error_msg
publish_log
id, run_id (FK), target (gsheets|excel), status,
published_at, error_msg, rows_published
raw_files
id, pipeline_name, filename, downloaded_at,
scope_version, email_uid
scope_rebuild_history
id, pipeline_name, old_scope, new_scope,
reason, bumped_at, bumped_by
Ventana de terminal
python run_pipeline_v2.py --publish-status # últimas N publicaciones
python run_pipeline_v2.py --scope-status # scope_version + last_run + next_window
python run_pipeline_v2.py --version-status # versiones activas por pipeline

Logs por run en SALIDAS/logs/<timestamp>-<pipeline>.log.


caso de usocomando
Cotidiano (prod)actualizar_pipelines.bat
Test sin tocar prodactualizar_pipelines.bat --dev
Re-descarga totalactualizar_pipelines.bat --full-rebuild
Diagnóstico publicacionespython run_pipeline_v2.py --publish-status
Estado scopespython run_pipeline_v2.py --scope-status
Reprocesar offlinepython run_pipeline_v2.py <pipeline> --reprocess --target dev

Ventana de terminal
python run_pipeline_v2.py <pipeline> --reprocess --target dev
# Verifica con --publish-status que el fallo quedó registrado
python run_pipeline_v2.py --publish-status

Scope desactualizado (captura emails incorrectos)

Sección titulada «Scope desactualizado (captura emails incorrectos)»
  1. Bump __scope_version__ en domains/<x>/scope.py
  2. Correr --full-rebuild para ese pipeline
  3. El bump queda en scope_rebuild_history

Revisar publish_log para la fecha en cuestión. Si el publish falló silenciosamente, rerun con --reprocess.

El hash corto está en el commit de git. git show <hash> devuelve el estado exacto del código que procesó esa fila.


itemprioridadestado
processed_by_version en GSheetsmediapendiente
Scheduler automáticoaltapendiente
Notificaciones fallo/éxitomediapendiente
Dashboard observabilidad (portal)bajapendiente

  • IngelCoding — hub del proyecto
  • Orquestador-Pipelines — detalle del orquestador
  • Versionado-Pipelines-Plan — plan de versionado en 3 ejes
  • Arquitectura-Completa — diagrama de capas completo
  • DB-Structures-IngelCoding — esquema SQLite detallado
  • Portal nodos: v1_operativa · v1_workflow · v1_versionado · v1_trazabilidad · v1_observabilidad · v1_cookbook