Files
balam/_archivado/diagrama-fases-construccion.html
T
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

741 lines
33 KiB
HTML
Raw 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 · Plan de construcción por fases</title>
<style>
:root{
--bg:#ffffff;
--ink:#0f172a;
--muted:#64748b;
--line:#e2e8f0;
--soft:#f8fafc;
--navy:#1e293b;
--peach:#fed7aa;
--peach-ink:#9a3412;
--lavender:#ddd6fe;
--lavender-ink:#5b21b6;
--amber:#fde68a;
--amber-ink:#92400e;
--mint:#bbf7d0;
--mint-ink:#14532d;
--rose:#fecaca;
--rose-ink:#991b1b;
--sky:#bae6fd;
--sky-ink:#075985;
--slate:#e2e8f0;
--slate-ink:#334155;
}
*{box-sizing:border-box}
html,body{background:var(--bg)}
body{
margin:0 auto; padding:48px 56px; max-width:1280px;
font-family:-apple-system,BlinkMacSystemFont,"Inter","Segoe UI",Roboto,sans-serif;
color:var(--ink);
}
h1{font-size:38px; font-weight:800; margin:0 0 6px; letter-spacing:-0.02em}
.lede{color:var(--muted); font-size:16px; margin:0 0 28px; max-width:820px; line-height:1.5}
.section-label{
font-size:11px; font-weight:600; color:var(--muted);
letter-spacing:2px; text-transform:uppercase;
margin:0 0 10px;
}
.block-title{
font-size:22px; font-weight:700; margin:0 0 4px;
display:flex; align-items:center; gap:12px; letter-spacing:-0.01em;
}
.block-sub{color:var(--muted); font-size:14px; margin:0 0 26px; max-width:760px; line-height:1.5}
/* ---- color utilities (lectura / escritura / no-toca / futuro) ---- */
.t-read {background:#ecfdf5; border-color:#bbf7d0; color:#14532d}
.t-write {background:#fff7ed; border-color:#fed7aa; color:#9a3412}
.t-none {background:#f8fafc; border-color:#e2e8f0; color:#64748b}
.t-future{background:#f5f3ff; border-color:#ddd6fe; color:#5b21b6}
/* ---- leyenda ---- */
.legend{display:flex; gap:10px; flex-wrap:wrap; margin:0 0 44px}
.legend .item{
display:inline-flex; align-items:center; gap:8px; font-size:13px;
color:var(--slate-ink); border:1px solid var(--line); background:var(--soft);
padding:8px 14px; border-radius:10px; font-weight:600;
}
.legend .ic{font-size:15px}
/* ---- tile base (reutilizado) ---- */
.tile{
width:88px; height:88px; border-radius:20px;
display:flex; align-items:center; justify-content:center;
font-size:38px; flex:0 0 auto;
box-shadow:0 1px 2px rgba(15,23,42,.06), 0 4px 12px rgba(15,23,42,.04);
}
.tile.navy {background:var(--navy); color:#fff}
.tile.peach {background:var(--peach); color:var(--peach-ink)}
.tile.lavender{background:var(--lavender); color:var(--lavender-ink)}
.tile.amber {background:var(--amber); color:var(--amber-ink)}
.tile.mint {background:var(--mint); color:var(--mint-ink)}
.tile.rose {background:var(--rose); color:var(--rose-ink)}
.tile.sky {background:var(--sky); color:var(--sky-ink)}
.tile.slate {background:var(--slate); color:var(--slate-ink)}
/* ================= LÍNEA DE TIEMPO VERTICAL ================= */
.timeline{margin:0 0 56px}
.phase{
position:relative;
display:grid; grid-template-columns:88px 1fr; gap:28px;
padding-bottom:28px;
}
.phase::before{ /* riel vertical de la línea de tiempo */
content:""; position:absolute; left:43px; top:100px; bottom:-6px;
width:2px; background:var(--line); z-index:0;
}
.phase:last-child::before{display:none}
.phase.lead-roadmap::before{ /* tramo punteado hacia el roadmap */
background:transparent; width:0; border-left:2px dashed #cbd5e1; left:42px;
}
.phase .tile{position:relative; z-index:1}
.phase-card{
border:1px solid var(--line); border-radius:18px;
padding:20px 24px 22px;
box-shadow:0 1px 2px rgba(15,23,42,.06), 0 4px 12px rgba(15,23,42,.04);
}
.ph-kicker{
font-size:11px; font-weight:700; letter-spacing:1.6px; text-transform:uppercase;
color:var(--muted); margin:0 0 3px;
}
.ph-title{font-size:19px; font-weight:700; margin:0 0 12px; letter-spacing:-0.01em}
.ph-card-list{margin:0; padding-left:18px; font-size:13.5px; color:var(--slate-ink); line-height:1.55}
.ph-card-list li{margin:4px 0}
.ph-card-list b{color:var(--ink); font-weight:600}
.ph-status{display:flex; flex-wrap:wrap; gap:10px; margin-top:16px}
.status{
display:inline-flex; align-items:center; gap:8px;
padding:8px 13px; border-radius:11px; font-size:12.5px;
border:1px solid var(--line); line-height:1.3;
}
.status .ic{font-size:14px; flex:0 0 auto}
.status b{font-weight:700}
/* ---- variante Roadmap (post-MVP) ---- */
.phase.roadmap .phase-card{
border:1.5px dashed #cbd5e1; background:#fcfcfd; box-shadow:none;
}
.phase.roadmap .tile{opacity:.9}
.rm-badge{
display:inline-flex; align-items:center; gap:7px;
background:#f5f3ff; border:1px solid #ddd6fe; color:#5b21b6;
font-size:11px; font-weight:700; letter-spacing:.4px;
padding:5px 11px; border-radius:999px; margin:0 0 12px;
}
/* ================= SWIMLANE INTEGRACIÓN EN EL TIEMPO ================= */
.swim-wrap{overflow-x:auto; margin:0 0 12px; padding-bottom:6px}
.swim{
display:grid;
grid-template-columns:118px repeat(6, minmax(140px,1fr));
gap:10px; min-width:920px;
}
.swim .corner{}
.swim .ch{
text-align:center; font-size:13px; font-weight:700; color:var(--ink);
padding:4px 4px 2px; align-self:end;
}
.swim .ch small{
display:block; color:var(--muted); font-weight:600; font-size:10px;
text-transform:uppercase; letter-spacing:1px; margin-top:2px;
}
.swim .ch.rm{color:var(--lavender-ink)}
.swim .lane{
display:flex; align-items:center; gap:9px;
font-weight:700; font-size:14px; color:var(--ink);
}
.swim .lane .dot{
width:26px; height:26px; border-radius:8px; flex:0 0 auto;
display:flex; align-items:center; justify-content:center; font-size:15px;
}
.swim .cell{
border:1px solid var(--line); border-radius:11px;
padding:11px 13px; font-size:12.5px; font-weight:700;
display:flex; flex-direction:column; justify-content:center; min-height:58px;
}
.swim .cell small{display:block; font-weight:600; opacity:.78; font-size:10.5px; margin-top:3px}
.swim .cell.rm{border-style:dashed}
/* ================= DIAGRAMA ESTADO FINAL ================= */
.group{
border:1.5px dashed #cbd5e1; border-radius:18px;
padding:30px 20px 22px; position:relative; margin-top:6px;
}
.group::before{
content:attr(data-label);
position:absolute; top:-9px; left:18px;
background:#fff; padding:0 8px;
font-size:10px; font-weight:700; letter-spacing:1.5px; text-transform:uppercase;
color:var(--lavender-ink);
}
.flow{
display:flex; align-items:flex-start; gap:6px;
overflow-x:auto; padding:4px 4px 8px;
}
.node{flex:0 0 auto; width:120px; text-align:center}
.node .tile{margin:0 auto 12px}
.node .label{font-size:13px; font-weight:700; line-height:1.25}
.node .sub{font-size:11px; color:var(--muted); margin-top:3px; line-height:1.3}
.arrow{
flex:0 0 auto; display:flex; flex-direction:column; align-items:center; gap:5px;
padding-top:30px; user-select:none;
}
.arrow .gly{color:#cbd5e1; font-size:22px; line-height:1}
.arrow .cap{font-size:9.5px; color:var(--muted); max-width:78px; text-align:center; line-height:1.25; font-weight:600}
/* ================= TARJETAS NARRATIVAS (dolor / visión / enfoque) ================= */
.divider{height:1px; background:var(--line); margin:48px 0}
.cards{display:grid; grid-template-columns:repeat(auto-fit,minmax(232px,1fr)); gap:16px}
.info-card{
border:1px solid var(--line); border-radius:16px; padding:18px 20px; background:#fff;
box-shadow:0 1px 2px rgba(15,23,42,.06), 0 4px 12px rgba(15,23,42,.04);
}
.info-card .ic-head{display:flex; align-items:center; gap:11px; margin-bottom:9px}
.info-card .ic-emoji{
width:40px; height:40px; border-radius:12px; flex:0 0 auto;
display:flex; align-items:center; justify-content:center; font-size:20px;
}
.info-card h4{margin:0; font-size:14px; font-weight:700; line-height:1.25}
.info-card p{margin:0; font-size:12.5px; color:var(--slate-ink); line-height:1.5}
/* ---- flow compacto (cadena manual del dolor) ---- */
.flow.compact{gap:2px}
.flow.compact .node{width:104px}
.flow.compact .node .tile{width:72px; height:72px; font-size:30px; border-radius:16px}
.flow.compact .arrow{padding-top:22px}
/* ================= ARQUITECTURA ================= */
.arch{margin-top:4px}
.band-label{
font-size:10px; font-weight:700; letter-spacing:1.4px; text-transform:uppercase;
color:var(--muted); margin:0 0 11px;
}
.arch-row{display:flex; gap:14px; flex-wrap:wrap}
.arch-row + .band-label{margin-top:20px}
.arch-card{
flex:1 1 210px; min-width:200px;
border:1px solid var(--line); border-radius:14px; padding:14px 16px; background:#fff;
display:flex; align-items:center; gap:13px;
box-shadow:0 1px 2px rgba(15,23,42,.06), 0 4px 12px rgba(15,23,42,.04);
}
.arch-card .ico{
width:46px; height:46px; border-radius:12px; flex:0 0 auto;
display:flex; align-items:center; justify-content:center; font-size:23px;
box-shadow:0 1px 2px rgba(15,23,42,.06);
}
.ico.navy {background:var(--navy); color:#fff}
.ico.peach {background:var(--peach); color:var(--peach-ink)}
.ico.lavender{background:var(--lavender); color:var(--lavender-ink)}
.ico.amber {background:var(--amber); color:var(--amber-ink)}
.ico.mint {background:var(--mint); color:var(--mint-ink)}
.ico.sky {background:var(--sky); color:var(--sky-ink)}
.ico.slate {background:var(--slate); color:var(--slate-ink)}
.arch-card .ac-t{font-weight:700; font-size:13.5px; line-height:1.2}
.arch-card .ac-s{font-size:11px; color:var(--muted); margin-top:3px; line-height:1.3}
.arch-card.rm{border-style:dashed; background:#fcfcfd}
.arch-card.rm .ico{opacity:.9}
.arch-down{text-align:center; color:#cbd5e1; font-size:22px; margin:8px 0; user-select:none; line-height:1.1}
.arch-down small{display:block; font-size:10px; color:var(--muted); letter-spacing:1px; text-transform:uppercase; font-weight:700}
.arch .group{padding:26px 20px 20px; margin-top:0}
.arch .group::before{color:var(--slate-ink)}
.mini-pills{display:flex; gap:5px; margin-top:6px; flex-wrap:wrap}
.mini-pill{font-size:9.5px; font-weight:700; padding:2px 8px; border-radius:999px; border:1px solid; white-space:nowrap}
/* ================= RESPONSIVE ================= */
@media (max-width:1100px){
body{padding:36px 30px}
h1{font-size:32px}
.swim{grid-template-columns:108px repeat(6, minmax(132px,1fr))}
}
@media (max-width:700px){
body{padding:26px 18px}
h1{font-size:26px}
.lede{font-size:14px}
.block-title{font-size:19px}
.phase{grid-template-columns:56px 1fr; gap:16px}
.phase .tile{width:56px; height:56px; font-size:25px; border-radius:16px}
.phase::before{left:27px; top:66px}
.phase.lead-roadmap::before{left:26px}
.phase-card{padding:16px 17px 18px}
.ph-title{font-size:17px}
.node{width:108px}
.arch-card{flex-basis:100%; min-width:0}
}
</style>
</head>
<body>
<h1>Balam · Del dolor actual a la plataforma orquestada</h1>
<p class="lede">La historia completa de un vistazo: <b>por qué duele hoy</b>, <b>a qué queremos llegar</b>, <b>cómo lo solucionamos</b>, con <b>qué arquitectura</b> y <b>en qué orden</b> lo construimos. El MVP son las Fases&nbsp;04 (6 semanas, medio tiempo); la fase Post-MVP es roadmap futuro, no incluido en la cotización.</p>
<!-- ====== LEYENDA ====== -->
<div class="legend">
<span class="item"><span class="ic"></span> Lectura (consumir datos)</span>
<span class="item"><span class="ic">✍️</span> Escritura (escribir vía API)</span>
<span class="item"><span class="ic">⏸️</span> No se toca / fuera de scope</span>
<span class="item"><span class="ic">🔮</span> Visión futura (roadmap)</span>
</div>
<!-- ====================================================== -->
<!-- ====== EL DOLOR (HOY) ====== -->
<!-- ====================================================== -->
<p class="section-label">El dolor · hoy</p>
<h2 class="block-title">Todo el ciclo financiero se mueve a mano</h2>
<p class="block-sub">Ocho pasos encadenados, todos dependientes de una persona moviendo datos entre sistemas que no se hablan. Cada eslabón es una oportunidad de error y de retraso.</p>
<div class="flow compact">
<div class="node"><div class="tile slate">🕐</div><div class="label">Jira</div><div class="sub">Horas por cliente</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile slate">👥</div><div class="label">BUK</div><div class="sub">Nómina aprobada</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile rose">✍️</div><div class="label">Captura factura</div><div class="sub">Manual en BIND</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile rose">📧</div><div class="label">Cobranza</div><div class="sub">Correo a mano</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile rose">⬇️</div><div class="label">PDFs banco</div><div class="sub">Descarga manual</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile rose">📊</div><div class="label">Excel</div><div class="sub">Conciliación</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile rose">📒</div><div class="label">Contador</div><div class="sub">Captura asientos</div></div>
<div class="arrow"><span class="gly"></span></div>
<div class="node"><div class="tile rose">📈</div><div class="label">Reporte CxC</div><div class="sub">Llega tarde</div></div>
</div>
<div class="cards" style="margin-top:22px">
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-write">🎯</span><h4>Error humano caro</h4></div>
<p>Un recordatorio de cobranza enviado por equivocación a ACUNTIA o al Top 3 daña la relación con el cliente más importante.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-write"></span><h4>Horas a mano cada mes</h4></div>
<p>Conciliar 3 estados de cuenta bancarios en PDF, línea por línea, contra las facturas que viven en BIND.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-write">🐢</span><h4>Información que llega tarde</h4></div>
<p>Dirección no ve el estado real de la cobranza del día; el reporte llega cuando la decisión ya pasó.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-write">🧵</span><h4>Proceso frágil</h4></div>
<p>Todo depende de que una persona recuerde capturar, cobrar y descargar a tiempo. Si falta, el ciclo se detiene.</p>
</div>
</div>
<div class="divider"></div>
<!-- ====================================================== -->
<!-- ====== A QUÉ QUEREMOS LLEGAR (VISIÓN) ====== -->
<!-- ====================================================== -->
<p class="section-label">A qué queremos llegar · la visión</p>
<h2 class="block-title">Una plataforma que absorbe lo repetitivo</h2>
<p class="block-sub">Las personas dejan de mover datos y solo tocan las excepciones. El resultado: cobranza segura, conciliación automática y visibilidad en tiempo real.</p>
<div class="cards">
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-read"></span><h4>Cobranza con candado</h4></div>
<p>Lista blanca dura: ACUNTIA y el Top 3 nunca reciben un recordatorio automático, por diseño.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-read"></span><h4>Cobro más rápido</h4></div>
<p>Link de pago Stripe directo en el correo; el webhook marca la factura como pagada sin intervención.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-read">🤖</span><h4>Conciliación automática</h4></div>
<p>El match exacto se resuelve solo; el equipo solo revisa lo que no cuadra, en una cola dedicada.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-read">📊</span><h4>Visibilidad en vivo</h4></div>
<p>Dashboard de CxC y CxP en tiempo real para CEO, CFO y CTO, con multimoneda MXN + USD.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-read">🧾</span><h4>Asientos sin captura</h4></div>
<p>En el roadmap, BIND recibe pagos y asientos vía API y se elimina el export a Excel.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-read">🔒</span><h4>Todo trazable</h4></div>
<p>Audit log de quién hizo qué y cuándo, con roles y permisos granulares (RBAC).</p>
</div>
</div>
<div class="divider"></div>
<!-- ====================================================== -->
<!-- ====== CÓMO LO SOLUCIONAMOS (ENFOQUE) ====== -->
<!-- ====================================================== -->
<p class="section-label">Cómo lo solucionamos · el enfoque</p>
<h2 class="block-title">Una capa de orquestación sobre BIND</h2>
<p class="block-sub">No reemplazamos nada: BIND sigue siendo la fuente de verdad y el único que emite CFDI. La plataforma coordina el flujo, automatiza lo repetitivo y usa IA para lo difícil.</p>
<div class="cards">
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-future">🧩</span><h4>Capa sobre BIND, no reemplazo</h4></div>
<p>La plataforma orquesta el flujo; BIND conserva facturación, timbrado CFDI y contabilidad.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-future">🤖</span><h4>IA para lo difícil</h4></div>
<p>Claude extrae los movimientos de cada PDF bancario (1 pipeline por banco) y valida totales.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-future">⚙️</span><h4>Automatizar lo repetitivo</h4></div>
<p>Sync de facturas, recordatorios y match corren solos con un motor de cron + worker.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-future">🙋</span><h4>Humano solo en excepciones</h4></div>
<p>Lo que no hace match cae en una cola de revisión: nada se pierde y nada se cobra a ciegas.</p>
</div>
<div class="info-card">
<div class="ic-head"><span class="ic-emoji t-future">🛡️</span><h4>Control y trazabilidad</h4></div>
<p>RBAC, audit log universal y lista blanca dura protegen el proceso de errores costosos.</p>
</div>
</div>
<div class="divider"></div>
<!-- ====================================================== -->
<!-- ====== LA ARQUITECTURA ====== -->
<!-- ====================================================== -->
<p class="section-label">La arquitectura</p>
<h2 class="block-title">Con qué se construye, por capas</h2>
<p class="block-sub">Una sola plataforma desplegada en Azure, organizada en tres capas: las personas que la usan, la aplicación que orquesta, y los sistemas externos a los que se conecta.</p>
<div class="arch">
<!-- Capa 1: Usuarios -->
<p class="band-label">① Usuarios · acceso por rol</p>
<div class="arch-row">
<div class="arch-card">
<span class="ico peach">💰</span>
<div><div class="ac-t">Finanzas</div><div class="ac-s">Cobranza, pagos y conciliación</div></div>
</div>
<div class="arch-card">
<span class="ico amber">🏢</span>
<div><div class="ac-t">Dirección</div><div class="ac-s">Dashboard CxC / CxP en vivo</div></div>
</div>
<div class="arch-card">
<span class="ico slate">🛠️</span>
<div><div class="ac-t">Operaciones</div><div class="ac-s">Carga de PDFs y revisión</div></div>
</div>
</div>
<div class="arch-down"><small>RBAC + autenticación</small></div>
<!-- Capa 2: Plataforma -->
<div class="group" data-label="② Plataforma Balam · desplegada en Azure">
<p class="band-label">Aplicación</p>
<div class="arch-row">
<div class="arch-card">
<span class="ico sky">🖥️</span>
<div><div class="ac-t">UI Web</div><div class="ac-s">Facturas, dashboard, cobranza, conciliación</div></div>
</div>
<div class="arch-card">
<span class="ico lavender">🔌</span>
<div><div class="ac-t">API core</div><div class="ac-s">Auth, roles, reglas de negocio</div></div>
</div>
<div class="arch-card">
<span class="ico lavender"></span>
<div><div class="ac-t">Worker + Cron</div><div class="ac-s">Sync, recordatorios, motor de match</div></div>
</div>
</div>
<p class="band-label">Datos &amp; almacenamiento</p>
<div class="arch-row">
<div class="arch-card">
<span class="ico mint">🗄️</span>
<div><div class="ac-t">PostgreSQL</div><div class="ac-s">Facturas, pagos, conciliación, audit log</div></div>
</div>
<div class="arch-card">
<span class="ico mint">📦</span>
<div><div class="ac-t">Blob Storage</div><div class="ac-s">PDFs bancarios y respaldos</div></div>
</div>
</div>
</div>
<div class="arch-down"><small>APIs · webhooks · archivos</small></div>
<!-- Capa 3: Integraciones -->
<div class="group" data-label="③ Servicios e integraciones externas">
<p class="band-label">Activas en el MVP</p>
<div class="arch-row">
<div class="arch-card">
<span class="ico navy">📘</span>
<div>
<div class="ac-t">BIND ERP · API</div>
<div class="ac-s">Facturas, clientes, catálogo · fuente de verdad</div>
<div class="mini-pills">
<span class="mini-pill t-read">✅ Lectura</span>
<span class="mini-pill t-write">✍️ Escritura (roadmap)</span>
</div>
</div>
</div>
<div class="arch-card">
<span class="ico peach">🤖</span>
<div><div class="ac-t">Claude API</div><div class="ac-s">Parsing de PDFs bancarios</div></div>
</div>
<div class="arch-card">
<span class="ico mint">💳</span>
<div><div class="ac-t">Stripe</div><div class="ac-s">Pago con link + webhook de pagado</div></div>
</div>
<div class="arch-card">
<span class="ico sky">💱</span>
<div><div class="ac-t">DOF</div><div class="ac-s">Tipo de cambio MXN / USD</div></div>
</div>
</div>
<p class="band-label">Roadmap futuro 🔮</p>
<div class="arch-row">
<div class="arch-card rm">
<span class="ico slate">👥</span>
<div><div class="ac-t">BUK · API</div><div class="ac-s">Nómina aprobada → factura automática</div></div>
</div>
<div class="arch-card rm">
<span class="ico slate">🕐</span>
<div><div class="ac-t">Jira</div><div class="ac-s">Horas por colaborador-cliente</div></div>
</div>
<div class="arch-card rm">
<span class="ico slate">🏦</span>
<div><div class="ac-t">Belvo / Plaid</div><div class="ac-s">Banca en vivo (elimina PDFs)</div></div>
</div>
</div>
</div>
</div>
<div class="divider"></div>
<!-- ====================================================== -->
<!-- ====== LÍNEA DE TIEMPO ====== -->
<!-- ====================================================== -->
<p class="section-label">El plan · cómo se construye · 6 fases</p>
<h2 class="block-title">En qué orden lo entregamos</h2>
<p class="block-sub">Cada fase entrega algo usable. BIND arranca solo como exploración, pasa a lectura activa y, ya en el roadmap, a escritura. BUK queda fuera hasta que exponga una API estable.</p>
<div class="timeline">
<!-- FASE 0 -->
<div class="phase">
<div class="tile slate">🔍</div>
<div class="phase-card">
<p class="ph-kicker">Fase 0 · Semana 1</p>
<h3 class="ph-title">Discovery</h3>
<ul class="ph-card-list">
<li>Validar <b>BIND API</b>: auth, sandbox, webhooks y endpoints de escritura.</li>
<li>Recolectar <b>3 PDFs bancarios</b> reales anonimizados (Banorte, Intercam, IBC Texas).</li>
<li>Validar parsing con <b>Claude API</b> sobre los PDFs.</li>
<li>Setup de <b>Azure + repositorio + CI/CD</b>.</li>
</ul>
<div class="ph-status">
<span class="status t-none"><span class="ic">⏸️</span><span><b>BIND</b> · Solo exploración, sin integración</span></span>
<span class="status t-none"><span class="ic">⏸️</span><span><b>BUK</b> · Fuera de scope</span></span>
</div>
</div>
</div>
<!-- FASE 1 -->
<div class="phase">
<div class="tile sky">🔄</div>
<div class="phase-card">
<p class="ph-kicker">Fase 1 · Semanas 23</p>
<h3 class="ph-title">Sync BIND + plataforma base</h3>
<ul class="ph-card-list">
<li><b>Conector BIND API (lectura)</b>: facturas, clientes y catálogo.</li>
<li>Modelo central de facturas con estados.</li>
<li>Multimoneda <b>MXN + USD</b> (tipo de cambio del DOF).</li>
<li>Auth, roles y audit log · UI: listado, filtros y detalle de facturas.</li>
</ul>
<div class="ph-status">
<span class="status t-read"><span class="ic"></span><span><b>BIND</b> · Lectura activa vía API (sync programado)</span></span>
<span class="status t-none"><span class="ic">⏸️</span><span><b>BUK</b> · Fuera de scope</span></span>
</div>
</div>
</div>
<!-- FASE 2 -->
<div class="phase">
<div class="tile lavender">📬</div>
<div class="phase-card">
<p class="ph-kicker">Fase 2 · Semana 4</p>
<h3 class="ph-title">Cobranza + Dashboard + Pago link</h3>
<ul class="ph-card-list">
<li>Registro manual de pagos asociados a facturas + editor de template de cobranza.</li>
<li>Motor de recordatorios automáticos (<b>cron + worker</b>).</li>
<li><b>Lista blanca dura</b>: ACUNTIA + Top 3 nunca reciben auto-recordatorio.</li>
<li>Pago con link <b>Stripe (Checkout)</b> + webhook que marca pagado · Dashboard CxC en vivo.</li>
</ul>
<div class="ph-status">
<span class="status t-read"><span class="ic"></span><span><b>BIND</b> · Fuente de verdad (lectura)</span></span>
<span class="status t-none"><span class="ic">⏸️</span><span><b>BUK</b> · Fuera de scope</span></span>
</div>
</div>
</div>
<!-- FASE 3 -->
<div class="phase">
<div class="tile peach">🔗</div>
<div class="phase-card">
<p class="ph-kicker">Fase 3 · Semana 5</p>
<h3 class="ph-title">Conciliación bancaria (PDF)</h3>
<ul class="ph-card-list">
<li>Upload manual de PDFs + extracción estructurada con <b>Claude API</b> (1 pipeline por banco).</li>
<li>Validación de totales (sumatoria vs. resumen del PDF).</li>
<li>Motor de conciliación: <b>match exacto auto</b> · alias semi-auto · no-match → cola humana.</li>
<li>Detección de duplicados y traspasos internos.</li>
</ul>
<div class="ph-status">
<span class="status t-read"><span class="ic"></span><span><b>BIND</b> · Lectura para hacer match contra facturas</span></span>
<span class="status t-none"><span class="ic">⏸️</span><span><b>BUK</b> · Fuera de scope</span></span>
</div>
</div>
</div>
<!-- FASE 4 -->
<div class="phase lead-roadmap">
<div class="tile mint">📈</div>
<div class="phase-card">
<p class="ph-kicker">Fase 4 · Semana 6</p>
<h3 class="ph-title">Reportes + cierre del MVP</h3>
<ul class="ph-card-list">
<li>Export <b>Excel/CSV compatible con BIND</b> (el contador sube los asientos manualmente).</li>
<li>Reportes mensuales de <b>CxC y CxP</b>.</li>
<li>Backups + hardening + <b>RBAC granular</b>.</li>
<li>Documentación + capacitación.</li>
</ul>
<div class="ph-status">
<span class="status t-read"><span class="ic"></span><span><b>BIND</b> · Lectura + export Excel hacia BIND (manual por contador)</span></span>
<span class="status t-none"><span class="ic">⏸️</span><span><b>BUK</b> · Fuera de scope</span></span>
</div>
</div>
</div>
<!-- POST-MVP -->
<div class="phase roadmap">
<div class="tile amber">🔮</div>
<div class="phase-card">
<p class="ph-kicker">Post-MVP · Roadmap futuro</p>
<span class="rm-badge">🔮 Roadmap · no incluido en el MVP / cotización</span>
<h3 class="ph-title">Cierre del ciclo end-to-end</h3>
<ul class="ph-card-list">
<li><b>BIND escritura vía API</b>: registra pagos y genera asientos contables automáticos (elimina el export Excel).</li>
<li><b>BUK</b>: cuando exponga API, la nómina aprobada dispara la factura automática en BIND vía la plataforma.</li>
<li><b>Jira</b>: horas por colaborador-cliente como input de facturación.</li>
<li><b>Belvo/Plaid</b>: integración bancaria en vivo (elimina el upload de PDFs).</li>
</ul>
<div class="ph-status">
<span class="status t-write"><span class="ic">✍️</span><span><b>BIND</b> · Escritura vía API (pagos + asientos automáticos)</span></span>
<span class="status t-future"><span class="ic">🔮</span><span><b>BUK</b> · Integración end-to-end (Jira → BUK → factura)</span></span>
</div>
</div>
</div>
</div>
<!-- ====================================================== -->
<!-- ====== SWIMLANE: INTEGRACIÓN A LO LARGO DEL TIEMPO ====== -->
<!-- ====================================================== -->
<p class="section-label">Integración a lo largo del tiempo</p>
<h2 class="block-title">Cómo evoluciona el rol de BIND y BUK</h2>
<p class="block-sub">De un vistazo: BIND pasa de exploración → lectura → escritura. BUK permanece fuera de scope durante todo el MVP y solo entra en el roadmap.</p>
<div class="swim-wrap">
<div class="swim">
<!-- fila encabezados -->
<div class="corner"></div>
<div class="ch">Fase 0<small>Sem 1</small></div>
<div class="ch">Fase 1<small>Sem 23</small></div>
<div class="ch">Fase 2<small>Sem 4</small></div>
<div class="ch">Fase 3<small>Sem 5</small></div>
<div class="ch">Fase 4<small>Sem 6</small></div>
<div class="ch rm">Post-MVP<small>Roadmap</small></div>
<!-- fila BIND -->
<div class="lane"><span class="dot" style="background:var(--navy);color:#fff">📘</span> BIND</div>
<div class="cell t-none">⏸️ Exploración<small>validar API</small></div>
<div class="cell t-read">✅ Lectura<small>sync programado</small></div>
<div class="cell t-read">✅ Lectura<small>fuente de verdad</small></div>
<div class="cell t-read">✅ Lectura<small>match facturas</small></div>
<div class="cell t-read">✅ Lectura<small>+ export Excel</small></div>
<div class="cell t-write rm">✍️ Escritura<small>pagos + asientos</small></div>
<!-- fila BUK -->
<div class="lane"><span class="dot" style="background:var(--sky);color:var(--sky-ink)">👥</span> BUK</div>
<div class="cell t-none">⏸️ Fuera de scope<small></small></div>
<div class="cell t-none">⏸️ Fuera de scope<small></small></div>
<div class="cell t-none">⏸️ Fuera de scope<small></small></div>
<div class="cell t-none">⏸️ Fuera de scope<small></small></div>
<div class="cell t-none">⏸️ Fuera de scope<small></small></div>
<div class="cell t-future rm">🔮 Integración<small>nómina → factura</small></div>
</div>
</div>
<!-- ====================================================== -->
<!-- ====== DIAGRAMA ESTADO FINAL POST-MVP ====== -->
<!-- ====================================================== -->
<p class="section-label" style="margin-top:52px">Estado final · Roadmap post-MVP</p>
<h2 class="block-title">El ciclo cerrado end-to-end</h2>
<p class="block-sub">Visión objetivo una vez completado el roadmap: cada sistema dispara al siguiente sin intervención manual. Las flechas indican quién dispara a quién.</p>
<div class="group" data-label="🔮 Estado objetivo post-MVP">
<div class="flow">
<div class="node">
<div class="tile slate">🕐</div>
<div class="label">Jira</div>
<div class="sub">Horas por colaborador-cliente</div>
</div>
<div class="arrow"><span class="gly"></span><span class="cap">horas aprobadas</span></div>
<div class="node">
<div class="tile sky">👥</div>
<div class="label">BUK</div>
<div class="sub">Nómina aprobada</div>
</div>
<div class="arrow"><span class="gly"></span><span class="cap">nómina aprobada</span></div>
<div class="node">
<div class="tile lavender">⚙️</div>
<div class="label">Plataforma</div>
<div class="sub">Orquesta y genera factura</div>
</div>
<div class="arrow"><span class="gly"></span><span class="cap">factura vía API</span></div>
<div class="node">
<div class="tile navy">📘</div>
<div class="label">BIND ERP</div>
<div class="sub">Timbra CFDI + asiento</div>
</div>
<div class="arrow"><span class="gly"></span><span class="cap">CFDI / cobro</span></div>
<div class="node">
<div class="tile mint">🏦</div>
<div class="label">Banco</div>
<div class="sub">Cobro / movimientos</div>
</div>
<div class="arrow"><span class="gly"></span><span class="cap">mov. en vivo · Belvo/Plaid</span></div>
<div class="node">
<div class="tile peach">🔗</div>
<div class="label">Conciliación</div>
<div class="sub">Match automático</div>
</div>
<div class="arrow"><span class="gly"></span><span class="cap">asiento automático</span></div>
<div class="node">
<div class="tile amber">📈</div>
<div class="label">Reporte</div>
<div class="sub">CxC / CxP + asiento</div>
</div>
</div>
</div>
</body>
</html>