Files
balam/propuesta/diagrama-fase1-vs-prd.html
JohannVelazquez 633d05e330 Reorganiza repo como fuente de la verdad + propuesta v1.0 con emisión de facturas
- Estructura nueva: README maestro, bitacora/ (REGISTRO, PENDIENTES, plantillas),
  propuesta/, fuentes/; material superado a _archivado/
- Propuesta v1.0: MVP BIND-first con emisión asistida MXN/USD (dry-run +
  confirmación, timbra PAC de BIND), 112-136 h / $67,200-$81,600 + IVA,
  stack .NET 10 + EF Core + Angular 21 + PostgreSQL 17 sobre Azure
- Bitácora: historial de correos + 2 llamadas (incl. revisión 4-jun) y pendientes
- Prototipo y diagrama actualizados a v1.0; precios de Azure verificados
- Archivo ajeno (proyecto EOS) retirado del repo

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-04 10:57:27 -06:00

687 lines
32 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Balam · Arquitectura Fase 1 vs. PRD original</title>
<style>
:root{
--bg:#ffffff;
--ink:#0f172a;
--ink-2:#1e293b;
--muted:#64748b;
--muted-2:#94a3b8;
--line:#e2e8f0;
--line-2:#cbd5e1;
--soft:#f8fafc;
--soft-2:#f1f5f9;
/* status colors */
--in:#16a34a;
--in-bg:#dcfce7;
--in-ink:#14532d;
--in-line:#86efac;
--partial:#d97706;
--partial-bg:#fef3c7;
--partial-ink:#92400e;
--partial-line:#fcd34d;
--f2:#1d4ed8;
--f2-bg:#dbeafe;
--f2-ink:#1e3a8a;
--f2-line:#93c5fd;
--f3:#64748b;
--f3-bg:#f1f5f9;
--f3-ink:#475569;
--f3-line:#cbd5e1;
}
*{box-sizing:border-box}
html,body{background:var(--bg)}
body{
margin:0 auto; padding:48px 56px; max-width:1320px;
font-family:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI",Roboto,sans-serif;
color:var(--ink); line-height:1.5;
}
h1{font-size:36px; font-weight:800; margin:0 0 8px; letter-spacing:-0.025em}
.lede{color:var(--muted); font-size:16px; margin:0 0 36px; max-width:860px; line-height:1.55}
.lede strong{color:var(--ink)}
.section-label{
font-size:11px; font-weight:600; color:var(--muted);
letter-spacing:2px; text-transform:uppercase;
margin:0 0 12px;
}
.block-title{
font-size:22px; font-weight:700; margin:0 0 6px;
display:flex; align-items:center; gap:12px; letter-spacing:-0.015em;
}
.block-sub{color:var(--muted); font-size:14px; margin:0 0 24px; max-width:780px; line-height:1.55}
/* ============ summary numbers ============ */
.summary{
display:grid; grid-template-columns:repeat(4,1fr); gap:14px; margin:0 0 56px;
}
.stat{
border:1px solid var(--line); border-radius:12px; padding:18px 20px; background:#fff;
}
.stat-num{font-size:32px; font-weight:800; letter-spacing:-0.03em; line-height:1.1; margin-bottom:4px}
.stat-label{font-size:12px; color:var(--muted); font-weight:600; text-transform:uppercase; letter-spacing:0.06em; margin-bottom:8px}
.stat-sub{font-size:13px; color:var(--ink-2)}
.stat.in{border-color:var(--in-line); background:#f0fdf4}
.stat.in .stat-num{color:var(--in)}
.stat.partial{border-color:var(--partial-line); background:#fffbeb}
.stat.partial .stat-num{color:var(--partial)}
.stat.f2{border-color:var(--f2-line); background:#eff6ff}
.stat.f2 .stat-num{color:var(--f2)}
.stat.f3{border-color:var(--f3-line); background:var(--f3-bg)}
.stat.f3 .stat-num{color:var(--f3-ink)}
/* ============ legend ============ */
.legend{
display:flex; gap:14px; flex-wrap:wrap; margin:0 0 28px;
padding:14px 18px; border:1px solid var(--line); background:var(--soft); border-radius:10px;
}
.legend-item{display:flex; align-items:center; gap:8px; font-size:12.5px; color:var(--ink-2)}
.lg-chip{width:14px; height:14px; border-radius:4px; border:1px solid}
.lg-chip.in{background:var(--in-bg); border-color:var(--in-line)}
.lg-chip.partial{background:var(--partial-bg); border-color:var(--partial-line)}
.lg-chip.f2{background:var(--f2-bg); border-color:var(--f2-line)}
.lg-chip.f3{background:var(--f3-bg); border-color:var(--f3-line)}
/* ============ architecture stack ============ */
.arch{margin:0 0 64px}
.arch-stack{display:flex; flex-direction:column; gap:14px}
.layer{
display:grid; grid-template-columns:170px 1fr; gap:18px; align-items:stretch;
}
.layer-label{
background:var(--ink); color:#fff; border-radius:10px; padding:18px 16px;
display:flex; flex-direction:column; justify-content:center; gap:4px;
}
.layer-num{
width:26px; height:26px; border-radius:50%; background:#fff; color:var(--ink);
display:grid; place-items:center; font-weight:700; font-size:13px; margin-bottom:6px;
}
.layer-name{font-weight:700; font-size:14px; letter-spacing:-0.01em}
.layer-sub{font-size:11.5px; color:#94a3b8}
.layer-content{
border:1px solid var(--line); border-radius:10px; padding:16px;
display:flex; flex-wrap:wrap; gap:10px; background:#fff;
}
.mod{
border:1.5px solid; border-radius:8px; padding:10px 14px;
min-width:140px; flex:0 1 auto; position:relative;
}
.mod.in{background:var(--in-bg); border-color:var(--in-line); color:var(--in-ink)}
.mod.partial{background:var(--partial-bg); border-color:var(--partial-line); color:var(--partial-ink)}
.mod.f2{background:var(--f2-bg); border-color:var(--f2-line); color:var(--f2-ink)}
.mod.f3{background:var(--f3-bg); border-color:var(--f3-line); color:var(--f3-ink)}
.mod-title{font-weight:700; font-size:13.5px; letter-spacing:-0.005em}
.mod-sub{font-size:11.5px; opacity:0.85; margin-top:2px}
.mod-tag{
position:absolute; top:-7px; right:8px; background:#fff;
font-size:9.5px; font-weight:700; text-transform:uppercase; letter-spacing:0.08em;
padding:1px 5px; border-radius:3px; border:1px solid currentColor;
}
/* ============ side-by-side comparison ============ */
.compare{
display:grid; grid-template-columns:1fr 1fr; gap:18px; margin:0 0 56px;
}
.col{
border:1px solid var(--line); border-radius:12px; padding:24px; background:#fff;
}
.col.prd{border-top:4px solid var(--muted)}
.col.f1{border-top:4px solid var(--in)}
.col-head{margin-bottom:16px}
.col-tag{
display:inline-block; font-size:11px; font-weight:700; letter-spacing:0.1em;
text-transform:uppercase; padding:3px 8px; border-radius:4px; margin-bottom:8px;
}
.col-tag.prd{background:var(--soft-2); color:var(--muted)}
.col-tag.f1{background:var(--in-bg); color:var(--in-ink)}
.col-title{font-size:18px; font-weight:700; letter-spacing:-0.015em}
.col-sub{font-size:13px; color:var(--muted); margin-top:4px}
.col ul{margin:14px 0 0; padding:0; list-style:none}
.col li{
padding:10px 0; border-bottom:1px solid var(--soft-2); font-size:13.5px;
display:flex; gap:10px; align-items:flex-start;
}
.col li:last-child{border-bottom:none}
.col li .ico{
width:18px; height:18px; border-radius:50%; flex-shrink:0; display:grid; place-items:center;
font-size:11px; font-weight:700; margin-top:1px;
}
.ico.check{background:var(--in-bg); color:var(--in)}
.ico.partial{background:var(--partial-bg); color:var(--partial)}
.ico.out{background:var(--f2-bg); color:var(--f2)}
.ico.future{background:var(--f3-bg); color:var(--f3-ink)}
.col li strong{font-weight:600; color:var(--ink)}
.col li .note{display:block; color:var(--muted); font-size:12px; margin-top:2px}
/* ============ coverage matrix ============ */
.matrix{
border:1px solid var(--line); border-radius:12px; overflow:hidden; background:#fff;
margin:0 0 56px;
}
table{width:100%; border-collapse:collapse}
thead th{
background:var(--soft); border-bottom:1px solid var(--line); padding:12px 14px;
text-align:left; font-size:11px; color:var(--muted); font-weight:700;
text-transform:uppercase; letter-spacing:0.08em;
}
tbody td{
padding:12px 14px; border-bottom:1px solid var(--soft-2); font-size:13px; vertical-align:top;
}
tbody tr:last-child td{border-bottom:none}
.rf-id{font-family:ui-monospace,"SF Mono","Cascadia Mono",monospace; font-size:11.5px; color:var(--muted-2); font-weight:600}
.cov-badge{
display:inline-flex; align-items:center; gap:5px; padding:3px 10px; border-radius:5px;
font-size:11px; font-weight:700; letter-spacing:0.02em;
}
.cov-badge.in{background:var(--in-bg); color:var(--in-ink); border:1px solid var(--in-line)}
.cov-badge.partial{background:var(--partial-bg); color:var(--partial-ink); border:1px solid var(--partial-line)}
.cov-badge.f2{background:var(--f2-bg); color:var(--f2-ink); border:1px solid var(--f2-line)}
.cov-badge.f3{background:var(--f3-bg); color:var(--f3-ink); border:1px solid var(--f3-line)}
/* ============ pillars ============ */
.pillars{display:grid; grid-template-columns:repeat(3,1fr); gap:16px; margin:0 0 56px}
.pillar{
border:1px solid var(--line); border-radius:12px; padding:22px; background:#fff;
border-top:4px solid;
}
.pillar.in{border-top-color:var(--in)}
.pillar.f2{border-top-color:var(--f2)}
.pillar.f3{border-top-color:var(--f3-ink)}
.pillar-head{display:flex; align-items:center; gap:10px; margin-bottom:8px}
.pillar-emoji{font-size:22px}
.pillar-title{font-size:16px; font-weight:700; letter-spacing:-0.01em}
.pillar-sub{font-size:12px; color:var(--muted); margin-bottom:14px}
.pillar ul{margin:0; padding:0; list-style:none; font-size:13px}
.pillar li{padding:6px 0; border-bottom:1px dashed var(--soft-2); color:var(--ink-2)}
.pillar li:last-child{border-bottom:none}
/* ============ note / footer ============ */
.note-box{
background:#fffbeb; border:1px solid #fde68a; color:#78350f;
padding:14px 18px; border-radius:10px; font-size:13px; margin:0 0 32px;
display:flex; gap:12px; align-items:flex-start;
}
.note-icon{flex-shrink:0; font-size:16px}
.footer{
margin-top:48px; padding-top:24px; border-top:1px solid var(--line);
font-size:12px; color:var(--muted); display:flex; justify-content:space-between;
}
</style>
</head>
<body>
<p class="section-label">Balam · MVP Fase 1</p>
<h1>Arquitectura Fase 1 vs. PRD original</h1>
<p class="lede">
El PRD original de Balam pidió una plataforma <strong>end-to-end</strong> que cubriera facturación, cobranza, conciliación bancaria, asientos contables y reportes. Después de la llamada con Noe del 19-may y su recorte explícito del 25-may
(<em>"primer interés es facturación, solo BIND ERP primero"</em>), la <strong>Fase 1 se acota a facturación-first sobre BIND — incluida la emisión asistida de facturas en MXN y USD</strong>.
Lo demás vive en <strong>Fase 2 (cotizada en Anexo B)</strong> y <strong>Fase 3+ (roadmap)</strong> sin perder la arquitectura objetivo.
</p>
<!-- ============ SUMMARY NUMBERS ============ -->
<div class="summary">
<div class="stat in">
<div class="stat-label">Cubierto en Fase 1</div>
<div class="stat-num">8</div>
<div class="stat-sub">capacidades del PRD (incl. emisión)</div>
</div>
<div class="stat partial">
<div class="stat-label">Parcial en Fase 1</div>
<div class="stat-num">6</div>
<div class="stat-sub">con cobertura acotada</div>
</div>
<div class="stat f2">
<div class="stat-label">Diferido a Fase 2</div>
<div class="stat-num">8</div>
<div class="stat-sub">cotizado en Anexo B</div>
</div>
<div class="stat f3">
<div class="stat-label">Roadmap Fase 3+</div>
<div class="stat-num">8</div>
<div class="stat-sub">sin cotización aún</div>
</div>
</div>
<!-- ============ LEGEND ============ -->
<div class="legend">
<div class="legend-item"><span class="lg-chip in"></span> Incluido en Fase 1 (MVP BIND-first)</div>
<div class="legend-item"><span class="lg-chip partial"></span> Parcial en Fase 1 — versión limitada</div>
<div class="legend-item"><span class="lg-chip f2"></span> Diferido a Fase 2 (cotizada en Anexo B)</div>
<div class="legend-item"><span class="lg-chip f3"></span> Roadmap Fase 3+ (sin cotización aún)</div>
</div>
<!-- ============ ARCHITECTURE STACK ============ -->
<section class="arch">
<p class="section-label">1 / Arquitectura objetivo</p>
<h2 class="block-title">Stack por capas · módulos por fase</h2>
<p class="block-sub">
Misma arquitectura objetivo del PRD. Lo que cambia es <strong>qué módulos se entregan en Fase 1</strong> y cuáles se conectan después sin rearquitectar.
</p>
<div class="arch-stack">
<!-- Layer 1: Usuarios -->
<div class="layer">
<div class="layer-label">
<div class="layer-num">1</div>
<div class="layer-name">Usuarios</div>
<div class="layer-sub">Roles y canales</div>
</div>
<div class="layer-content">
<div class="mod in">
<div class="mod-title">Finanzas</div>
<div class="mod-sub">Operación diaria</div>
</div>
<div class="mod in">
<div class="mod-title">Dirección</div>
<div class="mod-sub">Visibilidad ejecutiva</div>
</div>
<div class="mod in">
<div class="mod-title">Operaciones</div>
<div class="mod-sub">Excepciones</div>
</div>
<div class="mod in">
<div class="mod-title">Admin técnico</div>
<div class="mod-sub">Config + RBAC</div>
</div>
<div class="mod f3">
<div class="mod-tag">F3+</div>
<div class="mod-title">RRHH (BUK)</div>
<div class="mod-sub">Vía BUK API</div>
</div>
</div>
</div>
<!-- Layer 2: Frontend -->
<div class="layer">
<div class="layer-label">
<div class="layer-num">2</div>
<div class="layer-name">Experiencia</div>
<div class="layer-sub">Frontend / Dashboard</div>
</div>
<div class="layer-content">
<div class="mod in">
<div class="mod-title">Auth + RBAC</div>
<div class="mod-sub">4 roles, RLS</div>
</div>
<div class="mod in">
<div class="mod-title">Listado de facturas</div>
<div class="mod-sub">Filtros + búsqueda</div>
</div>
<div class="mod in">
<div class="mod-title">Detalle factura</div>
<div class="mod-sub">PDF + XML + bitácora</div>
</div>
<div class="mod in">
<div class="mod-title">Catálogo clientes</div>
<div class="mod-sub">Lista blanca configurable</div>
</div>
<div class="mod in">
<div class="mod-title">Dashboard CxC</div>
<div class="mod-sub">KPIs + aging</div>
</div>
<div class="mod in">
<div class="mod-title">Cobranza operativa</div>
<div class="mod-sub">Alertas internas</div>
</div>
<div class="mod in">
<div class="mod-title">Config + reportes</div>
<div class="mod-sub">CSV/XLSX export</div>
</div>
<div class="mod f3">
<div class="mod-tag">F3+</div>
<div class="mod-title">Portal cliente</div>
<div class="mod-sub">Self-service</div>
</div>
</div>
</div>
<!-- Layer 3: Backend -->
<div class="layer">
<div class="layer-label">
<div class="layer-num">3</div>
<div class="layer-name">Núcleo</div>
<div class="layer-sub">Backend / Orquestación</div>
</div>
<div class="layer-content">
<div class="mod in">
<div class="mod-title">Módulo Facturación</div>
<div class="mod-sub">Emisión MXN/USD, estados, vencimientos</div>
</div>
<div class="mod in">
<div class="mod-title">Módulo Cobranza</div>
<div class="mod-sub">Aging + lista blanca</div>
</div>
<div class="mod in">
<div class="mod-title">Motor de reglas</div>
<div class="mod-sub">Alertas + excepciones</div>
</div>
<div class="mod in">
<div class="mod-title">Bitácora / Audit log</div>
<div class="mod-sub">Eventos universales</div>
</div>
<div class="mod in">
<div class="mod-title">Multi-tenancy</div>
<div class="mod-sub">tenant_id + RLS</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Recordatorios email</div>
<div class="mod-sub">Cron + worker</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Pagos Stripe</div>
<div class="mod-sub">Checkout + webhook</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Conciliación bancaria</div>
<div class="mod-sub">Match + cola humana</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Export asientos</div>
<div class="mod-sub">Formato BIND</div>
</div>
<div class="mod f3">
<div class="mod-tag">F3+</div>
<div class="mod-title">Detección anomalías</div>
<div class="mod-sub">IA / LLM</div>
</div>
<div class="mod f3">
<div class="mod-tag">F3+</div>
<div class="mod-title">Orquestador agentes IA</div>
<div class="mod-sub">Auto-clasificación</div>
</div>
</div>
</div>
<!-- Layer 4: Data -->
<div class="layer">
<div class="layer-label">
<div class="layer-num">4</div>
<div class="layer-name">Datos</div>
<div class="layer-sub">Persistencia</div>
</div>
<div class="layer-content">
<div class="mod in">
<div class="mod-title">Postgres central</div>
<div class="mod-sub">Azure Flexible</div>
</div>
<div class="mod in">
<div class="mod-title">Clientes + Facturas</div>
<div class="mod-sub">Snapshot normalizado</div>
</div>
<div class="mod partial">
<div class="mod-tag">PARCIAL</div>
<div class="mod-title">Pagos</div>
<div class="mod-sub">Solo lo de BIND en F1</div>
</div>
<div class="mod in">
<div class="mod-title">Alertas + Bitácora</div>
<div class="mod-sub">Eventos + audit</div>
</div>
<div class="mod in">
<div class="mod-title">Configuración + Reglas</div>
<div class="mod-sub">Lista blanca, ventanas</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Storage documental</div>
<div class="mod-sub">PDFs bancarios</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Movimientos bancarios</div>
<div class="mod-sub">Extraídos PDF</div>
</div>
</div>
</div>
<!-- Layer 5: Integraciones externas -->
<div class="layer">
<div class="layer-label">
<div class="layer-num">5</div>
<div class="layer-name">Integraciones</div>
<div class="layer-sub">Sistemas externos</div>
</div>
<div class="layer-content">
<div class="mod in" style="border-width:2.5px">
<div class="mod-tag" style="background:var(--in); color:#fff; border-color:var(--in)">CORE F1</div>
<div class="mod-title">BIND ERP API</div>
<div class="mod-sub">Clientes · Cotizaciones · Facturas (lectura + emisión) · Pagos · PDF/XML</div>
</div>
<div class="mod in">
<div class="mod-title">DOF (TC diario)</div>
<div class="mod-sub">MXN ↔ USD</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Stripe</div>
<div class="mod-sub">Checkout + webhook</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Resend (email)</div>
<div class="mod-sub">Recordatorios cliente</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">Claude API</div>
<div class="mod-sub">Parsing PDFs banco</div>
</div>
<div class="mod f2">
<div class="mod-tag">F2</div>
<div class="mod-title">BUK API</div>
<div class="mod-sub">Nómina + colaboradores</div>
</div>
<div class="mod f3">
<div class="mod-tag">F3+</div>
<div class="mod-title">Belvo / Plaid</div>
<div class="mod-sub">Bancos en vivo</div>
</div>
<div class="mod f3">
<div class="mod-tag">F3+</div>
<div class="mod-title">Jira API</div>
<div class="mod-sub">Horas → input facturación</div>
</div>
</div>
</div>
</div>
<div class="note-box" style="margin-top:24px">
<span class="note-icon"></span>
<div>
<strong>Arquitectura preparada para el futuro:</strong> los módulos en azul/gris no requieren rearquitectar la base. El motor de reglas, audit log y multi-tenancy de Fase 1 los soporta tal cual cuando se activen. El único costo de diferirlos es <em>tiempo</em>, no <em>rework</em>.
</div>
</div>
</section>
<!-- ============ COMPARE COLUMNS ============ -->
<section>
<p class="section-label">2 / Lo que pidió el PRD vs. lo que entrega Fase 1</p>
<h2 class="block-title">Comparación directa por bloque funcional</h2>
<p class="block-sub">Cada bloque del PRD original (§3.1) mapeado a su entrega real en Fase 1. Diferidos no son "cortes" sino re-secuenciaciones validadas con el CTO.</p>
<div class="compare">
<div class="col prd">
<div class="col-head">
<span class="col-tag prd">PRD original</span>
<div class="col-title">Lo que Balam pidió en el PRD</div>
<div class="col-sub">Plataforma end-to-end con todas las integraciones desde día 1</div>
</div>
<ul>
<li><span class="ico check"></span><div><strong>Facturación visible y consultable</strong><span class="note">Multimoneda MXN/USD/EUR, descarga automática</span></div></li>
<li><span class="ico check"></span><div><strong>Cobranza con seguimiento</strong><span class="note">Lista blanca ACUNTIA + Top 3, registro pagos</span></div></li>
<li><span class="ico check"></span><div><strong>Conciliación bancaria automática</strong><span class="note">3 bancos: 2 MX + IBC Bank Texas</span></div></li>
<li><span class="ico check"></span><div><strong>Asientos contables automáticos</strong><span class="note">Integración con BIND para registro contable</span></div></li>
<li><span class="ico check"></span><div><strong>Dashboard financiero en tiempo real</strong><span class="note">CxC, vencimientos, KPIs directivos</span></div></li>
<li><span class="ico check"></span><div><strong>Alertas automáticas configurables</strong><span class="note">Pagos pendientes, errores conciliación</span></div></li>
<li><span class="ico check"></span><div><strong>Integración con BUK (nómina)</strong><span class="note">Trigger nómina → factura</span></div></li>
<li><span class="ico check"></span><div><strong>Trazabilidad completa</strong><span class="note">Audit log universal</span></div></li>
</ul>
</div>
<div class="col f1">
<div class="col-head">
<span class="col-tag f1">Fase 1 entrega</span>
<div class="col-title">Lo que Fase 1 entrega en 6 7 sem</div>
<div class="col-sub">MVP BIND-first acotado a facturación (consulta + emisión) + cobranza operativa interna</div>
</div>
<ul>
<li><span class="ico check"></span><div><strong>Facturación: consulta y emisión</strong><span class="note">Emite MXN (con IVA) y USD (sin IVA) vía BIND, con dry-run + confirmación humana · EUR diferido a F2</span></div></li>
<li><span class="ico partial">~</span><div><strong>Cobranza con seguimiento interno</strong><span class="note">Lista blanca + aging + alertas <em>internas</em>. Recordatorios a clientes en F2.</span></div></li>
<li><span class="ico out"></span><div><strong>Conciliación bancaria — diferido</strong><span class="note">Cotizado en Anexo B: PDF + Claude API + match</span></div></li>
<li><span class="ico out"></span><div><strong>Asientos contables — diferido</strong><span class="note">Cotizado en Anexo B: export formato BIND</span></div></li>
<li><span class="ico check"></span><div><strong>Dashboard financiero v1</strong><span class="note">CxC totales + por cliente + aging + vencimientos</span></div></li>
<li><span class="ico partial">~</span><div><strong>Alertas internas configurables</strong><span class="note">A equipo de Finanzas. A clientes en F2.</span></div></li>
<li><span class="ico future">·</span><div><strong>BUK — roadmap F3+</strong><span class="note">API confirmada, sin prioridad</span></div></li>
<li><span class="ico check"></span><div><strong>Trazabilidad completa</strong><span class="note">Audit log universal desde día 1</span></div></li>
</ul>
</div>
</div>
</section>
<!-- ============ COVERAGE MATRIX ============ -->
<section>
<p class="section-label">3 / Cobertura granular</p>
<h2 class="block-title">Matriz de requerimientos funcionales (PRD §6)</h2>
<p class="block-sub">Trazabilidad uno a uno de los RF del PRD contra el alcance comprometido en Fase 1.</p>
<div class="matrix">
<table>
<thead>
<tr>
<th style="width:60px">ID</th>
<th>Descripción PRD</th>
<th style="width:140px">Cobertura</th>
<th>Notas</th>
</tr>
</thead>
<tbody>
<tr><td class="rf-id">RF-01</td><td>Generar facturas automáticamente desde eventos de negocio</td><td><span class="cov-badge partial">Parcial</span></td><td>Creación manual (cotización→factura) incluida en Fase 1; la generación automática desde eventos (Jira/BUK) → Fase 2. BIND timbra.</td></tr>
<tr><td class="rf-id">RF-02</td><td>Soporte multimoneda USD/EUR/MXN</td><td><span class="cov-badge partial">Parcial</span></td><td>MXN + USD en Fase 1. EUR en Fase 2.</td></tr>
<tr><td class="rf-id">RF-03</td><td>Integración con sistemas existentes (BUK / nómina)</td><td><span class="cov-badge f2">Fase 2</span></td><td>API BUK confirmada, no prioridad del CTO.</td></tr>
<tr><td class="rf-id">RF-04</td><td>Registrar pagos automáticamente desde fuentes bancarias</td><td><span class="cov-badge f2">Fase 2</span></td><td>Diferido junto con conciliación bancaria.</td></tr>
<tr><td class="rf-id">RF-05</td><td>Asociar pagos a facturas</td><td><span class="cov-badge partial">Parcial</span></td><td>Lo que reporta BIND vía Payments. Matching avanzado en Fase 2.</td></tr>
<tr><td class="rf-id">RF-06</td><td>Identificar pagos parciales y completos</td><td><span class="cov-badge partial">Parcial</span></td><td>Según expone BIND. Validar en Discovery (Plan A/B/C).</td></tr>
<tr><td class="rf-id">RF-07</td><td>Conciliar automáticamente transacciones bancarias</td><td><span class="cov-badge f2">Fase 2</span></td><td>Cotizado: 3 bancos + Claude API + cola humana.</td></tr>
<tr><td class="rf-id">RF-08</td><td>Detectar discrepancias</td><td><span class="cov-badge f2">Fase 2</span></td><td>Sigue a RF-07.</td></tr>
<tr><td class="rf-id">RF-09</td><td>Generar reportes de conciliación</td><td><span class="cov-badge f2">Fase 2</span></td><td>Sigue a RF-07.</td></tr>
<tr><td class="rf-id">RF-10</td><td>Generar asientos contables automáticos</td><td><span class="cov-badge f2">Fase 2</span></td><td>Depende de capacidad de escritura de la API BIND validada.</td></tr>
<tr><td class="rf-id">RF-11</td><td>Integración con sistema contable</td><td><span class="cov-badge f2">Fase 2</span></td><td>Export formato BIND para carga manual del contador.</td></tr>
<tr><td class="rf-id">RF-12</td><td>Dashboard financiero en tiempo real</td><td><span class="cov-badge in">Fase 1</span></td><td>KPIs sincronizados cada 4h con BIND.</td></tr>
<tr><td class="rf-id">RF-13</td><td>Alertas automáticas configurables</td><td><span class="cov-badge partial">Parcial</span></td><td>Alertas <em>internas</em> en Fase 1. A clientes en Fase 2.</td></tr>
<tr><td class="rf-id">RF-14</td><td>Reportes exportables</td><td><span class="cov-badge in">Fase 1</span></td><td>CSV/XLSX por filtros · reporte operativo configurable.</td></tr>
</tbody>
</table>
</div>
<div class="matrix">
<table>
<thead>
<tr>
<th style="width:80px">ID</th>
<th>Requerimiento no funcional (PRD §7)</th>
<th style="width:140px">Cobertura</th>
<th>Notas</th>
</tr>
</thead>
<tbody>
<tr><td class="rf-id">RNF-01</td><td>Arquitectura modular y escalable</td><td><span class="cov-badge in">Fase 1</span></td><td>Multi-tenancy + RLS desde día 1.</td></tr>
<tr><td class="rf-id">RNF-02</td><td>Alta disponibilidad</td><td><span class="cov-badge partial">Parcial</span></td><td>Single-region en Azure. HA real (multi-region) → Fase 2.</td></tr>
<tr><td class="rf-id">RNF-03</td><td>Seguridad de datos financieros</td><td><span class="cov-badge in">Fase 1</span></td><td>Key Vault, RBAC, audit log, hardening.</td></tr>
<tr><td class="rf-id">RNF-04</td><td>Cumplimiento fiscal (México y Texas)</td><td><span class="cov-badge partial">Parcial</span></td><td>Tax estándar en MVP. Compliance avanzado Texas → Fase 2.</td></tr>
<tr><td class="rf-id">RNF-05</td><td>Integración con APIs externas</td><td><span class="cov-badge in">Fase 1</span></td><td>BIND API + DOF para TC.</td></tr>
<tr><td class="rf-id">RNF-06</td><td>Trazabilidad completa de operaciones</td><td><span class="cov-badge in">Fase 1</span></td><td>Audit log universal desde día 1.</td></tr>
</tbody>
</table>
</div>
</section>
<!-- ============ THREE PILLARS ============ -->
<section>
<p class="section-label">4 / Resumen por fase</p>
<h2 class="block-title">Qué entra, qué se difiere, qué espera</h2>
<p class="block-sub">Vista de tres tiempos para alinear expectativas con Noe, Ara y Pedro.</p>
<div class="pillars">
<div class="pillar in">
<div class="pillar-head">
<span class="pillar-emoji"></span>
<span class="pillar-title">Fase 1 — Facturación-first</span>
</div>
<div class="pillar-sub">6 7 semanas · 112 136 h · $67.2K $81.6K MXN</div>
<ul>
<li>Integración API BIND (lectura + escritura asistida)</li>
<li><strong>Emisión de facturas MXN/USD</strong> con dry-run + confirmación</li>
<li>Vista facturación · estados · filtros · PDF/XML</li>
<li>Catálogo clientes + lista blanca ACUNTIA + Top 3</li>
<li>Cobranza operativa interna (aging + alertas a Finanzas)</li>
<li>Dashboard CxC · KPIs · multimoneda MXN+USD</li>
<li>Reportes CSV/XLSX configurables</li>
<li>Auth + RBAC + multi-tenancy + audit log universal</li>
<li>Prototipo visual navegable en Semana 1</li>
</ul>
</div>
<div class="pillar f2">
<div class="pillar-head">
<span class="pillar-emoji"></span>
<span class="pillar-title">Fase 2 — Anexo B (cotizada)</span>
</div>
<div class="pillar-sub">80 106 h · $48K $63.6K MXN indicativo</div>
<ul>
<li>Recordatorios email automáticos a clientes + templates</li>
<li>Pago con link Stripe Checkout + webhook</li>
<li>Conciliación bancaria PDF (3 bancos) + Claude API</li>
<li>Export asientos contables formato BIND</li>
<li>Integración BUK (lectura nómina + colaboradores)</li>
<li>Soporte EUR · alta disponibilidad multi-region</li>
<li>Compliance avanzado Texas</li>
</ul>
</div>
<div class="pillar f3">
<div class="pillar-head">
<span class="pillar-emoji"></span>
<span class="pillar-title">Fase 3+ — Roadmap (sin cotizar)</span>
</div>
<div class="pillar-sub">Se cotiza al cerrar Fase 2 con datos reales</div>
<ul>
<li>Integración bancaria en vivo (Belvo, Plaid)</li>
<li>Conector BIND para asientos contables automáticos</li>
<li>Integración Jira (horas → input facturación)</li>
<li>Cash-flow proyectado 30/60/90</li>
<li>Domiciliación / pagos recurrentes Stripe</li>
<li>Detección anomalías con IA / LLM</li>
<li>Portal de cliente self-service</li>
<li>Multi-tenancy comercial · productización SaaS</li>
</ul>
</div>
</div>
</section>
<div class="footer">
<span>Balam · Plataforma de Automatización Financiera · Diagrama de cobertura Fase 1 vs PRD</span>
<span>Documento de apoyo a la Propuesta Comercial v2.0 — 28 may 2026</span>
</div>
</body>
</html>