diff --git a/planeacion/Avance-Balam-2026-07-28.xlsx b/planeacion/Avance-Balam-2026-07-28.xlsx new file mode 100644 index 0000000..82d5fde Binary files /dev/null and b/planeacion/Avance-Balam-2026-07-28.xlsx differ diff --git a/planeacion/Horas-etapas-Balam-2026-07-28.xlsx b/planeacion/Horas-etapas-Balam-2026-07-28.xlsx deleted file mode 100644 index d664396..0000000 Binary files a/planeacion/Horas-etapas-Balam-2026-07-28.xlsx and /dev/null differ diff --git a/planeacion/generar_horas_etapas_2026_07_28.py b/planeacion/generar_horas_etapas_2026_07_28.py deleted file mode 100644 index 04168fb..0000000 --- a/planeacion/generar_horas_etapas_2026_07_28.py +++ /dev/null @@ -1,187 +0,0 @@ -"""Genera Horas-etapas-Balam-2026-07-28.xlsx — resumen de horas POR ETAPA para Erika. - -Pedido por Erika el 27-jul (6:46 pm: "las ya completas más que nada para ver -cuántas son") y aclarado el 28-jul (8:36 am): el Excel es el insumo del conteo -de horas de cada etapa "sobre todo para la FACTURACIÓN correspondiente". - -Las horas trabajadas se leen del Excel interno (`Plan-actividades-avance-2026-07-27.xlsx`), -que a su vez sale de `Seguimiento-horas.csv` — una sola fuente de datos, igual que -`generar_resumen_erika_2026_07_27.py`. Los rangos estimados y montos son los -contractuales de la propuesta v1.2 (§4) y de la Adenda 01 (Jira → BIND). -""" -import os -from datetime import date - -import openpyxl -from openpyxl.styles import Alignment, Border, Font, PatternFill, Side -from openpyxl.utils import get_column_letter - -BASE = os.path.dirname(os.path.abspath(__file__)) -SRC = os.path.join(BASE, "Plan-actividades-avance-2026-07-27.xlsx") -DST = os.path.join(BASE, "Horas-etapas-Balam-2026-07-28.xlsx") -EMISION = date(2026, 7, 28) # fecha de emisión; horas al corte del lunes 27-jul -TARIFA = 600 # MXN/h + IVA (propuesta v1.2 §3.3) - -# Marca Balam -CAFE, AMARILLO, CREMA = "331F0E", "F7BD0C", "FDF3D8" -V_FILL, V_FONT = "C6EFCE", "006100" # verde -A_FILL, A_FONT = "FFEB9C", "9C6500" # amarillo -GRIS = "595959" -BORDE = "D9D9D9" - -thin = Side(style="thin", color=BORDE) -box = Border(left=thin, right=thin, top=thin, bottom=thin) - -# --- Horas trabajadas desde el Excel interno (única fuente) ------------------- -wsrc = openpyxl.load_workbook(SRC).active -trab = {} -for row in range(2, wsrc.max_row + 1): - nombre = str(wsrc.cell(row=row, column=1).value or "").strip() - if nombre.startswith(("Etapa 0", "Etapa 1", "Integracion")): - clave = "TOTAL" if nombre.startswith("Integracion") else nombre.split(" ")[0] + nombre.split(" ")[1] - trab[clave] = float(wsrc.cell(row=row, column=10).value or 0) - -E0, E1, TOTAL = trab["Etapa0"], trab["Etapa1"], trab["TOTAL"] -assert abs((E0 + E1) - TOTAL) < 0.01, f"Horas no cuadran: {E0} + {E1} != {TOTAL}" - -# --- Filas del resumen -------------------------------------------------------- -# (etapa, estatus, kind_estatus, est_min, est_max, trabajadas o None) -ETAPAS = [ - ("Etapa 0 — Discovery, infraestructura y prototipo visual", - "✅ Completada y validada (24-jul)", "ok", 18, 22, E0), - ("Etapa 1 — Plataforma base y sincronización con BIND", - "🟡 En curso · 6 de 8 entregables terminados", "curso", 32, 39, E1), - ("Etapa 2 — Facturación (consulta y emisión), catálogo y multimoneda", - "⚪ Próxima", "prox", 38, 46, None), - ("Etapa 3 — Cobranza, tablero, reportes y cierre", - "⚪ Próxima", "prox", 24, 29, None), -] -ADENDA = ("Adicional — Integración Jira → BIND (Adenda 01)", - "📋 En aprobación · no estaba en la propuesta original", "prox", 9, 12, None) - -SUB_MIN = sum(e[3] for e in ETAPAS) # 112 -SUB_MAX = sum(e[4] for e in ETAPAS) # 136 -TOT_MIN, TOT_MAX = SUB_MIN + ADENDA[3], SUB_MAX + ADENDA[4] # 121, 148 - - -def dinero(h): - return f"${h * TARIFA:,.0f}" - - -def rango_dinero(lo, hi): - return f"{dinero(lo)} – {dinero(hi)}" - - -# --- Construcción ------------------------------------------------------------- -wb = openpyxl.Workbook() -ws = wb.active -ws.title = "Horas por etapa" - -ws["A1"] = "Proyecto Balam · Plataforma de Automatización Financiera" -ws["A1"].font = Font(bold=True, size=14, color=CAFE) -ws["A2"] = ("Horas por etapa — emitido el 28-jul-2026 · horas trabajadas al corte " - "del lunes 27-jul-2026 · tarifa $600 MXN/h + IVA") -ws["A2"].font = Font(size=10, italic=True, color=GRIS) - -ENC = ["Etapa", "Estatus", "Horas estimadas", "Horas trabajadas\n(al 27-jul)", - "Importe estimado\n(MXN, antes de IVA)"] -ANCHOS = [52, 34, 15, 15, 20] -FILA_ENC = 4 - -for i, (txt, ancho) in enumerate(zip(ENC, ANCHOS), start=1): - c = ws.cell(row=FILA_ENC, column=i, value=txt) - c.font = Font(bold=True, size=10, color=CAFE) - c.fill = PatternFill("solid", fgColor=AMARILLO) - c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) - c.border = box - ws.column_dimensions[get_column_letter(i)].width = ancho -ws.row_dimensions[FILA_ENC].height = 28 - - -def fila(r, nombre, estatus, kind, est, trabajadas, importe, bold=False, fill=None): - c = ws.cell(row=r, column=1, value=nombre) - c.font = Font(bold=bold, size=10, color=CAFE) - c.alignment = Alignment(vertical="center", wrap_text=True) - - cs = ws.cell(row=r, column=2, value=estatus) - cs.font = Font(size=9, color=GRIS) - cs.alignment = Alignment(vertical="center", wrap_text=True) - if kind == "ok": - cs.font = Font(size=9, color=V_FONT); cs.fill = PatternFill("solid", fgColor=V_FILL) - elif kind == "curso": - cs.font = Font(size=9, color=A_FONT); cs.fill = PatternFill("solid", fgColor=A_FILL) - - ce = ws.cell(row=r, column=3, value=est) - ce.font = Font(bold=bold, size=10, color=CAFE) - ce.alignment = Alignment(horizontal="center", vertical="center") - - ct = ws.cell(row=r, column=4, value=trabajadas if trabajadas is not None else "—") - if trabajadas is not None: - ct.number_format = "0.00" - ct.font = Font(bold=bold or trabajadas is not None, size=10, color=CAFE) - ct.alignment = Alignment(horizontal="center", vertical="center") - - ci = ws.cell(row=r, column=5, value=importe) - ci.font = Font(bold=bold, size=10, color=CAFE) - ci.alignment = Alignment(horizontal="right", vertical="center") - - for col in range(1, 6): - ws.cell(row=r, column=col).border = box - if fill: - ws.cell(row=r, column=col).fill = PatternFill("solid", fgColor=fill) - ws.row_dimensions[r].height = 26 - - -r = FILA_ENC + 1 -for nombre, estatus, kind, lo, hi, t in ETAPAS: - fila(r, nombre, estatus, kind, f"{lo} – {hi}", t, rango_dinero(lo, hi)) - r += 1 - -fila(r, "Subtotal — propuesta v1.2", "", "sub", f"{SUB_MIN} – {SUB_MAX}", TOTAL, - rango_dinero(SUB_MIN, SUB_MAX), bold=True, fill=CREMA) -r += 1 - -nombre, estatus, kind, lo, hi, t = ADENDA -fila(r, nombre, estatus, kind, f"{lo} – {hi}", t, rango_dinero(lo, hi)) -r += 1 - -fila(r, "Total con Adenda 01", "", "tot", f"{TOT_MIN} – {TOT_MAX}", TOTAL, - rango_dinero(TOT_MIN, TOT_MAX), bold=True, fill=CREMA) -r += 2 - -# --- Notas -------------------------------------------------------------------- -notas = [ - f"Horas trabajadas al corte del lunes 27-jul-2026, del control de horas del proyecto " - f"(mismas cifras del Excel de avance enviado el 27-jul): Etapa 0 {E0:.2f} h · " - f"Etapa 1 {E1:.2f} h · total {TOTAL:.2f} h.", - f"La Etapa 0 cerró en {E0:.2f} h, dentro del rango contractual de 18–22 h " - f"(a $600/h: {dinero(E0)} antes de IVA).", - "Referencia de facturación (propuesta v1.2, §3.3): la facturación inicial es de 30 h — " - "$18,000 + IVA — y cubre la Etapa 0 completa más el inicio de la Etapa 1; se emite en " - "cuanto se confirme el visto bueno. Los avances posteriores se facturan semanalmente " - "(viernes) por horas efectivamente trabajadas, con pago a 30 días naturales.", - "La integración Jira → BIND no estaba contemplada en la propuesta original; se " - "formaliza en la Adenda 01 (compartida el 28-jul) y se ejecuta tras su aprobación " - "por escrito.", - "Los rangos de horas operan con tope por etapa: al aproximarse al máximo, el trabajo " - "se detiene y se revisa el alcance antes de continuar.", -] -for txt in notas: - c = ws.cell(row=r, column=1, value=txt) - c.font = Font(italic=True, size=9, color=CAFE) - c.alignment = Alignment(wrap_text=True, vertical="top") - ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=5) - ws.row_dimensions[r].height = 28 if len(txt) > 120 else 16 - r += 1 - -ws.freeze_panes = f"A{FILA_ENC + 1}" -ws.sheet_view.showGridLines = False -ws.print_area = f"A1:E{r}" -ws.page_setup.orientation = "landscape" -ws.page_setup.fitToWidth = 1 -ws.sheet_properties.pageSetUpPr.fitToPage = True - -wb.save(DST) -print("OK ->", DST) -print(f" E0 {E0:.2f} h · E1 {E1:.2f} h · total {TOTAL:.2f} h · " - f"v1.2 {SUB_MIN}–{SUB_MAX} h · con adenda {TOT_MIN}–{TOT_MAX} h") diff --git a/planeacion/generar_plan_completo_2026_07_28.py b/planeacion/generar_plan_completo_2026_07_28.py new file mode 100644 index 0000000..5cd11a2 --- /dev/null +++ b/planeacion/generar_plan_completo_2026_07_28.py @@ -0,0 +1,335 @@ +"""Genera Avance-Balam-2026-07-28.xlsx — plan y avance COMPLETO para Erika. + +Pedido por Erika el 27-28 jul: el conteo de horas de cada etapa (base de la +facturación) en el mismo formato de los exceles anteriores, extendido a las +Etapas 2 y 3 desglosadas por actividades diarias. + +Etapas 0-1 (hechas/en curso) se leen del Excel interno +(`Plan-actividades-avance-2026-07-27.xlsx`), que a su vez sale de +`Seguimiento-horas.csv` — una sola fuente de datos. Las Etapas 2-3 y el ajuste +Jira → BIND se planifican aquí con los rangos contractuales de la propuesta +v1.3 (§2 y §4): E2 38–46 h · E3 24–29 h · Jira 9–12 h · total 121–148 h. +""" +import os +import re +from datetime import date + +import openpyxl +from openpyxl.styles import Alignment, Border, Font, PatternFill, Side +from openpyxl.utils import get_column_letter + +BASE = os.path.dirname(os.path.abspath(__file__)) +SRC = os.path.join(BASE, "Plan-actividades-avance-2026-07-27.xlsx") +DST = os.path.join(BASE, "Avance-Balam-2026-07-28.xlsx") + +# Marca Balam +CAFE, AMARILLO, CREMA = "331F0E", "F7BD0C", "FDF3D8" +V_FILL, V_FONT = "C6EFCE", "006100" # verde +A_FILL, A_FONT = "FFEB9C", "9C6500" # amarillo +R_FILL, R_FONT = "FFC7CE", "9C0006" # rojo +GRIS = "595959" +BORDE = "D9D9D9" + +thin = Side(style="thin", color=BORDE) +box = Border(left=thin, right=thin, top=thin, bottom=thin) + +# Columnas del origen (interno 27-jul) +O_NOMBRE, O_INI, O_FIN, O_PCT, O_EST, O_TRAB, O_STAT = 1, 3, 4, 7, 9, 10, 11 + +# Estatus del interno que quedaron amarrados a la "sesión del 28-jul" — +# la sesión se movió a revisión interna de Balam (REGISTRO #58). +REEMPLAZOS_STAT = { + "🔴 Diseño listo · impl. en pausa (def. Balam 28-jul)": + "🔴 Diseño listo · impl. en pausa (flujo en revisión interna de Balam)", + "🟡 Conectividad lista · falta regla 28-jul": + "🟡 Conectividad lista · falta regla (revisión interna de Balam)", +} + +# Los rangos por actividad del interno sumaban 34–42 h en Etapa 1, fuera del +# rango contractual de 32–39 (tope de facturación $23,400). Se recortan las +# tres actividades cuyas horas reales quedaron muy por debajo del estimado, +# para que la descomposición sume exactamente 32–39. +REEMPLAZOS_EST = { + "Sincronización de clientes": "1.5–2", # antes 2.5–3 (real: 0.5) + "Sincronización de facturas y cotizaciones": "4–4.5", # antes 4.5–5.5 (real: 0.5) + "Modelo de facturas + migraciones + datos de prueba": "3–3.5" # antes 3.5–4.5 (real: 0.5) +} + + +def limpia_fecha(txt): + """'vie 24/07/26' -> '24/07/2026'.""" + m = re.search(r"(\d{2})/(\d{2})/(\d{2})", str(txt or "")) + return f"{m.group(1)}/{m.group(2)}/20{m.group(3)}" if m else "" + + +# --- Lee Etapas 0-1 del interno ---------------------------------------------- +wsrc = openpyxl.load_workbook(SRC).active +hechas = [] # filas E0/E1 (encabezados de etapa + actividades) +trab_por_etapa = {} +for row in range(2, wsrc.max_row + 1): + nombre = str(wsrc.cell(row=row, column=O_NOMBRE).value or "").strip() + if not nombre or nombre.startswith(("✅", "▬", "Horas:", "Etapa 1:", "🔴", "Pendientes", + "API de Jira", "Núcleo")): + continue + if nombre.startswith("Integracion"): + trab_por_etapa["TOTAL"] = float(wsrc.cell(row=row, column=O_TRAB).value or 0) + continue + es_etapa = nombre.startswith("Etapa") + if es_etapa: + trab_por_etapa[nombre] = float(wsrc.cell(row=row, column=O_TRAB).value or 0) + stat = str(wsrc.cell(row=row, column=O_STAT).value or "").strip() + est = str(wsrc.cell(row=row, column=O_EST).value or "") + hechas.append({ + "nombre": nombre, + "ini": limpia_fecha(wsrc.cell(row=row, column=O_INI).value), + "fin": limpia_fecha(wsrc.cell(row=row, column=O_FIN).value), + "pct": wsrc.cell(row=row, column=O_PCT).value or 0, + "est": REEMPLAZOS_EST.get(nombre, est), + "trab": wsrc.cell(row=row, column=O_TRAB).value, + "stat": REEMPLAZOS_STAT.get(stat, stat), + "etapa": es_etapa, + }) + +E0, E1 = trab_por_etapa["Etapa 0"], trab_por_etapa["Etapa 1"] +TOTAL = trab_por_etapa["TOTAL"] +assert abs((E0 + E1) - TOTAL) < 0.01, f"Horas no cuadran: {E0}+{E1} != {TOTAL}" + + +def suma_est(filas): + lo = hi = 0.0 + for f in filas: + est = f["est"] if isinstance(f, dict) else f + if not est or est == "—": + continue + p = est.replace("–", "-").split("-") + lo += float(p[0]) + hi += float(p[-1]) + return lo, hi + + +# Las actividades de E0 y E1 deben sumar exactamente su rango contractual. +_secciones = {} +_actual = None +for f in hechas: + if f["etapa"]: + _actual = f["nombre"] + else: + _secciones.setdefault(_actual, []).append(f) +assert suma_est(_secciones["Etapa 0"]) == (18, 22), \ + f"Etapa 0: actividades suman {suma_est(_secciones['Etapa 0'])} != (18, 22)" +assert suma_est(_secciones["Etapa 1"]) == (32, 39), \ + f"Etapa 1: actividades suman {suma_est(_secciones['Etapa 1'])} != (32, 39)" + +# --- Plan de Etapas 2-3 y ajuste Jira (actividades diarias) ------------------- +PROX = "⚪ Próxima" +PROX_FLUJO = "⚪ Próxima · requiere flujo de facturación definido" +PROX_JIRA = "⚪ Próxima · sujeta a aprobación (v1.3) y flujo definido" + +# (nombre, ini, fin, est_min, est_max, estatus) +ETAPA2 = ("Etapa 2 — Facturación (consulta y emisión), catálogo y multimoneda", + "29/07/2026", "12/08/2026", 38, 46, [ + ("Andamiaje del frontend (Angular): proyecto, login y guardias por rol", + "29/07/2026", "30/07/2026", "4–5", PROX), + ("Layout base con la identidad de marca; gestión de estado y caché", + "30/07/2026", "31/07/2026", "3–4", PROX), + ("Listado de facturas: filtros, búsqueda, paginación y ordenamiento", + "31/07/2026", "03/08/2026", "6–7", PROX), + ("Detalle de factura con descarga de PDF/XML desde BIND", + "04/08/2026", "04/08/2026", "3–4", PROX), + ("Catálogo de clientes con lista blanca configurable (editable por rol Administración)", + "05/08/2026", "05/08/2026", "3–4", PROX), + ("Tipo de cambio del DOF: proceso programado y captura al facturar", + "06/08/2026", "06/08/2026", "2", PROX), + ("Creación de cotizaciones desde la plataforma (con simulación dry-run)", + "06/08/2026", "07/08/2026", "5–6", PROX_FLUJO), + ("Conversión cotización→factura con confirmación humana (MXN con IVA / USD sin IVA)", + "10/08/2026", "11/08/2026", "5–6", PROX_FLUJO), + ("Exportación de facturas y clientes a CSV/XLSX", + "11/08/2026", "11/08/2026", "2", PROX), + ("Pruebas integrales del flujo de emisión + manual de usuario", + "12/08/2026", "12/08/2026", "5–6", PROX), +]) + +ETAPA3 = ("Etapa 3 — Cobranza, tablero, reportes y cierre", + "13/08/2026", "21/08/2026", 24, 29, [ + ("Módulo de cobranza: antigüedad de cartera 30/60/90 y vistas por vencer/vencidas", + "13/08/2026", "14/08/2026", "5–6", PROX), + ("Alertas internas configurables + aplicación de la lista blanca", + "14/08/2026", "17/08/2026", "4–5", PROX), + ("Tablero directivo con indicadores de cuentas por cobrar", + "17/08/2026", "18/08/2026", "4–5", PROX), + ("Reporte operativo configurable (frecuencia, destinatarios, CSV/XLSX/PDF)", + "19/08/2026", "19/08/2026", "3–4", PROX), + ("Endurecimiento de seguridad, secretos, respaldos y plan de recuperación", + "20/08/2026", "20/08/2026", "3–4", PROX), + ("Documentación técnica: README, runbook y ADRs", + "20/08/2026", "21/08/2026", "2", PROX), + ("Sesión de capacitación grabada + transferencia y cierre", + "21/08/2026", "21/08/2026", "3", PROX), + ("Soporte posterior al lanzamiento (2 semanas, corrección de defectos — sin costo)", + "24/08/2026", "04/09/2026", "—", "⚪ Incluida en el cierre · sin costo"), +]) + +JIRA = ("Integración Jira → BIND (ajuste propuesta v1.3, en aprobación)", + "04/08/2026", "07/08/2026", 9, 12, [ + ("Cliente de la API de Jira (token PAF): lectura de tickets FAC y control de límites", + "04/08/2026", "05/08/2026", "3–4", PROX_JIRA), + ("Disparador por estatus → generación automática de la cotización en BIND", + "05/08/2026", "06/08/2026", "4–5", PROX_JIRA), + ("Trazabilidad ticket↔cotización↔factura, alimentación del tablero y prueba observada", + "07/08/2026", "07/08/2026", "2–3", PROX_JIRA), +]) + + +def suma_rangos(acts): + lo = hi = 0 + for _, _, _, est, _ in acts: + if est == "—": # filas sin costo (soporte incluido) no suman + continue + p = est.split("–") + lo += float(p[0]) + hi += float(p[-1]) + return lo, hi + + +for titulo, _, _, lo, hi, acts in (ETAPA2, ETAPA3, JIRA): + slo, shi = suma_rangos(acts) + assert (slo, shi) == (lo, hi), f"{titulo}: actividades {slo}–{shi} != rango {lo}–{hi}" + +TOT_MIN = 18 + 32 + ETAPA2[3] + ETAPA3[3] + JIRA[3] # 121 +TOT_MAX = 22 + 39 + ETAPA2[4] + ETAPA3[4] + JIRA[4] # 148 +PCT_GLOBAL = round(TOTAL / ((TOT_MIN + TOT_MAX) / 2), 2) + +# --- Construcción ------------------------------------------------------------- +wb = openpyxl.Workbook() +ws = wb.active +ws.title = "Plan y avance" + +ws["A1"] = "Proyecto Balam · Plataforma de Automatización Financiera" +ws["A1"].font = Font(bold=True, size=14, color=CAFE) +ws["A2"] = ("Plan y avance al 28-jul-2026 · horas trabajadas al corte del lunes 27-jul · " + "Etapas 2-3 y ajuste Jira desglosados por actividad diaria") +ws["A2"].font = Font(size=10, italic=True, color=GRIS) + +ENC = ["Actividad", "Inicio", "Fin", "Avance", "Horas\nestimadas", "Horas\ntrabajadas", "Estatus"] +ANCHOS = [56, 12, 12, 9, 11, 11, 40] +FILA_ENC = 4 + +for i, (txt, ancho) in enumerate(zip(ENC, ANCHOS), start=1): + c = ws.cell(row=FILA_ENC, column=i, value=txt) + c.font = Font(bold=True, size=10, color=CAFE) + c.fill = PatternFill("solid", fgColor=AMARILLO) + c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True) + c.border = box + ws.column_dimensions[get_column_letter(i)].width = ancho +ws.row_dimensions[FILA_ENC].height = 26 + + +def pinta_fila(r, nombre, ini, fin, pct, est, trab, stat, etapa=False): + c = ws.cell(row=r, column=1, value=nombre) + c.font = Font(bold=etapa, size=10, color=CAFE) + c.alignment = Alignment(vertical="center", wrap_text=True, indent=0 if etapa else 1) + + for col, val in ((2, ini), (3, fin)): + cc = ws.cell(row=r, column=col, value=val) + cc.font = Font(size=9, color=GRIS) + cc.alignment = Alignment(horizontal="center", vertical="center") + + cp = ws.cell(row=r, column=4, value=pct) + cp.number_format = "0%" + cp.alignment = Alignment(horizontal="center", vertical="center") + if pct >= 1: + cp.font = Font(bold=True, size=10, color=V_FONT) + cp.fill = PatternFill("solid", fgColor=V_FILL) + elif pct > 0: + cp.font = Font(bold=True, size=10, color=A_FONT) + cp.fill = PatternFill("solid", fgColor=A_FILL) + else: + cp.font = Font(size=10, color=GRIS) + + ce = ws.cell(row=r, column=5, value=est) + ce.font = Font(bold=etapa, size=10, color=CAFE) + ce.alignment = Alignment(horizontal="center", vertical="center") + + ct = ws.cell(row=r, column=6, value=trab if trab not in (None, "") else "—") + if isinstance(trab, (int, float)): + ct.number_format = "0.00" + ct.font = Font(bold=etapa, size=10, color=CAFE) + ct.alignment = Alignment(horizontal="center", vertical="center") + + cs = ws.cell(row=r, column=7, value=stat) + cs.alignment = Alignment(horizontal="left", vertical="center", wrap_text=True) + cs.font = Font(size=9, color=GRIS) + if stat.startswith("✅"): + cs.font = Font(size=9, color=V_FONT); cs.fill = PatternFill("solid", fgColor=V_FILL) + elif stat.startswith("🟡"): + cs.font = Font(size=9, color=A_FONT); cs.fill = PatternFill("solid", fgColor=A_FILL) + elif stat.startswith("🔴"): + cs.font = Font(size=9, bold=True, color=R_FONT); cs.fill = PatternFill("solid", fgColor=R_FILL) + + for col in range(1, 8): + ws.cell(row=r, column=col).border = box + if etapa and col in (1, 2, 3): + ws.cell(row=r, column=col).fill = PatternFill("solid", fgColor=CREMA) + + +r = FILA_ENC + 1 +pinta_fila(r, "Integracion de plataformas Balam", "01/07/2026", "21/08/2026", + PCT_GLOBAL, f"{TOT_MIN:.0f}–{TOT_MAX:.0f}", TOTAL, "", etapa=True) +r += 1 + +for f in hechas: + pinta_fila(r, f["nombre"], f["ini"], f["fin"], f["pct"], f["est"], f["trab"], + f["stat"], etapa=f["etapa"]) + r += 1 + +for titulo, ini, fin, lo, hi, acts in (ETAPA2, ETAPA3, JIRA): + pinta_fila(r, titulo, ini, fin, 0, f"{lo}–{hi}", None, "", etapa=True) + r += 1 + for nombre, aini, afin, est, stat in acts: + pinta_fila(r, nombre, aini, afin, 0, est, None, stat) + r += 1 + +# --- Leyenda y notas ---------------------------------------------------------- +r += 1 +leyenda = "✅ Completada · 🟡 En curso · 🔴 Pendiente/bloqueada · ⚪ Próxima" +notas = [ + (leyenda, False), + (f"Horas trabajadas al corte del lunes 27-jul: {E0:.2f} h en Etapa 0 (cerrada y " + f"validada, rango 18–22 h) y {E1:.2f} h en Etapa 1 ({TOTAL:.2f} h en total). " + "Las horas por etapa son la base de la facturación (tarifa $600/h + IVA).", True), + ("Etapas 2 y 3 desglosadas por actividad diaria con sus rangos estimados " + "(38–46 h y 24–29 h). Las fechas planificadas asumen media jornada en promedio " + "y están sujetas a la definición del flujo de facturación (en revisión interna " + "de Balam) y al acceso a Azure. El soporte post-lanzamiento (2 semanas, sin " + "costo) corre del 24-ago al 4-sep, después del cierre.", False), + ("Integración Jira → BIND (9–12 h): ajuste no contemplado en la propuesta " + "original, incorporado en la propuesta ajustada v1.3; se ejecuta tras su " + "aprobación por escrito y una vez definido el flujo. De aprobarse, corre en " + "paralelo con la Etapa 2 la semana del 4-ago.", False), + (f"Total del plan con el ajuste: {TOT_MIN:.0f}–{TOT_MAX:.0f} h. El avance global " + f"({PCT_GLOBAL:.0%}) se calcula sobre el plan completo; el corte anterior (80%) " + "se calculaba solo sobre las Etapas 0-1.", False), + ("En Etapa 1 siguen abiertos: capa de escritura (en pausa por la definición del " + "flujo), datos de prueba, y Azure/CI-CD (accesos del lado de Balam).", False), +] +for txt, bold in notas: + c = ws.cell(row=r, column=1, value=txt) + c.font = Font(italic=True, size=9, color=CAFE, bold=bold) + c.alignment = Alignment(wrap_text=True, vertical="top") + ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=7) + ws.row_dimensions[r].height = 28 if len(txt) > 120 else 14 + r += 1 + +ws.freeze_panes = f"A{FILA_ENC + 1}" +ws.sheet_view.showGridLines = False +ws.print_area = f"A1:G{r}" +ws.page_setup.orientation = "landscape" +ws.page_setup.fitToWidth = 1 +ws.sheet_properties.pageSetUpPr.fitToPage = True + +wb.save(DST) +print("OK ->", DST) +print(f" E0 {E0:.2f} h · E1 {E1:.2f} h · trabajadas {TOTAL:.2f} h · " + f"plan {TOT_MIN:.0f}–{TOT_MAX:.0f} h · avance global {PCT_GLOBAL:.0%} · " + f"filas E2 {len(ETAPA2[5])} · E3 {len(ETAPA3[5])} · Jira {len(JIRA[5])}") diff --git a/propuesta/00 - PROPUESTA-COMERCIAL.md b/propuesta/00 - PROPUESTA-COMERCIAL.md index fa512bd..f052fbc 100644 --- a/propuesta/00 - PROPUESTA-COMERCIAL.md +++ b/propuesta/00 - PROPUESTA-COMERCIAL.md @@ -5,8 +5,8 @@ |---|---| | **Preparada para** | Noe Rocha (CTO) · Araceli Sánchez Jiménez (CEO/Operaciones) · Erika Chávez (PM) · Pedro Alberto Ayala Elizondo (Contacto técnico) | | **Preparada por** | Johann Velazquez — Consultor de Software · Monterrey, N.L. | -| **Fecha** | Mayo 2026 (actualizada julio 2026) | -| **Versión** | 1.2 — facturación inicial de 30 h explícita y condiciones comerciales consolidadas (ajuste post-kickoff, 1-jul-2026). Base: v1.1 con ajustes acordados el 8-jun-2026 | +| **Fecha** | Mayo 2026 (actualizada al 28 de julio de 2026) | +| **Versión** | 1.3 — integración Jira → BIND incorporada al alcance conforme al control de cambios (§10), ajuste del 28-jul-2026. Base: v1.2 (facturación inicial de 30 h explícita y condiciones comerciales consolidadas, 1-jul-2026) | | **Vigencia** | 30 días naturales a partir de la fecha de emisión | --- @@ -15,16 +15,16 @@ Balam opera hoy un proceso financiero fragmentado: facturación, cobranza, conciliación y contabilidad viven en sistemas que no se comunican, y el trabajo de unirlos recae en personas. Cada traspaso manual introduce error, retrabajo y demoras de cobranza que erosionan la relación con los clientes estratégicos. -Esta propuesta plantea una **primera etapa enfocada**: una plataforma web que centraliza la facturación y las cuentas por cobrar sobre **BIND ERP**, el sistema ya confirmado como fuente de verdad. El MVP permite **emitir facturas en MXN y USD** desde la plataforma —creando la cotización y convirtiéndola en factura a través de la API de BIND, que conserva el timbrado CFDI— y entrega además visibilidad, dashboard, alertas y reglas de cobranza. Toda emisión opera con **confirmación humana y modo de simulación**, de modo que la prioridad #1 de Balam (facturación) se atiende sin asumir riesgos fiscales. La arquitectura queda preparada para incorporar conciliación bancaria, pagos en línea, contabilidad e integraciones adicionales conforme se validen. +Esta propuesta plantea una **primera etapa enfocada**: una plataforma web que centraliza la facturación y las cuentas por cobrar sobre **BIND ERP**, el sistema ya confirmado como fuente de verdad. El MVP permite **emitir facturas en MXN y USD** desde la plataforma —creando la cotización y convirtiéndola en factura a través de la API de BIND, que conserva el timbrado CFDI— y entrega además visibilidad, dashboard, alertas y reglas de cobranza. Toda emisión opera con **confirmación humana y modo de simulación**, de modo que la prioridad #1 de Balam (facturación) se atiende sin asumir riesgos fiscales. Con el **ajuste de julio de 2026**, el alcance incorpora además la **integración con Jira**: los tickets de la bandeja de Facturación generan automáticamente su cotización en BIND, conservando los mismos candados de control. La arquitectura queda preparada para incorporar conciliación bancaria, pagos en línea, contabilidad e integraciones adicionales conforme se validen. En síntesis: -- **Alcance:** MVP de facturación (consulta y **emisión asistida** MXN/USD) y cobranza sobre la API de BIND ERP. -- **Plazo:** 6 a 7 semanas, a media dedicación. -- **Inversión:** **$67,200 – $81,600 MXN** + IVA, bajo esquema de tiempo y materiales con tope por etapa. +- **Alcance:** MVP de facturación (consulta y **emisión asistida** MXN/USD) y cobranza sobre la API de BIND ERP, más la **integración acotada con Jira** (generación automática de cotizaciones desde la bandeja de Facturación — ajuste jul-2026). +- **Plazo:** 6 a 8 semanas, a media dedicación. +- **Inversión:** **$72,600 – $88,800 MXN** + IVA, bajo esquema de tiempo y materiales con tope por etapa (incluye el ajuste Jira → BIND de 9 – 12 h). - **Modelo:** transparencia total de horas, entregables verificables semana a semana, y código propiedad de Balam desde el primer día. -El enfoque responde directamente a la indicación del CTO de priorizar facturación e integrar únicamente BIND en esta primera fase, evitando comprometer alcance que dependa de integraciones aún no disponibles o no prioritarias. +El enfoque responde directamente a la indicación del CTO de priorizar facturación y BIND en esta primera fase, evitando comprometer alcance que dependa de integraciones aún no disponibles o no prioritarias. La integración con Jira —originalmente diferida— se incorporó en julio de 2026 como ajuste de alcance, una vez que la propia dirección confirmó que el proceso de facturación se gobierna en Jira y que su API cubre lo necesario. --- @@ -36,11 +36,12 @@ Durante la sesión con el equipo directivo, la lectura del requerimiento fue cla ### 1.2 Contexto que define el alcance -Tras la sesión de seguimiento y las actualizaciones del CTO del 25 de mayo, tres factores reordenan el alcance del MVP: +Tras la sesión de seguimiento y las actualizaciones del CTO del 25 de mayo, cuatro factores reordenan el alcance del MVP: 1. **BIND ERP cuenta con API oficial** (`api.bind.com.mx`, OData v3, 20,000 solicitudes/día). Esto permite una integración por API en tiempo cercano a real, superando el supuesto inicial de exportación manual de archivos. 2. **La dirección técnica priorizó la facturación.** Conforme a la indicación de considerar "únicamente BIND ERP en una primera etapa", funcionalidades como pagos en línea, conciliación bancaria, recordatorios automáticos a clientes y asientos contables se difieren de manera explícita a fases posteriores. 3. **BUK dispone de API**, confirmada por el equipo de Balam, aunque no constituye una prioridad inmediata. Queda contemplada en el roadmap sin condicionar el MVP. +4. **El proceso interno evolucionó hacia Jira** (confirmado por la dirección en julio de 2026): hoy todo el flujo de facturación nace y se gobierna en Jira — *"lo que no está en Jira no se procesa"* — con una bandeja dedicada (**Facturación**, llave `FAC-`) y un flujo de estatus formal. Por ello, la integración con Jira se incorporó al alcance como **ajuste conforme al control de cambios** (§10), detallado en la §2. ### 1.3 Sistemas actuales @@ -48,7 +49,7 @@ Tras la sesión de seguimiento y las actualizaciones del CTO del 25 de mayo, tre |---|---|---| | **BIND ERP** | Facturación y contabilidad con PAC integrado | Integración principal (API confirmada) | | **BUK** | Recursos humanos, contratos, nómina | Fuera de alcance (API disponible, fase posterior) | -| **Jira** | Gestión de proyectos y servicios | Fuera de alcance | +| **Jira** | Gestión de proyectos y servicios; origen operativo del proceso de facturación | **Integración acotada (ajuste jul-2026):** lectura de la bandeja Facturación y generación automática de cotizaciones en BIND | | **Banca (3 instituciones)** | 2 México + IBC Bank Texas, estados en PDF | Fuera de alcance | ### 1.4 Solución propuesta @@ -58,6 +59,7 @@ Se propone una **capa de operaciones financieras sobre BIND ERP**, no un reempla **Alcance funcional del MVP:** - Integración con BIND ERP vía API: lectura primero y **escritura asistida** una vez validada en Discovery. +- **Integración con Jira (ajuste jul-2026):** lectura de los tickets de la bandeja **Facturación (`FAC-`)** y generación automática de la cotización en BIND al alcanzar el estatus disparador que Balam defina, mediante la misma capa de escritura controlada y con trazabilidad ticket ↔ cotización ↔ factura. - **Emisión de facturas desde la plataforma:** creación de cotización y conversión a factura en MXN (con IVA) y USD (sin IVA, para clientes extranjeros) a través de la API de BIND, con timbrado a cargo del PAC de BIND, confirmación humana obligatoria y modo de simulación (*dry-run*) previo a cada emisión. - Catálogo central de clientes con lista blanca configurable (ACUNTIA + Top 3). - Vista unificada de facturación: estados, vencimientos, filtros y descarga de PDF/XML. @@ -87,6 +89,7 @@ La incorporación posterior de pagos en línea, recordatorios automáticos, conc - Reducción medible del trabajo manual de consulta y reporteo sobre BIND. - Aplicación correcta de la lista blanca: ACUNTIA y Top 3 nunca reciben recordatorios automáticos masivos. - Entrega del MVP funcional en el plazo comprometido, con alcance acotado y sin desviaciones. +- Trazabilidad ticket de Jira → cotización → factura sin captura manual duplicada, una vez definido el flujo de facturación. - Control fiscal: ninguna factura se emite sin confirmación humana explícita; el timbrado CFDI permanece a cargo del PAC de BIND. ### 1.6 Escala operativa de referencia @@ -122,7 +125,7 @@ La selección tecnológica privilegia robustez empresarial, mantenibilidad a lar > **Sobre las versiones.** Las versiones indicadas son la referencia vigente a mayo de 2026; se fijan al inicio del proyecto sobre la rama estable/LTS de cada tecnología. Se prioriza **.NET 10** por ser versión de soporte extendido (LTS), apropiada para una aplicación financiera de largo plazo. -El proyecto se organiza en cuatro etapas secuenciales. Cada una concluye con un entregable demostrable y se factura conforme a horas reales (ver §3). +El proyecto se organiza en cuatro etapas secuenciales, más el **ajuste Jira → BIND** incorporado en julio de 2026 (al final de esta sección). Cada bloque concluye con un entregable demostrable y se factura conforme a horas reales (ver §3). ### Etapa 0 — Discovery, infraestructura y prototipo visual · *Semana 1 · 18 – 22 h* @@ -195,6 +198,27 @@ El proyecto se organiza en cuatro etapas secuenciales. Cada una concluye con un > **Fuera de esta etapa:** recordatorios automáticos a clientes, pagos en línea, conciliación bancaria, asientos contables automáticos e integración bancaria en vivo. +### Integración Jira → BIND — ajuste de alcance (jul-2026) · *se ejecuta junto con las Etapas 2-3 · 9 – 12 h* + +**Antecedente.** La versión anterior de esta propuesta dejó Jira fuera del alcance conforme a la información disponible al cotizar. En las sesiones del 22, 24 y 27 de julio la dirección confirmó que el proceso interno evolucionó — todo el flujo de facturación nace y se gobierna en Jira — y quedó confirmada la viabilidad técnica: la API de Jira cubre lectura y escritura de tickets, se entregó el token de integración (**"PAF"**, vigente al 27-jul-2027) y se documentaron los límites de consumo de Atlassian. La estimación (~10 h) se comunicó a la PM el 21 de julio; esta sección la formaliza conforme al control de cambios (§10). + +**Entregables:** + +- **Conexión con la API de Jira** mediante el token PAF y lectura de los tickets de la bandeja **Facturación (`FAC-`)**, con consumo autorregulado conforme a los límites de velocidad documentados por Atlassian. +- **Generación automática de la cotización en BIND** cuando un ticket alcanza el estatus disparador que Balam defina (candidato natural: la entrada del ticket al proceso de facturación, previo a "resuelto"), a través de la misma capa de escritura controlada del MVP. +- **Trazabilidad ticket ↔ cotización ↔ prefactura/factura**, visible en la plataforma y registrada en la bitácora de auditoría; los tickets leídos alimentan además la vista *"qué necesita atención"* del tablero. +- **Pruebas controladas:** scripts de consulta y de creación/edición sobre un registro de prueba, y una **prueba observada** con el equipo de Balam antes de habilitar la generación automática en operación. + +``` +Ticket Jira (FAC) → Cotización BIND (automática) → Prefactura → Aprobación humana → Timbrado (PAC de BIND) +``` + +> **El control fiscal no cambia.** La integración crea **cotizaciones, nunca facturas**: se mantiene la cadena acordada — cotización → prefactura → **aprobación humana** → timbrado por el PAC de BIND — con modo de simulación (*dry-run*), feature flag y registro en bitácora. No existe timbrado automático. + +**No incluye:** (a) el **alta automática de clientes en BIND** — si el cliente del ticket no existe, la plataforma lo detecta y lo notifica; darlo de alta automáticamente es una decisión de proceso abierta que, de aprobarse, se estima por separado; (b) **tickets con múltiples facturas** — el supuesto es *un ticket → una cotización*; el manejo del caso masivo se define junto con Balam y, si requiere desarrollo adicional, se estima por separado; (c) **otros usos de Jira** (reporteo de horas de consultores, tableros sobre otras bandejas, espacio comercial) y los módulos del Anexo B. + +> **Dependencia clave.** La implementación inicia una vez que Balam cierre la **definición del flujo de facturación** (en revisión interna), de la cual salen el estatus disparador y las reglas de prefactura. + --- ## 3. Modelo de colaboración @@ -212,7 +236,7 @@ A cambio de esta flexibilidad, el esquema ofrece controles concretos: ### 3.2 Dedicación y plazo -La dedicación es de **media jornada (aproximadamente 20 h/semana**, con flexibilidad hasta 25 h en semanas de mayor carga). Sobre esa base, la primera etapa requiere **112 a 136 horas**, equivalentes a **6 – 7 semanas** de calendario. +La dedicación es de **media jornada (aproximadamente 20 h/semana**, con flexibilidad hasta 25 h en semanas de mayor carga). Sobre esa base, la primera etapa requiere **121 a 148 horas** (incluido el ajuste Jira → BIND), equivalentes a **6 – 8 semanas** de calendario. ### 3.3 Condiciones comerciales @@ -255,9 +279,12 @@ La inversión de la primera etapa se desglosa por entregable, conforme al esquem | 1 | Plataforma base, sincronización con BIND y capa de escritura | 32 – 39 | $19,200 – $23,400 | | 2 | Facturación (consulta y **emisión** MXN/USD), catálogo y multimoneda | 38 – 46 | $22,800 – $27,600 | | 3 | Cobranza, tablero, reportes y cierre | 24 – 29 | $14,400 – $17,400 | -| **Total primera etapa** | | **112 – 136 h** | **$67,200 – $81,600** | +| Ajuste jul-2026 | **Integración Jira → BIND** (lectura de la bandeja FAC, cotización automática, trazabilidad y pruebas) | 9 – 12 | $5,400 – $7,200 | +| **Total primera etapa** | | **121 – 148 h** | **$72,600 – $88,800** | -> Cifras antes de IVA. Plazo estimado: **6 – 7 semanas** a media jornada (~20 h/semana, con flexibilidad hasta 25 h en semanas pico). +> Cifras antes de IVA. Plazo estimado: **6 – 8 semanas** a media jornada (~20 h/semana, con flexibilidad hasta 25 h en semanas pico). + +> **Sobre el ajuste Jira → BIND:** se incorporó conforme al control de cambios (§10) a partir de la confirmación de julio de 2026 (ver §2); el rango es consistente con la estimación de ~10 h comunicada el 21 de julio y su ejecución inicia una vez que Balam cierre la definición del flujo de facturación. > **Facturación inicial (vinculante para el primer pago):** el primer pago corresponde a **30 horas — $18,000 MXN + IVA**, que cubren la **Etapa 0 completa (18–22 h) y el inicio de la Etapa 1**; se factura al arranque del proyecto y su pago corre a 30 días naturales (ver §3.3). Los avances posteriores se facturan semanalmente (viernes) por horas efectivamente trabajadas. @@ -302,7 +329,7 @@ Los siguientes son servicios de infraestructura externos, independientes de los | Azure Key Vault + Application Insights | Secretos (Standard) + observabilidad (5 GB/mes incluidos, luego por GB) | $0 – $15 | | Monitoreo de disponibilidad / Sentry *(opcional)* | Plan gratuito → Team | $0 – $26 | | PAC para CFDI | Ya incluido en BIND | Sin costo adicional | -| **Total mensual estimado** | | **$30 – $160 USD/mes** | +| **Total mensual estimado** | | **$30 – $162 USD/mes** | > **Configuración esperada en producción** (App Service B2 + PostgreSQL B2s con respaldo + observabilidad básica): **≈ $90 – $110 USD/mes**. El extremo bajo de la tabla corresponde a una configuración mínima; el alto, a una holgada con redundancia y monitoreo de pago. @@ -327,6 +354,8 @@ El cumplimiento de las estimaciones depende de las siguientes condiciones. De no 7. **Acuerdo de uso de la metodología asistida por IA**, con el compromiso de no entrenamiento sobre datos del cliente. 8. **El PAC integrado de BIND** atiende los volúmenes actuales y futuros sin costo adicional; el timbrado CFDI permanece a cargo de BIND, no de la plataforma. 9. **El comportamiento de escritura de la API de BIND** (creación de cotización, conversión a factura y timbrado) se valida en Discovery; la emisión productiva se habilita únicamente tras esa validación. Balam designa al rol responsable de confirmar cada emisión. +10. **Token de Jira ("PAF") vigente** con visibilidad de la bandeja Facturación (`FAC-`), que opera como bandeja "padre" del proceso; si algún disparador nace en otra bandeja sin reflejarse en FAC, el ajuste se revisa en conjunto. Entregado el 27-jul-2026. +11. **Definición del flujo de facturación** cerrada por Balam (estatus disparador y reglas de prefactura) y **diagrama del flujo Jira en tamaño legible** entregado, antes de iniciar la implementación del ajuste Jira → BIND. --- @@ -371,7 +400,8 @@ Más allá del código funcional, la entrega incluye: 1. Sesión de revisión de esta propuesta (1 h) para resolver dudas y ajustar lo que corresponda. 2. **Firma del contrato / orden de trabajo** (prestación de servicios y confidencialidad) — formaliza el compromiso para arrancar sin anticipo. 3. **Facturación inicial** (30 horas — **$18,000 MXN** + IVA), que cubre la Etapa 0 y el inicio de la Etapa 1 (ver §3.3), con pago a 30 días naturales, para iniciar Discovery. -4. Arranque del proyecto, con entrega del MVP en **6 – 7 semanas**. +4. Arranque del proyecto, con entrega del MVP en **6 – 8 semanas**. +5. **Aprobación por escrito de la versión 1.3** (basta la confirmación por correo electrónico) para ejecutar el ajuste Jira → BIND de 9 – 12 h una vez definido el flujo de facturación. --- @@ -393,7 +423,7 @@ Leyenda: ✅ Cubierto · ⚠️ Parcial · ❌ Diferido a fase posterior (Anexo | Funcionalidad PRD | Cobertura | Detalle | |---|---|---| -| Generación automatizada de facturas | ⚠️ | **Incluida la creación asistida:** cotización → factura desde la plataforma vía API de BIND, con confirmación humana; el timbrado lo realiza el PAC de BIND. La generación **automática desde eventos** (Jira→BUK→Factura) depende de APIs no disponibles hoy — fase posterior. | +| Generación automatizada de facturas | ⚠️ | **Incluida la creación asistida:** cotización → factura desde la plataforma vía API de BIND, con confirmación humana; el timbrado lo realiza el PAC de BIND. Con el **ajuste jul-2026**, los tickets de Jira (bandeja Facturación) **generan automáticamente su cotización**; la cadena completa sin intervención (Jira→BUK→Factura) sigue en fase posterior. | | Multimoneda para clientes internacionales (USD sin IVA) | ✅ | **Emisión en MXN (con IVA) y USD (sin IVA)** con tipo de cambio del DOF capturado al momento de facturación. **EUR queda fuera del MVP.** | | Descarga automática de facturas / reporte | ✅ | Listado con filtros, búsqueda, detalle con PDF/XML y exportación a Excel. | @@ -433,7 +463,7 @@ Leyenda: ✅ Cubierto · ⚠️ Parcial · ❌ Diferido a fase posterior (Anexo | ID | Descripción | Cobertura | Notas | |---|---|---|---| -| RF-01 | Generar facturas automáticamente desde eventos | ⚠️ | Creación manual (cotización→factura) incluida; la generación automática desde eventos requiere Jira/BUK — fase posterior | +| RF-01 | Generar facturas automáticamente desde eventos | ⚠️ | Creación asistida (cotización→factura) incluida; con el ajuste jul-2026, los tickets de Jira generan automáticamente la **cotización**. La factura siempre requiere aprobación humana; la cadena BUK→Factura sigue en fase posterior | | RF-02 | Multimoneda USD/EUR/MXN | ⚠️ | Emisión MXN + USD en el MVP; EUR en fase posterior | | RF-03 | Integración con sistemas existentes (BUK / nómina) | ❌ | API de BUK confirmada, no prioritaria | | RF-04 | Registrar pagos desde fuentes bancarias | ❌ | Fase posterior | @@ -461,7 +491,7 @@ Leyenda: ✅ Cubierto · ⚠️ Parcial · ❌ Diferido a fase posterior (Anexo ### A.4 Diferidos — resumen -**Bloqueado por terceros o sin prioridad actual:** generación automática de facturas (Jira→BUK→Factura); integración bancaria en vivo (Belvo/Plaid/IBC Texas); integración con BUK; integración con Jira. +**Bloqueado por terceros o sin prioridad actual:** generación automática de facturas de punta a punta (Jira→BUK→Factura); integración bancaria en vivo (Belvo/Plaid/IBC Texas); integración con BUK. *(La integración con Jira dejó de estar diferida: se incorporó como ajuste jul-2026 — ver §2.)* **Diferido por decisión de alcance:** pagos en línea; recordatorios automáticos a clientes; conciliación bancaria; asientos contables automáticos; EUR; flujo de efectivo proyectado; detección avanzada de anomalías; portal de cliente; multi-tenant comercial; cumplimiento avanzado Texas. @@ -486,7 +516,7 @@ Los siguientes son **rangos indicativos**, no compromisos contractuales. Se reco ### B.2 Roadmap posterior (sin cotización) -Se cotiza al cierre de la fase anterior, priorizando con datos reales de uso: integración bancaria en vivo (Belvo, Plaid); conector con BIND para asientos contables automáticos; integración con Jira; flujo de efectivo proyectado (30/60/90 días); gestión cambiaria automática; pagos recurrentes; detección avanzada de anomalías; soporte EUR; clasificación asistida por IA; portal de cliente; multi-tenant comercial; aplicación móvil para tickets; y cumplimiento avanzado para Texas. +Se cotiza al cierre de la fase anterior, priorizando con datos reales de uso: integración bancaria en vivo (Belvo, Plaid); conector con BIND para asientos contables automáticos; ampliaciones de la integración con Jira (otras bandejas, reporteo de horas, espacio comercial); flujo de efectivo proyectado (30/60/90 días); gestión cambiaria automática; pagos recurrentes; detección avanzada de anomalías; soporte EUR; clasificación asistida por IA; portal de cliente; multi-tenant comercial; aplicación móvil para tickets; y cumplimiento avanzado para Texas. ### B.3 Activación diff --git a/propuesta/01 - ADENDA-INTEGRACION-JIRA.md b/propuesta/01 - ADENDA-INTEGRACION-JIRA.md deleted file mode 100644 index 047deef..0000000 --- a/propuesta/01 - ADENDA-INTEGRACION-JIRA.md +++ /dev/null @@ -1,66 +0,0 @@ -# Adenda 01 — Integración Jira → BIND -## Generación automática de cotizaciones desde los tickets de facturación - -| | | -|---|---| -| **Preparada para** | Noe Rocha (CTO) · Araceli Sánchez Jiménez (CEO/Operaciones) · Erika Chávez (PM) · Pedro Alberto Ayala Elizondo (Contacto técnico) | -| **Preparada por** | Johann Velazquez — Consultor de Software · Monterrey, N.L. | -| **Fecha** | 28 de julio de 2026 | -| **Documento** | Adenda 01 a la Propuesta Comercial v1.2 — solicitud de cambio conforme a la §10 (control de cambios) | -| **Vigencia** | 30 días naturales a partir de la fecha de emisión | - ---- - -## 1. Antecedente - -La propuesta v1.2 dejó Jira explícitamente **fuera del alcance** del MVP (§1.3 y Anexo A.4), conforme a la información disponible al momento de cotizar. Durante el Discovery y las sesiones de julio, la dirección confirmó que el proceso interno evolucionó: **hoy todo el flujo de facturación de Balam nace y se gobierna en Jira** — *"lo que no está en Jira no se procesa"* — con una bandeja dedicada (**Facturación**, llave `FAC-`) y un flujo de estatus formal que culmina en "resuelto". - -En la sesión del 22 de julio el CTO planteó incorporar esta conectividad como ajuste de alcance; en la validación del prototipo del 24 de julio se ratificó, y en la sesión técnica del 27 de julio con Pedro Ayala quedó confirmada la viabilidad: la API de Jira cubre **lectura y escritura** de tickets, se entregó el token de integración (**"PAF"**, vigente al 27-jul-2027) y se documentaron los límites de consumo del lado de Atlassian. La estimación preliminar (~10 h) se comunicó a la PM el 21 de julio; esta adenda la formaliza por escrito, como lo prevé el control de cambios de la propuesta. - -## 2. Alcance del cambio - -La integración agrega a la primera etapa las siguientes capacidades: - -1. **Conexión con la API de Jira** mediante el token PAF y lectura de los tickets de la bandeja **Facturación (`FAC-`)**, con consumo autorregulado conforme a los límites de velocidad documentados por Atlassian. -2. **Generación automática de la cotización en BIND** cuando un ticket alcanza el estatus disparador que Balam defina (candidato natural: la entrada del ticket al proceso de facturación, previo a "resuelto"), a través de la misma **capa de escritura controlada** del MVP. -3. **Trazabilidad ticket ↔ cotización ↔ prefactura/factura**, visible en la plataforma y registrada en la bitácora de auditoría. Los tickets leídos alimentan además la vista *"qué necesita atención"* del tablero. -4. **Pruebas controladas:** scripts de consulta y de creación/edición sobre un registro de prueba, y una **prueba observada** con el equipo de Balam antes de habilitar la generación automática en operación (según lo acordado en la sesión del 27 de julio). - -> **El control fiscal no cambia.** La integración crea **cotizaciones, nunca facturas**: se mantiene la cadena acordada — cotización → prefactura → **aprobación humana** → timbrado por el PAC de BIND — con modo de simulación (*dry-run*), feature flag y registro en bitácora. No existe timbrado automático. - -## 3. Qué no incluye - -- **Alta automática de clientes en BIND.** Si el cliente del ticket no existe en BIND, la plataforma lo **detecta y lo notifica**; darlo de alta automáticamente es una decisión de proceso aún abierta y, de aprobarse, se estima por separado. -- **Tickets con múltiples facturas.** El supuesto de esta adenda es *un ticket → una cotización*. El manejo del caso masivo (un ticket con un listado de decenas de facturas) se define junto con Balam; si requiere desarrollo adicional, se estima por separado. -- **Otros usos de Jira** — reporteo de horas de consultores, tableros sobre otras bandejas o el espacio comercial para pipeline de ventas — así como los módulos diferidos del Anexo B, permanecen fuera del alcance. - -## 4. Estimación e inversión - -| Concepto | Horas | Inversión (MXN) | -|---|---|---| -| Integración Jira → BIND: lectura de la bandeja FAC, disparador por estatus, cotización automática, trazabilidad y pruebas | 9 – 12 | $5,400 – $7,200 | - -- **Tarifa vigente:** $600 MXN/h + IVA (§3.3). El rango es consistente con la estimación de ~10 h comunicada el 21 de julio y opera bajo el mismo esquema de horas reales **con tope**: al aproximarse al máximo, el trabajo se detiene y se revisa con Balam. -- **Facturación:** como el resto de los avances — semanal (viernes) por horas efectivamente trabajadas, con pago a 30 días naturales. -- **Efecto en el total de la primera etapa:** de 112 – 136 h ($67,200 – $81,600) pasa a **121 – 148 h ($72,600 – $88,800)**, antes de IVA. - -## 5. Supuestos y dependencias - -1. **Definición del flujo de facturación** por parte de Balam (actualmente en revisión interna; sesión por agendar): de ella salen el estatus disparador y las reglas de prefactura. La implementación de esta adenda inicia una vez cerrada esa definición. -2. **Token PAF vigente** con visibilidad de la bandeja FAC (entregado el 27 de julio) y un interlocutor técnico (Pedro) para dudas de Jira, con respuesta en menos de 48 horas. -3. **Diagrama del flujo Jira de facturación** en tamaño legible (comprometido por Balam en la sesión del 22 de julio). -4. **Bandeja FAC como fuente.** FAC opera como bandeja "padre" del proceso de facturación; si las pruebas muestran que algún disparador nace en otra bandeja sin reflejarse en FAC, el ajuste se revisa en conjunto. -5. **Sin ambiente de pruebas de BIND:** toda prueba de escritura será acotada, acordada previamente y observada, como se convino con el CTO. - -## 6. Condiciones - -Todo lo no modificado por esta adenda — condiciones comerciales (§3.3), garantía de 45 días, propiedad del código, metodología de desarrollo y supuestos generales — permanece en los términos de la propuesta v1.2 y del contrato de servicios firmado. La mención de Jira como "fuera de alcance" (§1.3 y Anexo A) queda sustituida por el alcance acotado que esta adenda define. - -## 7. Aceptación - -Conforme a la §10 de la propuesta (control de cambios), esta adenda se ejecuta tras su **aprobación por escrito**; basta la confirmación por correo electrónico. No requiere un nuevo contrato. - ---- - -**Johann Velazquez** · Consultor de Software -Monterrey, Nuevo León diff --git a/propuesta/Adenda-01-Integracion-Jira-Balam.pdf b/propuesta/Adenda-01-Integracion-Jira-Balam.pdf deleted file mode 100644 index bee4600..0000000 Binary files a/propuesta/Adenda-01-Integracion-Jira-Balam.pdf and /dev/null differ diff --git a/propuesta/Adenda-01-Integracion-Jira.html b/propuesta/Adenda-01-Integracion-Jira.html deleted file mode 100644 index 62ab6f7..0000000 --- a/propuesta/Adenda-01-Integracion-Jira.html +++ /dev/null @@ -1,377 +0,0 @@ - - - - -Adenda 01 — Integración Jira → BIND · Balam - - - - - -
-
-
-
Adenda 01 · Propuesta Comercial
-
- -
-

Integración Jira → BIND

-
Generación automática de cotizaciones desde los tickets de facturación — Balam
-
- -
-
-
Preparada para
-
Noe Rocha (CTO) · Araceli Sánchez Jiménez (CEO/Operaciones) · Erika Chávez (PM) · Pedro Alberto Ayala Elizondo (Contacto técnico)
- -
Preparada por
-
Johann Velazquez — Consultor de Software · Monterrey, N.L.
- -
Fecha
-
28 de julio de 2026
- -
Referencia
-
Propuesta Comercial v1.2 · Contrato de servicios firmado el 26-jun-2026 · §10 — Control de cambios
- -
Vigencia
-
30 días naturales a partir de la fecha de emisión
-
- -
- Documento confidencial - Adenda a la propuesta v1.2 — no sustituye al contrato -
-
-
- - -
- -
-
01

Antecedente

- -

La propuesta v1.2 dejó Jira explícitamente fuera del alcance del MVP (§1.3 y Anexo A.4), conforme a la información disponible al momento de cotizar. Durante el Discovery y las sesiones de julio, la dirección confirmó que el proceso interno evolucionó: hoy todo el flujo de facturación de Balam nace y se gobierna en Jira — "lo que no está en Jira no se procesa" — con una bandeja dedicada (Facturación, llave FAC-) y un flujo de estatus formal que culmina en "resuelto".

- -

En la sesión del 22 de julio el CTO planteó incorporar esta conectividad como ajuste de alcance; en la validación del prototipo del 24 de julio se ratificó, y en la sesión técnica del 27 de julio con Pedro Ayala quedó confirmada la viabilidad: la API de Jira cubre lectura y escritura de tickets, se entregó el token de integración ("PAF", vigente al 27-jul-2027) y se documentaron los límites de consumo del lado de Atlassian. La estimación preliminar (~10 h) se comunicó a la PM el 21 de julio; esta adenda la formaliza por escrito, como lo prevé el control de cambios de la propuesta.

-
- -
-
02

Alcance del cambio

- -

La integración agrega a la primera etapa las siguientes capacidades:

- -
    -
  1. Conexión con la API de Jira mediante el token PAF y lectura de los tickets de la bandeja Facturación (FAC-), con consumo autorregulado conforme a los límites de velocidad documentados por Atlassian.
  2. -
  3. Generación automática de la cotización en BIND cuando un ticket alcanza el estatus disparador que Balam defina (candidato natural: la entrada del ticket al proceso de facturación, previo a "resuelto"), a través de la misma capa de escritura controlada del MVP.
  4. -
  5. Trazabilidad ticket ↔ cotización ↔ prefactura/factura, visible en la plataforma y registrada en la bitácora de auditoría. Los tickets leídos alimentan además la vista "qué necesita atención" del tablero.
  6. -
  7. Pruebas controladas: scripts de consulta y de creación/edición sobre un registro de prueba, y una prueba observada con el equipo de Balam antes de habilitar la generación automática en operación (según lo acordado en la sesión del 27 de julio).
  8. -
- -
- Ticket Jira (FAC)→ - Cotización BIND (automática)→ - Prefactura→ - Aprobación humana→ - Timbrado (PAC de BIND) -
- -
El control fiscal no cambia. La integración crea cotizaciones, nunca facturas: se mantiene la cadena acordada — cotización → prefactura → aprobación humana → timbrado por el PAC de BIND — con modo de simulación (dry-run), feature flag y registro en bitácora. No existe timbrado automático.
-
- -
-
03

Qué no incluye

- - -
- -
-
04

Estimación e inversión

- - - - - - - - -
ConceptoHorasInversión (MXN)
Primera etapa — propuesta v1.2 (Etapas 0 a 3)112 – 136$67,200 – $81,600
Adenda 01 — Integración Jira → BIND: lectura de la bandeja FAC, disparador por estatus, cotización automática, trazabilidad y pruebas9 – 12$5,400 – $7,200
Total de la primera etapa con adenda121 – 148$72,600 – $88,800
- - -
- -
-
05

Supuestos y dependencias

- -
    -
  1. Definición del flujo de facturación por parte de Balam (actualmente en revisión interna; sesión por agendar): de ella salen el estatus disparador y las reglas de prefactura. La implementación de esta adenda inicia una vez cerrada esa definición.
  2. -
  3. Token PAF vigente con visibilidad de la bandeja FAC (entregado el 27 de julio) y un interlocutor técnico (Pedro) para dudas de Jira, con respuesta en menos de 48 horas.
  4. -
  5. Diagrama del flujo Jira de facturación en tamaño legible (comprometido por Balam en la sesión del 22 de julio).
  6. -
  7. Bandeja FAC como fuente. FAC opera como bandeja "padre" del proceso de facturación; si las pruebas muestran que algún disparador nace en otra bandeja sin reflejarse en FAC, el ajuste se revisa en conjunto.
  8. -
  9. Sin ambiente de pruebas de BIND: toda prueba de escritura será acotada, acordada previamente y observada, como se convino con el CTO.
  10. -
-
- -
-
06

Condiciones

- -

Todo lo no modificado por esta adenda — condiciones comerciales (§3.3), garantía de 45 días, propiedad del código, metodología de desarrollo y supuestos generales — permanece en los términos de la propuesta v1.2 y del contrato de servicios firmado. La mención de Jira como "fuera de alcance" (§1.3 y Anexo A) queda sustituida por el alcance acotado que esta adenda define.

-
- -
-
07

Aceptación

- -

Conforme a la §10 de la propuesta (control de cambios), esta adenda se ejecuta tras su aprobación por escrito; basta la confirmación por correo electrónico. No requiere un nuevo contrato.

- -
-
Johann Velazquez
-
Consultor de Software · Monterrey, Nuevo León
-
-
- -
- - - diff --git a/propuesta/Propuesta-Balam.html b/propuesta/Propuesta-Balam.html index 803d0e9..ae3c655 100644 --- a/propuesta/Propuesta-Balam.html +++ b/propuesta/Propuesta-Balam.html @@ -4,6 +4,16 @@ Propuesta Comercial — Plataforma de Automatización Financiera · Balam