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,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>
|
||||
Reference in New Issue
Block a user