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:
@@ -0,0 +1,740 @@
|
||||
<!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 0–4 (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 & 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 2–3</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 2–3</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>
|
||||
Reference in New Issue
Block a user