From 68aedc7863c3c95de2e69427f31cf71fee449c5f Mon Sep 17 00:00:00 2001 From: Johann Date: Wed, 16 Sep 2026 10:28:47 -0600 Subject: [PATCH] =?UTF-8?q?El=20Excel=20de=20avance=20muestra=20fechas=20R?= =?UTF-8?q?EALES=20por=20tarea=20(primer=20y=20=C3=BAltimo=20d=C3=ADa=20tr?= =?UTF-8?q?abajado),=20no=20el=20calendario=20plan;=20'=E2=80=94'=20=3D=20?= =?UTF-8?q?sin=20iniciar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- planeacion/Avance-Balam-2026-09-16.xlsx | Bin 11025 -> 11170 bytes planeacion/generar_avance_2026_09_16.py | 78 +++++++++++++++++++++++- 2 files changed, 77 insertions(+), 1 deletion(-) diff --git a/planeacion/Avance-Balam-2026-09-16.xlsx b/planeacion/Avance-Balam-2026-09-16.xlsx index 71c1620851833b3d6ff93a50ef5075be3f6c2c9e..f65ce84154efc791f4ee72af7bfda341a0d1791d 100644 GIT binary patch delta 7151 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 diff --git a/planeacion/generar_avance_2026_09_16.py b/planeacion/generar_avance_2026_09_16.py index abce10f..8f848e1 100644 --- a/planeacion/generar_avance_2026_09_16.py +++ b/planeacion/generar_avance_2026_09_16.py @@ -2,7 +2,13 @@ Corte del miércoles 16-sep: sin sesiones ni desarrollo nuevos desde el 15-sep; solo se publicó el Excel de avance en Google Sheets (Drive/Balam) y se -regeneró este corte. El corte del 15-sep no se toca. Las horas se leen de +regeneró este corte. El corte del 15-sep no se toca. + +Además, a petición de Johann (16-sep), las columnas Inicio/Fin dejan de +mostrar las fechas PLAN y muestran las fechas REALES: primer y último día +trabajado de cada tarea según `Seguimiento-horas.csv`, la bitácora y los +commits ("—" = sin iniciar; las tareas en curso llevan como Fin el último día +trabajado). Las fechas plan quedan en Avance-Balam-2026-08-06b.xlsx. Las horas se leen de `Seguimiento-horas.csv`; el script aborta si el reparto no cuadra con las horas nuevas del CSV. """ @@ -61,6 +67,59 @@ ENCABEZADOS = { "Etapa 3": (E3, 0.05), } +# --- Fechas reales por fila (dd/mm/yyyy o "—") --------------------------------- +# Trazabilidad: CSV (fecha por actividad), REGISTRO.md y commits de ambos repos. +SIN_INICIAR = ("—", "—") +FECHAS_REALES = { + "Integracion de plataformas Balam": ("01/07/2026", "16/09/2026"), # en curso + "Etapa 0": ("01/07/2026", "24/07/2026"), # validada por Balam el 24-jul + "Sesión de arranque (kickoff)": ("01/07/2026", "01/07/2026"), + "Sesión de Discovery": ("06/07/2026", "07/07/2026"), # facturación 6-jul, cobranza 7-jul + "Entrega y validación de accesos": ("06/07/2026", "06/07/2026"), + "Validación técnica de la API de BIND": ("06/07/2026", "06/07/2026"), # 117 GETs, adelantada un día + "Prototipo visual navegable": ("08/07/2026", "10/07/2026"), + "Documento de hallazgos": ("10/07/2026", "10/07/2026"), # PDF + correo del 10-jul + "Sesión de validación del prototipo": ("23/07/2026", "24/07/2026"), # guion 23-jul, sesión 24-jul + "Etapa 1": ("13/07/2026", "03/09/2026"), # técnica cerrada 1-ago; publicación provisional 3-sep + "Demostración semanal": ("15/07/2026", "16/09/2026"), # gestión y cortes, en curso + "Repositorio privado GitHub": ("13/07/2026", "16/07/2026"), # push del scaffold 16-jul + "Backend base": ("13/07/2026", "19/07/2026"), # B0–B2 el 19-jul + "Arquitectura multi-tenant": ("14/07/2026", "01/08/2026"), # RLS 21-jul, verificación balam_app 1-ago + "Cliente de la API de BIND": ("15/07/2026", "15/07/2026"), + "Capa de escritura controlada": ("19/07/2026", "23/08/2026"), # diseño 19-jul; cotización 11-ago; prefactura 23-ago + "Sincronización de clientes": ("19/07/2026", "19/07/2026"), # B3 + "Configuración de infraestructura en Azure": ("03/09/2026", "03/09/2026"), # publicación provisional en paputec.mx + "Sincronización de facturas": ("21/07/2026", "01/08/2026"), # B4 21-jul; scheduler B5 1-ago + "Sesión de reglas y dudas": ("21/07/2026", "22/07/2026"), # agenda 21-jul, sesión 22-jul + "Definición de alcance Jira": ("22/07/2026", "07/08/2026"), # v1.3 aprobada 30-jul; definiciones cerradas 7-ago + "Modelo de facturas": ("21/07/2026", "01/08/2026"), # mapper 21-jul; seeder demo 1-ago + "CI/CD": ("03/09/2026", "03/09/2026"), # deploy.sh + secretos fuera del repo + "Etapa 2": ("01/08/2026", "10/09/2026"), # en curso + "» Ajuste dentro de la Etapa 2": ("27/07/2026", "03/09/2026"), # sesión con Pedro 27-jul → tickets cotizados 3-sep + "Cliente de la API de Jira": ("29/07/2026", "06/08/2026"), + "Disparador por estatus": ("20/08/2026", "07/09/2026"), # sondeo FAC-106 → folio 1026 (21-ago) → lote 7-sep + "Trazabilidad ticket": ("10/08/2026", "03/09/2026"), # definiciones → pruebas observadas + "Andamiaje del frontend": ("16/07/2026", "01/08/2026"), # scaffold 16-jul; login JWT 1-ago + "Layout base": ("01/08/2026", "06/08/2026"), + "Listado de facturas": ("01/08/2026", "01/08/2026"), + "Detalle de factura": ("01/08/2026", "01/08/2026"), # PDF; XML pendiente + "Catálogo de clientes": ("01/08/2026", "01/08/2026"), + "Tipo de cambio del DOF": SIN_INICIAR, + "Creación de cotizaciones desde la plataforma": ("06/08/2026", "07/09/2026"), # wizard UI 6-ago → lote 7-sep + "Conversión cotización→factura": ("06/08/2026", "10/09/2026"), # simulación 6-ago → captura del endpoint 10-sep + "Exportación de facturas": ("01/08/2026", "01/08/2026"), # CSV + "Pruebas integrales": SIN_INICIAR, + "Etapa 3": ("03/09/2026", "03/09/2026"), # solo endurecimiento y runbook + "Módulo de cobranza": SIN_INICIAR, + "Alertas internas": SIN_INICIAR, + "Tablero directivo": SIN_INICIAR, + "Reporte operativo": SIN_INICIAR, + "Endurecimiento de seguridad": ("03/09/2026", "03/09/2026"), + "Documentación técnica": ("03/09/2026", "03/09/2026"), + "Sesión de capacitación": SIN_INICIAR, + "Soporte posterior": SIN_INICIAR, +} + FILAS = { "Demostración semanal": (0.6, "🟡 En curso · el seguimiento pasó a Pedro (sesiones 'Seguimiento PAF' " "21, 24 y 26-ago; 3, 9 y 10-sep) · corte de horas al 16-sep, publicado en " @@ -81,6 +140,8 @@ ws["A2"] = ("Plan y avance al 16-sep-2026 · plataforma publicada en paputec.mx "desde el ticket (individual y en lote); prefactura por API bloqueada por BIND · horas del " "10-ago al 16-sep reconstruidas, pendientes de validar") ws["A2"].font = Font(size=10, italic=True, color=GRIS) +ws.cell(row=4, column=2, value="Inicio (real)") +ws.cell(row=4, column=3, value="Fin (real)") # Notas del corte anterior: se limpian antes del bucle y se reescriben abajo. primera_nota = None @@ -96,10 +157,20 @@ for row in range(5, ws.max_row + 1): tope = primera_nota if primera_nota else ws.max_row + 1 aplicado = set() +fechas_aplicadas = set() for row in range(5, tope): nombre = str(ws.cell(row=row, column=1).value or "").strip() if not nombre: continue + for prefijo, (ini, fin) in FECHAS_REALES.items(): + if nombre.startswith(prefijo): + for col, val in ((2, ini), (3, fin)): + cel = ws.cell(row=row, column=col, value=val) + cel.alignment = Alignment(horizontal="center", vertical="center") + if val == "—": + cel.font = Font(size=9, color=GRIS) + fechas_aplicadas.add(prefijo) + break for prefijo, (trab, pct) in ENCABEZADOS.items(): if nombre.startswith(prefijo): c = ws.cell(row=row, column=C_TRAB, value=round(trab, 2)) @@ -128,6 +199,8 @@ for row in range(5, tope): faltan = set(DELTAS_TRAB) - aplicado assert not faltan, f"Filas no encontradas en el Excel: {faltan}" +faltan_fechas = set(FECHAS_REALES) - fechas_aplicadas +assert not faltan_fechas, f"Filas sin fecha real aplicada: {faltan_fechas}" notas = [ ("✅ Completada · 🟡 En curso · 🔴 Pendiente/bloqueada · ⚪ Próxima · " @@ -151,6 +224,9 @@ notas = [ "interno y decidir el camino (réplica, detección al timbrado o soporte de BIND).", False), ("En espera de Balam: acceso a Azure (requisitos enviados el 25-ago), cancelación del CFDI 2386 " "y de la cotización 1026, y la definición del camino de prefactura.", False), + ("Fechas: Inicio y Fin son REALES (primer y último día trabajado según el registro de horas, la " + "bitácora y los commits); las tareas en curso llevan como Fin el último día trabajado y '—' " + "significa sin iniciar. El calendario plan original está en el corte del 6-ago.", False), ] r = primera_nota if primera_nota else ws.max_row + 2 for txt, bold in notas: