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>
This commit is contained in:
JohannVelazquez
2026-06-04 10:57:27 -06:00
parent 404e6f3b89
commit 633d05e330
47 changed files with 32977 additions and 472 deletions
+686
View File
@@ -0,0 +1,686 @@
<!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>