---
titulo: Sistema de facturación y finanzas — especificación para agentes de código
fuente: https://www.puente.xyz/recursos/guia-sistema-de-facturacion
guia_md: https://www.puente.xyz/recursos/guia-sistema-de-facturacion/guia.md
version: 1.0
actualizada: 2026-10-08
autor: Cris Ugarte, CEO de Puente OS
---

# Especificación: sistema de facturación y finanzas

## 0. Cómo usar este archivo

- Léelo completo. Entrevista al usuario con §9, una pregunta por vez, y luego planifica.
- Construye en el orden de §5, una tarea a la vez; al cerrar cada una, corre sus criterios (§6) con los datos de §7 y muestra la salida.
- Implementa la lógica general: nunca fijes los datos de ejemplo en el código.
- Marcas: `[CONFIGURABLE]` = usa el valor por defecto de §8 salvo que el usuario elija otro. `[SUPUESTO]` = decisión del ejemplo, confírmala. `[PREGUNTAR]` = decisión del usuario, nunca la supongas. `[PLATAFORMA PUENTE OS]` = límite de esa plataforma; ignóralo en otro stack.
- Todos los datos de ejemplo son ficticios: Empresa Demo SpA (la empresa usuaria) y Cliente Demo Ltda. (su cliente). País de los ejemplos: Chile. Moneda: CLP, sin decimales.

## 1. Objetivo y alcance

App web interna para un equipo de finanzas u operaciones (1 a 5 personas) que: (1) registra clientes y líneas con precio versionado; (2) calcula los cargos del mes sin duplicar; (3) emite cada cargo una vez a través del facturador electrónico; (4) muestra la facturación neta mensual; (5) carga extractos con cuadratura y arma el flujo de caja; (6) concilia abonos con facturas y lista lo por cobrar; (7) genera diario, mayor y balance; (8) proyecta presupuesto, impuesto y caja.

Incluye: los 8 pasos de la guía, en 11 tareas (§5).
Fuera de alcance: cálculo de nómina (los sueldos se leen ya calculados); declarar impuestos ante la autoridad; boletas masivas a consumidor final desde e-commerce; agentes de IA (opcional, ver `agente_categorias` en §8).

## 2. Plataforma

**Ruta A — Puente OS.** Construye en Puente Studio con sus cinco bloques: App (frontend React + TypeScript), Tablas (tablas dinámicas), Workflows (tareas programadas o disparadas por la app), Integraciones (conectores dentro de un workflow) y Agentes (opcional). Puente OS es la plataforma que construye los sistemas que operan tu negocio.

**Ruta B — otro stack.** Equivalencias: App → frontend web (React o similar) · Tabla → tabla en una base relacional (Postgres, SQLite) · Workflow programado → tarea programada (cron) · Workflow disparado por la app → función del servidor o endpoint · Integración → cliente de la API externa, del lado del servidor · Agente → llamada a un LLM con herramientas.

Límites `[PLATAFORMA PUENTE OS]`:
- Sin claves foráneas: las relaciones son por convención de campos (§3.17) y la app las valida.
- Actualizar una fila la reemplaza completa: lee, modifica y escribe la fila entera.
- Cambiar las opciones de una lista exige migrar la estructura: los catálogos que cambian van en una tabla (por eso existe `categorias_banco`).
- Lecturas de 500 filas por página y tope de consultas por minuto: pagina siempre y usa inserción masiva atómica para lotes.
En otro stack, usa claves foráneas, transacciones y unicidad.

**Adaptador del facturador.** Toda operación con el facturador electrónico pasa por una interfaz única. Implementa primero un **facturador simulado** en memoria con las mismas operaciones; la app demo de la guía usa uno.

Operaciones: `buscar_por_referencia(llave) → [{id, estado, folio, fecha, neto, referencia}]` · `crear_borrador(doc) → {id}` (nunca emite) · `emitir(id)` · `consultar_estado(id) → {estado, folio, motivo_error}` · `borrar_borrador(id)` · `obtener_pdf(id) → url` · `listar_documentos(desde, hasta, página) → [{tipo, folio, fecha, cliente_tax_id, neto, iva, total, folio_referencia, estado}]` · `buscar_cliente(tax_id)` · `crear_cliente(datos) → {id_facturador}` · `consultar_registro(tax_id) → {razon_social, direccion, actividad}`. Los estados del facturador se mapean a `borrador`, `procesando`, `emitido` y `fallido`.

## 3. Modelo de datos — 16 tablas: 8 del núcleo y 8 opcionales

Convenciones para todas las tablas: `id` (uuid), `creado_at` y `actualizado_at` (texto ISO 8601 con zona `[CONFIGURABLE: zona_horaria]`). Fechas `AAAA-MM-DD`. Período `AAAA-MM`, texto validado con `^\d{4}-(0[1-9]|1[0-2])$`. Montos en moneda local como enteros (`[CONFIGURABLE: decimales_moneda]`). Identificadores tributarios como texto normalizado (R-01).

### 3.1 clientes [NÚCLEO]
Formato: campo (tipo; * = obligatorio) — ejemplo — regla.
- tax_id (texto único*) — 762222223 — R-01
- razon_social (texto*) — Cliente Demo Ltda.
- actividad (texto, según país) — Servicios informáticos — giro (CL), actividad (PE), régimen fiscal (MX)
- direccion · comuna · ciudad · codigo_postal (texto, según país) — largo máximo según facturador
- pais (lista CL, PE, MX*) — CL
- email_facturacion (texto) — facturas@clientedemo.example
- condicion_pago (lista contado, credito*) · dias_pago (entero) — credito · 30
- id_facturador (texto) — C-0001 — vacío = sin alta en el facturador
- activo (booleano*) — true — baja lógica

### 3.2 lineas [NÚCLEO]
- cliente_tax_id (texto*) — 762222223 — = clientes.tax_id
- cuenta_comercial (texto*) — Demo Retail
- glosa (texto*) — Plan Operación — largo ≤ `largo_glosa`
- descripcion_base (texto)
- unidad (lista CLP, UF, USD*) — UF — CLP moneda local, UF índice, USD divisa
- precio (número*) — 12 — > 0, en la unidad · cantidad (número) — solo CLP; vacío = 1
- periodicidad (lista mensual, puntual*) — mensual — ofrece solo opciones implementadas
- exenta (booleano*) — false
- ref_oc · ref_hes (texto) — 4500-001
- vigente_desde (fecha*) · vigente_hasta (fecha; vacío = sin fin) — 2026-01-01 · 2026-09-30
- estado (lista activa, pausada, terminada*) — activa — solo `activa` factura
- version_de (texto) — id de la línea anterior — R-02

### 3.3 cargos [NÚCLEO] — cola de emisión, uno por línea y período
- idem_key (texto único*) — DEMO-202609-762222223-DEMO-RETAIL-PLAN-OPERACION-12-UF — R-07
- periodo · ciclo_id · linea_id (texto*) — 2026-09
- cliente_tax_id · razon_social · cuenta_comercial · glosa · descripcion (texto) — copia del momento (R-10)
- unidad_origen · precio_origen · valor_indice (lista · número · número) — UF · 12 · 40135.12 (null en CLP)
- cantidad · precio_unitario · neto · impuesto · total (número) — 12 · 40135 · 481620 · 91508 · 573128 — R-05, R-06
- exenta (booleano) · ref_oc · ref_hes (texto)
- estado (lista pendiente, borrador, procesando, emitido, fallido*) — R-12
- doc_externo_id · folio · pdf_url (texto) — · 121 ·
- fecha_borrador · neto_borrador (fecha · número) — 2026-09-28 · 481620 — lo que congeló el facturador
- error_tipo (lista transitorio, datos) · error_msg (texto) · intentos (entero) · emitido_at (texto ISO)

### 3.4 ciclos [NÚCLEO] — una fila por período
`periodo` (texto, único) · `fecha_documento` (fecha) · `indice_congelado` (número) · `indice_origen` (lista oficial, provisorio) · `total_neto` (número) · `cargos_creados` (entero) · `estado` (derivado, R-12). Guardar de nuevo el mismo período actualiza la fila.

### 3.5 config [NÚCLEO]
`clave` (texto, único) · `valor` (texto; la app lo convierte al leer) · `grupo` (lista facturacion, banco, cobranza, contabilidad, presupuesto) · `descripcion`. Las claves y sus valores por defecto están en §8; ningún parámetro vive en el código.

### 3.6 extractos [NÚCLEO]
`cuenta_bancaria` (texto) · `n_extracto` (entero) · `fecha_desde` · `fecha_hasta` · `saldo_inicial` · `saldo_final` (número) · `archivo` (texto). Único: (`cuenta_bancaria`, `n_extracto`) según `llave_extracto`.

### 3.7 movimientos_banco [NÚCLEO]
- extracto_id (texto*) — = extractos.id
- fecha (fecha*) — 2026-09-05
- monto (número con signo*) — 2380000 — + abono, − cargo
- descripcion (texto*) — 762222223 TRANSF — glosa del banco · documento (texto) — n° de operación
- contraparte_tax_id (texto) — 762222223 — R-01, extraído de la glosa si existe
- categoria (texto*) — cobranza_cliente — = categorias_banco.clave · operacional (booleano, derivado)
- folios_pagados (texto) — 101,103 — vacío = conciliación automática
- fijado_por · notas (texto) — quién fijó y con qué comprobante

### 3.8 categorias_banco [NÚCLEO] — catálogo único
`clave` · `etiqueta` · `signo` (ingreso, egreso, ambos) · `operacional` (booleano) · `cuenta_cobranza` (booleano: entra al match de R-24) · `cuenta_contable` (= plan_cuentas.codigo) · `orden_regla` (entero) · `patron` (texto contenido en la glosa, sin distinguir mayúsculas) · `por_contraparte` (lista cliente, propio, fondo, ninguna). Filas iniciales en §7.4.

### 3.9 indices [OPCIONAL: obligatoria si alguna línea usa UF o USD]
`fecha` · `indice` (lista UF, UDI, USD) · `valor` (número, 2 decimales) · `origen` (oficial, provisorio) · `fuente` (texto). Única: (`fecha`, `indice`).

### 3.10 – 3.16 Opcionales (pasos 7 y 8)
- **gastos_proveedores:** proveedor_tax_id · proveedor · folio · fecha · neto · iva · total · moneda · tipo_cambio · categoria · cuenta_contable.
- **gastos_tarjeta:** fecha · descripcion · monto · moneda · categoria · cuenta_contable · n_estado_cuenta.
- **remuneraciones:** periodo · persona_id · bruto · aporte_empleador · cotizaciones · impuesto · liquido · fuente (real, estimada).
- **prestamos:** contraparte · capital · tasa_anual · n_cuotas · primera_cuota (fecha) · sistema (frances, aleman, al_vencimiento) · estado (por_firmar, vigente, pagado).
- **plan_cuentas:** codigo · nombre · tipo (activo, pasivo, patrimonio, ingreso, gasto) · naturaleza (deudora, acreedora).
- **saldos_apertura:** ejercicio · codigo_cuenta · debe · haber.
- **costos_presupuesto:** concepto · categoria (sueldos, software, oficina, servicios, otros) · monto_mensual (neto) · desde (AAAA-MM) · hasta (AAAA-MM, vacío = sin fin) · activo · afecto_iva.

### 3.17 Relaciones
`lineas.cliente_tax_id` = `clientes.tax_id` · `cargos.linea_id` = `lineas.id` · `cargos.ciclo_id` = `ciclos.id` · `movimientos_banco.extracto_id` = `extractos.id` · `movimientos_banco.categoria` = `categorias_banco.clave` · `movimientos_banco.contraparte_tax_id` = `clientes.tax_id` (cuando es cliente) · `folios_pagados` ⊂ folios de facturas del facturador (N:M; si crece, crea la tabla puente `pagos_documentos`).

## 4. Reglas de negocio

**Clientes y líneas**
- R-01 Normaliza el identificador tributario al escribir: quita puntos, guiones y espacios, y pasa a mayúsculas. «76.222.222-3» → «762222223». Úsalo igual en todos los cruces.
- R-02 Cambiar precio, unidad o cantidad: `vigente_hasta` = día anterior a la fecha nueva y nueva fila con `version_de` = id anterior. Nunca se edita el precio en el lugar.
- R-03 «Traer del registro» completa razón social y dirección; completa la actividad solo si está vacía.

**Ciclo**
- R-04 Índice de la fecha del documento: en `indices` → oficial; fecha futura → provisorio (calcula, no emite: `indice_provisorio`); falta y no es futura → error visible.
- R-05 Montos. UF o USD: `cantidad = precio`, `precio_unitario = round(valor_indice)`, `neto = round(cantidad × precio_unitario)`. CLP: `cantidad = linea.cantidad || 1`, `precio_unitario = round(precio)`, `neto = round(precio × cantidad)`. Redondeo half-up a `decimales_moneda`.
- R-06 `impuesto = exenta ? 0 : round(neto × tasa_iva)`; `total = neto + impuesto`.
- R-07 Llave anti-duplicado: `PREFIJO-AAAAMM-slug`, con `slug = norm(tax_id + "-" + cuenta_comercial + "-" + glosa)` recortado a 40 + `"-"` + `norm(precio + " " + unidad)`. `norm`: sin tildes, mayúsculas, no alfanumérico → «-», sin guiones repetidos ni en los bordes. Precio sin decimales sobrantes («12.0» → «12»). Nunca uses el id de fila.
- R-08 Elegibilidad en el período P: `estado = activa` ∧ cliente `activo` ∧ (`vigente_desde` vacío ∨ mes(`vigente_desde`) ≤ P) ∧ (`vigente_hasta` vacío ∨ mes(`vigente_hasta`) ≥ P) ∧ (periodicidad `puntual` ⇒ mes(`vigente_desde`) = P). Compara por `AAAA-MM`. Cada línea activa descartada muestra su motivo («cobro único de 2026-03», «terminó en 2026-08»).
- R-09 Antes de guardar, relee los cargos del período: llave existente → «ya registrado» (no se guarda); repetida en el cálculo → la primera queda, las demás «llave repetida». Advertencias (cliente inexistente o sin datos obligatorios, glosa larga, precio ≤ 0, sin alta en el facturador, índice provisorio) desmarcan la fila; bloquean si `advertencias_bloquean`.
- R-10 El cargo copia razón social, glosa, descripción, montos y `valor_indice` al crearse. El ciclo guarda `indice_congelado`.
- R-11 Cambiar período o fecha del documento descarta la vista previa.

**Emisión**
- R-12 Estados del cargo (evento → estado): crear borrador → `borrador`; documento existente con la llave → `emitido`/`procesando`; emitir o sincronizar → `emitido`/`procesando`/`fallido`; descartar, rehacer o editar referencias → `pendiente` (borra el borrador); reintentar `fallido` → `emitido`/`fallido`; quitar → elimina (solo sin documento). `emitido` es terminal. Ciclo derivado: `preparado` (hay pendientes) → `borradores` → `emitiendo` (alguno procesando) → `cerrado` (todos emitidos).
- R-13 Crear borrador: `buscar_por_referencia(idem_key)`, igualdad exacta. 0 → crea. 1 emitido o procesando → vincula y copia folio. 1 borrador huérfano (intento cortado) → bórralo y crea otro. Más de 1, o vinculado a otro cargo → salta y avisa. Si la búsqueda falla → no crea. El workflow de borrador nunca emite.
- R-14 «Emitible»: `fecha_borrador = ciclo.fecha_documento` ∧ `|neto_borrador − cargo.neto| ≤ tolerancia_neto_emision` ∧ (UF/USD ⇒ índice oficial de esa fecha). Si falla, muestra el motivo y ofrece «Rehacer» (borra, recalcula con el índice de la fecha nueva, crea otro).
- R-15 Emisión tras confirmar en una tarjeta (cantidad, total, destinatarios). Un cargo a la vez: revalida la fila → `consultar_estado` → emitido: márcalo; procesando: espera; si no, `emitir` y consulta con `espera_emision_seg` (≈3 min). Transitorios (red, tiempo agotado, autoridad caída, tope de consultas) se reintentan hasta `reintentos_transitorios`; errores de datos → `fallido` con `error_msg`.
- R-16 Sincronización automática de cargos `borrador` y `procesando` con el estado del facturador al abrir la vista.

**Panel**
- R-17 Neto del mes M = Σ neto de facturas aceptadas con fecha en M − Σ neto de notas de crédito cuya factura referida tiene fecha en M (`imputacion_nota_credito = mes_corregido`), o con fecha en M (`mes_emision`). Lee todas las páginas desde `inicio_historico`. Si la lectura falla, muestra el error: un «0» se distingue de «no se pudo leer».

**Extracto y caja**
- R-18 Lectura: ubica el encabezado por `anclas_extracto`, corta antes de los resúmenes y convierte cargos y abonos a monto con signo.
- R-19 Cuadratura: `Σ monto = saldo_final − saldo_inicial` con tolerancia `tolerancia_cuadratura`. Si no cuadra, bloquea «Cargar» y muestra la diferencia.
- R-20 Un extracto con llave ya cargada se rechaza («ya cargado»). La carga del extracto y sus movimientos es atómica.
- R-21 Clasificación: aplica `categorias_banco` por `orden_regla`; gana la primera que calza; sin coincidencia → `sin_clasificar` (operacional hasta revisarlo). Cambiar la categoría recalcula `operacional`.
- R-22 `saldo_mes = saldo_mes_anterior + Σ movimientos del mes`. `flujo_operacional = Σ montos con categoría operacional`. `tesoreria = Σ montos con categoría no operacional`.

**Cobranza**
- R-23 Entran al match: abonos (`monto > 0`) con `cuenta_cobranza = true`; facturas emitidas con saldo > `saldo_minimo_factura`, netas de sus notas de crédito. Compara contra el total con IVA.
- R-24 Match: (0) aplica `folios_pagados` y reserva esas facturas. (1) En orden cronológico, por abono, combinaciones de 1 a `max_facturas_por_abono` facturas del cliente con fecha ≤ abono y suma = monto ± `holgura_exacta`; si no hay, agrupa hasta `max_abonos_agrupados` abonos en `ventana_agrupacion_dias` («pago en partes»). (2) Sin calce: holgura `max(holgura_exacta, round(holgura_comision_pct × Σ facturas))`. Desempate: menor rango de fechas entre facturas.
- R-25 Insignias: `confirmado` (fijado a mano, o una sola combinación posible), `a confirmar` (2 o más combinaciones; muestra las alternativas), `pago en partes`, `sin factura que calce`.
- R-26 Facturas con fecha anterior al primer extracto cargado → «sin verificar»; se muestran aparte del total por cobrar.
- R-27 `dias = hoy − fecha_emision` (o − vencimiento si `antiguedad_desde = vencimiento`). Tramos: ≤ 30 al día; 31–60 amarillo; > 60 rojo (`tramos_antiguedad`).

**Contabilidad**
- R-28 Asientos: venta → D por cobrar (total) / H ingresos (neto) + IVA débito; nota de crédito → inverso; gasto → D gasto + IVA crédito / H proveedores por pagar; tarjeta → D gasto / H tarjeta por pagar; sueldo → D remuneraciones + aporte empleador / H cotizaciones + impuesto + líquido por pagar; banco → `categorias_banco.cuenta_contable`.
- R-29 Asiento con Σ debe ≠ Σ haber → fuera del diario y listado en «descuadrados». Movimiento sin cuenta → «pendiente de cierre».
- R-30 IVA: cuenta neta = débito − crédito − pagos de la declaración mensual.
- R-31 Préstamo francés: `r = (1 + tasa_anual)^(1/12) − 1`; `cuota = P·r / (1 − (1 + r)^−n)`, redondeada. Interés de la cuota k = saldo × r. Porción corriente = capital que vence en los próximos 12 meses.
- R-32 Pendientes de cierre: pasivos con saldo deudor, movimientos sin cuenta, facturas en moneda extranjera sin tipo de cambio, sueldos `estimada`.

**Presupuesto**
- R-33 Para cada mes m del horizonte: `ingreso_m = ingreso_{m−1} × (1 + crecimiento)` (m₀ = `mes_base` con `ingreso_base`); `costos_m = Σ monto_mensual` de costos activos con desde ≤ m ≤ hasta; `iva_ventas = ingreso × tasa_iva`; `iva_compras = Σ costos afectos × tasa_iva`; `impuesto = max(0, iva_ventas − iva_compras) + ingreso × tasa_anticipo`, pagado en m + `desfase_impuesto`; `ebitda = ingreso − costos`; `caja = ingreso × (1 + tasa_iva) − (costos + iva_compras) − impuesto_pagado`; el saldo se acumula desde `saldo_inicial`. Alerta si saldo < `saldo_minimo_alerta`.
- R-34 Tendencia sobre meses cerrados (excluye el mes en curso): `compuesto = (último / primero)^(1/(n−1)) − 1`; `promedio = media de los crecimientos mensuales`. Si `|promedio − compuesto| > umbral_irregular_pts` → «irregular».
- R-35 `clientes_a_cerrar = ceil(brecha / ticket_cliente_nuevo)`, con `brecha = ingreso meta del mes − ingreso del mes anterior`.

**Índices (workflow programado)**
- R-36 Corre `indice_dias_carga` a `indice_hora_carga`: baja el índice de dos fuentes públicas `[PREGUNTAR]`, revisa cantidad y rango e inserta solo fechas nuevas donde coinciden (|a − b| < 0,005). Si descarta todas, la corrida falla.

## 5. Orden de construcción

- T-01 Tablas del núcleo, `config` con §8 y `categorias_banco` con §7.4. Depende de: —. Listo cuando: CA-01.
- T-02 Vistas Clientes y Líneas y precios (R-01 a R-03). Depende de: T-01. Listo cuando: CA-02, CA-03.
- T-03 Tabla `indices` y workflow de carga (R-04, R-36). Depende de: T-01. Listo cuando: CA-04.
- T-04 Vista Calcular el ciclo (R-05 a R-11). Depende de: T-02, T-03. Listo cuando: CA-05, CA-06, CA-07.
- T-05 Adaptador del facturador y facturador simulado; prueba de lectura. Depende de: T-01. Listo cuando: CA-08.
- T-06 Vista Borradores y emisión (R-12 a R-16). Depende de: T-04, T-05. Listo cuando: CA-09 a CA-12.
- T-07 Panel de facturación (R-17). Depende de: T-05. Listo cuando: CA-13.
- T-08 Subir extracto y Flujo de caja (R-18 a R-22). Depende de: T-01. Listo cuando: CA-14 a CA-16.
- T-09 Quién pagó y Por cobrar (R-23 a R-27). Depende de: T-05, T-08. Listo cuando: CA-17 a CA-19.
- T-10 Contabilidad (R-28 a R-32). Depende de: T-07, T-08. Listo cuando: CA-20 a CA-22.
- T-11 Presupuesto (R-33 a R-35). Depende de: T-07, T-08. Listo cuando: CA-23 a CA-25.

## 6. Criterios de aceptación

- CA-01 Existen las 8 tablas del núcleo con los tipos de §3; `periodo = "2026-13"` se rechaza; `config` tiene las claves de §8.
- CA-02 El alta con «76.222.222-3» guarda «762222223»; una línea creada con «76.222.222-3» queda asociada a ese cliente.
- CA-03 Subir L1 a 13 UF desde 2026-10-01 deja L1 con `vigente_hasta = 2026-09-30` y L1b (13 UF, `version_de = L1`); el ciclo 2026-09 cobra 12 UF y el 2026-10, 13 UF.
- CA-04 Fuentes con 40135.12 y 40135.12 → se inserta; 40135.12 y 40135.20 → se descarta; si todas se descartan, la corrida falla.
- CA-05 Ciclo 2026-09, fecha 2026-09-28, UF 40135.12: L1 da cantidad 12, precio_unitario 40135, neto 481620, impuesto 91508, total 573128, llave `DEMO-202609-762222223-DEMO-RETAIL-PLAN-OPERACION-12-UF`; L2 (Implementación, puntual 2026-03) aparece descartada con motivo «cobro único de 2026-03».
- CA-06 Recalcular el ciclo 2026-09 guardado: todo «ya registrado» y `cargos` no cambia. Dos líneas idénticas: la segunda sale «llave repetida».
- CA-07 Dada una vista previa, al cambiar la fecha del documento la vista previa se vacía.
- CA-08 El facturador simulado responde `listar_documentos` con los documentos de §7.3; la app los muestra sin error.
- CA-09 Crear los borradores del período dos veces seguidas deja 1 documento por llave en el facturador. Invariante: nunca existen 2 documentos con la misma llave.
- CA-10 Borrador de L1 al 2026-09-28 y ciclo cambiado a 2026-09-30 (UF 40144.87): «Emitir» bloqueado por fecha; tras «Rehacer», neto 481740, impuesto 91531, total 573271, y la fila queda emitible.
- CA-11 Si `emitir` corta por tiempo agotado y `consultar_estado` dice emitido, la app marca emitido sin reenviar. Al emitir L1, el cargo queda `emitido` con folio 121 (facturador simulado). Invariante: un cargo `emitido` nunca se vuelve a enviar.
- CA-12 Sin «Confirmar» en la tarjeta, ningún cargo cambia de estado.
- CA-13 Con §7.3 y la factura 121 de CA-11: agosto = 800000; septiembre = 481740. Invariante: Σ de todos los meses = Σ facturas − Σ notas de crédito.
- CA-14 Con el extracto 12 de §7.5: Σ = 1150000 = 5150000 − 4000000 (cuadra); categorías cobranza_cliente, impuestos, traspaso_interno, sin_clasificar; flujo operacional +1450000; tesorería −300000.
- CA-15 Si un monto del extracto 12 cambia en $1, «Cargar» queda bloqueado y muestra la diferencia de 1.
- CA-16 Cargar de nuevo el extracto 12 → «ya cargado» y `movimientos_banco` no cambia. Invariante: saldo final de la vista = `saldo_final` del último extracto.
- CA-17 Con el conjunto de cobranza de §7.6: el abono de 595000 propone F-101 + F-102, insignia «a confirmar», alternativa F-101 + F-103.
- CA-18 Al fijar «101,103»: insignia «confirmado»; F-102 queda por cobrar; con hoy = 2026-09-29, F-102 tiene 203 días, tramo rojo. Al vaciar el campo, vuelve el resultado automático.
- CA-19 Una factura con fecha anterior al primer extracto queda «sin verificar» y fuera del total por cobrar.
- CA-20 Venta de neto 1000000: asiento D cuentas por cobrar 1190000 / H ingresos 1000000 + IVA débito 190000. Invariante: en el diario, Σ debe = Σ haber; el balance cuadra.
- CA-21 Un egreso «proveedores» sin factura deja proveedores por pagar con saldo deudor en pendientes de cierre; con la factura cargada, desaparece.
- CA-22 Préstamo de 12000000 al 12 % anual en 24 cuotas, sistema francés: cuota 561450; interés de la cuota 1 = 113866; amortización 447584.
- CA-23 Con §7.7, agosto 2026: ingreso 10500000; iva_ventas 1995000; iva_compras 95000; anticipo 105000; impuesto 2005000; ebitda 4000000 (38,1 %); caja 3895000; brecha 500000; clientes a cerrar 2.
- CA-24 Un costo con `desde` = tercer mes del horizonte aparece solo desde ese mes.
- CA-25 Serie cerrada 10000000, 20000000, 10000000, 12000000: promedio 23,3 %, compuesto 6,3 %, diferencia 17,1 puntos → «irregular».
- CA-final Recorrido completo con los datos de §7: cada vista coincide con las cifras de CA-05, CA-13, CA-14, CA-18 y CA-23.

## 7. Datos de ejemplo (ficticios)

### 7.1 Empresa y clientes
Empresa usuaria: Empresa Demo SpA, tax_id 761111111, prefijo de llave DEMO.
| tax_id | razon_social | actividad | condicion_pago | dias_pago | id_facturador | activo |
|---|---|---|---|---|---|---|
| 762222223 | Cliente Demo Ltda. | Servicios informáticos | credito | 30 | C-0001 | true |

### 7.2 Líneas e índices
| id | cuenta_comercial | glosa | unidad | precio | periodicidad | ref_oc | vigente_desde | vigente_hasta | estado |
|---|---|---|---|---|---|---|---|---|---|
| L1 | Demo Retail | Plan Operación | UF | 12 | mensual | 4500-001 | 2026-01-01 | | activa |
| L2 | Demo Online | Implementación | CLP | 800000 | puntual | | 2026-03-01 | | activa |

`indices` (UF, oficial): 2026-09-28 = 40135.12 · 2026-09-30 = 40144.87.
L2 en el ciclo 2026-03: neto 800000, impuesto 152000, total 952000.

### 7.3 Documentos del facturador simulado
Previos a la app (el simulador asigna folios correlativos desde 121; la factura 121, de 481740 al 2026-09-30, nace al emitir L1 en CA-11):
| tipo | folio | fecha | cliente_tax_id | neto | folio_referencia | estado |
|---|---|---|---|---|---|---|
| factura | 120 | 2026-08-31 | 762222223 | 1000000 | | emitido |
| nota_credito | 5 | 2026-09-15 | 762222223 | 200000 | 120 | emitido |

### 7.4 categorias_banco (orden · clave · regla · operacional · cuenta_cobranza)
- 1 · rescate_inversion (+) / aporte_inversion (−) · contraparte = fondo `[PREGUNTAR]` · no · no
- 2 · traspaso_interno · contraparte propia o «TRANSF A EMPRESA DEMO SPA» · no · no
- 3 · cobranza_cliente · contraparte = cliente, abono · sí · sí
- 4 · impuestos · «S.I.I.» o «TESORERIA» · sí · no
- 5 · gastos_banco · «COMISION» · sí · no
- 6 · tarjeta_credito · «PAGO TARJETA» · sí · no
- Manuales operacionales: proveedores, remuneraciones, arriendo, cotizaciones, honorarios, otro_ingreso. Manuales no operacionales: aporte_capital, retiro_socios, pago_revertido, venta_divisas. Sin coincidencia: sin_clasificar (operacional hasta revisarlo).

### 7.5 Extractos (cuenta «Demo-CC»)
- Extracto 11 (2026-08): saldo_inicial 3200000, saldo_final 4000000. Movimientos: 2026-08-10 +952000 «762222223 TRANSF» · 2026-08-20 −132000 «PAGO S.I.I.» · 2026-08-31 −20000 «COMISION MANTENCION».
- Extracto 12 (2026-09): saldo_inicial 4000000, saldo_final 5150000. Movimientos: 2026-09-05 +2380000 «762222223 TRANSF» · 2026-09-12 −850000 «PAGO S.I.I.» · 2026-09-15 −300000 «TRANSF A EMPRESA DEMO SPA» · 2026-09-20 −80000 «TRANSF A TERCERO».

### 7.6 Conjunto de cobranza (se prueba aparte de 7.5)
Primer extracto cargado: 2026-03-01. Facturas de 762222223: F-101 2026-03-03 total 238000 (neto 200000) · F-102 2026-03-10 total 357000 (neto 300000) · F-103 2026-03-12 total 357000 (neto 300000). Abono 2026-03-20 +595000 «762222223 TRANSF». Hoy = 2026-09-29.

### 7.7 Presupuesto
`mes_base` 2026-07 · `ingreso_base` 10000000 · `crecimiento` 0.05 · `tasa_iva` 0.19 · `tasa_anticipo` 0.01 · `desfase_impuesto` 0 · `ticket_cliente_nuevo` 250000. Costos: Sueldos 6000000 (afecto_iva false, desde 2026-01) · Software 500000 neto (afecto_iva true, desde 2026-01).

## 8. Configuración

Formato: clave = valor por defecto (opciones).
- Generales: pais = CL (CL, PE, MX) · moneda = CLP · decimales_moneda = 0 · zona_horaria = America/Santiago · tasa_iva = 0.19 (PE 0.18, MX 0.16) · prefijo_llave = DEMO `[PREGUNTAR]`.
- Ciclo: largo_glosa = 25 · fecha_documento = fin_de_mes (fija) · advertencias_bloquean = false · indice_provisorio = bloquear_emision (avisar) · indice_dias_carga = 10 al 15 · indice_hora_carga = 08:00.
- Emisión: tolerancia_neto_emision = 1 · espera_emision_seg = 5, 10, 20, 40, 60, 60 · reintentos_transitorios = 3 · aprobacion = una_persona (doble_sobre_monto) · monto_doble_firma = `[PREGUNTAR]` si doble.
- Panel: imputacion_nota_credito = mes_corregido (mes_emision) · inicio_historico = `[PREGUNTAR]`.
- Banco: anclas_extracto = SALDO INICIAL, MONTO · tolerancia_cuadratura = 0 (0.01 con decimales) · llave_extracto = cuenta_numero (numero, fecha_monto_documento).
- Cobranza: holgura_exacta = 2 · holgura_comision_pct = 0.003 · max_facturas_por_abono = 4 · max_abonos_agrupados = 4 · ventana_agrupacion_dias = 45 · saldo_minimo_factura = 1 · antiguedad_desde = emision (vencimiento) · tramos_antiguedad = 30, 60.
- Contabilidad: sistema_prestamo = frances (aleman, al_vencimiento).
- Presupuesto: mes_base = último mes cerrado · ingreso_base = su neto · saldo_inicial = saldo del banco · crecimiento = 0.05 `[SUPUESTO]` · horizonte = diciembre del año en curso · tasa_anticipo = 0.01 `[SUPUESTO]` · desfase_impuesto = 0 (1) · umbral_irregular_pts = 15 · ticket_cliente_nuevo = `[PREGUNTAR]` · saldo_minimo_alerta = 0.
- Opcional: agente_categorias = false.

## 9. Preguntas para el usuario

Las 10 de la guía, en orden (valor por defecto entre paréntesis):
1. ¿En qué país facturas? → `pais` (CL).
2. ¿Qué facturador electrónico usas (Bsale, Wasabil, Nubox u otro)? → adaptador de §2 `[PREGUNTAR]`; mientras tanto, el simulado.
3. ¿Cobras en moneda local, UF o dólares? → `unidad`; define si T-03 aplica.
4. ¿Cuotas mensuales, cobros únicos o ambos? → `periodicidad` (ambos).
5. ¿Tus clientes exigen OC, HES u otra referencia? → `ref_oc`, `ref_hes` (OC).
6. ¿Qué fecha llevan tus facturas? → `fecha_documento` (fin_de_mes).
7. ¿Quién aprueba la emisión? → `aprobacion` (una_persona).
8. ¿Cómo obtienes los movimientos del banco? → `anclas_extracto`, `llave_extracto`.
9. ¿Qué plazo de pago das? → `dias_pago`, `antiguedad_desde` (emision).
10. ¿Qué plan de cuentas usa tu contador? → `plan_cuentas` `[PREGUNTAR]`; sin él, propón uno mínimo y pide aprobación antes de T-10.

Además: prefijo de la llave, inicio del histórico, tax_id propio y del fondo de inversión, fuentes del índice y software contable o de gestión (Chipax, Defontana u otro), si se integra.

## 10. Requisitos de construcción sobre credenciales

- Guarda las credenciales del facturador, del banco y del software contable solo del lado del servidor (en Puente OS, dentro de los workflows); nunca en el código de la app ni en el repositorio.
- Pide cada credencial al usuario cuando la tarea la necesite; nunca la inventes ni la repitas en respuestas o registros.
- Usa el facturador simulado o el ambiente de pruebas del facturador hasta que el usuario confirme por escrito emitir en producción.
- Da a la app solo los permisos que usa cada vista; sueldos y préstamos van en una vista o app aparte, con acceso restringido.
- Pregunta antes de activar tareas programadas, borrar datos o regenerar credenciales.

## 11. Glosario

Cargo: cobro de una línea en un período. Ciclo: cálculo y emisión de un período. Cuenta comercial: área de un cliente con precio propio. DTE / comprobante electrónico / CFDI: documento tributario en Chile / Perú / México. Extracto bancario: cartola (CL), estado de cuenta (MX). Facturador electrónico: emite ante la autoridad (Bsale, Wasabil, Nubox; OSE/PSE en Perú; PAC en México). Folio: número correlativo. HES: hoja de entrada de servicios. Nota de crédito: anula o rebaja una factura. PPM: anticipo mensual de renta (CL). Tesorería: movimientos no operacionales. UF / UDI: índices de reajuste de Chile / México.
