CLI local para conciliacion bancaria (Chile-first) con auditoria y enfoque fail-closed.
Project description
Conciliador Bancario (MVP)
CLI local (Chile-first) para conciliación bancaria con enfoque fail-closed, auditabilidad y salidas deterministas.
Vista rápida (inputs → proceso → outputs)
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).
Arquitectura / Flujo General
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).
Qué hace (y qué no)
Qué hace
- 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.
Qué NO hace
- 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).
Casos borde (comportamiento fail-closed)
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).
Quick Start (5 minutos)
Modelo mental del CLI
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).
1) Instalar (pipx, recomendado)
# Desde PyPI (recomendado):
pipx install bankrecon
# Desde el repo (desarrollo):
pipx install .
concilia --help
OCR (opcional para PDFs escaneados):
pipx inject bankrecon pdf2image pytesseract Pillow
Flujo 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]
2) Inicializar un “cliente”
concilia init --out-dir .\mi_cliente
Esto crea plantillas:
.\mi_cliente\config_cliente.yaml.\mi_cliente\banco.csv.\mi_cliente\movimientos_esperados.csv
3) Validar inputs (antes de correr)
concilia validate --config .\mi_cliente\config_cliente.yaml --bank .\mi_cliente\banco.csv --expected .\mi_cliente\movimientos_esperados.csv
4) Ejecutar (modo seguro primero)
concilia run --config .\mi_cliente\config_cliente.yaml --bank .\mi_cliente\banco.csv --expected .\mi_cliente\movimientos_esperados.csv --out .\salida --dry-run
Luego, para generar XLSX:
concilia run --config .\mi_cliente\config_cliente.yaml --bank .\mi_cliente\banco.csv --expected .\mi_cliente\movimientos_esperados.csv --out .\salida
5) Explicar un caso puntual
concilia explain --run-dir .\salida M-<match_id>
concilia explain --run-dir .\salida H-<hallazgo_id>
Formatos soportados (MVP)
- 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.
Calidad y confianza (lo que mira CI)
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 -q
Semgrep (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 src
Contratos y artefactos (Core → Premium)
El 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
UX Contracts (anti-regresion)
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
Documentación
Empiece aquí:
Referencia:
docs/guia_contadores.mddocs/guia_tecnica.mddocs/agregar_formato.mddocs/contract_run_json.mddocs/ux_contracts.mdwalkthrough.mdmvp_checklist.md
Público objetivo
Sí
- 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).
No
- 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).
Estado del proyecto
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.
Versionado y releases
- 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.
Premium (opcional)
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file bankrecon-0.2.14.tar.gz.
File metadata
- Download URL: bankrecon-0.2.14.tar.gz
- Upload date:
- Size: 2.0 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
660d79b9d864a30dda3c19d33fd298b58888917795e45df985e7ddd7c6abc428
|
|
| MD5 |
b9e632a50c7f038c3adba457d0c7c53a
|
|
| BLAKE2b-256 |
fb5ee199f5ee7e61a3ed709bb10242ae4a18112bed83b9c38e746a37de78d5aa
|
Provenance
The following attestation bundles were made for bankrecon-0.2.14.tar.gz:
Publisher:
publish.yml on cortega26/conciliador_bancario
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bankrecon-0.2.14.tar.gz -
Subject digest:
660d79b9d864a30dda3c19d33fd298b58888917795e45df985e7ddd7c6abc428 - Sigstore transparency entry: 940543544
- Sigstore integration time:
-
Permalink:
cortega26/conciliador_bancario@f5e1063bec4aa4d6d19e850a418861605a03629c -
Branch / Tag:
refs/tags/v0.2.14 - Owner: https://github.com/cortega26
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f5e1063bec4aa4d6d19e850a418861605a03629c -
Trigger Event:
push
-
Statement type:
File details
Details for the file bankrecon-0.2.14-py3-none-any.whl.
File metadata
- Download URL: bankrecon-0.2.14-py3-none-any.whl
- Upload date:
- Size: 47.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dfe2639eca9acaa571f04a1bae6d712e787e626137a8426dc1d9306a9a5f4bd
|
|
| MD5 |
d8ec86126d1ed2db3f855777f517a14e
|
|
| BLAKE2b-256 |
667c740cff675df0e4af63d8440d2432093ceb34c6ec801d17959ad5b14afe35
|
Provenance
The following attestation bundles were made for bankrecon-0.2.14-py3-none-any.whl:
Publisher:
publish.yml on cortega26/conciliador_bancario
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
bankrecon-0.2.14-py3-none-any.whl -
Subject digest:
3dfe2639eca9acaa571f04a1bae6d712e787e626137a8426dc1d9306a9a5f4bd - Sigstore transparency entry: 940543572
- Sigstore integration time:
-
Permalink:
cortega26/conciliador_bancario@f5e1063bec4aa4d6d19e850a418861605a03629c -
Branch / Tag:
refs/tags/v0.2.14 - Owner: https://github.com/cortega26
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@f5e1063bec4aa4d6d19e850a418861605a03629c -
Trigger Event:
push
-
Statement type: