Skip to main content

Conciliador Bancario (MVP)

CLI local (Chile-first) para conciliación bancaria con enfoque fail-closed, auditabilidad y salidas deterministas.

CI PyPI Python Licencia


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

Arquitectura del Conciliador Bancario

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 en run_dir (run.json, audit.jsonl, XLSX opcional).
  • concilia explain: inspecciona un match/hallazgo puntual desde run.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
  • Tipos: mypy (src, cero errores; ver [tool.mypy])
  • 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)

El escaneo de supply-chain cubre todo lo que el repo declara: el entorno instalado (runtime + dev) y, por separado, cada extra opcional de pyproject.toml. Los extras se auditan aparte a proposito: no se instalan en el job de tests, y si no se escanean explicitamente quedan fuera del alcance del gate. Eso ya paso una vez, con Pillow en el extra pdf-ocr, que llego a tener 33 vulnerabilidades conocidas mientras el gate reportaba limpio. Un gate que no mira algo no es un gate sobre ese algo.

Comandos locales:

python -m pip install -e ".[dev]"

python -m black --check src tests tools
python -m ruff check src tests tools
python -m mypy src
python -m bandit -c .bandit.yml -r src
python tools/pip_audit_gate.py            # entorno + extras
python tools/pip_audit_gate.py --solo-extras   # solo los extras
python -m pytest -q

SBOM (PEP 770)

El wheel incluye un SBOM CycloneDX en bankrecon-*.dist-info/sboms/bankrecon.cdx.json, la ubicación que standardize PEP 770, de modo que los consumidores obtienen el inventario sin instalar el paquete ni resolver dependencias.

Alcance, deliberadamente acotado: contiene las dependencias runtime directas con sus versiones exactas, y nada más. El árbol transitivo completo no se incluye, porque dependería de una resolución concreta y se volvería viejo en silencio. Quien necesite el árbol completo tiene dos fuentes en este repo: requirements.txt con los pines directos, y pip-audit en CI, que resuelve e inspecciona el entorno entero.

tests/test_sbom.py falla si el SBOM se desincroniza de requirements.txt, si aparece un timestamp/serialNumber (rompería el determinismo del build) o si el pin de hatchling baja de la versión que soporta sbom-files.

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.md
  • docs/guia_tecnica.md
  • docs/agregar_formato.md
  • docs/contract_run_json.md
  • docs/ux_contracts.md
  • walkthrough.md
  • mvp_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, explain operativos.
  • 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 main hace bump automático de patch, crea tag vX.Y.Z y (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

Built and maintained by Carlos Ortega — automation, data systems, and web technical hygiene consulting. Portfolio and services: tooltician.com.

Metadata

Release files for bankrecon 0.5.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for bankrecon 0.5.0
File Size Uploaded
bankrecon-0.5.0.tar.gz 425.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for bankrecon 0.5.0
File Interpreter ABI Platform
bankrecon-0.5.0-py3-none-any.whl Python 3 none any Details

Total release size: 519.0 kB

Release files / bankrecon-0.5.0.tar.gz

Download URL bankrecon-0.5.0.tar.gz
Size 425.5 kB
Tags Source
SHA-256 checksum
How to use checksums
3e73705029d324221de39e1a5e42f8008a385aafb0346ab945bcb33a8544f4d9
BLAKE2b-256 checksum
How to use checksums
a20094514b8ebcff6cdcc1161c58b4e8460bfda3d10383876a429542050eea25
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release files / bankrecon-0.5.0-py3-none-any.whl

Download URL bankrecon-0.5.0-py3-none-any.whl
Size 93.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a91cc7dcbcfefbd6554f8f8a5323c1277447eb16b59387b30db63a4f5f39d624
BLAKE2b-256 checksum
How to use checksums
dcc6fda7eb1bda689dd618dc5028b2201d9bdf51847c67a415406bc77084e920
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 1, 2026.

Transparency log

Release history Release notifications | RSS feed

0.5.1

2 release files

This release

0.5.0 This release

2 release files

0.3.2

2 release files

0.3.1

2 release files

0.3.0

2 release files

0.2.21

2 release files

0.2.20

2 release files

0.2.19

2 release files

0.2.18

2 release files

0.2.17

2 release files

0.2.16

2 release files

0.2.14

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page