CLI local (Chile-first) para conciliación bancaria con enfoque fail-closed, auditabilidad y salidas deterministas.
Entradas (por cliente) Proceso (core) Salidas (por corrida = run_dir)
config_cliente.yaml ┐ ┌─ run.json (resultado técnico + contrato)
banco.csv|xlsx|xml|pdf ├─> ingestión -> normalización -> matching -> ├─ audit.jsonl (traza append-only, JSON Lines)
esperados.csv|xlsx ┘ validación estricta + auditoría └─ reporte_conciliacion.xlsx (opcional; revisión humana)
Diagrama completo: ver Arquitectura / Flujo General (SVG) mas abajo.
Puntos no negociables:
- Fail-closed: ante ambigüedad o baja confianza, el sistema no autoconcilia.
- Sin errores silenciosos: validación estricta; errores explícitos.
-
Auditable: evidencia técnica (
run.json,audit.jsonl, XLSX). -
Determinista: misma entrada → mismo
run.json(sin timestamps variables).
Nota: el archivo fuente (docs/diagrams/conciliador_architecture.puml) es la fuente de verdad. El SVG se genera
localmente con PlantUML (ver docs/diagrams/RENDERING.md).
- Concilia movimientos del banco (cartola/extracto) contra movimientos esperados (ERP/planilla/registros internos).
- Genera matches y hallazgos (pendientes, advertencias, riesgos) con explicación.
- Produce artefactos reproducibles para cierre mensual y auditoría.
- No se conecta a bancos, no descarga datos, no usa APIs bancarias.
- No es un ERP ni “reemplaza” criterio contable.
- No “adivina” para maximizar autoconciliación (por diseño, prioriza control de daño).
- No es SaaS: no hay telemetría ni envío de datos (todo corre local).
Este core está diseñado para no autoconciliar cuando el riesgo de error sube o la evidencia es insuficiente. En esos casos genera hallazgos y deja trazabilidad en run.json y audit.jsonl para revisión humana.
Ejemplos comunes:
- Pago parcial: 1 factura pagada en 2+ transferencias.
- Si el ERP entrega 2+ movimientos esperados (granularidad real de pago), el core puede conciliar cada transferencia contra su esperado (si no hay ambigüedad).
- Si el ERP entrega 1 esperado por el total y el banco trae 2+ abonos, el core no hace split/merge automático: queda como pendiente/hallazgo (fail-closed).
- Pago agrupado: 2+ facturas pagadas con 1 transferencia (N esperados vs 1 banco). El core no agrupa automáticamente: requiere revisión.
- Comisiones/retenciones/redondeos: si el monto bancario no calza exactamente con el esperado, se reporta discrepancia (no auto-match).
- Reversas/chargebacks/abonos correctivos: se preservan como eventos separados; si generan ambigüedad, quedan como hallazgos.
- OCR (PDF escaneado): siempre baja confianza y por defecto no autoconcilia.
Si estos casos aparecen de forma recurrente y tu problema pasa a ser tiempo humano de revisión, revisa la sección Premium (este repo mantiene el core conservador por diseño).
-
concilia init: genera plantillas por cliente (config + CSVs ejemplo). -
concilia validate: valida inputs (formato + parseo real) antes de correr. -
concilia run: ejecuta pipeline end-to-end y persiste artefactos tecnicos enrun_dir(run.json,audit.jsonl, XLSX opcional). -
concilia explain: inspecciona un match/hallazgo puntual desderun.json(fail-closed si el contrato es invalido).
# Desde PyPI (recomendado):
pipx install bankrecon
# Desde el repo (desarrollo):
pipx install .
concilia --helpOCR (opcional para PDFs escaneados):
pipx inject bankrecon pdf2image pytesseract PillowFlujo recomendado (primera vez):
flowchart TB
i[concilia init] --> v[concilia validate]
v --> d[concilia run --dry-run]
d --> r[concilia run]
r --> e[concilia explain]
concilia init --out-dir .\mi_clienteEsto crea plantillas:
.\mi_cliente\config_cliente.yaml.\mi_cliente\banco.csv.\mi_cliente\movimientos_esperados.csv
concilia validate --config .\mi_cliente\config_cliente.yaml --bank .\mi_cliente\banco.csv --expected .\mi_cliente\movimientos_esperados.csvconcilia run --config .\mi_cliente\config_cliente.yaml --bank .\mi_cliente\banco.csv --expected .\mi_cliente\movimientos_esperados.csv --out .\salida --dry-runLuego, para generar XLSX:
concilia run --config .\mi_cliente\config_cliente.yaml --bank .\mi_cliente\banco.csv --expected .\mi_cliente\movimientos_esperados.csv --out .\salidaconcilia explain --run-dir .\salida M-<match_id>
concilia explain --run-dir .\salida H-<hallazgo_id>- Banco: CSV / XLSX / XML / PDF (texto).
- PDF escaneado: solo con OCR habilitado (opcional) y siempre con política conservadora (no autoconcilia).
- Movimientos esperados: CSV / XLSX.
Este repo tiene guardrails para bloquear regresiones:
- Formato: Black
- Lint: Ruff
- SAST: Bandit
- SCA (supply-chain): pip-audit (vulnerabilidades en dependencias; ver
.pip-audit-ignore.txt) - SAST semántico: Semgrep (corre en CI sobre Ubuntu; en Windows requiere Docker/WSL)
- Tests: pytest (incluye tests “golden” para outputs contractuales)
Comandos locales:
python -m pip install -e ".[dev]"
python -m black --check src tests tools
python -m ruff check src tests tools
python -m bandit -c .bandit.yml -r src
python tools/pip_audit_gate.py
python -m pytest -qSemgrep (opcional local):
# Requiere Docker o WSL2; en CI ya está integrado.
docker run --rm -v "${PWD}:/src" -w /src returntocorp/semgrep:1.95.0 semgrep scan --config .semgrep.yml --error --metrics=off srcEl artefacto run.json es un contrato versionado para consumo por herramientas externas (incluyendo premium).
- Especificación:
docs/contract_run_json.md - Glosario de términos:
GLOSARIO.md
Este repo trata la UX del CLI como un contrato verificable: ante ambiguedad o baja confianza, el core no autoconcilia, y siempre deja evidencia.
- Contratos:
docs/ux_contracts.md - Tests de contrato (referencia):
tests/test_e2e_cli.py,tests/test_golden_datasets.py,tests/test_audit_contract.py
Empiece aquí:
Referencia:
docs/guia_contadores.mddocs/guia_tecnica.mddocs/agregar_formato.mddocs/contract_run_json.mddocs/ux_contracts.mdwalkthrough.mdmvp_checklist.md
- Estudios contables (persona principal: contador/a tradicional, multi-cliente, Excel-first), PyMEs y equipos que necesitan un flujo reproducible de conciliación con evidencia.
- Usuarios no técnicos o semi-técnicos que puedan ejecutar comandos y preparar archivos (CSV/XLSX/PDF).
- Quien busca integración automática con bancos, sincronización online o una UI gráfica.
- Quien necesita maximizar “auto-match” a costa de riesgo (este proyecto prefiere conservadurismo).
MVP funcional:
-
concilia init,validate,run,explainoperativos. - Ingestión para CSV/XLSX/XML/PDF texto; OCR opcional.
- Salidas:
run.json,audit.jsonl,reporte_conciliacion.xlsx.
Roadmap (alto nivel, sin promesas de fecha):
- Endurecer compatibilidad por formatos bancarios reales (sin romper contrato).
- Mejoras de ergonomía y documentación operativa.
- Source of truth:
src/conciliador_bancario/version.py - Historial de cambios:
CHANGELOG.md - Política (repo público): cada merge a
mainhace bump automático depatch, crea tagvX.Y.Zy (si está configurado) publica en PyPI.
Este repo OSS se mantiene intencionalmente conservador (fail-closed) y enfocado en riesgo/auditoría. El Premium (repo separado) está diseñado para capas de productividad que ahorran tiempo humano recurrente, sin cambiar la fuente de verdad del core: consume el run_dir (run.json, audit.jsonl, XLSX técnico) y trabaja sobre evidencia.
Ejemplos de problemas que típicamente empujan a Premium:
- Resolución asistida de casos N↔1 (pagos parciales y pagos agrupados), con agrupación y trazabilidad defendible.
- Paquetes de reglas específicas por banco/ERP (reducción de fricción operacional) sin meter heurísticas frágiles en el core.
- Heurísticas de auto-match más agresivas, pero controladas por umbrales, reglas explícitas y auditoría.
- Reportes ejecutivos/listos para cliente y flujos operativos multi-cliente (automatización y presentación).
Referencia (diseño; no implementado en este repo):
- Roadmap:
docs/premium_roadmap.md - Arquitectura:
docs/premium_architecture.md - Licensing:
docs/premium_licensing.md
Built and maintained by Carlos Ortega — automation, data systems, and web technical hygiene consulting. Portfolio and services: tooltician.com.