Reorganiza repo como fuente de la verdad + propuesta v1.0 con emisión de facturas

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

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
JohannVelazquez
2026-06-04 10:57:27 -06:00
parent 404e6f3b89
commit 633d05e330
47 changed files with 32977 additions and 472 deletions
+722
View File
@@ -0,0 +1,722 @@
# Arquitectura Técnica — Plataforma Balam
Este documento es la decisión técnica que sostendrá el proyecto. Está pensada para:
1. Permitir entregar el MVP en **6 semanas (medio tiempo, ~120 h)**.
2. **Escalar sin re-escribir** cuando se agreguen nuevos módulos, clientes o cuando se decida comercializar como producto SaaS.
3. Ser comprensible por otro desarrollador si hay que sumar gente.
## Posicionamiento
La plataforma es una **capa de operaciones financieras encima de BIND ERP**, no un reemplazo. El sistema de verdad para emisión de CFDI y contabilidad sigue siendo BIND (que ya tiene PAC integrado). Lo que falta y aporta valor:
- Cobranza con reglas (lista blanca, recordatorios automáticos, templates)
- Conciliación bancaria sobre PDFs (Banorte/BBVA/IBC Texas)
- Dashboard consolidado de CxC
- Pagos con link (Stripe)
- Alertas y reportes programados
## Visión end-to-end (el horizonte que persigue la arquitectura)
El equipo directivo (CEO/CFO/CTO) describió un ciclo financiero completamente desconectado: nómina, facturación, cobranza, conciliación y contabilidad pasan por manos distintas y cada handoff cuesta dinero. El MVP **no resuelve todo el ciclo**, pero la arquitectura se diseña para llegar a él sin reescribir:
```
Fase 2-3 (futuro) MVP (lo que construimos en 6 semanas)
────────────────── ────────────────────────────────────
Jira (horas) ┌─ Cobranza
│ │
▼ │
BUK (nómina) ┌─ BIND (facturación) ─────┼─ Conciliación
│ │ │ (PDF + IA)
▼ │ │
Plataforma ───trigger──>│ ├─ Dashboard
(auto-factura) │ │
└─ BIND (asientos) <────────┴─ Pago con link
(Stripe)
```
**Cómo el MVP prepara la visión completa:**
| Capacidad futura | Qué construye el MVP que la habilita |
|---|---|
| Trigger de factura desde nómina (BUK) | Outbox pattern + worker — basta agregar un handler `nomina.approved` |
| Ingesta de horas desde Jira | Schema multi-fuente para facturas (origen ya tipificado) |
| Generación automática de asiento contable contra BIND | Motor de reportería con mapeo evento → asiento ya existe; falta solo conector BIND |
| Banco en vivo (Belvo / Plaid) | Schema `statement_line` agnóstico a fuente; pipeline de Claude API es reemplazable sin tocar conciliación |
| Anomalía con IA / agentes | Stream de eventos del outbox alimenta cualquier consumidor IA en Fase 2 |
| Multi-tenant comercial | `tenant_id` + RLS desde día 1 — solo falta onboarding self-service |
**Por eso el MVP, aunque acotado, es estratégico:** entrega valor operativo en 6 semanas y abre el camino al ciclo completo sin deuda técnica.
```
┌─────────────────────────────────────────────┐
│ Plataforma Balam (nueva) │
│ Cobranza · Dashboard · Conciliación · Pago │
└──────┬───────────────┬───────────────┬──────┘
│ import │ export │ webhook
│ (archivo) │ (archivo) │
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ BIND │ │ BIND │ │ Stripe │
│ (facturas│ │ (asientos│ │ (pago) │
│ + PAC) │ │ + ERP) │ └──────────┘
└──────────┘ └──────────┘
┌──────────┐
│ Claude │
│ API │
│ (parsing │
│ PDFs) │
└────▲─────┘
┌────┴─────┐
│ PDFs de │
│ 3 bancos │
└──────────┘
```
## MVP vs diseño completo
El diseño descrito en este documento es la **arquitectura objetivo**, calibrada para soportar todo el roadmap (incluyendo Fase 2). El MVP de 6 semanas a medio tiempo construye los cimientos completos pero **no implementa todos los módulos**:
| Componente | MVP (6 sem · medio tiempo) | Fase 2 |
|---|---|---|
| Auth, RBAC, audit log | ✅ | — |
| Multi-tenancy en schema (`tenant_id` + RLS) | ✅ | onboarding self-service |
| Import de catálogo + facturas desde BIND (archivo) | ✅ | API en vivo |
| **Emisión de CFDI desde la plataforma** | ❌ (BIND lo hace) | sólo si se valida necesidad |
| Multimoneda visualización | ✅ MXN + USD | EUR |
| Cobranza + recordatorios + lista blanca configurable | ✅ | — |
| **Pago con link (Stripe Checkout + webhook)** | ✅ | domiciliación / recurrentes |
| Dashboard CxC | ✅ básico | cash-flow 30/60/90 |
| **Banca: import de PDFs + parsing con Claude API** | ✅ | Belvo / Plaid en vivo |
| Conciliación: match exacto + por alias | ✅ | scoring difuso completo |
| Detección de anomalías | ⚠️ solo duplicados + traspasos | z-score, vendor nuevo, horarios |
| Reporte para asientos contables (Excel para BIND) | ✅ | API en vivo |
| Outbox pattern + eventos | ✅ | — |
| Agentes IA / LLM operativos | ❌ | ✅ |
| Portal cliente / móvil | ❌ | ✅ |
| Integración BUK | ❌ | ✅ cuando exponga API |
**Por qué este recorte:** la arquitectura modular y event-driven permite agregar Fase 2 sin tocar lo entregado. El MVP demuestra valor con el mínimo viable; las decisiones de qué invertir en Fase 2 se toman con datos de uso real, no a priori.
## Constraint operativo: sin sandboxes
BIND y BUK solo cuentan con producción. Esto se mitiga así:
1. **La plataforma no escribe a BIND en MVP.** El flujo es estrictamente: BIND exporta → plataforma importa → plataforma exporta para que el contador suba manualmente. Ninguna operación tuya puede corromper BIND.
2. **Modo dry-run** disponible en cualquier acción con efecto externo (envío de correos, generación de links Stripe), con preview obligatorio antes de confirmar.
3. **Snapshots automáticos** de la base de datos antes de cualquier import masivo desde BIND.
4. **Audit log** registra el actor (humano o sistema), la acción, y el delta. Reversible en <5 min para operaciones internas.
---
## 1. Principios rectores
| Principio | Implicación |
|---|---|
| **Modular monolito > microservicios** | Empezamos con un solo despliegue, módulos con fronteras claras. Microservicios sólo si el volumen lo justifica. |
| **Boring tech** | PostgreSQL, TypeScript, Node, React. Nada exótico. |
| **Eventos internos desde día 1** | El core publica eventos (`invoice.issued`, `payment.received`); los módulos reaccionan. Eso permite agregar módulos nuevos sin tocar los existentes. |
| **Multi-tenancy desde el esquema** | `tenant_id` en todas las tablas (aunque por ahora exista un solo tenant). Cuando llegue el momento de vender el producto, no hay que rehacer la DB. |
| **Audit log universal** | Todo cambio en entidades financieras se registra (quién, qué, cuándo, antes/después). Cumple RNF-06 y es vital para fiscal. |
| **Idempotencia en integraciones** | Webhooks, jobs y endpoints externos siempre con `idempotency_key`. Evita facturas duplicadas o pagos repetidos. |
| **Failure isolation** | Un error en conciliación nunca tira la facturación. Workers separados, colas independientes. |
---
## 2. Stack recomendado
### Backend
- **Lenguaje:** TypeScript (Node.js 22 LTS)
- **Framework:** NestJS *o* Fastify + tRPC
- NestJS si esperamos sumar devs (estructura opinionada, fácil onboarding)
- Fastify + tRPC si seguiré solo (más ligero, mejor DX con frontend)
- **Recomendación: NestJS** — pensando en futura comercialización + onboarding
- **ORM:** Prisma (migraciones, tipos, ergonomía)
- **Validación:** Zod (compartida entre front y back)
- **Auth:** Better-auth o Auth.js (autohospedado, sin lock-in)
### Frontend
- **Framework:** Next.js 15 (App Router)
- **UI:** shadcn/ui + Tailwind v4
- **Data fetching:** TanStack Query
- **Tablas / data grids:** TanStack Table
- **Charts:** Recharts o Tremor (Tremor está pensado para dashboards financieros)
- **Forms:** React Hook Form + Zod
### Datos
- **Primaria:** PostgreSQL 16
- **Cache / Queue:** Redis 7 (BullMQ para jobs)
- **Object storage:** S3 / R2 (XML/PDF de facturas, estados de cuenta)
### Infra (Azure por preferencia del cliente)
- **App + Worker:** Azure App Service (Linux, plan B2 inicial)
- **Base de datos:** Azure Database for PostgreSQL Flexible Server
- **Storage:** Azure Blob Storage (PDFs bancarios cifrados en reposo)
- **Cache / Queue:** Azure Cache for Redis (Basic) o Upstash Redis serverless si el costo de Azure Redis no se justifica
- **Observabilidad:** Sentry (errores) + Application Insights (logs/métricas integrado a Azure) + uptime monitoring externo
- **CI/CD:** GitHub Actions con deploy a Azure App Service
- **Secretos:** Azure Key Vault
### Calidad
- **Tests:** Vitest (unit) + Playwright (E2E críticos)
- **Lint/Format:** Biome (rápido, reemplaza ESLint + Prettier)
- **Types:** TypeScript strict en todo
- **Pre-commit:** Lefthook
### Integraciones obligatorias en MVP
- **Import de archivos BIND** (formato CSV/Excel a confirmar en Fase 0)
- **Parsing de PDFs bancarios:** Claude API (Anthropic) — un pipeline por banco
- **Pago con link:** Stripe Checkout + Webhook
- **Tipo de cambio:** API del DOF (Banxico) + cache diario
- **Email transaccional:** Resend (DX excelente) o Postmark
### Integraciones diferidas a Fase 2
- PAC propio (solo si Balam decide emitir CFDI desde la plataforma — hoy lo hace BIND)
- Agregador bancario MX: Belvo o Finerio Connect (reemplaza upload manual de PDFs)
- Banco US: Plaid o scraping autorizado del portal IBC
- BUK API (cuando exista)
- Conector contra BIND vía API (cuando exista)
---
## 3. Estructura del repositorio (monorepo)
```
balam/
├── apps/
│ ├── web/ # Next.js (frontend)
│ ├── api/ # NestJS (backend HTTP)
│ └── worker/ # Procesos en background (BullMQ)
├── packages/
│ ├── db/ # Prisma schema + migraciones + tipos
│ ├── core/ # Lógica de dominio compartida
│ ├── contracts/ # Schemas Zod compartidos front/back
│ ├── integrations/ # Clientes para PAC, bancos, etc.
│ └── ui/ # Componentes shadcn customizados
├── docs/ # ADRs, runbooks, manuales
└── infra/ # IaC mínimo, scripts de deploy
```
Gestor: **pnpm workspaces** + **Turborepo** para caché de builds.
---
## 4. Modelo de datos (núcleo)
Diagrama lógico simplificado:
```
tenant ─┬─ user ──── role
├─ customer ─┬─ invoice ──┬─ invoice_line
│ │ └─ cfdi_xml
│ └─ contact
├─ bank_account ─┬─ bank_statement ── statement_line
│ └─ reconciliation_match
├─ payment ─── payment_allocation (M-N con invoice)
├─ exchange_rate (DOF diario)
├─ accounting_entry ─── entry_line
├─ event (event sourcing ligero / outbox)
├─ audit_log
└─ notification (recordatorios enviados, blacklist)
```
**Reglas duras del modelo:**
- Toda tabla financiera tiene: `id`, `tenant_id`, `created_at`, `updated_at`, `created_by`, `updated_by`.
- Montos siempre en **decimal(18,4)** + columna `currency` ISO 4217. **Nunca** `float`.
- Fechas en UTC en DB, presentación en CST/MX.
- Soft delete con `deleted_at` en entidades editables; **hard delete prohibido** en facturas/pagos (cancelación lógica).
- `idempotency_key` único por tenant en endpoints de creación masiva.
---
## 5. Arquitectura de capas
```
┌─────────────────────────────────────────────┐
│ Frontend Next.js (Dashboard, Forms) │
└──────────────────┬──────────────────────────┘
│ HTTPS + JWT/Session
┌──────────────────▼──────────────────────────┐
│ API NestJS (REST + tRPC opcional) │
│ ├── Auth & RBAC │
│ ├── Controllers / Resolvers │
│ └── Application Services │
└──────┬─────────────────────┬────────────────┘
│ │
│ publish events │ enqueue jobs
▼ ▼
┌──────────────┐ ┌─────────────────────────┐
│ Event Bus │ │ Worker (BullMQ) │
│ (outbox tbl) │ │ ├── invoice timbrado │
└──────┬───────┘ │ ├── bank sync (cron) │
│ │ ├── reconciliation │
▼ │ ├── reminders (cron) │
┌──────────────┐ │ └── reports │
│ Modules │ └────────┬────────────────┘
│ reaccionan │ │
└──────┬───────┘ │
│ │
▼ ▼
┌─────────────────────────────────────────────┐
│ Domain Services + Repositories (Prisma) │
└──────────────────┬──────────────────────────┘
┌─────────────────────────────────────────────┐
│ PostgreSQL + Redis + S3 │
└─────────────────────────────────────────────┘
▲ ▲ ▲
│ │ │
┌──────┴──────────────┴──────────────┴────────┐
│ Integraciones externas (clientes) │
│ BIND (archivo) · Claude API · Stripe · DOF · Email │
└─────────────────────────────────────────────┘
```
---
## 6. Patrón Event-Driven (clave para escalar)
Tabla `event` (outbox pattern):
```sql
CREATE TABLE event (
id uuid PRIMARY KEY,
tenant_id uuid NOT NULL,
type text NOT NULL, -- 'invoice.issued', 'payment.received'
payload jsonb NOT NULL,
aggregate_id uuid NOT NULL, -- id de la entidad afectada
occurred_at timestamptz NOT NULL,
processed_at timestamptz,
attempts int DEFAULT 0
);
```
**Flujo:** Cuando se emite una factura, en la misma transacción se inserta un evento `invoice.issued`. Un worker lee la tabla y dispara handlers: enviar email al cliente, generar asiento contable, programar recordatorio de cobro.
**Por qué importa:** mañana cuando agreguen "notificar a Slack al timbrar", se agrega un handler sin tocar el código de facturación. Ese es el diseño que les va a encantar — no porque lo digan, sino porque verán que pedir cambios es barato.
---
## 7. Módulos del sistema (bounded contexts)
### 7.1 Identity & Access (`identity`)
- Users, tenants, roles, permissions
- Sesiones, MFA opcional (recomendado para finanzas)
- Audit log
### 7.2 Catálogo (`catalog`)
- Customers (con flag `is_strategic`, `auto_reminder_enabled`)
- Products/Services
- Tax regimes, payment methods (catálogos SAT)
### 7.3 Sincronización con BIND (`bind-sync`)
- Importador de archivo de BIND (clientes, facturas, productos, catálogo de cuentas)
- Dedupe por id externo (UUID del CFDI o id de BIND)
- Visualización multimoneda con snapshot de TC al momento de la factura
- Modo dry-run para previsualizar deltas antes de aplicar
- Sincronización programada o manual
### 7.4 Cobranza (`collections`)
- Estados de factura derivados de BIND + pagos locales
- Motor de recordatorios (cron + templates editables)
- Lista blanca: clientes con `auto_reminder_enabled=false` jamás reciben (ACUNTIA + Top 3 — configurable)
- Tracking de comunicaciones enviadas
### 7.5 Pagos (`payments`)
- Stripe Checkout: generación de link por factura
- Webhook receiver: marca factura como pagada al confirmar
- Soporte tarjeta + SPEI
- Conciliación lista para pagos directos por banco (no via Stripe) en módulo banking
### 7.6 Banca (`banking`)
- Upload de PDFs (Banorte/BBVA/IBC) por usuario
- Pipeline de extracción con Claude API + validación de totales
- Almacenamiento de statement_lines con dedupe por hash
- (Fase 2: conexiones a Belvo / Plaid)
### 7.7 Conciliación (`reconciliation`)
- Motor de matching con scoring (exacto → alias → cola humana)
- Detección de duplicados y traspasos internos
- (Fase 2: detección avanzada de anomalías, z-score, etc.)
### 7.8 Reportería (`reporting`)
- Dashboard tiempo real (CxC, vencidas, próximas a vencer)
- Reportes programables (diario/semanal por email)
- Export para BIND: pagos conciliados + movimientos clasificados en Excel/CSV
### 7.9 Alertas (`notifications`)
- Email, en-app
- Configurables por usuario y por evento
---
## 8. Seguridad y compliance
### Obligatorio desde día 1
- TLS everywhere (Let's Encrypt vía proxy)
- Secrets en variables de entorno cifradas, nunca en el repo
- Cifrado en reposo de PostgreSQL (Railway/Fly lo proveen)
- Cifrado a nivel campo para datos sensibles (credenciales bancarias, tokens de agregadores) usando `pgcrypto`
- Bcrypt para passwords (Argon2 si Better-auth lo permite)
- Rate limiting en endpoints públicos
- CORS estricto
- Headers de seguridad (helmet)
- Validación Zod en cada entrada
- RBAC granular por módulo y acción
### Mexicano-específico
- Emisión y sello digital del CFDI: **lo maneja BIND con su PAC integrado**; la plataforma no toca el SAT en MVP
- Almacenamiento de XML/PDF de facturas en Blob Storage (referenciado por id de BIND) — por **5 años** según SAT
- Bitácora de cancelaciones espejo (motivo + UUID sustituto) sincronizada desde el export de BIND
- Tipos de cambio del DOF para reportería interna
### Texas (banco US)
- Si hay operación contable real en Texas, revisar requerimientos con contador (no asumir).
- Para el MVP, tratamos las cuentas US como cuentas bancarias normales en USD.
---
## 9. Estrategia de tipo de cambio
- Cache diario en tabla `exchange_rate` desde API de Banxico (DOF FIX)
- Al emitir factura USD, se "fija" el TC del día en la factura
- Para conciliación de pagos USD a facturas MXN: regla configurable (TC del día del pago o del día de la factura)
- Pérdidas/ganancias cambiarias se registran como asientos automáticos
---
## 10. Pipeline de extracción de PDFs bancarios
Los 3 bancos entregan estados de cuenta como PDF (Banorte, BBVA, IBC Bank Texas). No hay CSV/API disponibles. La estrategia:
```
Upload PDF ──> Almacenar en Blob ──> Job en cola ──> Pipeline por banco
┌───────────────┼───────────────┐
▼ ▼ ▼
pdfplumber/ Claude API Validación
pdftotext extracción (totales,
(texto) estructurada duplicados,
→ JSON formato)
statement_line[]
hash + dedupe + persist
```
**Decisiones clave:**
1. **Texto primero, modelo después.** Se extrae texto con `pdfplumber` (Python) o `pdf-parse` (Node) y se pasa el texto plano a Claude. Más barato y rápido que mandar el PDF binario.
2. **Un prompt por banco**, versionado. Cada prompt incluye: ejemplos few-shot, schema JSON esperado, instrucciones de manejo de saltos de página y casos borde.
3. **Validación automática post-extracción:**
- Suma de movimientos == saldo final - saldo inicial (con tolerancia mínima)
- Cantidad de movimientos == lo que el resumen del PDF indica
- Si validación falla → flag manual review, no se inserta
4. **Schema único** para `statement_line` (independiente de banco):
```
{ fecha, monto, tipo: 'cargo'|'abono', concepto, referencia, saldo_post, hash }
```
5. **Hash de dedupe:** `sha256(banco_id + fecha + monto + concepto)`. Re-upload del mismo PDF es idempotente.
6. **Costo aproximado:** 50 facturas/mes → ~3 PDFs/mes × ~20 páginas × ~1500 tokens/pág × $3/MTok input + $15/MTok output. **~$2-8 USD/mes** total. Despreciable.
7. **Privacidad:** Anthropic API por default no entrena con datos del cliente (Zero Data Retention disponible bajo enterprise agreement si se requiere). Documentado en supuesto §11 de la propuesta.
8. **Migration path:** cuando en Fase 2 se conecte Belvo, el `statement_line` schema no cambia. Solo cambia la fuente. Mismo motor de conciliación reutilizable.
**Por qué Claude API y no parsers hardcoded:**
- Los bancos cambian formato sin avisar. Un parser regex se rompe; Claude tolera variaciones.
- IBC Texas tiene formato muy diferente a los bancos MX. Reutilizar prompts es trivial; reutilizar regex no.
- Tiempo de implementación: ~3-4 h por banco con Claude vs. 8-12 h por banco con parser custom + tests.
## 11. Estrategia de conciliación (corazón del proyecto)
Algoritmo en cascada (mayor a menor confianza):
1. **Match exacto:** monto idéntico + referencia/UUID en concepto + ±3 días → auto-match
2. **Match alto:** monto idéntico + cliente identificable por patrón en concepto + ±7 días → auto-match con flag de revisión
3. **Match medio:** monto en ventana ±2% + cliente identificable → cola de revisión humana
4. **Sin match:** se guarda en `unmatched_statement_line`, dashboard de pendientes
**Cliente identificable por patrón:** usar regex / fuzzy match contra alias del cliente (`Banorte` puede llegar el pago como "BANORTE SA", "BNTE", etc. — armar tabla `customer_alias`).
**Anomalías detectables sin IA:**
- Gasto que excede 2σ del promedio mensual de esa categoría
- Cargo duplicado (mismo monto + mismo concepto + ventana 5 días)
- Cargos en horarios atípicos (madrugada, fines de semana si la empresa no opera)
- Vendor nuevo (no aparece en los últimos 6 meses)
Esto es robusto, explicable y gratis. **La IA se agrega en v2** sobre estos cimientos, no como reemplazo.
---
## 12. Multi-tenancy: ahora vs después
**Ahora (MVP):**
- `tenant_id` en todas las tablas
- Row-level security en PostgreSQL (RLS) con policies por tenant
- Un solo tenant en producción (Balam)
**Después (comercialización):**
- Onboarding self-service
- Plan/billing del SaaS
- Aislamiento de archivos por tenant en S3
Costo de incluir `tenant_id` ahora: <5% del esfuerzo. Costo de agregarlo después: rewrite parcial. **Por eso se hace desde día 1.**
---
## 13. Testing strategy
| Tipo | Cobertura objetivo | Herramienta |
|---|---|---|
| Unit (lógica de dominio: cálculos, reglas) | >90% | Vitest |
| Integration (servicios + DB) | rutas críticas | Vitest + Testcontainers |
| E2E (flujos críticos UI) | 5-8 flujos | Playwright |
| Contract (mocks de PAC, Belvo) | endpoints integrados | MSW |
**Flujos E2E obligatorios:**
1. Crear cliente → emitir factura MXN → timbrar → descargar PDF
2. Emitir factura USD a cliente extranjero (sin IVA)
3. Importar movimiento bancario → conciliar manualmente → ver pago aplicado
4. Conciliación automática end-to-end con datos sintéticos
5. Enviar recordatorio que respeta lista blanca (cliente Top 3 no recibe)
---
## 14. Plan de despliegue
- `main` → producción (deploy automático tras CI verde + aprobación manual)
- `develop` → staging (deploy automático)
- Feature branches → preview environments (Railway lo soporta)
- Rollback en <2 min vía Railway dashboard
**Migraciones:**
- Siempre backward-compatible (expand → migrate → contract)
- Backup automático antes de cada migración productiva
- Migraciones revisadas manualmente, nunca destructivas en hot-path
---
## 15. Observabilidad mínima
- **Sentry:** errores no manejados, performance de queries lentas
- **Better Stack / Axiom:** logs estructurados (cada request, cada job)
- **Métricas:** dashboard interno con (a) facturas/día, (b) pagos conciliados auto vs manual, (c) jobs fallidos, (d) latencia p95
- **Alertas a tu correo/Slack:**
- Job de timbrado falla
- Sync bancario sin éxito por >4 hrs
- >10 errores en 5 min
- Disco/memoria al 80%
---
## 16. ADRs (Architecture Decision Records)
Llevar `docs/adr/NNNN-titulo.md` con decisiones grandes:
- ADR-0001: Monorepo con pnpm + Turborepo
- ADR-0002: NestJS como framework backend
- ADR-0003: PostgreSQL como única base de datos primaria
- ADR-0004: Multi-tenancy por `tenant_id` desde día 1
- ADR-0005: BIND como fuente de verdad de facturación; plataforma como capa de operaciones
- ADR-0006: Claude API para extracción estructurada de PDFs bancarios (vs parsers hardcoded)
- ADR-0007: Stripe Checkout para pago con link (vs Conekta / MercadoPago)
- ADR-0008: Azure App Service + PostgreSQL Flexible para hosting (vs Railway/Fly)
- ADR-0009: Outbox pattern para eventos internos
Cada ADR: contexto, decisión, alternativas consideradas, consecuencias. Esto vale oro cuando entra el próximo dev (o tú dentro de 6 meses).
---
## 17. Roadmap de evolución (post-MVP)
Priorizado por **acercarse al ciclo end-to-end** que el equipo directivo describió en la llamada original (Jira → BUK → Factura → Cobranza → Conciliación → Asiento):
| Cuándo | Qué | Por qué |
|---|---|---|
| Mes 3-4 | Belvo (MX) en vivo + asientos contables auto contra BIND | Elimina dos cuellos de botella manuales que sobrevivieron al MVP |
| Mes 4-5 | Ingesta de horas Jira → input de facturación + EUR | Habilita el caso de uso #1 del PRD inicial (factura auto desde horas) |
| Mes 5-7 | Integración profunda con BUK (cuando exponga API) — trigger nómina → factura | Cierra el extremo izquierdo del ciclo |
| Mes 7-9 | Domiciliación Stripe, anomalía con IA, portal cliente | Capa de valor agregado sobre el ciclo ya cerrado |
| Mes 9-12 | Multi-tenancy comercial, onboarding self-service, billing del SaaS | Pivote a producto comercializable |
| Año 2 | Marketplace de integraciones (otros PACs, bancos, ERPs) | Crecimiento del producto |
---
## 18. Workflow de desarrollo con Claude Code
El proyecto se desarrolla con **Claude Code** como acelerador. La arquitectura, convenciones y herramientas elegidas en este documento están deliberadamente alineadas con prácticas que **maximizan la calidad del output asistido por IA**: tipos estrictos, módulos con fronteras claras, ADRs versionados, tests como contrato.
### 17.1 Estructura de soporte a la IA (en el repo)
```
.claude/
├── settings.json # permisos de herramientas, hooks
├── skills/ # workflows reutilizables (slash commands)
│ ├── new-module/ # scaffolding de un módulo nuevo
│ ├── new-integration/ # cliente de API externa con tests + retries
│ ├── new-event-handler/ # handler con outbox + tests + idempotencia
│ ├── new-cfdi-test/ # E2E de facturación
│ └── review-pr/ # checklist de revisión antes de merge
├── agents/ # sub-agentes especializados (opcional)
└── memory/ # contexto persistente (decisiones, gotchas)
CLAUDE.md # contexto raíz del proyecto (siempre cargado)
docs/
├── adr/ # decisiones arquitectónicas
├── conventions.md # cómo se nombran cosas, patrones obligatorios
├── domain-glossary.md # vocabulario fiscal/financiero (CFDI, asiento, etc.)
└── integrations/ # docs por integración (Belvo, PAC, BIND)
```
### 17.2 CLAUDE.md raíz (esqueleto)
Este archivo se carga automáticamente en cada sesión. Tiene que ser **corto y duro**:
```markdown
# Balam — Plataforma de Automatización Financiera
## Contexto crítico
Sistema financiero productivo de empresa real. Errores cuestan dinero,
relaciones con clientes y compliance fiscal. Cuidado extremo con:
- Cálculos de impuestos (decimal(18,4), nunca float)
- Idempotencia en endpoints de creación
- Lista blanca de cobranza (ACUNTIA + Top 3 jamás reciben recordatorio auto)
- Cancelación de facturas: lógica, nunca hard delete
- Multi-tenancy: tenant_id en cada query (RLS activo)
## Reglas duras
- TypeScript strict siempre. Nada de `any`.
- Toda mutación financiera escribe a audit_log en la misma transacción.
- Toda integración externa con retry + idempotency_key.
- Tests obligatorios para: cálculo de impuestos, matching de conciliación,
reglas de cobranza, generación de asientos.
- Nunca commitees secretos. Nunca pegues datos reales de Balam en prompts.
## Stack
NestJS + Prisma + PostgreSQL + Redis (BullMQ) + Next.js + shadcn/ui.
Monorepo pnpm + Turborepo. Tests con Vitest + Playwright. Lint con Biome.
## Comandos comunes
- `pnpm dev` — levanta web + api + worker
- `pnpm test` — corre toda la suite
- `pnpm db:migrate` — aplica migración (siempre backward-compatible)
- `pnpm db:seed` — datos sintéticos para desarrollo
- `pnpm typecheck` — valida tipos sin compilar
## Antes de cerrar una tarea
1. `pnpm typecheck && pnpm test && pnpm lint` debe pasar
2. Si tocaste schema, hay migración + rollback verificado
3. Si tocaste lógica financiera, hay test que la cubre
4. Si tocaste integración externa, hay mock + test contra mock
5. PR description explica el "por qué", no solo el "qué"
## Documentos vivos
- Convenciones: docs/conventions.md
- Glosario fiscal: docs/domain-glossary.md
- ADRs: docs/adr/
- Integraciones: docs/integrations/<nombre>.md
```
### 17.3 Slash commands / skills críticos
Cada uno automatiza un workflow repetitivo y enforce las convenciones del proyecto:
| Skill | Qué hace |
|---|---|
| `/new-module <nombre>` | Crea estructura del bounded context (controller, service, repository, schema Prisma, tests, evento outbox) siguiendo el template del proyecto |
| `/new-integration <api>` | Genera cliente con reintentos exponenciales, idempotency, error mapping, mock para tests, y registro en `docs/integrations/` |
| `/new-event-handler <evento>` | Crea handler que lee outbox, es idempotente, registra en audit, y tiene test de retry |
| `/new-cfdi-scenario` | Genera test E2E de Playwright para flujo de facturación específico |
| `/pre-merge-review` | Corre checklist: types + tests + lint + ADR si aplica + migration safety + no secretos |
| `/add-adr <titulo>` | Crea nuevo ADR con template estándar y lo lista en MEMORY |
### 17.4 Sub-agentes (uso disciplinado)
Útiles para tareas paralelizables o que ensucian el contexto principal:
- **`explore`** — buscar dónde se usa una entidad antes de refactorizar
- **`reviewer`** — segunda lectura sobre cambios sensibles (lógica fiscal, seguridad, queries con tenant_id)
- **`integration-debugger`** — investigar fallos contra mocks de APIs externas sin saturar contexto principal
No abuses. Cada subagente cuesta tokens y tiempo de orquestación.
### 17.5 Convenciones que multiplican la productividad de la IA
Todas viven en `docs/conventions.md`:
1. **Nombres explícitos**: `calculateInvoiceTaxesMXN()` mejor que `calc()`. La IA infiere intención del nombre.
2. **Schemas Zod compartidos** en `packages/contracts/`: una fuente de verdad para tipos front/back.
3. **Tests como spec**: cada función pública con test de happy path + edge cases. La IA usa los tests como contrato vivo.
4. **Comentarios solo para "por qué"**, nunca para "qué". Los nombres dicen el qué.
5. **Archivos cortos**: máximo ~300 líneas. Si un archivo crece más, se divide. Mejor para IA, mejor para humanos.
6. **Errores tipados** (`Result<T, DomainError>` o excepciones tipadas), nunca `throw new Error('algo')` genérico.
7. **Una responsabilidad por archivo.** Un servicio, un controller, un schema por archivo.
8. **README por package** con: propósito, entrypoints, ejemplos de uso.
### 17.6 Seguridad operativa con IA
Reglas no negociables:
- **Datos reales de Balam jamás entran a prompts.** Para pruebas se usan datos sintéticos generados con scripts (faker + patrones reales).
- **Credenciales (PAC, Belvo, Plaid, DB) viven en gestor de secretos.** Nunca pegadas en chat ni en `.env` versionado.
- **XMLs de CFDI reales, estados de cuenta, listas de clientes:** no van a IA. Para debugging se trabaja sobre versiones anonimizadas.
- **Hooks de pre-commit** que bloquean: secretos detectados (gitleaks), archivos con extensión `.cfdi` o `.statement`, datos en formato BIND real.
- **Permisos de Claude Code restrictivos** (`.claude/settings.json`): allowlist explícito para Bash; deny en comandos destructivos sin confirmación; no acceso a `/Users/johann/Desktop/Proyectos personales/BALAM/datos-reales/` si esa carpeta llega a existir.
- **Code review pre-merge obligatorio** (humano, mío): la IA propone, yo apruebo. Documentado en commit trail.
### 17.7 Ventaja en velocidad (qué pasa con el presupuesto)
Tareas que **se aceleran 40-60%** con Claude Code:
- Boilerplate de módulos, controllers, schemas
- Generación de tests (sobre todo edge cases que un humano olvidaría)
- Refactor mecánico (renombrar, mover, extraer)
- Migraciones de schema con rollback
- Documentación (ADRs, READMEs, manuales de usuario)
- Mappers y transformaciones de DTOs
- Mocks de APIs externas
Tareas que **NO se aceleran significativamente** (sigue siendo trabajo humano):
- Decisiones de arquitectura
- Discovery y conversaciones con stakeholders
- Debugging de integraciones reales (BIND, bancos)
- Validación con datos reales
- Diseño de UX
- Negociación de cambios de scope
Por eso los rangos de horas siguen incluyendo holgura: Fase 0 y debugging de integraciones no se aceleran; lo que se acelera es el 60% restante del trabajo. Espera caer cerca del **extremo bajo** de cada rango.
### 17.8 Memoria persistente del proyecto (en `.claude/memory/`)
Llevar memorias semánticas pequeñas con `[[links]]` entre ellas. Ejemplos útiles para este proyecto:
- `gotcha-belvo-paginacion.md` — Belvo pagina por cursor, no por offset (descubierto durante Fase 3)
- `gotcha-cfdi-cancelacion.md` — cancelación requiere UUID sustituto si motivo=01 (no para motivos 02-04)
- `gotcha-fxrate-dof.md` — el DOF publica TC del día siguiente a las 18:00 hrs; usar T-1 para facturas mañaneras
- `convention-tenant-id.md` — toda query nueva debe filtrar por tenant_id explícitamente o usar RLS, jamás confiar en aplicación
- `decision-bind-as-source-of-truth.md` — BIND queda como fuente de verdad para facturación y contabilidad; plataforma es capa de operaciones (ver ADR-0005)
Estas memorias hacen que la IA no repita errores y que recuerdes tú mismo las decisiones meses después.
---
## 19. Por qué este diseño les va a gustar (sin que lo digan)
1. **Pedir cambios será barato** — al ser event-driven, sumar comportamiento es un handler, no una cirugía.
2. **Auditable** — cuando finanzas pregunte "¿quién canceló esa factura?", hay respuesta exacta en 5 segundos.
3. **Sin lock-in** — el código es suyo, el hosting es portable, sin SDKs propietarios.
4. **Multi-tenant ready** — el día que decidan vender el producto, no hay rewrite.
5. **Explicable** — cualquier dev puede leer el monorepo y entender qué hace cada módulo en una tarde.
6. **Robusto** — el motor de conciliación funciona sin IA; la IA es mejora, no dependencia.
7. **Respeta lo que ya funciona** — BIND queda como sistema de verdad para facturación y contabilidad. La plataforma orquesta, no reemplaza. Esto reduce riesgo, costo y resistencia al cambio.
8. **Construido con toolchain moderno** — desarrollo asistido por IA con revisión humana, tests exhaustivos y documentación al día. Mismo resultado, menos horas facturadas, mejor mantenibilidad.
+251
View File
@@ -0,0 +1,251 @@
# Plan de Ejecución — Balam MVP (6 semanas · medio tiempo)
Documento interno (tuyo). Mapea las fases de la propuesta a tareas concretas, con desglose de horas y entregables verificables. Sirve para tu seguimiento semanal y para sustentar tus facturas.
---
## Parámetros del proyecto
- **Dedicación:** medio tiempo, ~20 h/semana (flex hasta 25 h en semanas pico)
- **Calendario:** 6 semanas
- **Budget total:** 110 140 horas
- **Tarifa:** 600 MXN/h + IVA
- **Total estimado:** $66,000 $84,000 MXN
## Cómo usar este documento
- Cada fase tiene **tareas atómicas** con estimación de horas (rango).
- Al cerrar una tarea, registra horas reales en columna `real`.
- Si una tarea excede 130% del estimado máximo, **paras y avisas** al cliente antes de continuar.
- Cada fase termina con un entregable demoable + actualización del Linear/Notion.
## Expectativa de horas con Claude Code
Los rangos están calibrados para **caer cerca del extremo bajo** trabajando con Claude Code como asistente. El rango alto es la holgura para sorpresas en:
- Formato del export de BIND (puede ser distinto a lo esperado)
- Parsing de PDFs bancarios (calibración de prompts)
- IBC Bank Texas (formato menos conocido)
- Integración Stripe con flujo de webhook
## Disciplina de scope (crítica a medio tiempo)
Como es un MVP de 6 semanas con una sola persona a medio tiempo, **decir que no es la habilidad más importante**. Default respuesta a "podríamos también...":
> "Buena idea. Lo dejo anotado para Fase 2 para no comprometer la entrega del MVP en 6 semanas."
Cualquier cambio de alcance en mitad de fase requiere Change Request escrito y aprobado.
---
## Fase 0 — Discovery + Setup (Semana 1 · 18-22 h)
| # | Tarea | Min | Max | Real |
|---|---|---|---|---|
| 0.1 | Kick-off con contacto técnico + gerente administrativo | 2 | 2 | |
| 0.2 | Inspección formato de export de BIND (clientes, facturas, catálogo) | 2 | 3 | |
| 0.3 | Recolección y análisis de 2-3 PDFs reales por banco (Banorte/BBVA/IBC) | 2 | 3 | |
| 0.4 | Validación de viabilidad de Claude API sobre los PDFs reales | 1 | 2 | |
| 0.5 | Confirmación de cuenta Stripe MX + revisión de fee structure | 1 | 1 | |
| 0.6 | Setup Azure: App Service + Postgres + Blob Storage + Key Vault | 2 | 3 | |
| 0.7 | Setup repo monorepo + CI/CD con deploy a Azure | 2 | 3 | |
| 0.8 | Setup Claude Code: CLAUDE.md, settings.json, gitleaks pre-commit, skills base | 2 | 2 | |
| 0.9 | docs/conventions.md + domain-glossary.md (vocabulario fiscal CFDI + glosario interno BIND) | 1 | 2 | |
| 0.10 | Recepción y aplicación de manual de marca a maquetas iniciales | 1 | 1 | |
| 0.11 | Documento de supuestos validados + plan refinado de Fases 1-4 + ADRs iniciales | 2 | 2 | |
| **Total Fase 0** | | **18** | **22** | |
**Entregables Fase 0:**
- `docs/discovery.md` con hallazgos
- `docs/supuestos.md` confirmado
- `docs/adr/0001-0009.md`
- Repo + CI/CD + staging Azure accesible
- `CLAUDE.md` + `.claude/` configurado
- Conventions + glosario de dominio
- Plan refinado presentado a stakeholders
---
## Fase 1 — Plataforma + Sincronización con BIND (Semanas 2-3 · 30-38 h)
### Semana 2 (15-19 h)
| # | Tarea | Min | Max | Real |
|---|---|---|---|---|
| 1.1 | Schema Prisma: tenant, user, role, audit_log, exchange_rate | 2 | 3 | |
| 1.2 | Auth (Better-auth) con login email + roles (Finanzas/Dirección/Admin) | 3 | 4 | |
| 1.3 | Layout base frontend (Next.js + shadcn): login, sidebar, branding aplicado | 3 | 4 | |
| 1.4 | Módulo Catálogo: customer + UI de gestión + bandera auto_reminder_enabled | 3 | 4 | |
| 1.5 | Audit log universal (middleware Prisma) | 2 | 2 | |
| 1.6 | Cron diario TC del DOF + cache | 2 | 2 | |
### Semana 3 (15-19 h)
| # | Tarea | Min | Max | Real |
|---|---|---|---|---|
| 1.7 | Schema invoice + invoice_line (espejo de BIND) | 2 | 2 | |
| 1.8 | Importador de archivo BIND: parser + validación + dedupe | 4 | 5 | |
| 1.9 | UI de importación: upload, preview de deltas (dry-run), confirmación | 3 | 4 | |
| 1.10 | Listado de facturas con filtros, búsqueda, drill-down a detalle | 3 | 4 | |
| 1.11 | Snapshot de TC al momento de la factura (display multimoneda MXN/USD) | 1 | 2 | |
| 1.12 | Outbox pattern + worker base (tabla event + handler skeleton) | 2 | 2 | |
| **Total Fase 1** | | **30** | **38** | |
**Entregables Fase 1:**
- Sistema autenticado con branding aplicado
- Importación funcional desde BIND con dry-run
- Listado y consulta de facturas (espejo de BIND) en MXN y USD
- Audit log activo
- Outbox pattern listo para handlers
---
## Fase 2 — Cobranza + Dashboard + Pago con link (Semana 4 · 25-32 h)
| # | Tarea | Min | Max | Real |
|---|---|---|---|---|
| 2.1 | Schema payment + payment_allocation (M-N a facturas) | 1 | 2 | |
| 2.2 | UI de registro manual de pago + asociación (totales y parciales) | 3 | 4 | |
| 2.3 | Template editor para correo de cobranza (markdown + variables) | 2 | 3 | |
| 2.4 | Motor de envío programado (cron + worker idempotente con Resend) | 3 | 4 | |
| 2.5 | UI para configurar lista blanca por cliente | 1 | 2 | |
| 2.6 | Log de comunicaciones enviadas + UI de revisión | 2 | 2 | |
| 2.7 | Stripe Checkout: cliente + generación de link por factura | 3 | 4 | |
| 2.8 | Stripe Webhook: recepción + verificación de firma + marca factura pagada | 3 | 4 | |
| 2.9 | Inclusión del link de pago dentro del email de recordatorio | 1 | 2 | |
| 2.10 | Dashboard v1: CxC total, por cliente, vencidas, próximas a vencer | 3 | 4 | |
| 2.11 | Exportación a Excel/CSV | 1 | 2 | |
| 2.12 | Test E2E: recordatorio respeta lista blanca + link de pago funciona | 2 | 3 | |
| **Total Fase 2** | | **25** | **32** | |
**Entregables Fase 2:**
- Cobranza automatizada con lista blanca
- Pago con link Stripe (tarjeta + SPEI) funcional end-to-end
- Dashboard de CxC operativo
- Exportación a Excel
---
## Fase 3 — Conciliación PDF con Claude API (Semana 5 · 22-28 h)
| # | Tarea | Min | Max | Real |
|---|---|---|---|---|
| 3.1 | Schema: bank_account, bank_statement, statement_line | 1 | 2 | |
| 3.2 | UI de upload de PDF con almacenamiento en Blob | 2 | 3 | |
| 3.3 | Extracción de texto con pdf-parse + pipeline por banco | 2 | 3 | |
| 3.4 | Prompt versionado para Banorte + validación de totales | 2 | 3 | |
| 3.5 | Prompt versionado para BBVA + validación de totales | 2 | 3 | |
| 3.6 | Prompt versionado para IBC Texas + validación de totales | 3 | 4 | |
| 3.7 | Dedupe por hash + persistencia de statement_lines | 1 | 2 | |
| 3.8 | Algoritmo de matching exacto (monto + referencia + ventana fecha) | 3 | 3 | |
| 3.9 | Tabla customer_alias + matching por alias | 2 | 3 | |
| 3.10 | UI cola de revisión humana para no conciliados | 2 | 3 | |
| 3.11 | Detección básica: duplicados + traspasos internos | 2 | 2 | |
| **Total Fase 3** | | **22** | **28** | |
**Entregables Fase 3:**
- Upload + parsing automático de los 3 PDFs bancarios
- Motor de conciliación con auto-match + cola humana
- Detección básica de duplicados y traspasos
---
## Fase 4 — Reportes + Cierre (Semana 6 · 15-20 h)
| # | Tarea | Min | Max | Real |
|---|---|---|---|---|
| 4.1 | Export de pagos conciliados a Excel en formato BIND | 2 | 3 | |
| 4.2 | Reporte mensual CxC + CxP exportable | 2 | 2 | |
| 4.3 | Reportes programados por email (diario / semanal) | 2 | 3 | |
| 4.4 | Endurecimiento seguridad: helmet, rate limit, RBAC granular, MFA opcional | 2 | 3 | |
| 4.5 | Backups automáticos Azure + plan de recuperación documentado | 1 | 2 | |
| 4.6 | Documentación técnica: README, runbook, ADRs finalizados | 2 | 2 | |
| 4.7 | Sesión de capacitación grabada (1.5 h) con contacto técnico + gerente admin | 2 | 2 | |
| 4.8 | Handoff + sesión de cierre con stakeholders | 1 | 1 | |
| 4.9 | Buffer para correcciones finales | 1 | 2 | |
| **Total Fase 4** | | **15** | **20** | |
**Entregables Fase 4:**
- Reportes operativos enviándose automáticamente
- Export para BIND validado por el contador
- Seguridad endurecida
- Documentación y capacitación entregadas
- Sistema en producción operando
---
## Resumen total
| Fase | Min | Max | MXN Min | MXN Max |
|---|---|---|---|---|
| 0 - Discovery + Setup Azure | 18 | 22 | 10,800 | 13,200 |
| 1 - Plataforma + Sync BIND | 30 | 38 | 18,000 | 22,800 |
| 2 - Cobranza + Dashboard + Pago link | 25 | 32 | 15,000 | 19,200 |
| 3 - Conciliación PDF (Claude API) | 22 | 28 | 13,200 | 16,800 |
| 4 - Reportes + Cierre | 15 | 20 | 9,000 | 12,000 |
| **TOTAL** | **110** | **140** | **$66,000** | **$84,000** |
**Tiempo calendario:** 6 semanas medio tiempo (~20 h/semana base, hasta 25 h en pico)
**Tarifa:** 600 MXN/h + IVA
**Facturación:** semanal viernes, pago a 7 días
---
## Capacidad por semana
| Semana | Horas planeadas (max) | Carga |
|---|---|---|
| 1 (Fase 0) | 22 | normal |
| 2 (Fase 1a) | 19 | normal |
| 3 (Fase 1b) | 19 | normal |
| 4 (Fase 2) | 32 | ⚠️ pico (necesita 25-30 h ese semana) |
| 5 (Fase 3) | 28 | ⚠️ alto (necesita 24-28 h ese semana) |
| 6 (Fase 4) | 20 | normal |
> **Semanas 4 y 5 son el pico.** Plan: cargar más horas (25-30/sem) y compensar con semanas 1-3 más relajadas. Si en semana 4 no puedes subir el ritmo, alarma temprana y mueves Stripe (8h) a Fase 2 / Fase 2 post-MVP.
---
## Decisiones de descope si vas tarde
Estas son las palancas, en orden de "primero soltar":
1. **Domiciliación** — ya fuera del MVP, no agregar bajo ningún motivo.
2. **Detección de duplicados/traspasos** (tarea 3.11) — push a Fase 2, ahorra ~2 h.
3. **Reportes programados por email** (tarea 4.3) — push a Fase 2, ahorra ~3 h.
4. **Stripe Webhook automático** (tarea 2.8) — fallback: registro manual de pago al confirmar Stripe en su dashboard, ahorra ~4 h.
5. **IBC Texas** (tarea 3.6) — push a Fase 2, los bancos MX cubren 70% del volumen, ahorra ~4 h.
6. **Multimoneda display** (tarea 1.11) — push a Fase 2 si solo manejan 5 facturas USD/mes, ahorra ~2 h.
Si activas las palancas 1-3 recuperas ~5 h. Si activas 1-5 recuperas ~13 h. **Más allá de eso ya es replantear contrato.**
---
## Reglas de ejecución
1. **Nunca trabajes una hora que no puedas justificar en factura.** Si una tarea está fuera de scope acordado, paras y conversas.
2. **Time-tracking obligatorio** (Toggl o Linear). Horas no registradas son horas regaladas.
3. **Demo cada viernes**, sin excepción.
4. **Loom > reunión.** Para updates de status, 3-5 min de Loom en lugar de pedir reunión.
5. **PRs con descripción larga.** Tu evidencia de trabajo y documentación viva.
6. **CHANGELOG.md** — entrada al cerrar cada fase.
7. **No deployees viernes después de las 4pm.** Bug + fin de semana = pesadilla.
8. **Backup tu propio progreso.** Cliente debe poder retomar con otro dev si te enfermas.
9. **Decir "no" es parte del trabajo.** Cada "podríamos también..." que aceptas en MVP es una hora menos para lo crítico.
10. **Producción es el único ambiente disponible.** Antes de cualquier export o sync con BIND: dry-run + confirmación explícita + snapshot DB.
---
## Señales tempranas
**Va bien:**
- Stakeholder responde dudas en <24 hrs
- Las demos generan ajustes pequeños, no replanteos
- Las horas reales caen cerca del medio del rango
- Aparecen requests de Fase 2 (señal de que confían en ti)
**Alerta (paras y conversas):**
- Stakeholder no contesta más de 3 días → bloqueador serio
- El export de BIND llega en formato distinto al esperado en Fase 0 → cotizar workaround
- Claude API no extrae con calidad suficiente algún PDF → reevaluar approach (fallback: parser híbrido para ese banco)
- Stripe rechaza la cuenta Balam o tarda en validar → bloquea Fase 2.7-2.9
- Llegas a viernes de semana 3 sin Fase 1 cerrada → renegocia scope **ese viernes**, no la semana siguiente
+359
View File
@@ -0,0 +1,359 @@
# Guía operativa — Stakeholders, llamadas y decisiones por fase
Documento de referencia personal para el proyecto **Balam · Plataforma de Automatización Financiera (MVP 6 semanas)**.
Sirve para:
1. **Antes de arrancar** — preparar la llamada con el CTO para validar supuestos críticos.
2. **Durante el proyecto** — saber a quién acercarte en cada fase y para qué decisión exacta.
3. **Detectar bloqueadores temprano** — si la persona indicada no responde, sabes qué riesgo se materializa.
> Compañeros de este documento:
> - `00 - PROPUESTA-COMERCIAL.md` — alcance comprometido y supuestos firmados
> - `01 - ARQUITECTURA-TECNICA.md` — módulos y decisiones técnicas
> - `02 - PLAN-EJECUCION.md` — tareas atómicas y horas por fase
---
## Cómo usar este documento
- **Sección 1**: lectura inicial. El mapa de stakeholders + diagrama es el modelo mental que cargas en la cabeza durante todo el proyecto.
- **Sección 2**: consulta semanal. Cada lunes de una nueva fase, revisa las tablas para confirmar que ya tienes las respuestas que vas a necesitar esa semana.
- **Sección 3**: consulta pre-llamada CTO. Antes de la llamada de pre-arranque (todavía no estás en Fase 0).
- **Sección 4**: chequeo mensual de salud — si ves anti-patrones, paras y conversas con el contacto técnico.
---
# Sección 1 · Mapa de stakeholders por fase
## 1.1 Quién decide qué
| Stakeholder | Decide / valida | Pregúntale **antes** de tocar |
|---|---|---|
| **CEO** | Visión, qué clientes son intocables, scope cuando hay conflicto entre áreas | Cualquier decisión que toque relación con cliente estratégico (lista blanca, tono de cobranza) |
| **CFO** | Reglas fiscales y contables, ciclos de cobranza, política de pagos, métricas financieras, validación de reportes | Templates de cobranza, dashboard, tolerancias de conciliación, export para contabilidad |
| **CTO** | Sistemas, APIs, infra, secretos, integraciones técnicas, seguridad | Acceso a BIND/bancos, Azure, política de datos, decisiones técnicas no triviales |
| **Gerente Administrativo** | Operación día a día: quién descarga PDFs, cómo se identifican pagos, cómo se manejan parciales | Reglas operativas: aliases de clientes, ventanas de match, comportamiento UI |
| **Contador (interno o externo)** | Formato del export para BIND, catálogo de cuentas, cierre contable | Estructura del export, mapeo de eventos a asientos contables |
> **Regla práctica:** si la decisión afecta dinero o relación con cliente → CFO/CEO. Si es técnica → CTO. Si es operativa día a día → gerente admin. Cuando dudes, escala al CFO porque típicamente es quien orquesta este tipo de proyectos en una PyME.
## 1.2 Diagrama — Stakeholders × Fases
```mermaid
flowchart TB
classDef ceo fill:#FFD93D,stroke:#666,color:#000,stroke-width:1px
classDef cfo fill:#6BCB77,stroke:#666,color:#000,stroke-width:1px
classDef cto fill:#4D96FF,stroke:#666,color:#FFF,stroke-width:1px
classDef ga fill:#FF6B6B,stroke:#666,color:#FFF,stroke-width:1px
classDef cont fill:#9D4EDD,stroke:#666,color:#FFF,stroke-width:1px
subgraph F0["FASE 0 · Semana 1 · Discovery + Setup"]
direction LR
CEO0["CEO<br/><br/>Kickoff<br/>Lista blanca definitiva"]:::ceo
CFO0["CFO<br/><br/>Reglas operativas<br/>Línea base errores y tiempo"]:::cfo
CTO0["CTO<br/><br/>Azure + Stripe MX<br/>Política de datos / Claude API"]:::cto
GA0["GERENTE ADMIN<br/><br/>PDFs reales 3 bancos<br/>Lista de usuarios"]:::ga
CONT0["CONTADOR<br/><br/>Formato export BIND"]:::cont
end
subgraph F1["FASE 1 · Semanas 2-3 · Plataforma + Sync BIND"]
direction LR
CFO1["CFO<br/><br/>Roles RBAC<br/>Política de cancelación"]:::cfo
CTO1["CTO<br/><br/>Auth y MFA<br/>Acceso para inspeccionar BIND"]:::cto
GA1["GERENTE ADMIN<br/><br/>Validación demo S2<br/>Clientes duplicados / aliases"]:::ga
CONT1["CONTADOR<br/><br/>Campos obligatorios de invoice<br/>Fuente del TC"]:::cont
end
subgraph F2["FASE 2 · Semana 4 · Cobranza + Dashboard + Pago link"]
direction LR
CEO2["CEO<br/><br/>Tono del template<br/>Clientes en zona gris"]:::ceo
CFO2["CFO<br/><br/>TEMPLATE FINAL aprobado<br/>Métricas del dashboard"]:::cfo
CTO2["CTO<br/><br/>Stripe webhook secret<br/>Email transaccional"]:::cto
GA2["GERENTE ADMIN<br/><br/>Ciclo de recordatorios<br/>UX de pagos Stripe"]:::ga
CONT2["CONTADOR<br/><br/>Asiento de pagos Stripe<br/>Manejo de duplicados"]:::cont
end
subgraph F3["FASE 3 · Semana 5 · Conciliación PDF"]
direction LR
CFO3["CFO<br/><br/>Tolerancia de match<br/>Retención PDFs 5 años"]:::cfo
CTO3["CTO<br/><br/>Cifrado Blob Storage<br/>Confirmación Claude API ok"]:::cto
GA3["GERENTE ADMIN<br/><br/>ALIASES de clientes<br/>Validación de match rate"]:::ga
CONT3["CONTADOR<br/><br/>Catálogo de cuentas<br/>Traspasos internos"]:::cont
end
subgraph F4["FASE 4 · Semana 6 · Reportes + Cierre"]
direction LR
CEO4["CEO<br/><br/>Sign-off del MVP"]:::ceo
CFO4["CFO<br/><br/>Criterios de éxito<br/>Aprobación de reportes"]:::cfo
CTO4["CTO<br/><br/>Backups<br/>Handoff técnico"]:::cto
GA4["GERENTE ADMIN<br/><br/>Capacitación grabada"]:::ga
CONT4["CONTADOR<br/><br/>VALIDACIÓN del export BIND"]:::cont
end
F0 --> F1 --> F2 --> F3 --> F4
```
### Cómo leer el diagrama
- **Filas horizontales = fases en el tiempo** (de izquierda a derecha por el flujo, de arriba a abajo en pantalla).
- **Cada bloque de fase contiene los stakeholders que necesitas** durante esa semana, con la decisión / dato concreto que aporta.
- **Códigos de color por rol:**
- 🟡 Amarillo = CEO (visión + clientes estratégicos)
- 🟢 Verde = CFO (reglas de negocio + dinero)
- 🔵 Azul = CTO (sistemas + infra)
- 🔴 Rojo = Gerente Administrativo (operación día a día)
- 🟣 Morado = Contador (contabilidad fiscal + BIND)
- **Si un stakeholder no aparece en una fase**, no significa que no exista — significa que **no es bloqueante** para esa fase. Aun así puede recibir el demo de fin de semana.
- **El CEO aparece solo 3 veces** (F0, F2, F4) — es deliberado: úsalo para kickoff, validación de tono comercial, y sign-off. No lo satures.
## 1.3 Detalle por fase
### Fase 0 — Discovery + Setup (Semana 1)
**Módulos involucrados:** ninguno todavía — es la fase de validar supuestos y dejar todo listo.
| Decisión / dato que necesitas | A quién | Cuándo | 🚩 Si no llega |
|---|---|---|---|
| Export real de BIND (anonimizado) + formato confirmado | CTO + contador | Día 1-3 | Replantear Fase 1 |
| 2-3 PDFs anonimizados por banco (Banorte, BBVA, IBC) | Gerente admin (es quien los descarga) | Día 1-3 | Replantear Fase 3 |
| Subscripción Azure + sponsor + región | CTO | Día 1-2 | No hay dónde desplegar |
| Cuenta Stripe MX verificada (RFC + bancarios) | CFO + CTO | Día 1-5 | Bloqueas Fase 2 |
| Lista blanca DEFINITIVA: ACUNTIA + Top 3 con nombre exacto + alias contables | CEO + CFO | Día 1-5 | Riesgo regulatorio comercial |
| Manual de marca | Gerente admin o quien lo guarde | Día 1-3 | Branding genérico |
| Aprobación uso Claude API con PDFs bancarios | CFO + CTO | Día 1-3 | Replantear Fase 3 |
| Línea base medible de "tiempo de conciliación actual" + "errores manuales actuales" | CFO + gerente admin | Día 1-7 | Criterios de éxito ≥70%/60% no se pueden demostrar al cierre |
| Política de manejo de datos financieros (auditoría externa, NDA, encripción) | CTO | Día 2-3 | Compliance gap |
> **Salida de F0:** un `docs/supuestos.md` firmado. Si algo no se valida, lo marcas como "asunción que se materializará en Change Request si cae".
---
### Fase 1 — Plataforma + Sync BIND (Semanas 2-3)
**Módulos:** `identity`, `catalog`, `bind-sync` + outbox base.
| Decisión / dato | A quién | Cuándo | 🚩 Si no llega |
|---|---|---|---|
| Roles exactos: ¿Finanzas, Dirección, Operaciones, Admin alcanzan? ¿Hay sub-roles? | CFO + CTO | Inicio S2 | Re-trabajo en RBAC |
| ¿Quiénes (nombres + emails) tendrán acceso por rol? | Gerente admin | Inicio S2 | No puedes poblar usuarios reales |
| Política de auth: ¿MFA obligatorio para Finanzas? ¿SSO con Google Workspace si lo usan? | CTO | Inicio S2 | Endurecimiento queda en F4 |
| Validación del schema de invoice (qué campos del export son obligatorios) | Contador + gerente admin | Mid S2 | Modelo incompleto |
| ¿Hay clientes duplicados en BIND por errores históricos? ¿Algún mecanismo de "cliente padre" / "cliente sucursal"? | Gerente admin + contador | Mid S2 | Conciliación falla en S5 |
| Política de cancelación de facturas (¿se reflejan en plataforma?) | CFO + contador | Mid S2 | Estados inconsistentes |
| TC: ¿DOF FIX está bien o usan otro para alguna cuenta específica (USD interno)? | CFO + contador | Mid S2 | Diferencias cambiarias erróneas |
| Confirmación final de fuera-de-scope: EUR + emisión CFDI desde plataforma | CFO | Inicio S2 | Scope creep en S3-S4 |
| **Demo de fin de S2** revisada por gerente admin | Gerente admin | Viernes S2 | Sorpresa en S3 |
| **Demo de fin de S3** revisada por CFO | CFO | Viernes S3 | F2 arranca sobre base no validada |
---
### Fase 2 — Cobranza + Dashboard + Pago con link (Semana 4) — pico de stakeholders
**Módulos:** `collections`, `payments`, `reporting` (dashboard), `notifications`.
> Esta es la fase con **más decisiones de negocio**. CFO y gerente admin tienen que estar disponibles. Bloquea calendario suyo con anticipación desde F0.
| Decisión / dato | A quién | Cuándo | 🚩 Si no llega |
|---|---|---|---|
| **Aprobación final del template de correo** (tono, firma, asuntos) | CFO + CEO (porque toca clientes) | Lunes S4 | No puedes activar recordatorios |
| Ciclo de recordatorios: ¿X días antes, Y días después de vencer, escalación humana al día Z? | CFO + gerente admin | Lunes S4 | Defaults arbitrarios |
| Quién puede **modificar la lista blanca en producción** (rol + segundo factor) | CFO | Lunes S4 | Riesgo de envío accidental |
| Cómo se reporta hoy un pago vía link Stripe en BIND (¿asiento manual del contador? ¿flujo separado?) | Contador + CFO | Martes S4 | Pagos Stripe quedan huérfanos contablemente |
| Política para **pagos duplicados** (cliente paga por link + por transferencia en el mismo día) | Gerente admin + CFO | Mié S4 | Conciliación contradictoria en S5 |
| ¿El gerente admin valida cada pago Stripe antes de marcarlo "aplicado", o auto? | Gerente admin | Mié S4 | UX equivocada |
| Métricas exactas del dashboard (¿qué corte usa Dirección? ¿semanal? ¿por cliente?) | CFO + CEO | Mar S4 | Dashboard no usable |
| Stripe webhook secret + cuenta de email para notificaciones | CTO | Mar S4 | Webhook no se puede recibir |
| Política de manejo cuando webhook Stripe falla (¿conciliar al día siguiente vía dashboard Stripe?) | Gerente admin | Jue S4 | Sin runbook operativo |
| **Demo viernes S4** con CFO + gerente admin + (idealmente) un cliente test | CFO + GA | Viernes S4 | Riesgo de descubrir gap en S5 cuando ya es tarde |
> **Tip:** el template de correo es donde más fricción suele haber. Pide un borrador del CFO en F0 (semana 1) para iterarlo durante F1, no improvises en S4.
---
### Fase 3 — Conciliación PDF con Claude API (Semana 5)
**Módulos:** `banking`, `reconciliation`.
| Decisión / dato | A quién | Cuándo | 🚩 Si no llega |
|---|---|---|---|
| Lista exhaustiva de **aliases por cliente** (cómo aparecen los pagos en cada banco) | Gerente admin + contador | Lunes S5 | Match por alias inútil → todo va a cola humana |
| Tolerancia aceptada: ¿centavos? ¿±0.5%? ¿±2%? ¿depende de monto? | CFO | Lunes S5 | Auto-match muy laxo o muy estricto |
| Ventana de fecha para auto-match (±3 días default, ¿es razonable para SPEI 24/7?) | Gerente admin | Lunes S5 | Auto-match pierde casos legítimos |
| Política de traspasos internos: ¿qué hacen hoy en BIND con esos movimientos? | Contador + CFO | Mar S5 | Doble registro en conciliación |
| ¿Quién aprueba un "match con flag" (medio match)? ¿Cualquiera de Finanzas, o solo CFO? | CFO | Mar S5 | Cola sin dueño |
| Política de **retención de PDFs bancarios** (¿5 años SAT, indefinido, otra?) | CFO + contador | Mar S5 | Compliance fiscal |
| Cifrado en reposo de PDFs en Azure Blob — confirmar política de Balam | CTO | Mar S5 | Hardening incompleto |
| Catálogo de cuentas / clasificaciones de gasto que el contador usa hoy | Contador | Mié S5 | Anomalías por categoría no se pueden detectar |
| Validación con datos reales: subir un mes completo de un banco y revisar match rate con gerente admin | Gerente admin | Jue S5 | Sales del rango y no te enteras |
> **Tip:** los aliases son oro y suelen vivir solo en la cabeza del gerente admin / contador. Pide una hora bloqueada con ellos en S5 para vaciar ese conocimiento a una tabla.
---
### Fase 4 — Reportes + Cierre (Semana 6)
**Módulos:** `reporting` (export BIND), `notifications` (reportes programados), seguridad final, capacitación.
| Decisión / dato | A quién | Cuándo | 🚩 Si no llega |
|---|---|---|---|
| **Validación del export para BIND** (que efectivamente cargue sin error en BIND real) | Contador | Lunes S6 | Entregable inservible |
| Catálogo de cuentas final + mapeo evento → asiento que el contador necesita | Contador + CFO | Lunes S6 | Export incompleto |
| Qué reportes quiere automáticos: ¿diario CxC? ¿semanal de movimientos no conciliados? ¿quién los recibe? | CFO + Dirección | Mar S6 | Reportes que nadie lee |
| Validación de criterios de éxito (≥70% reducción errores, ≥60% reducción tiempo conciliación) | CFO | Mié S6 | No puedes cerrar el contrato |
| Plan de quién opera el sistema post-MVP (gerente admin solo, o también el CTO interviene) | CTO + CFO | Mié S6 | Sin owner operativo |
| Backups: confirmar política (frecuencia, retención, dónde se guardan, plan de recuperación) | CTO | Jue S6 | Compliance + riesgo operativo |
| Sesión de capacitación grabada — quiénes asisten (contacto técnico + gerente admin obligatorios, contador deseable) | Todos los anteriores | Jue S6 | Capacitación no replicable |
| Sign-off formal del MVP | CFO (o CEO) | Viernes S6 | Disputa de horas / scope |
## 1.4 Cadencia recomendada de contacto
| Persona | Cadencia base | Cuándo aumentar |
|---|---|---|
| **CTO (contacto técnico día a día)** | Daily async (1-2 mensajes) + sesión técnica quincenal de 1 h | F0 (acceso), F1 (BIND), inicio F2 (Stripe), F3 (seguridad PDF) |
| **Gerente administrativo** | Demo semanal viernes + ad-hoc por bloqueadores | F2 completa (reglas operativas), F3 completa (aliases, validación) |
| **CFO** | Demo semanal viernes + sesión validación al cierre de cada fase | F2 (templates + dashboard), F4 (export + criterios de éxito) |
| **CEO** | Solo en kickoff + demo final F4 (+ ad-hoc si hay decisión de scope conflicto) | Si surge fricción con cliente estratégico |
| **Contador** | Bloqueado para F0 (formato BIND), F3 (catálogo + aliases), F4 (export final) | Cuando toques cualquier flujo que termine en BIND |
## 1.5 Anti-patrones que cuestan caro
1. **Esperar al CFO/CEO solo en F4** — descubres en S6 que el template de correo no les gusta y replantear el motor de cobranza queda fuera de presupuesto. Inclúyelos desde F2.
2. **Hablar solo con el CTO** — vas a tener un sistema técnicamente correcto que no refleja las reglas de negocio reales. El gerente admin sabe la operación que ni el CTO ni el CFO conocen al detalle.
3. **Pedir lista blanca "en algún momento"** — si llegas a S4 sin tenerla formalizada, el riesgo regulatorio comercial es tuyo. Pídela el día 1.
4. **No bloquear calendario de CFO/gerente admin con anticipación para S4 y S5** — son las semanas pico de decisión de negocio. Si están de viaje o saturados, F2/F3 se atrasan.
5. **Asumir que el contador es interno** — muchas PyMEs en MX tienen contador externo que va una vez por semana. Si es el caso, agéndalo en F0 para que esté disponible en F4.
---
# Sección 2 · Preparación llamada CTO (pre-Fase 0)
> Esta es la llamada **antes de firmar** o antes del kickoff de Fase 0. El objetivo no es vender ni planear todavía; es validar que los 11 supuestos de la propuesta se sostienen.
## 2.1 Objetivo de la llamada
Salir con **decisión clara sobre si algún supuesto crítico de la propuesta ya hoy sabemos que no se cumple**. Es 10× más barato descubrirlo aquí que en semana 2.
Duración recomendada: **60-75 min**. Si solo hay 30, prioriza Bloque 1.
## 2.2 Bloque 1 — Sistemas y datos (25-30 min, el corazón de la llamada)
### BIND ERP
| Pregunta | Por qué importa | 🚩 Bandera roja |
|---|---|---|
| ¿BIND expone alguna API documentada o solo es UI + export? ¿Han hablado con BIND sobre roadmap de API? | Define si Fase 2 es realista en 3 meses o 1 año | No hay API ni planes |
| ¿Cómo exportan hoy facturas y catálogo de clientes? ¿Formato (CSV, Excel, XML SAT)? ¿Frecuencia? ¿Manual o programado? | Es el input principal del MVP | Solo se puede descargar a mano factura por factura |
| ¿Puedes mandarme un export real (anonimizado) en la próxima semana? | El parsing real es la diferencia entre 18 y 30 h en Fase 0 | "Tengo que pedirlo, no sé cuándo lo tengamos" |
| ¿Tienen sandbox de BIND o solo producción? | Define si podemos probar contra datos reales sin riesgo | Solo producción |
| ¿Quién es el admin de BIND internamente? ¿Tiene tiempo para apoyar dudas técnicas? | Necesitas a alguien que valide formatos de export | Ningún dueño técnico claro |
| ¿BIND timbra las facturas (CFDI 4.0) sin costo adicional según el volumen actual? ¿Manejará el crecimiento? | Confirma el supuesto #4 — si no, hay que sumar PAC | No tienen claro el límite |
### Bancos (3 cuentas — 2 MX + IBC Texas)
| Pregunta | Por qué importa | 🚩 Bandera roja |
|---|---|---|
| ¿Cuáles 2 bancos MX exactamente? ¿BBVA, Banorte, Banamex, Santander? | Cada uno tiene formato de PDF distinto | Banco regional poco común |
| ¿Tienen PDFs históricos (últimos 3-6 meses) de los 3 bancos para validar parsing? | Necesitamos muestras reales en Fase 0 | No tienen históricos digitales |
| ¿IBC Bank Texas permite descargar PDFs estructurados o solo print del web? | IBC es el riesgo mayor del MVP | Solo "imprimir como PDF" del portal |
| ¿Quién descarga hoy los estados de cuenta? ¿Cada cuándo? ¿Lo siguen haciendo manual durante el MVP? | El flujo de upload manual depende de esto | "No sabemos quién lo hace consistente" |
| ¿Hay traspasos internos frecuentes entre las 3 cuentas? ¿Cuál es el patrón? | Define complejidad del motor de conciliación | Traspasos diarios sin patrón claro |
| ¿Algún banco ya integrado con Belvo/Plaid o ya tienen credenciales API en algún lado? | Atajo potencial para Fase 2 | — |
### BUK y Jira (para validar que Fase 2 sea creíble, no para MVP)
| Pregunta | Por qué importa |
|---|---|
| ¿BUK expone API? ¿Han pedido roadmap? | El caso de uso #1 del PRD original depende de esto |
| ¿Jira es Cloud o Server? | Cloud tiene API limpia; Server es más complicado |
| ¿Hay registro de horas por colaborador-cliente en Jira hoy, o eso vive en otro lado? | Define si Jira→Factura es viable en Fase 2 |
### Stripe
| Pregunta | Por qué importa | 🚩 Bandera roja |
|---|---|---|
| ¿Ya tienen cuenta Stripe MX verificada (RFC + bancarios) o hay que crearla? | Verificación de Stripe MX toma 1-3 semanas | No la tienen y la necesitamos para semana 4 |
| ¿Algún convenio o pricing especial con Stripe? | Ajuste a la sección de costos operativos | — |
## 2.3 Bloque 2 — Infra y compliance (15 min)
| Pregunta | Por qué importa |
|---|---|
| ¿Tienen subscripción Azure activa? ¿Quién la administra? ¿Centro de costos? | Si no, hay que crearla en Fase 0 |
| ¿Preferencia de región Azure? (mexicocentral, southcentralus, eastus) | Latencia y compliance — IBC Texas puede sugerir US |
| ¿Cómo manejan secretos hoy? (Key Vault, .env, 1Password, nada) | Define el estándar a aplicar |
| ¿Tienen política interna de manejo de datos financieros / PII? ¿Auditoría externa? | Compliance — afecta cómo se modela el audit log y backups |
| ¿NDA — usan el suyo o el mío? ¿Hay restricciones de portafolio? | Cierre legal antes de iniciar |
| Para el manejo de **datos reales** en Fase 3 con Claude API, ¿hay alguna política interna que choque con enviar PDFs bancarios a un LLM (aunque sea Anthropic con no-training)? | El supuesto #11 de la propuesta — si choca, replanteamos |
| ¿Quién recibe el handoff técnico al final del MVP? ¿Tienen DevOps interno o lo opera el contador? | Define qué tan robusta debe ser la operación + capacitación |
## 2.4 Bloque 3 — Realidades operativas (10 min)
| Pregunta | Por qué importa |
|---|---|
| De las ~50 facturas/mes: ¿distribución? ¿2-3 grandes y 47 chicas, o uniforme? | Define dónde concentrar esfuerzo de cobranza |
| ¿Cuántos clientes activos hay hoy? ¿Cuántos están "siempre en cobranza"? | Tamaño del catálogo y reglas de cobranza |
| ¿Cuánto tiempo toma conciliar **hoy** los 3 estados de cuenta del mes? ¿Quién lo hace? | Línea base del criterio de éxito ≥60% — **pide medirlo formalmente las próximas 2 semanas si no está medido** |
| ¿Qué % de facturas requiere re-trabajo por error contable hoy? | Línea base del criterio de éxito ≥70% |
| Pagos parciales: ¿qué tan frecuentes? ¿Cómo los registran hoy? | Define la UX del módulo de cobranza |
## 2.5 Bloque 4 — Reglas de negocio que el CTO sabe pero no están escritas (10 min)
| Pregunta | Por qué importa |
|---|---|
| Lista blanca ACUNTIA + Top 3: ¿quiénes son los Top 3 exactos? ¿Hay clientes "grises" (importantes pero no Top)? | Necesitas esto en Fase 0, no en Fase 2 |
| ¿Hay clientes con condiciones de pago no-estándar? (90 días, retenciones, factoring) | Afecta el motor de recordatorios |
| ¿Cuál es el ciclo de cobranza actual? (1er recordatorio a los X días, 2do a los Y, escalación humana cuándo) | Define defaults del motor |
| ¿Qué hacen hoy cuando entra un pago no identificado? | Necesitas la cola humana clara |
## 2.6 Bloque 5 — Personas, proceso y riesgo (10 min)
| Pregunta | Por qué importa |
|---|---|
| ¿Quién es el **contacto técnico día a día** durante el MVP? ¿Tú directamente o alguien de tu equipo? | Define velocidad de bloqueo |
| ¿Quién es el **gerente administrativo** que validará reglas de cobranza/conciliación? ¿SLA de respuesta? | El otro stakeholder del supuesto #9 |
| ¿Ya intentaron antes este proyecto internamente o con otro proveedor? ¿Qué pasó? | Lecciones gratis + por qué llegaron a ti |
| ¿Cuál es el **peor escenario** que les preocupa con esto? | Te dice dónde están las heridas reales |
| Si tuviéramos que cortar alcance en semana 5 por un imprevisto, ¿qué sacrificas primero entre cobranza, conciliación y dashboard? | Te da el orden de prioridad real, no el oficial |
| ¿Hay cambios fiscales conocidos en pipeline (SAT, Texas) en los próximos 6 meses? | Riesgo de re-trabajo |
## 2.7 Lo que pides cerrar antes de colgar
1. **Compromiso de envío** en 5-7 días hábiles de:
- 1 export real anonimizado de BIND (facturas + clientes)
- 1 PDF de estado de cuenta por cada uno de los 3 bancos (3 archivos)
- Lista de clientes en lista blanca (ACUNTIA + Top 3 con nombre exacto)
2. **Acceso o creación de subscripción Azure** con un sponsor identificado
3. **Borrador de NDA** si aplica
4. **Cadencia confirmada**: 2-3 standups async/semana + demo viernes + sesión técnica quincenal
5. **Próxima sesión técnica agendada** (idealmente día 1 de Fase 0)
## 2.8 Lo que NO conviene hacer en esta llamada
- **No prometer fechas exactas** antes de ver el export real de BIND y los PDFs
- **No entrar en debate de stack** (Next.js vs. lo que sea) — eso es tuyo
- **No discutir tarifa** — ya está en la propuesta, si lo abren responde corto
- **No ofrecer scope creep** aunque suene tentador (ej. "¿también podrías hacer X?") → "Lo agendamos para Fase 2"
## 2.9 Una pregunta-trampa-útil al final
> *"Si dentro de 6 meses esta plataforma está funcionando exactamente como esperan, ¿qué métrica concreta tendría que estar moviéndose para que sintieras que valió la pena?"*
Te da el norte real del proyecto y suele revelar prioridades que no están en el PRD.
---
# Apéndice · Artefactos críticos a recibir antes de iniciar Fase 0
Checklist para confirmar antes de facturar el anticipo:
- [ ] Export real anonimizado de BIND (clientes + facturas)
- [ ] 2-3 PDFs anonimizados de cada uno de los 3 bancos
- [ ] Subscripción Azure con sponsor identificado
- [ ] Cuenta Stripe MX verificada (o compromiso de tenerla en 2 semanas)
- [ ] Lista definitiva: ACUNTIA + Top 3 con nombre legal + aliases bancarios conocidos
- [ ] Manual de marca
- [ ] NDA firmado (si aplica) + acuerdo Claude API
- [ ] Línea base medida: tiempo de conciliación + % errores actuales (para los criterios de éxito ≥70%/60%)
- [ ] Contacto técnico día a día designado con disponibilidad confirmada
- [ ] Gerente administrativo identificado con SLA de respuesta <48 h
- [ ] Contador identificado, interno o externo, con disponibilidad para F0, F3 y F4
+256
View File
@@ -0,0 +1,256 @@
# Agenda · Llamada CTO (martes 19 mayo 2026)
> Documento de preparación personal para la **llamada de pre-arranque** del proyecto Balam.
> Complementa `03 - GUIA-STAKEHOLDERS.md` (Sección 2). La Guía tiene la lista exhaustiva de preguntas; este documento tiene **lo que ya investigué para no llegar en cero**, las preguntas concretas que se derivan de esa investigación, y el orden para los 60-75 min.
>
> Hallazgo principal: **BIND ERP sí tiene API documentada**. Esto cambia el tono de la llamada — la pregunta deja de ser "¿hay API?" y pasa a ser "¿qué módulos están expuestos, cuál es el plan de uso?".
---
## 0. Mentalidad para entrar a la llamada
- **No vendas, valida.** La propuesta ya está firmada (o por firmar); esta llamada existe para detectar si algún supuesto crítico hoy no se cumple. Mejor descubrirlo aquí que en semana 2.
- **No prometas fechas exactas** antes de ver el export real de BIND y los PDFs.
- **No discutas tarifa ni stack.**
- **Apunta hacia los artefactos** del cierre (Sección 7) — todo lo que NO sea uno de esos 5 entregables es ruido.
---
## 1. Estado de lo investigado (lo que YA sé antes de entrar)
Esta sección es para que entres a la llamada con contexto real, no asunciones. Cada hallazgo viene con la pregunta que se le deriva.
### 1.1 BIND ERP — **tiene API pública** ⚡ (cambia el supuesto #2)
| Hecho confirmado | Fuente | Implicación |
|---|---|---|
| API documentada en `developers.bind.com.mx` | [Portal BIND](https://developers.bind.com.mx/) · [Ayuda BIND](https://ayuda.bind.com.mx/hc/es/articles/360007437754-api-de-bind-erp) | Fase 1 puede ir vía API en vez de export, **si** los módulos que necesitamos están expuestos |
| Auth: Bearer Token (API Key) | Ayuda BIND | API Key se saca desde Perfil → Integraciones |
| Rate limit: 20,000 req/día | Ayuda BIND | Más que suficiente para ~50 facturas/mes |
| Endpoints confirmados: `/api/Invoices`, `/api/Invoices/{idOrNumber}` con UUID/folio fiscal · `/api/inventory` · módulo Customers (consultar, agregar, actualizar) | API tracker / Ayuda BIND | Cubre **facturación + clientes**, que es exactamente Fase 1 |
| **NO confirmado**: webhooks, endpoint de pagos, endpoint de asientos contables, sandbox, timbrado CFDI 4.0 vía API | — | Son las 5 preguntas clave de la llamada para BIND |
**Preguntas concretas al CTO sobre BIND** (en orden de prioridad):
1. ¿Han usado la API de BIND antes, o solo el export? ¿Tienen ya un API Key activo?
2. ¿Saben si BIND expone **webhooks** (factura creada, factura pagada, factura cancelada)? Si no, voy a tener que hacer polling — afecta cadencia y costo de Fase 1.
3. ¿Hay endpoint en BIND para **registrar pagos** y para **subir/generar asientos contables**? Si sí, Fase 4 cambia (en lugar de export Excel para el contador, escribimos directo). Si no, mantenemos el plan actual.
4. ¿BIND ofrece **sandbox**, o solo producción? — Define cómo trabajamos en Fase 0/1 sin tocar datos reales.
5. ¿El **timbrado CFDI 4.0** está expuesto vía API o sigue siendo solo botón en la UI? — Importa para visión Fase 2 (que la plataforma emita directo en lugar de "trigger humano en BIND").
> **Si NO conoce la API o nunca la han usado:** no es bandera roja por sí solo, pero pídele acceso ese mismo día para inspeccionarla yo.
### 1.2 BUK — tiene API REST documentada ✅ (supuesto #6 sostiene)
| Hecho confirmado | Implicación |
|---|---|
| BUK ofrece API RESTful para exportación de datos | Visión Fase 2 (BUK → factura automática) es viable |
| Plataforma BUK México activa (`buk.mx`) | No hay riesgo de no-cobertura geográfica |
| 30+ integraciones nativas + flujos configurables | Hay precedente, no es greenfield |
**Preguntas concretas al CTO sobre BUK:**
1. ¿Quién administra BUK internamente? ¿Tienen ya credenciales API o hay que solicitarlas?
2. ¿Qué disparador de BUK marcaría "nómina aprobada lista para facturar al cliente"? (Es el caso de uso #1 del PRD original — viable solo si ese evento existe en BUK.)
3. ¿Cómo registran hoy en BUK las horas por colaborador-cliente? ¿Lo hace BUK, Jira, o vive en una hoja aparte?
### 1.3 IBC Bank Texas — sin API, pero hay 2 alternativas a PDF ⚠️
Esto es el riesgo más alto del MVP según la propuesta. Lo que ya sé:
| Hecho confirmado | Fuente | Implicación |
|---|---|---|
| IBC ofrece eStatements PDF/PNG, retención 18 meses online | [IBC Online Banking](https://www.ibc.com/online-banking/online-banking-services) | Lo que asumimos en la propuesta |
| IBC permite **export a Quicken/QuickBooks** (formato `.QBO`/`.QFX`/`.OFX`) | [IBC Online Banking](https://www.ibc.com/online-banking/online-banking-services) | **Esto es enorme** — parsear `.QBO` (XML estructurado) es 10× más barato y robusto que parsear PDF con Claude |
| Plaid cubre marginalmente bancos MX, pero **sí cubre la mayoría de US banks** — IBC posiblemente sí esté en Plaid | [Plaid Docs](https://plaid.com/docs/institutions/) | Plan B si `.QBO` no funciona y si están dispuestos a compartir credenciales |
**Preguntas concretas al CTO sobre IBC:**
1.**¿Hoy descargan estado de cuenta IBC en PDF, o también en formato `.QBO`/Quicken?** Si pueden descargar `.QBO`, **eliminamos el riesgo de parsing con Claude para IBC**. Cambia el alcance de Fase 3 significativamente.
2. ¿IBC ofrece "Direct Connect" para QuickBooks (vía OFX server) o solo "Web Connect" (descarga manual del archivo)? — Direct Connect = automatizable. Web Connect = sigue siendo descarga manual pero con archivo bueno.
3. ¿Estarían dispuestos a compartir credenciales IBC con un agregador tipo Plaid? (Si la respuesta es no, no insistir — política de seguridad típica.)
### 1.4 Bancos MX — Belvo cubre el universo posible ✅
| Hecho confirmado | Fuente |
|---|---|
| Belvo cubre **32 instituciones MX** para data + payments, incluyendo BBVA, Banorte, Citibanamex, Santander, HSBC, Scotiabank, Banregio, Inbursa, Banco del Bajío, Mifel | [Belvo Direct Debit Institutions](https://developers.belvo.com/products/payments_mexico/direct-debit-institutions) |
**Preguntas concretas al CTO sobre bancos MX:**
1. ¿**Cuáles 2 bancos MX exactos** son? (Si están en la lista de Belvo arriba, hay plan B viable.)
2. ¿Conocen Belvo o han evaluado integración bancaria previamente? — Posicionarlo como Fase 2 (no MVP), pero útil saber si hay apertura. La objeción típica es "no compartimos credenciales con terceros".
3. ¿Tienen PDFs históricos de los últimos 3-6 meses de los 3 bancos para validar parsing en Fase 0?
### 1.5 Stripe MX — timeline manejable, pero hay que arrancar ya ✅
| Hecho confirmado | Fuente | Implicación |
|---|---|---|
| Aprobación típica: **horas a 2 días**, máximo **2 semanas** en casos complejos | [Stripe MX requisitos](https://support.stripe.com/questions/required-information-to-open-your-stripe-account-in-mexico) | Si arrancan el trámite hoy, semana 4 (cobranza + pago link) está cubierta |
| Requisitos: entidad mexicana + RFC + CLABE + representante legal | Stripe Support | Si **falta uno solo**, Stripe MX no opera |
| Comisión: 3.6% + $3 MXN, sin IVA sobre la comisión | [Stripe pricing](https://stripe.com/pricing) | — |
| Alternativas si Stripe no aprueba: **Conekta** (100% MX, OXXO/SPEI nativo, 3.4% + $3 + IVA) o **Mercado Pago** | [Comparativa Stripe vs Conekta vs MP 2026](https://atempora.studio/blog/stripe-vs-mercado-pago-vs-conekta) | Plan B documentado |
**Preguntas concretas al CTO sobre Stripe:**
1. ¿La empresa ya tiene **RFC + CLABE + representante legal con CURP** listos? Si sí, abrimos cuenta esta semana y empezamos verificación.
2. ¿Algún convenio o pricing especial con Stripe? ¿O ya tienen cuenta?
3. Si Stripe MX rechaza o se tarda más de 2 semanas, ¿hay apertura a Conekta como Plan B?
### 1.6 Jira — variable crítica es Cloud vs Server
No requiere research técnico (Jira es estándar), pero confirmar:
1. ¿Jira es **Cloud o Server**? (Cloud = API limpia OAuth 2.0; Server = más complicado, depende de versión.)
2. ¿Hay registro de horas por colaborador-cliente en Jira hoy, o eso vive en otro lado (hoja de cálculo, BUK)?
---
## 2. Estructura de los 60-75 min (orden propuesto)
Asume que el CTO da máximo 60 min reales. Si te dan más, expandes Bloques 4 y 5.
### Min 0-5 · Apertura
- Saludo, agradecimiento por el tiempo.
- **Encuadre claro** (en menos de 60 segundos): *"El objetivo de hoy no es vender ni planear el proyecto — eso ya está en la propuesta. El objetivo es validar conmigo, sistema por sistema, que los supuestos de la propuesta se sostienen. Cada minuto que invertimos aquí me ahorra 10 minutos en semana 2."*
- Permiso para tomar nota / grabar (siempre pídelo).
### Min 5-30 · Bloque 1 — Sistemas y datos (el corazón)
Orden interno (no negociable, va de menor a mayor riesgo):
1. **BIND ERP** (8-10 min) — usa las 5 preguntas de 1.1
2. **Bancos MX** (5 min) — qué bancos exactos, PDFs históricos, posición sobre Belvo
3. **IBC Texas** (5 min) — la pregunta del `.QBO` es la más importante de toda la llamada
4. **BUK + Jira** (3-5 min) — son Fase 2, no MVP, no profundices
5. **Stripe** (3 min) — RFC/CLABE/representante listos sí/no
### Min 30-45 · Bloque 2 — Infra, compliance, seguridad
Usa la tabla de Sección 2.3 de `03 - GUIA-STAKEHOLDERS.md`. Los críticos:
- ¿Azure activa? ¿Quién la administra? ¿Centro de costos?
- ¿Política interna sobre enviar PDFs bancarios a un LLM externo (Claude API)? — **supuesto #11 de la propuesta**.
- ¿Cómo manejan secretos hoy?
- ¿NDA — el suyo o el mío?
### Min 45-55 · Bloque 3 — Realidades operativas y reglas no escritas
Lo mínimo crítico (ver Sección 2.4 y 2.5 de la Guía):
- Distribución de las ~50 facturas: ¿concentradas o uniformes?
- Tiempo actual de conciliación + % retrabajo (línea base para criterios de éxito 60%/70%).
- **Lista blanca: ¿Top 3 exactos?**
- ¿Cuál es el peor escenario que les preocupa? (Esta pregunta abre cosas no escritas.)
### Min 55-65 · Bloque 4 — Cierre operativo
Pide explícitamente los 5 entregables de Sección 7. **No salgas de la llamada sin esto.**
### Min 65-70 · Pregunta-trampa
> *"Si dentro de 6 meses esta plataforma está funcionando exactamente como esperan, ¿qué métrica concreta tendría que estar moviéndose para que sintieras que valió la pena?"*
Esta pregunta revela la prioridad real. A veces sale algo que no está en el PRD.
---
## 3. Banderas rojas a escuchar activamente
Si oyes cualquiera de estas, **no las negocies en la llamada** — anótalas y replantea después.
| Si escuchas... | Significa | Acción |
|---|---|---|
| "BIND no, eso lo administra el contador externo" | No tienes acceso técnico real | Pedir contacto del contador antes de Fase 0 |
| "No sabemos quién descarga los PDFs hoy" | No hay dueño operativo | Bloqueador para Fase 0 — necesitas dueño |
| "No podemos compartir PDFs reales todavía" | Supuesto #1 en riesgo | Posponer fecha de arranque hasta tenerlos |
| "Azure la administra otro proveedor" | Latencia + permisos | Pedir sponsor interno antes de Fase 0 |
| "Tenemos que consultar con legal sobre enviar datos a Claude API" | Supuesto #11 en riesgo | Plan B: extracción local (Tesseract + reglas) — replantear costos |
| "No tenemos RFC todavía / lo está tramitando la contadora" | Stripe MX no opera | Bloqueador para Fase 2 — Conekta Plan B inmediato |
| "IBC solo lo veo cuando entro al portal y le doy print" | El peor caso | Confirma `.QBO` antes de aceptar este peor caso |
| "Ya intentamos esto antes con otro proveedor" | Hay historia | Pregunta qué pasó — lecciones gratis |
---
## 4. Banderas verdes (señales de que el proyecto va a fluir)
| Si escuchas... | Significa |
|---|---|
| "El admin de BIND es Juanito y le digo que te ayude esta semana" | Dueño técnico claro |
| "Aquí tienes mi API Key de BIND, úsala" | Velocidad máxima en Fase 0/1 |
| "Tenemos sandbox de BIND" | Reduce 50% el riesgo de Fase 1 |
| "IBC sí permite descargar `.QBO`" | Fase 3 se simplifica 30-40% |
| "Stripe ya está creada y verificada" | Fase 2 sin bloqueador |
| "El gerente admin se llama X y está disponible miércoles y viernes" | Cadencia de validación realista |
| "Hay un Slack/Teams con el equipo que te van a meter" | Comunicación async funcionando |
---
## 5. Demostraciones de preparación (cosas que dices para mostrar que sí investigaste)
Úsalas cuando aplique. **No las metas todas a fuerza** — son munición, no checklist.
- *"Vi que BIND tiene un portal en `developers.bind.com.mx` con auth Bearer y rate limit de 20K req/día. ¿Ya tienen API Key o lo sacamos juntos esta semana?"*
- *"Belvo cubre BBVA, Banorte, Santander, Citibanamex, HSBC y Scotiabank en MX. ¿Cuáles son los 2 que ustedes usan? Si están en la lista, hay plan B para Fase 2."*
- *"IBC ofrece export a Quicken/QuickBooks en `.QBO`. Si me confirmas que sí está disponible para su cuenta business, **eliminamos el mayor riesgo del MVP** — ya no dependemos de OCR sobre PDF para Texas."*
- *"Stripe MX típicamente aprueba en 1-2 días si los datos están limpios. Conekta es el Plan B si hay algún tema con RFC/CLABE."*
> **Cuidado:** decir demasiado puede sonar a "ya tengo todo resuelto" → puede bajarles la urgencia de mandarte artefactos. Equilibrar.
---
## 6. Lo que NO conviene hacer (recordatorios)
- **No prometer fechas exactas** antes de ver el export real de BIND y los PDFs.
- **No entrar en debate de stack** (Next.js vs. otra cosa) — eso es decisión tuya.
- **No discutir tarifa** — está en la propuesta. Si lo abren, respondes corto y rediriges.
- **No aceptar scope creep** ("¿también podrías hacer X?") → *"Lo agendamos para Fase 2."*
- **No dar opinión técnica fuerte** sobre cómo operan hoy — vienes a entender, no a juzgar.
---
## 7. Lo que pides cerrar antes de colgar (entregables de la llamada)
Estas son las **5 promesas concretas** que necesitas salir con ellas en mano (idealmente con dueño y fecha):
1. **Compromiso de envío en 5-7 días hábiles:**
- [ ] 1 export real anonimizado de BIND (facturas + clientes), o acceso vía API Key
- [ ] 1 PDF de estado de cuenta por cada uno de los 3 bancos (3 archivos) — preferentemente últimos 3 meses
- [ ] **Si aplica:** 1 archivo `.QBO` de IBC Texas para validar formato
- [ ] Lista de clientes en lista blanca (ACUNTIA + Top 3 con nombre exacto)
2. **Acceso o creación de subscripción Azure** con un sponsor identificado.
3. **Borrador de NDA** (si aplica) + posición sobre el uso de Claude API.
4. **Cadencia confirmada**: 2-3 standups async/semana + demo viernes + sesión técnica quincenal.
5. **Próxima sesión técnica agendada** (idealmente día 1 de Fase 0) **con el contacto técnico día a día designado**.
---
## 8. Cosas a hacer YO antes de la llamada (mañana antes de entrar)
- [ ] Revisar la propuesta firmada (00 - PROPUESTA-COMERCIAL.md) para tener los 11 supuestos frescos.
- [ ] Tener `03 - GUIA-STAKEHOLDERS.md` abierto en otra pestaña por si necesito profundizar una pregunta.
- [ ] Tener este documento abierto en otra pestaña.
- [ ] Crear un Postman collection mínimo apuntando a `developers.bind.com.mx` para mostrarlo en pantalla si la conversación lo amerita. (Opcional, pero impresiona.)
- [ ] Confirmar el link de la videollamada y prueba audio/cámara 10 min antes.
- [ ] Tener una hoja en blanco a mano para anotar nombres, fechas, números.
---
## 9. Post-llamada (mismo día, antes de dormir)
- [ ] Mandar correo de **resumen + compromisos** al CTO en menos de 4 horas — formato: 5 bullets de lo que acordamos + 5 bullets de lo que cada uno entrega y para cuándo.
- [ ] Actualizar `00 - PROPUESTA-COMERCIAL.md` con cualquier supuesto que haya cambiado.
- [ ] Si cambian supuestos críticos (BIND con API rica, IBC con `.QBO`, política contra Claude API, etc.), abrir `02 - PLAN-EJECUCION.md` y ajustar Fase 0/1/3 según corresponda.
- [ ] Anotar en una sección de "riesgos abiertos" del proyecto las banderas rojas que escuchaste.
---
## Apéndice · Fuentes investigadas
- BIND ERP API: [Ayuda BIND](https://ayuda.bind.com.mx/hc/es/articles/360007437754-api-de-bind-erp) · [Portal Devs](https://developers.bind.com.mx/) · [API Tracker](https://apitracker.io/a/bind-erp)
- BUK: [buk.mx](https://www.buk.mx/) · [Plataforma RRHH](https://www.buk.co/productos/plataforma-de-rrhh)
- IBC Bank: [Online Banking Services](https://www.ibc.com/online-banking/online-banking-services) · [Business Banking](https://www.ibc.com/business/treasury-management/online-business-banking)
- Belvo: [Direct Debit Institutions MX](https://developers.belvo.com/products/payments_mexico/direct-debit-institutions) · [Banking Product](https://belvo.com/products/banking/)
- Plaid: [Institutions Coverage](https://plaid.com/docs/institutions/)
- Stripe MX: [Required Info](https://support.stripe.com/questions/required-information-to-open-your-stripe-account-in-mexico) · [Pricing](https://stripe.com/pricing) · [Comparativa MX 2026](https://atempora.studio/blog/stripe-vs-mercado-pago-vs-conekta)
+223
View File
@@ -0,0 +1,223 @@
# Checklist · Preguntas para CTO (19 mayo 2026)
> Lista en orden. Cada pregunta tiene un espacio para anotar la respuesta. Después de la llamada, regreso a la conversación con Claude y pego las respuestas para que actualicemos la propuesta.
>
> Tiempo objetivo: 60-75 min. Si solo dan 30, llegar hasta la pregunta 14 (Bloque 1 completo).
---
## Bloque 0 · Apertura (min 0-5)
**Encuadre que digo yo, no pregunta:**
> "El objetivo de hoy es validar contigo, sistema por sistema, que los supuestos de la propuesta se sostienen. Cada minuto aquí me ahorra 10 minutos en semana 2. Voy a tomar nota — ¿te parece?"
---
## Bloque 1 · Sistemas y datos (min 5-30, núcleo de la llamada)
### BIND ERP (min 5-15)
**1.** ¿Han usado la **API de BIND** antes, o solo el export manual? ¿Tienen ya un API Key activo?
> _Respuesta:_
**2.** ¿Saben si BIND expone **webhooks** (factura creada / pagada / cancelada)?
> _Respuesta:_
**3.** ¿BIND tiene endpoint para **registrar pagos** y para **subir asientos contables**? Si sí, ¿quieren que el MVP escriba directo o nos quedamos en export Excel para el contador?
> _Respuesta:_
**4.** ¿BIND ofrece **sandbox**, o solo producción?
> _Respuesta:_
**5.** ¿El **timbrado CFDI 4.0** está expuesto vía API o sigue siendo solo botón en la UI?
> _Respuesta:_
**6.** ¿Cómo exportan **hoy** facturas y catálogo de clientes? ¿Formato (CSV, Excel, XML SAT)? ¿Frecuencia?
> _Respuesta:_
**7.** ¿Pueden mandarme un **export real anonimizado** de BIND en los próximos 5-7 días?
> _Respuesta:_
**8.** ¿Quién es el **admin de BIND** internamente? ¿Tiene tiempo para apoyar dudas técnicas durante el MVP?
> _Respuesta:_
**9.** ¿BIND timbra las facturas (CFDI 4.0) **sin costo adicional** según el volumen actual? ¿Cubrirá el crecimiento esperado?
> _Respuesta:_
---
### Bancos — los 2 MX (min 15-20)
**10.** ¿**Cuáles 2 bancos MX exactamente**? (BBVA, Banorte, Banamex, Santander, HSBC, Scotiabank…)
> _Respuesta:_
**11.** ¿Tienen **PDFs históricos (últimos 3-6 meses)** de los 2 bancos MX que puedan enviarme la próxima semana?
> _Respuesta:_
**12.** ¿Hay traspasos internos frecuentes entre las 3 cuentas? ¿Cuál es el patrón?
> _Respuesta:_
---
### Banco — IBC Texas (min 20-25) ⚡ CRÍTICO
**13.** ⚡ ¿Hoy descargan el estado de cuenta IBC en **PDF, o también en formato `.QBO`/Quicken**?
> _Respuesta:_
**14.** ¿IBC ofrece **"Direct Connect" para QuickBooks** (vía OFX server) o solo "Web Connect" (descarga manual del archivo)?
> _Respuesta:_
**15.** ¿Tienen apertura a evaluar un agregador (Belvo MX, Plaid US para IBC) en Fase 2, o hay política contra compartir credenciales con terceros?
> _Respuesta:_
**16.** ¿Quién descarga **hoy** los estados de cuenta? ¿Con qué frecuencia? ¿Lo seguirá haciendo durante el MVP?
> _Respuesta:_
---
### BUK + Jira (min 25-28, no profundizar — son Fase 2)
**17.** ¿Quién administra BUK internamente? ¿Tienen credenciales API o hay que solicitarlas?
> _Respuesta:_
**18.** ¿Qué evento en BUK marcaría **"nómina aprobada lista para facturar al cliente"**? (¿Existe ese trigger?)
> _Respuesta:_
**19.** ¿Jira es **Cloud o Server**? ¿Hay registro de horas por colaborador-cliente hoy en Jira?
> _Respuesta:_
---
### Stripe (min 28-30)
**20.** ¿Ya tienen cuenta Stripe MX verificada, o hay que crearla? ¿RFC + CLABE + representante legal con CURP están listos?
> _Respuesta:_
**21.** Si Stripe MX rechaza o tarda más de 2 semanas, ¿hay apertura a **Conekta** como Plan B?
> _Respuesta:_
---
## Bloque 2 · Infraestructura, compliance, seguridad (min 30-45)
**22.** ¿Tienen subscripción **Azure** activa? ¿Quién la administra? ¿Centro de costos asignado?
> _Respuesta:_
**23.** ¿Preferencia de **región Azure** (mexicocentral, southcentralus, eastus)?
> _Respuesta:_
**24.** ¿Cómo manejan **secretos** hoy? (Key Vault, .env, 1Password, ninguno)
> _Respuesta:_
**25.** ¿Hay **política interna** que choque con enviar PDFs bancarios a Claude API (Anthropic, sin entrenamiento)?
> _Respuesta:_
**26.** ¿**NDA** — usan el suyo o el mío?
> _Respuesta:_
**27.** ¿Quién recibe el **handoff técnico** al final del MVP? ¿Hay DevOps interno o lo opera otra persona?
> _Respuesta:_
---
## Bloque 3 · Realidad operativa (min 45-55)
**28.** De las ~50 facturas/mes: ¿distribución? (¿2-3 grandes y 47 chicas, o uniforme?)
> _Respuesta:_
**29.** ¿Cuántos **clientes activos** hay hoy? ¿Cuántos están "siempre en cobranza"?
> _Respuesta:_
**30.** ¿Cuánto tiempo toma conciliar **hoy** los 3 estados de cuenta del mes? ¿Quién lo hace?
> _Respuesta:_
**31.** ¿Qué % de facturas requiere **re-trabajo por error contable** hoy?
> _Respuesta:_
**32.** **Pagos parciales**: ¿qué tan frecuentes? ¿Cómo los registran hoy?
> _Respuesta:_
---
### Reglas de negocio no escritas
**33.** **Lista blanca: ¿quiénes son los Top 3 exactos** además de ACUNTIA? ¿Hay clientes "grises"?
> _Respuesta:_
**34.** ¿Hay clientes con **condiciones de pago no-estándar** (90 días, retenciones, factoring)?
> _Respuesta:_
**35.** ¿Cuál es el **ciclo de cobranza actual**? (1er recordatorio a los X días, 2do a los Y, escalación humana cuándo)
> _Respuesta:_
**36.** ¿Qué hacen hoy cuando entra un **pago no identificado**?
> _Respuesta:_
---
## Bloque 4 · Personas, proceso, riesgo (min 55-65)
**37.** ¿Quién es el **contacto técnico día a día** durante el MVP? ¿Tú directamente o alguien de tu equipo?
> _Respuesta:_
**38.** ¿Quién es el **gerente administrativo** que validará reglas de cobranza/conciliación? ¿SLA de respuesta esperado?
> _Respuesta:_
**39.** ¿Ya intentaron este proyecto antes (internamente o con otro proveedor)? ¿Qué pasó?
> _Respuesta:_
**40.** Si tuviéramos que cortar alcance en semana 5 por un imprevisto, ¿qué **sacrificas primero** entre cobranza, conciliación y dashboard?
> _Respuesta:_
**41.** ¿Hay cambios fiscales conocidos en pipeline (SAT, Texas) en los próximos 6 meses?
> _Respuesta:_
---
## Bloque 5 · Pregunta-trampa final (min 65-68)
**42.** *"Si dentro de 6 meses esta plataforma está funcionando exactamente como esperan, ¿qué métrica concreta tendría que estar moviéndose para que sintieras que valió la pena?"*
> _Respuesta:_
---
## Cierre · Compromisos que necesito salir con ellos (min 68-75)
Antes de colgar, **confirmar los 5 entregables**. No salgo sin esto:
**C1.** ¿Cuándo me envían el **export real anonimizado de BIND** (facturas + clientes), o me dan acceso API?
> _Compromiso (fecha + dueño):_
**C2.** ¿Cuándo me envían **1 PDF por banco** (3 archivos)? ¿Y un **`.QBO` de IBC** si aplica?
> _Compromiso (fecha + dueño):_
**C3.** ¿Cuándo me dan **acceso o creación de subscripción Azure** con sponsor identificado?
> _Compromiso (fecha + dueño):_
**C4.** ¿Cuándo me llega el **borrador de NDA** + posición sobre Claude API?
> _Compromiso (fecha + dueño):_
**C5.** ¿Cuándo es la **próxima sesión técnica** (idealmente día 1 de Fase 0) y con quién?
> _Compromiso (fecha + dueño):_
**C6.** **Lista blanca**: ¿cuándo me mandan ACUNTIA + Top 3 con nombre legal + aliases bancarios?
> _Compromiso (fecha + dueño):_
**C7.** **Cadencia**: ¿confirmamos 2-3 standups async/semana + demo viernes + sesión técnica quincenal?
> _Compromiso (fecha + dueño):_
---
## Notas adicionales (cualquier cosa que surja)
> _Anota aquí cosas que no encajan en las preguntas pero importan: nombres mencionados, sistemas adicionales, sentimientos del CTO sobre alcance, etc._
---
## Post-llamada — lo que mando de regreso a Claude
1. Las respuestas de las 42 preguntas + 7 compromisos
2. Cualquier sorpresa o señal que percibí (banderas rojas/verdes)
3. Mi nivel de confianza con el proyecto (1-10) después de la llamada
Con eso actualizamos `00 - PROPUESTA-COMERCIAL.md` y `02 - PLAN-EJECUCION.md` para reflejar la realidad.
@@ -0,0 +1,82 @@
MENSAJES LISTOS PARA ENVIAR · BALAM
"
"1) WhatsApp para Pedro
"
"Hola Pedro, ¿cómo estás?
"
"Sí, con la información que nos compartieron y la confirmación de que BUK cuenta con API, ya puedo preparar una propuesta inicial.
"
"Mi recomendación es plantearla por fases: una primera etapa enfocada en BIND ERP para facturación, seguimiento de cobranza, alertas, reportes y trazabilidad; y dejar bancos, conciliación avanzada, BUK e IA/anomalías como fases posteriores para no inflar el MVP ni depender de todas las integraciones desde el día uno.
"
"Les compartiré la propuesta con alcance, fases, entregables, supuestos técnicos, dependencias y timeline estimado. También incluiré un checklist de accesos e información para que podamos iniciar rápido una vez aprobada.
"
"Gracias por el seguimiento. Quedo atento.
"
"---
"
"2) Correo de respuesta a la actualización de BUK
"
"Asunto: Re: Actualización API BUK / Propuesta Balam
"
"Buenos días, Pedro / equipo Balam,
"
"Muchas gracias por la actualización. La confirmación de que BUK cuenta con soporte API nos ayuda a dejar preparada la arquitectura para una integración posterior, aunque entiendo que no es la prioridad inmediata.
"
"Con la información del PRD, la llamada con Noe y la actualización de BIND/BUK, ya puedo estructurar una propuesta inicial realista. La plantearé en fases, iniciando con un MVP enfocado en BIND ERP para facturación, seguimiento de cobranza, alertas, reportes y trazabilidad.
"
"La intención es que la primera etapa les entregue valor operativo sin depender desde el inicio de bancos, BUK, Book, Jira o automatizaciones de IA más avanzadas. Esas integraciones quedarían consideradas dentro del roadmap y se cotizarían/validarían conforme avancemos en discovery técnico.
"
"Les comparto la propuesta para revisión. Quedo atento a comentarios y a la disponibilidad para una sesión corta de revisión técnica/comercial.
"
"Saludos,
Johann Velazquez
"
"---
"
"3) Correo para enviar la propuesta
"
"Asunto: Propuesta inicial · Plataforma de automatización financiera Balam
"
"Hola Noe, Erika, Ara y Pedro,
"
"Les comparto la propuesta inicial para el desarrollo de la plataforma de automatización financiera de Balam.
"
"Tomando como base el PRD, la llamada de seguimiento y los últimos comentarios sobre BIND y BUK, propongo iniciar con un MVP BIND-first enfocado en facturación, seguimiento de cobranza, alertas, reportes y trazabilidad. Este enfoque permite avanzar de forma realista y reducir riesgo técnico, dejando preparada la arquitectura para integrar bancos, BUK, conciliación bancaria, contabilidad e IA/agentes en fases posteriores.
"
"El documento incluye:
- alcance funcional y técnico del MVP;
- fases sugeridas;
- entregables;
- supuestos y dependencias;
- criterios de aceptación;
- elementos fuera de alcance de la primera fase;
- checklist de información y accesos necesarios.
"
"Quedo atento a sus comentarios. Si lo consideran conveniente, podemos agendar una sesión corta para revisar el alcance y ajustar la propuesta antes de pasar a aprobación.
"
"Saludos,
Johann Velazquez
@@ -0,0 +1,11 @@
Paquete de documentos Balam - MVP BIND-first
Contenido:
00_Resumen_Ejecutivo_Requerimiento_Balam.docx - Lectura ejecutiva y narrativa de alcance.
01_Propuesta_Tecnica_Comercial_Balam_MVP_BIND_First.docx - Documento principal para enviar al cliente.
02_SOW_Alcance_MVP_BIND_First_Balam.docx - Alcance formal/SOW para controlar expectativas.
03_Anexo_Tecnico_Integraciones_Discovery_Balam.docx - Detalle técnico para Noe/Pedro.
04_Checklist_Accesos_Datos_Dependencias_Balam.docx - Checklist operativo para iniciar discovery.
05_Mensajes_Listos_Para_Enviar_Balam.docx/.txt - Copys de WhatsApp y correos.
Nota: Completar montos comerciales antes de enviar la propuesta final.
File diff suppressed because it is too large Load Diff
+740
View File
@@ -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&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>
@@ -0,0 +1,372 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Balam · Flujo financiero</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; padding:48px 56px;
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 48px; max-width:780px}
.section-label{
font-size:11px; font-weight:600; color:var(--muted);
letter-spacing:2px; text-transform:uppercase;
margin:0 0 24px;
}
.flow-block{margin-bottom:56px}
.flow-title{
font-size:22px; font-weight:700; margin:0 0 4px;
display:flex; align-items:center; gap:12px;
}
.flow-title .pill{
font-size:11px; font-weight:600; letter-spacing:1px; text-transform:uppercase;
padding:4px 10px; border-radius:999px;
}
.pill.bad{background:#fee2e2; color:#991b1b}
.pill.ok{background:#dcfce7; color:#14532d}
.flow-sub{color:var(--muted); font-size:14px; margin:0 0 28px}
.flow{
display:flex; align-items:flex-start; gap:8px;
overflow-x:auto; padding:8px 4px 24px;
}
.node{
flex:0 0 auto; width:108px; text-align:center;
}
.tile{
width:88px; height:88px; border-radius:20px;
margin:0 auto 12px;
display:flex; align-items:center; justify-content:center;
font-size:38px;
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)}
.label{font-size:13px; font-weight:600; line-height:1.25}
.sub{font-size:11px; color:var(--muted); margin-top:3px; line-height:1.3}
.arrow{
flex:0 0 auto; align-self:center;
color:#cbd5e1; font-size:22px; padding:0 2px; margin-top:-36px;
user-select:none;
}
.group{
border:1.5px dashed #cbd5e1; border-radius:18px;
padding:18px 14px 14px; position:relative;
margin-top:14px;
display:flex; align-items:flex-start; gap:4px;
}
.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(--muted);
}
.divider{
height:1px; background:var(--line);
margin:32px 0;
}
/* metrics */
.metrics{
display:grid; grid-template-columns:repeat(4,1fr); gap:16px;
margin-top:8px;
}
.metric{
background:var(--soft); border:1px solid var(--line); border-radius:14px;
padding:18px;
}
.metric .m-label{font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:1.2px; font-weight:600}
.metric .m-row{display:flex; align-items:baseline; gap:10px; margin-top:8px}
.metric .m-before{font-size:14px; color:#94a3b8; text-decoration:line-through}
.metric .m-after{font-size:22px; font-weight:700; color:var(--ink)}
.metric .m-arrow{color:#cbd5e1; font-size:14px}
/* footer two-column */
.twocol{display:grid; grid-template-columns:1fr 1fr; gap:20px; margin-top:32px}
.card{
border:1px solid var(--line); border-radius:14px; padding:20px;
}
.card h3{margin:0 0 10px; font-size:14px; display:flex; align-items:center; gap:8px}
.card ul{margin:0; padding-left:18px; font-size:13px; color:var(--slate-ink); line-height:1.6}
.card .dot{width:8px; height:8px; border-radius:50%; display:inline-block}
.dot.red{background:#ef4444} .dot.green{background:#10b981}
@media (max-width:1100px){
.metrics{grid-template-columns:1fr 1fr}
.twocol{grid-template-columns:1fr}
body{padding:32px 24px}
}
</style>
</head>
<body>
<h1>Balam · Flujo financiero</h1>
<p class="lede">Cómo opera el ciclo de facturación, cobranza y conciliación hoy, y cómo operará después del MVP.</p>
<!-- ====== HOY ====== -->
<div class="flow-block">
<div class="flow-title">Hoy <span class="pill bad">Manual</span></div>
<p class="flow-sub">Ocho pasos, todos dependientes de una persona moviendo datos entre sistemas que no se hablan.</p>
<p class="section-label">Flujo actual</p>
<div class="flow">
<div class="node">
<div class="tile slate">🕐</div>
<div class="label">Jira</div>
<div class="sub">Horas por cliente</div>
</div>
<div class="arrow"></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"></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"></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"></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"></div>
<div class="node">
<div class="tile rose">📊</div>
<div class="label">Excel</div>
<div class="sub">Conciliación</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile rose">📒</div>
<div class="label">Contador</div>
<div class="sub">Captura asientos</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile rose">📈</div>
<div class="label">Reporte CxC</div>
<div class="sub">Llega tarde</div>
</div>
</div>
</div>
<div class="divider"></div>
<!-- ====== DESPUÉS ====== -->
<div class="flow-block">
<div class="flow-title">Después del MVP <span class="pill ok">Orquestado</span></div>
<p class="flow-sub">La plataforma absorbe los pasos repetitivos. Las personas solo tocan excepciones.</p>
<p class="section-label">Diagrama de flujo completo</p>
<div class="flow">
<div class="node">
<div class="tile navy">📘</div>
<div class="label">BIND ERP</div>
<div class="sub">Fuente de verdad</div>
</div>
<div class="arrow"></div>
<!-- Plataforma group -->
<div class="group" data-label="Plataforma de operaciones financieras">
<div class="node">
<div class="tile peach">🔄</div>
<div class="label">Sync API</div>
<div class="sub">Facturas + clientes</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile lavender">⚙️</div>
<div class="label">Motor</div>
<div class="sub">Reglas + match</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile lavender">📬</div>
<div class="label">Cobranza</div>
<div class="sub">Auto + lista blanca</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile amber">📊</div>
<div class="label">Dashboard</div>
<div class="sub">CxC en vivo</div>
</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile mint">💳</div>
<div class="label">Pago link</div>
<div class="sub">Stripe · opcional</div>
</div>
</div>
<p class="section-label" style="margin-top:32px">Ramal de conciliación bancaria</p>
<div class="flow">
<div class="node">
<div class="tile slate">📄</div>
<div class="label">PDF banco</div>
<div class="sub">Upload mensual</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile peach">🤖</div>
<div class="label">Claude</div>
<div class="sub">Extrae movimientos</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile lavender">🔗</div>
<div class="label">Match</div>
<div class="sub">Auto · monto + ref</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile amber">👁️</div>
<div class="label">Revisión</div>
<div class="sub">Solo excepciones</div>
</div>
<div class="arrow"></div>
<div class="node">
<div class="tile mint">📥</div>
<div class="label">Export BIND</div>
<div class="sub">Asientos al contador</div>
</div>
</div>
</div>
<div class="divider"></div>
<!-- ====== MÉTRICAS ====== -->
<p class="section-label">Impacto medible</p>
<div class="metrics">
<div class="metric">
<div class="m-label">Pasos manuales</div>
<div class="m-row">
<span class="m-before">8</span>
<span class="m-arrow"></span>
<span class="m-after">2</span>
</div>
</div>
<div class="metric">
<div class="m-label">Tiempo de conciliación</div>
<div class="m-row">
<span class="m-before">Horas / mes</span>
<span class="m-arrow"></span>
<span class="m-after">60%</span>
</div>
</div>
<div class="metric">
<div class="m-label">Errores contables</div>
<div class="m-row">
<span class="m-before">Recurrentes</span>
<span class="m-arrow"></span>
<span class="m-after">70%</span>
</div>
</div>
<div class="metric">
<div class="m-label">Visibilidad dirección</div>
<div class="m-row">
<span class="m-before">Reporte</span>
<span class="m-arrow"></span>
<span class="m-after">Tiempo real</span>
</div>
</div>
</div>
<!-- ====== DOLOR / GANANCIA ====== -->
<div class="twocol">
<div class="card">
<h3><span class="dot red"></span> Dolor que se elimina</h3>
<ul>
<li>Riesgo de mandar recordatorio a ACUNTIA o Top 3 por error humano.</li>
<li>Horas perdidas conciliando 3 PDFs bancarios a mano.</li>
<li>Errores contables que llegan tarde al contador.</li>
<li>Dirección sin visibilidad real del CxC del día.</li>
<li>Cobranza dependiendo de que alguien recuerde mandar el correo.</li>
</ul>
</div>
<div class="card">
<h3><span class="dot green"></span> Lo que se gana</h3>
<ul>
<li>Cobro más rápido con link de pago directo en el correo.</li>
<li>Conciliación automática + cola humana solo para excepciones.</li>
<li>Dashboard en tiempo real accesible para CEO / CFO / CTO.</li>
<li>Audit log completo de quién hizo qué y cuándo.</li>
<li>Base preparada para Fase 2: Jira → BUK → Factura end-to-end.</li>
</ul>
</div>
</div>
</body>
</html>
@@ -0,0 +1,315 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Balam — Flujo HOY vs DESPUÉS del MVP</title>
<style>
:root{
--bg:#0f172a;
--text:#e2e8f0; --muted:#94a3b8;
--bad:#ef4444; --bad-bg:rgba(239,68,68,.12);
--ok:#10b981; --ok-bg:rgba(16,185,129,.12);
--warn:#f59e0b;
--info:#3b82f6;
--accent:#a78bfa;
--border:#475569;
}
*{box-sizing:border-box}
body{
margin:0; padding:32px;
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 100%);
color:var(--text); min-height:100vh;
}
h1{margin:0 0 4px; font-size:28px}
.subtitle{color:var(--muted); margin-bottom:24px; font-size:14px}
.legend{
display:flex; gap:16px; flex-wrap:wrap; margin-bottom:24px;
padding:10px 14px; background:rgba(0,0,0,.25); border-radius:8px;
font-size:12px;
}
.legend-item{display:flex; align-items:center; gap:6px}
.icon{font-size:14px}
.columns{display:grid; grid-template-columns:1fr 1fr; gap:24px}
@media (max-width:1100px){ .columns{grid-template-columns:1fr} }
.panel{
background:#1e293b; border:1px solid var(--border);
border-radius:14px; padding:20px;
box-shadow:0 4px 16px rgba(0,0,0,.3);
}
.panel.before{border-top:4px solid var(--bad)}
.panel.after{border-top:4px solid var(--ok)}
.panel h2{
margin:0 0 4px; font-size:18px; display:flex; align-items:center; gap:10px;
}
.panel .tag{
font-size:11px; font-weight:700; padding:3px 10px; border-radius:10px;
text-transform:uppercase; letter-spacing:1px;
}
.tag.bad{background:var(--bad-bg); color:#fca5a5}
.tag.ok{background:var(--ok-bg); color:#6ee7b7}
.panel .lead{color:var(--muted); font-size:13px; margin-bottom:16px}
/* flow */
.flow{display:flex; flex-direction:column; gap:6px}
.step{
background:#334155; border:1px solid var(--border); border-radius:10px;
padding:10px 14px; font-size:13px; line-height:1.4;
display:flex; gap:10px; align-items:flex-start;
}
.step .num{
flex-shrink:0; width:24px; height:24px; border-radius:50%;
background:#475569; color:#fff; font-weight:700; font-size:12px;
display:flex; align-items:center; justify-content:center;
}
.step .body{flex:1}
.step .who{display:block; font-size:10px; color:var(--muted); text-transform:uppercase; letter-spacing:1px; margin-bottom:2px}
.step .what{color:var(--text)}
.step .note{display:block; font-size:11px; color:var(--muted); margin-top:4px; font-style:italic}
.step.manual .num{background:var(--bad)}
.step.manual{border-left:3px solid var(--bad)}
.step.auto .num{background:var(--ok)}
.step.auto{border-left:3px solid var(--ok)}
.step.semi .num{background:var(--warn)}
.step.semi{border-left:3px solid var(--warn)}
.arrow-down{
text-align:center; color:var(--muted); font-size:18px; line-height:1;
margin:-2px 0;
}
/* metrics */
.metrics{
display:grid; grid-template-columns:repeat(4,1fr); gap:12px;
margin-top:24px;
}
.metric{
background:#1e293b; border:1px solid var(--border); border-radius:12px;
padding:14px; text-align:center;
}
.metric .label{font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:1px}
.metric .before-val{font-size:18px; color:#fca5a5; margin-top:4px; text-decoration:line-through; opacity:.7}
.metric .arrow{font-size:14px; color:var(--accent); margin:2px 0}
.metric .after-val{font-size:20px; color:#6ee7b7; font-weight:700}
/* pain & gain box */
.summary{
display:grid; grid-template-columns:1fr 1fr; gap:16px; margin-top:24px;
}
.summary .box{
border-radius:12px; padding:16px;
}
.summary .pain{background:var(--bad-bg); border-left:4px solid var(--bad)}
.summary .gain{background:var(--ok-bg); border-left:4px solid var(--ok)}
.summary h3{margin:0 0 10px; font-size:14px}
.summary ul{margin:0; padding-left:20px; font-size:13px; line-height:1.6; color:var(--text)}
@media (max-width:700px){
.metrics{grid-template-columns:1fr 1fr}
.summary{grid-template-columns:1fr}
}
</style>
</head>
<body>
<h1>Balam · Flujo Financiero</h1>
<div class="subtitle">Cómo opera HOY vs cómo operará DESPUÉS del MVP</div>
<div class="legend">
<div class="legend-item"><span class="icon">🔴</span> Paso manual / handoff humano</div>
<div class="legend-item"><span class="icon">🟡</span> Semi-automático (humano valida)</div>
<div class="legend-item"><span class="icon">🟢</span> Automático</div>
</div>
<div class="columns">
<!-- ================= HOY ================= -->
<div class="panel before">
<h2>🕰️ HOY <span class="tag bad">Manual y desconectado</span></h2>
<div class="lead">Cada paso depende de una persona moviendo datos entre sistemas que no se hablan.</div>
<div class="flow">
<div class="step manual"><div class="num">1</div><div class="body">
<span class="who">Jira · Operaciones</span>
<span class="what">Registro de horas por colaborador y cliente.</span>
<span class="note">Sin visibilidad consolidada para facturación.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">2</div><div class="body">
<span class="who">BUK · RH</span>
<span class="what">Nómina aprobada de los 45 colaboradores + 5 freelancers.</span>
<span class="note">Sin trigger automático hacia facturación.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">3</div><div class="body">
<span class="who">Persona · Admin</span>
<span class="what">Genera factura manualmente en BIND ERP por cada cliente (~50/mes).</span>
<span class="note">Riesgo de error en monto, RFC, concepto.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">4</div><div class="body">
<span class="who">Persona · Cobranza</span>
<span class="what">Recordatorios manuales por correo a cada cliente vencido.</span>
<span class="note">Riesgo de enviar accidentalmente a ACUNTIA / Top 3 → daño de relación.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">5</div><div class="body">
<span class="who">Persona · Finanzas</span>
<span class="what">Descarga 3 PDFs bancarios (2 MX + IBC Texas) desde portales web.</span>
<span class="note">Producción únicamente, sin API.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">6</div><div class="body">
<span class="who">Persona · Finanzas</span>
<span class="what">Concilia movimiento por movimiento contra facturas en Excel.</span>
<span class="note">Horas de trabajo / mes · errores recurrentes.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">7</div><div class="body">
<span class="who">Contador</span>
<span class="what">Captura asientos contables en BIND a partir del Excel conciliado.</span>
<span class="note">Retrabajo si la conciliación previa tuvo errores.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">8</div><div class="body">
<span class="who">Dirección</span>
<span class="what">Pide reporte de CxC al área. Llega tarde y desactualizado.</span>
<span class="note">Sin visibilidad en tiempo real.</span>
</div></div>
</div>
</div>
<!-- ================= DESPUÉS ================= -->
<div class="panel after">
<h2>🚀 DESPUÉS del MVP <span class="tag ok">Orquestado y visible</span></h2>
<div class="lead">La plataforma absorbe los pasos repetitivos. Las personas solo deciden en excepciones.</div>
<div class="flow">
<div class="step semi"><div class="num">1</div><div class="body">
<span class="who">BIND ERP (API) → Plataforma</span>
<span class="what">Sync automático de facturas, clientes y catálogo.</span>
<span class="note">BIND sigue siendo fuente de verdad y emite CFDI.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step auto"><div class="num">2</div><div class="body">
<span class="who">Plataforma · Dashboard</span>
<span class="what">CxC en tiempo real: vencidas, próximas, por cliente, multimoneda (MXN/USD).</span>
<span class="note">Dirección entra al dashboard cuando quiera, sin pedir reporte.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step auto"><div class="num">3</div><div class="body">
<span class="who">Plataforma · Cobranza</span>
<span class="what">Recordatorios automáticos por correo 5 días antes del vencimiento.</span>
<span class="note"><strong>Lista blanca dura:</strong> ACUNTIA + Top 3 NUNCA reciben automático.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step auto"><div class="num">4</div><div class="body">
<span class="who">Plataforma · Pago (opcional)</span>
<span class="what">Link de pago Stripe en el correo → tarjeta o SPEI.</span>
<span class="note">Webhook marca factura como pagada al recibir confirmación.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step manual"><div class="num">5</div><div class="body">
<span class="who">Persona · Finanzas (mínimo)</span>
<span class="what">Sube 3 PDFs bancarios a la plataforma (mensual).</span>
<span class="note">Único paso manual que sigue. Se elimina en Fase 2 con Belvo/Plaid.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step auto"><div class="num">6</div><div class="body">
<span class="who">Plataforma · IA (Claude)</span>
<span class="what">Extrae movimientos de los PDFs y valida totales.</span>
<span class="note">Una pipeline por banco · datos no se usan para entrenamiento.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step semi"><div class="num">7</div><div class="body">
<span class="who">Plataforma · Motor conciliación</span>
<span class="what">Match automático monto+referencia+fecha. No-match → cola de revisión humana.</span>
<span class="note">Persona solo toca las excepciones, no todo.</span>
</div></div>
<div class="arrow-down"></div>
<div class="step semi"><div class="num">8</div><div class="body">
<span class="who">Contador · BIND</span>
<span class="what">Sube a BIND el export Excel ya conciliado y clasificado.</span>
<span class="note">Asientos automáticos contra BIND API → Fase 2.</span>
</div></div>
</div>
</div>
</div>
<!-- ================= MÉTRICAS ================= -->
<div class="metrics">
<div class="metric">
<div class="label">Pasos manuales</div>
<div class="before-val">8 de 8</div>
<div class="arrow"></div>
<div class="after-val">2 de 8</div>
</div>
<div class="metric">
<div class="label">Tiempo conciliación bancaria</div>
<div class="before-val">Horas / mes</div>
<div class="arrow"></div>
<div class="after-val">60% mín.</div>
</div>
<div class="metric">
<div class="label">Errores contables</div>
<div class="before-val">Recurrentes</div>
<div class="arrow"></div>
<div class="after-val">70% mín.</div>
</div>
<div class="metric">
<div class="label">Visibilidad para dirección</div>
<div class="before-val">Reporte pedido</div>
<div class="arrow"></div>
<div class="after-val">Tiempo real</div>
</div>
</div>
<!-- ================= DOLOR / GANANCIA ================= -->
<div class="summary">
<div class="box pain">
<h3>🔴 Dolor que se elimina</h3>
<ul>
<li>Riesgo de enviar recordatorio a ACUNTIA o Top 3 por error humano.</li>
<li>Horas perdidas conciliando 3 PDFs bancarios a mano.</li>
<li>Errores contables que llegan tarde al contador.</li>
<li>Dirección sin visibilidad real del CxC del día.</li>
<li>Cobranza dependiendo de que alguien recuerde mandar el correo.</li>
</ul>
</div>
<div class="box gain">
<h3>🟢 Lo que se gana</h3>
<ul>
<li>Cobro más rápido con link Stripe directo en el correo.</li>
<li>Conciliación automática + cola humana solo para excepciones.</li>
<li>Dashboard en tiempo real accesible para CEO/CFO/CTO.</li>
<li>Audit log completo de quién hizo qué, cuándo.</li>
<li>Base preparada para Fase 2: Jira→BUK→Factura end-to-end.</li>
</ul>
</div>
</div>
</body>
</html>
+293
View File
@@ -0,0 +1,293 @@
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8" />
<title>Balam — Qué se necesita para construir la plataforma</title>
<style>
:root{
--bg:#0f172a; --panel:#1e293b; --panel2:#334155;
--ok:#10b981; --warn:#f59e0b; --bad:#ef4444; --info:#3b82f6;
--text:#e2e8f0; --muted:#94a3b8; --accent:#a78bfa;
--border:#475569;
}
*{box-sizing:border-box}
body{
margin:0; padding:32px;
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,sans-serif;
background:linear-gradient(135deg,#0f172a 0%,#1e1b4b 100%);
color:var(--text); min-height:100vh;
}
h1{font-size:28px; margin:0 0 4px}
.subtitle{color:var(--muted); margin-bottom:32px; font-size:14px}
.legend{
display:flex; gap:16px; flex-wrap:wrap; margin-bottom:24px;
padding:12px 16px; background:rgba(0,0,0,.25); border-radius:8px;
font-size:13px;
}
.legend-item{display:flex; align-items:center; gap:6px}
.dot{width:12px; height:12px; border-radius:50%}
.dot.ok{background:var(--ok)} .dot.warn{background:var(--warn)}
.dot.bad{background:var(--bad)} .dot.info{background:var(--info)}
.dot.accent{background:var(--accent)}
.grid{
display:grid; grid-template-columns:1fr 1fr 1fr; gap:24px;
margin-bottom:24px;
}
.row{
display:grid; grid-template-columns:1fr 2fr 1fr; gap:24px;
align-items:stretch; margin-bottom:24px;
}
.col{display:flex; flex-direction:column; gap:16px}
.card{
background:var(--panel); border:1px solid var(--border);
border-radius:12px; padding:16px;
box-shadow:0 4px 12px rgba(0,0,0,.3);
}
.card h3{margin:0 0 8px; font-size:14px; display:flex; align-items:center; gap:8px}
.card .badge{
font-size:10px; padding:2px 8px; border-radius:10px;
background:var(--panel2); color:var(--muted); font-weight:600;
text-transform:uppercase; letter-spacing:.5px;
}
.badge.ok{background:rgba(16,185,129,.2); color:#6ee7b7}
.badge.warn{background:rgba(245,158,11,.2); color:#fcd34d}
.badge.bad{background:rgba(239,68,68,.2); color:#fca5a5}
.badge.info{background:rgba(59,130,246,.2); color:#93c5fd}
.badge.accent{background:rgba(167,139,250,.2); color:#c4b5fd}
.card ul{margin:6px 0 0; padding-left:18px; font-size:12px; color:var(--muted)}
.card li{margin:3px 0; line-height:1.4}
.section-title{
font-size:11px; font-weight:700; text-transform:uppercase;
letter-spacing:1.5px; color:var(--muted); margin:32px 0 12px;
padding-bottom:8px; border-bottom:1px solid var(--border);
}
.core-card{
background:linear-gradient(135deg,#4c1d95 0%,#7c3aed 100%);
border:2px solid var(--accent);
text-align:center; padding:24px;
}
.core-card h2{margin:0 0 8px; font-size:18px}
.core-card p{margin:0; font-size:13px; color:#ddd6fe}
.arrow{
display:flex; align-items:center; justify-content:center;
font-size:24px; color:var(--accent);
}
.checklist{
background:rgba(0,0,0,.3); border-left:4px solid var(--warn);
padding:16px 20px; border-radius:8px; margin-top:16px;
}
.checklist h3{margin:0 0 12px; font-size:14px; color:var(--warn)}
.checklist ol{margin:0; padding-left:20px; font-size:13px; line-height:1.7}
.checklist li strong{color:#fcd34d}
.footer-grid{display:grid; grid-template-columns:1fr 1fr; gap:16px; margin-top:16px}
.footer-card{background:var(--panel); border:1px solid var(--border); border-radius:10px; padding:16px}
.footer-card h4{margin:0 0 8px; font-size:13px}
.footer-card p, .footer-card ul{font-size:12px; color:var(--muted); margin:0; line-height:1.5}
.footer-card ul{padding-left:18px}
.pill{
display:inline-block; padding:2px 8px; border-radius:6px;
background:var(--panel2); font-size:11px; margin-right:4px;
}
@media (max-width:900px){
.grid,.row{grid-template-columns:1fr}
.arrow{transform:rotate(90deg)}
}
</style>
</head>
<body>
<h1>Balam · Plataforma de Automatización Financiera</h1>
<div class="subtitle">¿Qué se necesita para construirla? — vista de un solo vistazo</div>
<div class="legend">
<div class="legend-item"><span class="dot ok"></span> Ya existe / disponible</div>
<div class="legend-item"><span class="dot warn"></span> Por confirmar con Balam</div>
<div class="legend-item"><span class="dot bad"></span> Bloqueador si falta</div>
<div class="legend-item"><span class="dot info"></span> Lo construyo yo</div>
<div class="legend-item"><span class="dot accent"></span> Servicio externo (costo Balam)</div>
</div>
<!-- ============ FILA 1: FUENTES DE DATOS ============ -->
<div class="section-title">1 · Fuentes de datos (de dónde sale la información)</div>
<div class="grid">
<div class="card">
<h3>BIND ERP <span class="badge ok">API confirmada</span></h3>
<ul>
<li>Facturas, clientes, catálogo</li>
<li>Timbrado CFDI con PAC integrado</li>
<li>Límite 20K req/día (suficiente)</li>
<li><strong>Falta confirmar:</strong> sandbox, webhooks, endpoints de escritura</li>
</ul>
</div>
<div class="card">
<h3>3 Bancos (PDFs) <span class="badge warn">Solo PDF hoy</span></h3>
<ul>
<li>2 bancos MX (Banorte + Intercam?)</li>
<li>1 banco US: IBC Bank Texas</li>
<li>Sin API en MVP, sin sandbox</li>
<li><strong>Falta:</strong> muestras reales anonimizadas</li>
</ul>
</div>
<div class="card">
<h3>BUK / Jira <span class="badge bad">Diferido Fase 2</span></h3>
<ul>
<li>Nómina (BUK) y horas (Jira)</li>
<li>BUK: servicio problemático, API por confirmar</li>
<li>NO entran en MVP</li>
<li>Habilitan flujo end-to-end más adelante</li>
</ul>
</div>
</div>
<!-- ============ FILA 2: LA PLATAFORMA ============ -->
<div class="section-title">2 · La plataforma que construyo (capa sobre BIND, no reemplazo)</div>
<div class="card core-card">
<h2>⚙️ Plataforma de Operaciones Financieras</h2>
<p>Orquesta el flujo entre BIND, bancos y el equipo · No emite CFDI · No reemplaza contabilidad</p>
</div>
<div class="grid" style="margin-top:16px">
<div class="card">
<h3>📥 Ingesta &amp; Sync <span class="badge info">Construir</span></h3>
<ul>
<li>Conector BIND API (lectura)</li>
<li>Upload de PDFs bancarios</li>
<li>Parser IA (Claude) para PDFs</li>
<li>Validación de totales</li>
</ul>
</div>
<div class="card">
<h3>🔁 Motor de negocio <span class="badge info">Construir</span></h3>
<ul>
<li>Conciliación pagos ↔ facturas</li>
<li>Cobranza con lista blanca dura</li>
<li>Templates de correo + recordatorios</li>
<li>Audit log universal</li>
</ul>
</div>
<div class="card">
<h3>📊 UI &amp; Reportes <span class="badge info">Construir</span></h3>
<ul>
<li>Dashboard CxC / vencidas / próximas</li>
<li>RBAC: Finanzas / Dirección / Ops</li>
<li>Export Excel para BIND</li>
<li>Multimoneda MXN + USD (TC DOF)</li>
</ul>
</div>
</div>
<!-- ============ FILA 3: SERVICIOS EXTERNOS ============ -->
<div class="section-title">3 · Servicios externos (Balam los paga directo)</div>
<div class="grid">
<div class="card">
<h3>☁️ Azure <span class="badge accent">$45$140 USD/mes</span></h3>
<ul>
<li>App Service + worker</li>
<li>PostgreSQL administrado</li>
<li>Blob Storage para PDFs</li>
<li><strong>Falta:</strong> ¿subscripción existe?</li>
</ul>
</div>
<div class="card">
<h3>🤖 Claude API <span class="badge accent">$5$20 USD/mes</span></h3>
<ul>
<li>Parsing de PDFs bancarios</li>
<li>Sin entrenamiento sobre datos del cliente</li>
<li>Costo por página procesada</li>
</ul>
</div>
<div class="card">
<h3>💳 Stripe MX <span class="badge accent">% por transacción</span></h3>
<ul>
<li>Solo si confirman pago con link</li>
<li>RFC + CLABE + rep. legal requeridos</li>
<li><strong>Falta confirmar:</strong> ¿lo quieren?</li>
</ul>
</div>
</div>
<!-- ============ FILA 4: LO QUE NECESITO DE BALAM ============ -->
<div class="section-title">4 · Lo que Balam debe entregar antes / durante Fase 0</div>
<div class="grid">
<div class="card">
<h3>👥 Personas <span class="badge warn">Por nombrar</span></h3>
<ul>
<li>1 contacto técnico (día a día)</li>
<li>1 gerente administrativo (reglas)</li>
<li>Admin de BIND para resolver dudas</li>
<li>SLA respuesta &lt;48 h en bloqueadores</li>
</ul>
</div>
<div class="card">
<h3>🔑 Accesos <span class="badge warn">Crítico</span></h3>
<ul>
<li>API Key de BIND (o gestionarlo)</li>
<li>Subscripción Azure</li>
<li>Acceso a portal IBC para descarga PDFs</li>
<li>Cuenta Stripe MX (si aplica)</li>
</ul>
</div>
<div class="card">
<h3>📄 Datos &amp; reglas <span class="badge warn">Inicio Fase 0</span></h3>
<ul>
<li>3 PDFs reales (1 por banco) anonimizados</li>
<li>Lista blanca: ACUNTIA + Top 3 con nombres legales</li>
<li>Manual de marca</li>
<li>NDA (suyo o mío)</li>
<li>Ciclo de cobranza actual (días, escalación)</li>
</ul>
</div>
</div>
<!-- ============ DECISIÓN PENDIENTE ============ -->
<div class="checklist">
<h3>⚠️ Decisión pendiente del CTO antes de cotizar firme</h3>
<ol>
<li><strong>Alcance del MVP:</strong> ¿Opción A "BIND-first" (34 semanas, ~$3645K MXN) o Opción B "MVP completo con conciliación bancaria" (6 semanas, ~$6684K MXN)?</li>
<li><strong>BIND API:</strong> sandbox disponible (aunque sea pagado), webhooks expuestos, endpoints de escritura (registrar pagos / asientos).</li>
<li><strong>Pago con link Stripe:</strong> ¿es requerimiento real o se difiere a Fase 2?</li>
<li><strong>Operación:</strong> nombres de contacto técnico y gerente administrativo + cuenta Azure.</li>
</ol>
</div>
<!-- ============ FOOTER: PARÁMETROS ============ -->
<div class="footer-grid">
<div class="footer-card">
<h4>💰 Modelo comercial</h4>
<ul>
<li><span class="pill">600 MXN/h</span> + IVA, facturación semanal</li>
<li>Time &amp; Materials con soft cap por fase</li>
<li>Pago a 7 días, anticipo de 30 h Fase 0</li>
<li>Dedicación medio tiempo (~20 h/semana)</li>
</ul>
</div>
<div class="footer-card">
<h4>⏱️ Tiempo &amp; entrega</h4>
<ul>
<li>MVP B completo: 6 semanas esfuerzo · 8 semanas calendario</li>
<li>MVP A BIND-first: 34 semanas esfuerzo</li>
<li>Soporte post-launch: 2 semanas incluidas</li>
<li>Demo semanal viernes + standup async 2-3/sem</li>
</ul>
</div>
</div>
</body>
</html>
Binary file not shown.