Módulo Contabilidad
En una frase
El núcleo económico-financiero: plan de cuentas, asientos, periodos
contables, facturas (recibidas y emitidas), compromisos y
contratos de gasto (ciclo ADOP), derechos de ingreso, cuenta 413,
estados contables y un motor de reglas (RCF) que contabiliza
automáticamente. Es el módulo más extenso de la plataforma
(contabilidad.py supera las 10.000 líneas).
1. Propósito y alcance
Implementa la contabilidad presupuestaria y financiera del ayuntamiento:
- Plan de cuentas jerárquico y terceros (proveedores/clientes).
- Asientos contables (manuales y automáticos) y periodos (apertura, cierre, liquidación, distribución de resultado, amortización).
- Facturas recibidas (RCF — Registro Contable de Facturas, con integración FACe) y facturas emitidas (con rectificativas).
- Compromisos de gasto y contratos de gasto (ciclo ADOP: Autorización, Disposición, Obligación, Pago) y sus modificaciones.
- Derechos de ingreso (arrendamientos, concesiones…) y cuenta 413 (facturas pendientes de aplicar).
- Estados contables: balance, cuenta de resultados, sumas y saldos, ECPN, EFE, memoria, PMP.
- Motor contable (RCF): reglas + plantillas que generan asientos automáticamente a partir de eventos.
2. Estructura de archivos
app/modules/contabilidad/
├── contabilidad.py # Blueprint principal (~10.500 líneas): terceros, cuentas,
│ # asientos, periodos, cierre, facturas, informes, dashboard
├── rcf.py # Registro Contable de Facturas + FACe
├── configuracion.py # Tablas maestras del motor (reglas, plantillas, tipos)
├── motor_contable.py # Motor que interpreta reglas y genera asientos
├── seed_reglas_sistema.py # Reglas predefinidas del sistema (~29 + legacy)
├── models.py # Modelos del motor (ReglaContable, PlantillaAsiento…)
├── compromisos.py / compromiso_models.py # Compromisos de gasto (ADOP)
├── contratos.py / contrato_models.py # Contratos de gasto
├── contrato_modificaciones.py # Modificaciones de contrato
├── aprobacion_reglas.py / aprobacion_flujo.py # Aprobación configurable + firmas
├── timeline.py # Timeline unificado contratos/compromisos
├── facturas_emitidas.py # Facturas emitidas + rectificativas
├── derechos_ingreso.py / derechos_ingreso_scheduler.py # Derechos de ingreso
├── cuenta_413.py # Cuenta 413 (acreedores pendientes de aplicar)
├── dashboard_departamento.py # KPIs del departamento
├── validacion_tolerancia.py / validacion_desviacion.py # Validaciones de importe
├── sla_facturas.py / liberacion_facturas.py # Acciones MOS
├── factura_pdf.py # Generación de PDF de factura
├── errors.py # Catálogo de errores (CONT-*)
└── servicios/ # servicio_contable, asientos_factura, audit_service…
Blueprint contabilidad_bp registrado con prefijo /api (las rutas cuelgan
de /api/contabilidad/...). Varios archivos auxiliares registran endpoints sobre
ese mismo blueprint.
3. Modelos de datos
3.1 Plan de cuentas y terceros
| Modelo | Tabla | Propósito |
|---|---|---|
PlanContableCuenta |
plan_contable_cuentas |
Cuenta contable jerárquica (padre_id), naturaleza DEBE/HABER, permite_tercero, es_pgc_oficial. |
Tercero |
terceros |
Proveedor/cliente. nif, tipo_tercero, forma_pago, iban/swift cifrados, tipo_iva, retencion_irpf, y cuentas contables asociadas (acreedor/deudor y gasto por defecto). |
3.2 Asientos y periodos
| Modelo | Tabla | Propósito |
|---|---|---|
PeriodoContable |
periodos_contables |
Ejercicio con estado abierto, fechas de apertura/cierre. |
Asiento |
asientos |
Asiento: fecha_asiento, concepto, origen, estado (ABIERTO/PROVISIONAL/DEFINITIVO/FISCALIZADO/BLOQUEADO/ANULADO/REPARADO), numeración (ejercicio, numero_asiento) única, y trazabilidad (evento_contable, regla_contable, origen_id). |
AsientoLinea |
asiento_lineas |
Línea con cuenta_id, debe, haber, tercero_id. |
3.3 Facturas
| Modelo | Tabla | Propósito |
|---|---|---|
Factura / FacturaLinea |
facturas / factura_lineas |
Factura recibida. Estado, fase_contable (A/D/O/P), integración FACe (face_id, DIR3), retenciones, vínculo a propuesta (ud_propuesta_id) y a compromiso_id, estado_tramitacion. |
FacturaAsignacion |
factura_asignaciones |
Responsable asignado para crear la propuesta cuando la factura llega sin ella. |
FacturaEmitida / FacturaEmitidaLinea |
facturas_emitidas / … |
Factura emitida. Serie+numeración, estado (BORRADOR/EMITIDA/COBRADA/RECTIFICADA/ANULADA), rectificativas (factura_origen_id), vínculo a DerechoAIngreso. |
3.4 Compromisos de gasto (ADOP)
| Modelo | Tabla | Propósito |
|---|---|---|
CompromisoGasto |
compromisos_gasto |
Seguimiento del gasto recurrente. tipo (PERIODICO/CERTIFICACIONES/ACUMULATIVO), importe_adjudicado, importe_por_periodo, periodicidad, tolerancia_importe_pct, estado. |
CompromisoAnualidad |
compromisos_anualidades |
Importes por ejercicio: importe_autorizado (fase A), importe_dispuesto (fase D). |
CompromisoPeriodo |
compromisos_periodos |
Calendario de pagos esperados (YYYY-MM). |
CompromisoFactura |
compromisos_facturas |
Vínculo compromiso↔factura (tipo ORDINARIA/REGULARIZACION/COMPLEMENTARIA/FINAL, desviación). |
CompromisoHistorialImporte |
compromisos_historial_importes |
Revisiones de precio con su aprobación. |
3.5 Contratos de gasto
| Modelo | Tabla | Propósito |
|---|---|---|
ContratoGasto |
contratos_gasto |
Contrato 1:1 con una UD. Tipo, procedimiento de contratación, adjudicatario, importes, fechas, prórrogas, responsables, estado. |
ContratoPropuesta |
contratos_propuestas |
Propuestas vinculadas (ORIGINAL/COMPLEMENTARIA/MODIFICATIVA). |
ContratoModificacion |
contratos_modificaciones |
Modificación (REVISION_PRECIO/AMPLIACION_PLAZO/PRORROGA) con flujo de firmas y snapshots. |
ContratoHistoricoPrecio |
contratos_historico_precios |
Línea temporal de precios por periodo. |
ContratoReajuste |
contratos_reajustes |
Diferencia acumulada cuando una modificación retroactiva afecta a periodos ya facturados. |
ContratoAprobacionRegla / …Paso |
contratos_aprobacion_reglas / …pasos |
Reglas de aprobación configurables (qué cargos firman según condiciones). |
3.6 Motor contable (RCF)
| Modelo | Tabla | Propósito |
|---|---|---|
ReglaContable |
reglas_contables |
Regla: cuándo/para qué contabilizar. es_sistema la protege de borrado. |
TipoReglaContable |
tipos_reglas_contables |
Categoría de regla. |
PlantillaAsiento / PlantillaAsientoLinea |
plantillas_asiento / … |
Plantilla versionada con la definicion (JSON: líneas de debe/haber). |
CampoContable / TipoLineaContable |
campos_contables / tipos_linea_contable |
Piezas para definir las líneas de plantilla (importe y origen de cuenta). |
AuditoriaContable / ContabilidadAuditoriaEvento |
auditoria_contable / contabilidad_auditoria_evento |
Doble auditoría del motor (decisión + certificación). |
3.7 Inmovilizado y derechos de ingreso
| Modelo | Tabla | Propósito |
|---|---|---|
ActivoFijo / Amortizacion |
activos_fijos / amortizaciones |
Inmovilizado y su amortización periódica. |
DerechoAIngreso |
derechos_ingreso |
Derecho de cobro 1:1 con UD (arrendamiento, concesión…), con periodicidad y facturación automática/manual. |
DerechoIngresoPeriodo / …Anualidad |
derecho_ingreso_periodos / … |
Vencimientos y distribución plurianual. |
4. El motor contable (RCF)
Es el rasgo más distintivo del módulo: permite contabilizar sin programar, configurando reglas y plantillas.
flowchart TD
EV["Evento de negocio<br/>(factura, fase ADOP, cobro/pago…)"] --> M["MotorContable.contabilizar_evento(regla_id, objeto, modo)"]
M --> R["Resuelve ReglaContable + PlantillaAsiento (versión vigente)"]
R --> C["Construye ContextoContable<br/>(importes y cuentas del objeto)"]
C --> I["Interpreta la plantilla JSON → líneas lógicas (debe/haber)"]
I --> A1["Auditoría del motor (siempre, incluso en 'simular')"]
A1 --> P{modo}
P -- simular --> FIN["No persiste"]
P -- ejecutar --> SC["ServicioContable: valida debe=haber, numera, persiste Asiento"]
SC --> A2["Auditoría contable (certifica el asiento)"]
- Una regla define cuándo/para qué contabilizar; una plantilla (en JSON, versionada) define las líneas de debe/haber y de dónde sale cada cuenta (cuenta fija, clasificación económica, tercero, cuenta bancaria…) y cada importe (base, IVA, IRPF, total…).
- El motor trabaja en dos capas: decisión (
ServicioContabilizacion, enmotor_contable.py) y persistencia (ServicioContable). - Importes negativos → invierte debe/haber (asientos correctivos).
- Modos:
ejecutar,simular(previsualiza sin grabar) yreprocesar. - Doble auditoría:
contabilidad_auditoria_evento(la decisión, siempre) yauditoria_contable(el asiento creado), enlazadas entre sí.
Reglas del sistema
seed_reglas_sistema.py siembra ~29 reglas (recepción/conciliación/reversión
de facturas, apertura/cierre/regularización presupuestaria, pagos a justificar,
cobros/pagos, endoso, compensación, arqueos, recaudación, subvenciones…).
Llevan es_sistema=True: pueden desactivarse y reversionarse, pero no
borrarse. Algunos parámetros de control apuntan a ellas (p. ej.
tesoreria.pj.regla_contable_pago → SYS-PJ-ENT).
Validaciones de importe
- Tolerancia (
validacion_tolerancia.py): comprueba que la factura encaja en la propuesta/contrato. En contratos FIJOS, desviar más del redondeo (0,01 €) es bloqueante. - Desviación (
validacion_desviacion.py): escaladoOK→WARNING→BLOQUEO→BLOQUEO_CRITICO(la factura agota el disponible y exige propuesta complementaria).
5. Endpoints REST
El módulo expone más de 250 rutas bajo /api/contabilidad/. Resumen por área:
| Área | Rutas (ejemplos) | Permiso típico |
|---|---|---|
| Terceros | /terceros, /terceros/<id>, /terceros/rapido, anexos |
contabilidad:terceros:ver / :gestionar |
| Plan de cuentas | /plan-contable, /plan-contable/list, /cuentas-contables/<id>/movimientos |
contabilidad:parametros:gestionar / :asientos:ver |
| Asientos | /asientos, /asientos/<id>/estado, /asientos/definitivizar-masivo, /libro-mayor |
contabilidad:asientos:ver/crear/editar |
| Periodos y cierre | /periodos-contables, /periodos-contables/<id>/cerrar, /cierre/*, /distribucion-resultado/*, /amortizacion/* |
contabilidad:periodo:cierre |
| Facturas recibidas (RCF) | /rcf, /rcf/upload, /rcf/<id>/cambiar-estado, /rcf/<id>/rechazar, /rcf/bandejas |
contabilidad:facturas:ver/crear |
| FACe | /face/consultar, /face/pendientes, /face/procesar/<id>, /face/devolver/<id> |
contabilidad:facturas:crear / :procesar_face |
| Vinculación factura↔propuesta | /facturas/<id>/vincular-propuesta, /vinculaciones-pendientes, /facturas/<id>/confirmar-conciliacion |
contabilidad:facturas:crear |
| Cuenta 413 | /413/resumen, /413/facturas, /413/<id>/devolver-proveedor, /413/<id>/vincular-y-conciliar |
contabilidad:facturas:ver/crear |
| Facturas emitidas | /facturas-emitidas, /emitir, /anular, /marcar-cobrada, /rectificativa, /pdf |
contabilidad:facturas:ver/crear |
| Derechos de ingreso | /derechos-ingreso, /generar-periodos, /facturar-periodo/<pid>, /prorrogar |
contabilidad:facturas:ver/crear |
| Compromisos | /compromisos, /activar, /revision-precio, /vincular-factura, /timeline |
contabilidad:facturas:ver/crear |
| Contratos y modificaciones | /contratos, /contratos/<id>/modificaciones, /enviar-aprobacion, /aprobar, /timeline |
expediente:ver/crear, contabilidad:contratos:aprobar_modificaciones |
| Reglas de aprobación | /aprobacion-reglas (CRUD) |
expediente:ver, admin:gestionar_usuarios |
| Informes / estados | /informes/sumas-y-saldos, /balance_situacion, /cuenta_resultados, /ecpn, /efe, /pmp, /memoria/* (con export CSV/PDF) |
contabilidad:informes:ver |
| Dashboard / stats | /stats/dashboard-kpis, /stats/interventor-dashboard, /dashboard/departamento |
contabilidad:informes:ver / :dashboard:departamento |
| Configuración del motor | /tablas/tipos_regla, /tablas/reglas, /tablas/plantillas, /tablas/tipos-linea, /tablas/campos, /auditoria/* |
contabilidad:configuracion:gestionar |
| IA | /ia/explicar-balance, /ia/explicar-ecpn, /ia/explicar-efe, /memoria/seccion/<id>/generar-ia |
contabilidad:informes:ver |
6. El ciclo del gasto (ADOP) y los contratos
flowchart LR
PR["Propuesta de gasto (UD)"] -->|Autorización A| CO["Compromiso / Contrato"]
CO -->|Disposición D| CO
FA["Factura recibida"] -->|Obligación O| CO
FA -->|Pago P| TES["Tesorería"]
- Propuesta de gasto (UD del módulo Documental) → autoriza el gasto (A).
- Compromiso / Contrato → dispone el crédito (D); al crear un compromiso
activo se invoca
ServicioPresupuestario.disponer_credito(). - Factura vinculada → reconoce la obligación (O); su pago en Tesorería cierra la fase P.
- Las modificaciones de contrato (revisión de precio, ampliación de plazo,
prórroga) siguen un flujo de aprobación configurable por reglas
(
ContratoAprobacionRegla) que se materializa en el sistema genérico de firmas (resource_type='CONTRATO_MODIFICACION'). Al firmar el último paso,aplicar_aprobacion_completa()aplica los efectos (nuevo precio, nuevas fechas, reajustes retroactivos) y actualiza el histórico de precios.
Relación con Presupuesto
Cada evento contable tiene su contrapartida presupuestaria mediante
MovimientoPresupuestario (fases A/D/O/P/DR/C), gestionada por
ServicioPresupuestario. Ver el módulo Presupuesto (pendiente de documentar).
7. Permisos y roles
~27 permisos contabilidad:*. Principales:
| Categoría | Permisos |
|---|---|
| Terceros | contabilidad:terceros:ver, :gestionar (y admin:gestionar_terceros). |
| Facturas | contabilidad:facturas:ver, :crear, :procesar_face. |
| Asientos | contabilidad:asientos:ver, :crear, :editar. |
| Periodos | contabilidad:periodo:cierre. |
| Compromisos / contratos | contabilidad:compromisos:ver, contabilidad:contratos:aprobar_modificaciones. |
| Informes / dashboard | contabilidad:informes:ver, contabilidad:dashboard:departamento. |
| Parámetros / motor | contabilidad:parametros:gestionar, contabilidad:configuracion:gestionar, :auditoria:ver. |
| Conciliación / reproceso | contabilidad:conciliacion:ver, contabilidad:reprocesar. |
Roles base con peso contable: Interventor y Jefe de Contabilidad (reciben el grueso de los permisos operativos y de tablas del motor).
8. Integraciones
MOS — crons y acciones
| Acción | Cuándo | Función |
|---|---|---|
contabilidad.sla_facturas_sin_propuesta |
diario | Escala facturas en cuenta 413 sin propuesta según umbral de días/importe. |
contabilidad.sla_facturas_retenidas |
diario | Escala facturas retenidas (avisa a Jefatura e Interventor). |
contabilidad.revisar_facturas_retenidas |
tras aprobar propuesta complementaria | Libera facturas retenidas si aumenta el disponible del compromiso. |
contabilidad.facturar_derechos |
programado | Genera borradores de factura emitida de los derechos de ingreso que vencen. |
Además, eventos de auditoría en todas las operaciones relevantes
(FACTURA_EMITIDA_*, DERECHO_INGRESO_*, COMPROMISO_*, CONTRATO_*…).
Otros módulos y sistemas externos
- Documental: propuestas de gasto, contratos y derechos de ingreso son UDs; las modificaciones de contrato usan el sistema genérico de firmas.
- Presupuesto:
MovimientoPresupuestarioyServicioPresupuestario. - Tesorería: órdenes de pago y cobros enlazan con facturas.
- FACe: recepción de facturas electrónicas (vía RedSARA, con DIR3).
- Google Gemini: explicación de estados contables y generación de memoria.