Contabilidad de Matriz, propuesta técnica
Héctor: esto es lo que hay que programar para el segundo módulo de Matriz, el de contabilidad. Lee los bancos de una empresa, recoge sus facturas, propone a qué factura corresponde cada movimiento y deja la contabilidad lista para su ERP o para su gestoría; en una fase posterior emite facturas con Verifactu. Se instala por cliente, con varias sociedades dentro, y se conecta con MailDraft.
Alcance
El módulo cubre la contabilidad del día a día de una empresa de 20 a 200 personas. No presenta impuestos ni lleva almacén.
Cada empresa trabaja en uno de dos modos. Con ERP: su ERP sigue siendo el sistema fiscal, y el módulo concilia, prepara y le pasa asientos. Sin ERP: el módulo lleva el libro y emite las facturas.
| Fase | Qué entra | Piloto |
|---|---|---|
| 1 · Con ERP, por fichero | Empresas y usuarios, bancos, facturas recibidas, conciliación, libro diario, cierre y exportación a la gestoría, conexión con el correo | Cliente A, que lleva a3 en su gestoría |
| 2 · ERP por API | Leer maestros y facturas de a3ERP; escribirle asientos, cobros y pagos | Cliente B, que trabaja con a3ERP |
| 3 · Facturar | Facturas emitidas con Verifactu y sus vencimientos de cobro | Concreto Abstracto |
| 4 · Sin ERP | Cierre de ejercicio, carga inicial desde el ERP anterior y factura electrónica entre empresas | por elegir |
El orden de las fases y los pilotos están propuestos, sin cerrar. Los dos clientes piloto van aquí sin nombre, como A y B.
Cómo se entrega. Una instalación por cliente, con su base de datos y su contrato de Enable Banking, y varias sociedades dentro. Se cobra una cuota al mes. El mismo código se usa solo o como sección de la plataforma que el cliente ya tiene.
Queda fuera:
- presentar modelos fiscales (303, 111, 115, 347, 349), el SII y las cuentas anuales: los presenta la gestoría con las cifras que le da el módulo;
- almacén, pedidos, albaranes y circuitos de venta;
- calcular nóminas: solo se importa su resumen mensual;
- ordenar pagos o remesas desde el módulo: el banco es de solo lectura;
- TicketBAI, IGIC, recargo de equivalencia y cuentas en otra moneda;
- otros ERP (Sage, Holded, Odoo): entran después, por la misma puerta que a3ERP.
Conectividad
El módulo habla con ocho sistemas y solo escribe fuera en tres: el ERP, la AEAT y el correo, donde deja borradores.
A la izquierda, lo que entra; a la derecha, lo que sale; abajo, los dos servicios en los que se apoya. Las flechas con dos puntas son conexiones de ida y vuelta.
| Sistema | Sentido | Cómo | Cuándo | Si falla |
|---|---|---|---|---|
| Bancos | lee | Enable Banking: API REST con JWT firmado; el usuario autoriza en su banca | cada día y a petición | esa cuenta queda con su error y las demás siguen; se ofrece el extracto |
| Extractos | lee | Norma 43, o Excel con asistente de columnas | al subirlo o al llegar por correo | se rechaza el fichero que no cuadra y se dice por qué |
| Correo | lee y deja borradores | eventos y API entre módulos, con MailDraft o con el buzón propio | al llegar cada correo | la factura se sube a mano |
| ERP | lee; añade asientos, cobros y pagos | a3ERP: API REST en el servidor del cliente, o fichero SUENLACE.DAT | programado y al cerrar | cola con reintento; nada se duplica |
| AEAT | envía registros | servicio web de Verifactu, con certificado | al expedir cada factura | cola con reintento; la factura enseña su estado |
| Gestoría | exporta | CSV, ZIP y SUENLACE.DAT; además, un usuario de solo lectura | al cerrar mes o trimestre | el paquete se vuelve a generar |
| IA | envía el documento y recibe campos | API del modelo, con salida estructurada | al entrar una factura en PDF o en foto | alta a mano |
| Plataforma del cliente | acceso único y enlaces | API del módulo y sesión compartida | siempre | el módulo sigue funcionando solo |
Bancos: Enable Banking
- Autenticación. Cada llamada lleva un JWT RS256 de una hora firmado con la clave privada de la aplicación:
kides el id de la aplicación,issesenablebanking.comyaud,api.enablebanking.com. - Flujo.
GET /aspsps?country=ESda los bancos; se enseñan los que admitenpsu_type: business.POST /authcon el banco,valid_until, unstatede un solo uso y la dirección de vuelta devuelve la URL del banco. El usuario autoriza allí y vuelve con uncode.POST /sessionslo cambia por la sesión y sus cuentas. Después,GET /accounts/{uid}/balancesyGET /accounts/{uid}/transactions, paginado concontinuation_key. - Consentimiento. Dura lo que diga
maximum_consent_validityde cada banco: 180 días en la mayoría. Un 401 o un 403 al leer significa sesión caducada. Renovar es volver a autorizar, y tiene que conservar la cuenta y sus movimientos. - Histórico. En la hora siguiente a la autorización la mayoría de los bancos dan un año o más; después, muchos limitan a 90 días. La primera lectura pide todo.
- Límite. Sin el usuario delante, muchos bancos admiten unas cuatro consultas al día (429,
ASPSP_RATE_LIMIT_EXCEEDED). Leer saldo y movimientos de una cuenta gasta dos. - Una sola vez. Cada movimiento se identifica por
entry_referenceotransaction_id. Si faltan, por una huella de fecha, importe, concepto e IBAN. Solo se guardan los movimientos firmes (BOOK). - Producción. La aplicación se activa con contrato y revisión de la empresa, o en modo restringido enlazando las cuentas propias. Pide política de privacidad, condiciones y un correo de protección de datos. Cobra por volumen, con un mínimo al mes que no publica.
- Visto en el cliente A. CaixaBank, Bankinter, Banca March e Ibercaja conectan. Una cuenta de BBVA falla con «Error interacting with ASPSP». Santander y Sabadell, que pasan por Redsys, no dejan entrar al usuario de empresa. Para esos, extracto.
Extractos: Norma 43
- Texto de ancho fijo en Windows-1252. Registros 11 (cabecera de cuenta), 22 (movimiento), 23 (conceptos), 33 (final de cuenta) y 88. Fechas AAMMDD; la clave 1 es un cargo.
- Se comprueba que el saldo inicial más los movimientos da el final. Si no, no se carga.
- La cuenta se localiza por entidad, oficina y número.
- Un movimiento que ya entró por Enable Banking no puede entrar otra vez por el extracto: hace falta una identidad común a las dos vías. En lo que hay hecho no existe.
Correo: MailDraft
Es el contrato entre los dos módulos. La forma es una propuesta para cerrarla contigo.
| Sentido | Qué | Forma propuesta |
|---|---|---|
| Correo → contabilidad | Un adjunto que parece una factura (PDF, o Facturae en .xml o .xsig) llega a un buzón marcado «de facturas» | Evento con remitente, asunto, hilo, huella SHA-256 y el archivo |
| Correo → contabilidad | Un adjunto en Norma 43 | El mismo evento; contabilidad lo valida y lo carga |
| Correo → contabilidad | El usuario pulsa «Pasar a facturas» en cualquier correo | El mismo evento, lanzado a mano |
| Contabilidad → correo | Los hilos de un proveedor o de un cliente | Consulta por dirección o por dominio |
| Contabilidad → correo | Un borrador: enviar una factura, reclamar un cobro o pedir una factura que falta | Alta de borrador con destinatario, contexto y adjunto; el usuario lo revisa y lo envía |
| Los dos | Identidad | Un solo inicio de sesión; cada buzón pertenece a una empresa |
Sin MailDraft, el módulo tiene su propio buzón de facturas: una dirección a la que reenviar.
ERP: a3ERP
- API. Un servicio de Windows en el servidor del cliente; pide a3ERP 14 o posterior y el diccionario JNCAPI.
POST /api/logincon un usuario de a3ERP devuelve un token. - Qué ofrece. Maestros en
/api/maestro/{clientes, proveedores, cuentas, bancos, formaspago}. Facturas en/api/documento/{tipo}. Asientos:GET /api/asientosyPOST /api/asientos/crear, con fecha, tipo, diario y los apuntes (cuenta, debe y haber). Cobrar y pagar vencimientos en/api/cartera/cobrary/api/cartera/pagar. - Solo se añade. La API también modifica y borra. El adaptador no tiene esas operaciones.
- Destino explícito. Primero, la empresa de pruebas, que es una copia de la real dentro de a3ERP. Se asienta el mismo periodo a mano y con el módulo, y hasta que no dan lo mismo no se apunta a la real.
- Sin duplicar. Cada asiento lleva la referencia del módulo, y el módulo guarda el identificador que devuelve a3ERP.
- Por fichero. Para quien no tenga la API: SUENLACE.DAT, registros de 512 bytes en Windows-1252 (tipo 0, apunte; 1 y 2, factura y rectificativa; 9, detalle de IVA; C, alta de cuenta). Lo importa el a3 de la gestoría, no a3ERP.
- Sin confirmar. De quién es esa API (Wolters Kluwer o un distribuidor), qué cuesta y cómo se llega al servidor del cliente sin abrirle puertos. Lo natural sería un agente local que llame hacia fuera.
AEAT: Verifactu
- Por cada factura, un registro de alta, y uno de anulación si se anula, con huella SHA-256 encadenada al registro anterior.
- En el modo VERI*FACTU el registro se envía a la AEAT al expedir. La factura lleva el código QR y la leyenda.
- Una factura expedida no se edita ni se borra: se rectifica o se anula.
- El productor del programa firma una declaración responsable, visible dentro de la aplicación.
- Calendario. En el BOE, el uso obliga a las sociedades desde el 1 de enero de 2027 y al resto desde el 1 de julio de 2027. Hacienda anunció en octubre que lo llevaría a octubre de 2028; a primeros de noviembre no estaba publicado. Las obligaciones del productor ya están en vigor.
Plataforma del cliente
- El módulo expone su propia API, documentada, para todo lo que hace su interfaz.
- La plataforma de un cliente lo monta como una sección: acceso único, enlaces a cada pantalla y sus propias dimensiones de análisis (centro, proyecto, barco o puerto).
- Avisos de salida para quien quiera reaccionar: factura confirmada, movimiento conciliado, mes cerrado.
Funcionalidades
Son doce áreas. Cada una tiene una regla que no se rompe, y esa regla es lo primero que hay que respetar al programarla.
El detalle, requisito a requisito y con su identificador, está en Requisitos.
| Área | Qué hace | La regla que no se rompe |
|---|---|---|
| Empresas y usuarios | Varias sociedades por instalación. Alta guiada: datos fiscales, ejercicio, modo, plan de cuentas, tipos de IVA y de retención con sus cuentas. Papeles de dirección, contabilidad, gestoría y consulta. Dimensiones de análisis que define cada empresa | Cada dato lleva su empresa. Nada del cliente vive en el código |
| Bancos | Conectar, leer cada día, cargar extractos, renovar el consentimiento y ver la salud de cada conexión | Un movimiento entra una sola vez. Nunca se piden ni se guardan las claves del banco |
| Facturas recibidas | Entran por correo, foto, PDF, Facturae o a mano. Se leen, se comprueban y se revisan con el documento al lado. Proveedor reconocido, vencimientos y aprobación opcional por importe | Ninguna se contabiliza sin que una persona la confirme. El original se guarda siempre |
| Conciliación | Cada movimiento llega con su propuesta y su motivo. Pagos y cobros, uno a varios y varios a uno. Reglas para lo que no es factura. Liquidaciones de TPV y pasarelas. Cola «Por resolver» | Lo que una persona puso a mano no lo cambia ninguna regla |
| Libro diario | Partida doble. Asiento automático de cada factura, pago y cobro. Asientos a mano y plantillas. Mayor, balance de sumas y saldos y extracto de un tercero | Lo enviado al ERP o de un mes cerrado no se toca: se corrige con otro asiento |
| ERP | Una puerta común y un adaptador por ERP. a3ERP por API o por fichero. Maestros desde Excel con pasada en seco y cola de dudosos | Solo se añade. El destino es explícito. Reenviar no duplica |
| Facturación | Series, facturas completas, simplificadas y rectificativas, Verifactu y vencimientos de cobro. Solo en el modo sin ERP | Una factura expedida no se edita: se rectifica o se anula |
| Cierre y gestoría | Cierre de mes y de trimestre. Libros de recibidas, emitidas, diario y banco. Cifras del periodo para los impuestos. Exportación de toda la empresa | Un mes se cierra cuando ha terminado y no le queda nada pendiente |
| Panel | Lo de hoy, previsión de caja a 30, 60 y 90 días, ingresos y gastos frente al periodo anterior, rentabilidad por dimensión y preguntas a las cuentas en un chat | Toda cifra enlaza con los apuntes de los que sale |
| Correo | Facturas y extractos que llegan solos, hilos en la ficha de cada tercero y borradores desde contabilidad | Ningún correo sale sin que el usuario lo envíe |
| Interfaz | La familia de MailDraft en la dirección Mesa: inicio por tareas, modo foco, chat y los movimientos en bandeja o en tabla. Todo con el teclado. Accesible según WCAG 2.2 AA. Español e inglés | Lo reversible se deshace. Solo lo irreversible pide confirmación |
| Implantación | Plantilla de instalación, versiones que se aplican a todos los clientes, lista de lo que hay que pedir al cliente y a su gestoría, carga inicial y cuota | Entorno de pruebas y real por cada destino. Ningún valor por defecto apunta al real |
Cómo propone el cruce
Es el corazón del módulo. Así funciona lo que ya está en producción en el cliente A:
- Candidatas: las facturas contabilizadas con saldo pendiente, del mismo signo que el movimiento.
- Importe exacto, al céntimo: 50 puntos.
- Señal del proveedor, solo la mejor: el IBAN de la contraparte es el de su ficha (40), su NIF está en el concepto (35) o está su nombre (25).
- El número de la factura aparece en el concepto: 30.
- El pago cae a cinco días o menos del vencimiento: 10. A más de 120 días: se restan 15.
- Si ninguna llega a 75, se buscan combinaciones de facturas del mismo proveedor que sumen el importe exacto.
- Se enseñan las cinco mejores. La primera es «clara» si tiene 50 puntos o más y 20 de ventaja sobre la segunda.
Por añadir: los cobros de clientes, un margen para céntimos y comisiones, los traspasos entre cuentas propias y las liquidaciones agrupadas.
Automatizaciones
El módulo hace solo todo lo que no decide nada: leer, reconocer, proponer y avisar. Contabilizar y enviar lo confirma una persona, salvo lo que cada empresa ponga en automático.
| Automatización | Se dispara | Qué hace sola | Qué deja a una persona |
|---|---|---|---|
| Lectura de bancos | Cada madrugada y con «Leer ahora» | Lee saldo y movimientos de cada cuenta, una a una, sin pasar del límite del banco | Volver a autorizar una conexión caída |
| Histórico inicial | En la hora siguiente a autorizar un banco | Pide todo el histórico que dé el banco | Nada |
| Aviso de caducidad | 15 días antes de que venza un consentimiento | Avisa en el inicio y por correo | Renovar en la banca |
| Carga de extractos | Llega un Norma 43 al buzón de contabilidad | Lo valida y lo carga; si la cuenta no existe o no cuadra, lo anota | Dar de alta la cuenta que falta |
| Detección de facturas | Llega un adjunto a un buzón de facturas | Crea la factura «por revisar», reconoce al proveedor y descarta la repetida | Confirmarla |
| Lectura de la factura | Entra el documento | Facturae sin IA; PDF y foto con IA. Comprueba que bases, cuotas y total cuadran y marca lo que no | Corregir lo marcado |
| Lo habitual del proveedor | Se abre la revisión | Propone cuenta de gasto, tipo de IVA, retención y dimensión de su última factura | Aceptarlo o cambiarlo |
| Propuesta de cruce | Entra un movimiento o se confirma una factura | Puntúa las candidatas y deja la mejor con su motivo | Confirmar el cruce |
| Reglas | Entra un movimiento | Aplica la regla de su contraparte o de su texto | Contabilizarlo |
| Aprendizaje | Alguien clasifica a mano | Propone la regla para la próxima vez | Aceptar la regla |
| Traspasos | Entran la salida y la entrada entre dos cuentas propias | Las empareja | Nada |
| Asientos | Se confirma una factura, un pago, un cobro o una regla | Genera el asiento, enlazado a su origen | Nada |
| Vencimientos | Cada día | Marca lo vencido y prepara el borrador de la reclamación | Enviar el correo |
| Factura que falta | Un pago a un proveedor sigue sin factura | Prepara el borrador pidiéndola | Enviar el correo |
| Envío al ERP | Al validar o al cerrar, según la empresa | Cola con reintento que no duplica; registra cada intercambio | Pasar de la empresa de pruebas a la real |
| Verifactu | Se expide una factura | Genera el registro, lo encadena, lo envía y reintenta | Expedir |
| Cierre | Termina el mes | Prepara la lista de lo que falta y el paquete de la gestoría | Cerrar y reabrir |
| Salud | Siempre | Avisa de una conexión con error, de un saldo que no cuadra con el del banco y del límite de IA alcanzado | Resolverlo |
| Previsión de caja | Cada noche | Recalcula con los vencimientos y con lo que se repite cada mes | Nada |
Cuánto se hace solo lo elige cada empresa. Hay dos niveles:
- Proponer. Es el que viene puesto. Nada se confirma sin una persona.
- Confirmar lo inequívoco. Se confirma sin preguntar el cruce que coincide en importe exacto y, además, en IBAN o en número de factura. Coincidir solo en importe no basta.
Todo lo que se hizo solo se distingue en pantalla, queda en el registro de actividad y se puede deshacer mientras el mes esté abierto.
La IA tiene interruptor por empresa, límite de gasto al mes y registro del coste de cada llamada. Con la IA apagada, todo lo demás funciona.
Datos y reglas del sistema
El modelo ya está probado en producción con una sola empresa; lo que falta es ponerle empresa a todo.
| Entidad | Lo que guarda |
|---|---|
| Empresa | Datos fiscales, ejercicio, modo, dígitos del plan, cuentas de IVA y de retenciones, código en el ERP, nivel de automatismo |
| Usuario y papel | Quién entra en qué empresa y con qué permiso: ver, editar, exportar o reabrir |
| Tercero | Una ficha por NIF, cliente y proveedor a la vez: cuenta contable, IBAN, plazo de pago, operación y retención habituales |
| Cuenta contable | Código como texto, nombre, origen (ERP o módulo) y si ya se dio de alta en el ERP |
| Conexión bancaria | Proveedor, entorno, banco, sesión cifrada, válida hasta, última lectura y último error |
| Cuenta bancaria | IBAN, su cuenta 572, saldo del banco y su fecha, y de dónde llegan sus movimientos |
| Movimiento | Fecha, fecha valor, importe con signo, concepto, contraparte y su IBAN, identidad única, origen, estado (sin cruzar, cruzado o excluido) |
| Regla | Texto o contraparte, sentido, tramo de importe, cuenta de contrapartida, prioridad y usos |
| Documento entrante | El archivo, su huella, de dónde llegó, cómo se leyó y los campos leídos, hasta que una persona lo confirma o lo descarta |
| Factura recibida y sus líneas | Proveedor, número, fechas de expedición, de operación y de registro, tipo de operación, bases por tipo de IVA, retención, total, pagado, dimensiones y su asiento |
| Factura emitida y su registro | Serie, número, cliente, líneas, y el registro de Verifactu con su huella y su estado en la AEAT |
| Vencimiento | De qué factura, fecha, importe y estado |
| Cruce | Qué movimiento con qué factura, por cuánto, y si lo propuso el módulo, lo eligió una persona o se hizo solo |
| Asiento y apuntes | Ejercicio y número, fecha, origen, estado (borrador, validado o enviado), y cada apunte con su cuenta, debe y haber |
| Cierre | Qué mes, quién lo cerró y quién lo reabrió |
| Envío al ERP | Qué asientos, a qué destino, qué respondió y el identificador que devolvió |
| Actividad | Quién, qué, cuándo y desde dónde. Solo se añade |
| Uso de IA | Modelo, tokens, coste y resultado de cada llamada |
Lo que vale para todo el sistema:
- la empresa va en cada tabla y en cada consulta;
- importes en céntimos enteros y porcentajes en puntos básicos (2100 es el 21 %);
- fechas contables sin hora;
- códigos de cuenta y de tercero como texto: en a3ERP hay proveedores «A160»;
- cada asiento se puede seguir hasta su movimiento, su factura y su documento, y al revés;
- el registro de actividad no se modifica ni se borra, tampoco desde la base de datos;
- las sesiones del banco y las claves van cifradas; la clave privada de Enable Banking, solo en el entorno del servidor;
- documentos y registros se conservan seis años;
- verificación en dos pasos para dirección y contabilidad.
Pruebas. La lógica contable va en funciones puras, sin base de datos: Norma 43, cruce, asientos, validación de facturas, SUENLACE y Verifactu. En el portal del cliente A hay unas 95 comprobaciones de este tipo que valen como casos.
Lo que ya existe
Casi toda la fase 1 está programada y en uso en el portal del cliente A, para una sola empresa y con sus datos metidos en el código. Es TypeScript (Next.js y Prisma): vale como referencia de algoritmos y de casos de prueba, se programe en lo que se programe.
| Pieza | Dónde | Estado |
|---|---|---|
| Enable Banking: conector y flujo completo, con lectura cuenta a cuenta | Cliente A | En producción, con cuatro bancos reales |
| Norma 43: lector, carga y carga automática desde el correo | Cliente A | En producción |
| Cruce de movimientos con facturas recibidas, con puntuación y combinaciones | Cliente A | En producción |
| Reglas de banco y asiento del movimiento | Cliente A | En producción |
| Facturas recibidas: validación, asiento, proveedores y lectura de Facturae | Cliente A | En producción |
| Lectura de facturas en PDF con IA, con límite de gasto | Cliente A | Programada, apagada |
| Cierre de mes y de trimestre, libros en CSV y SUENLACE.DAT | Cliente A | En producción |
| Facturas y extractos que llegan por correo, e hilos enlazados con terceros | Cliente A | En producción, sobre IMAP |
| Interfaz de MailDraft llevada a React | Cliente A | En producción, solo en el correo |
| Categorización que aprende de lo puesto a mano | Cliente B | En producción, con datos de prueba |
| Previsión de caja por recurrentes | Cliente B | En producción, con datos de prueba |
| Importador de maestros de a3ERP con pasada en seco y cola de dudosos | Cliente B | En uso |
Lo que no existe en ningún sitio: la empresa en las tablas, los cobros y las facturas emitidas en el cruce, una identidad de movimiento común a la conexión y al extracto, la escritura en a3ERP y Verifactu.
Interfaz. La dirección elegida es Mesa: un inicio que resume lo pendiente y lo reparte en tareas, con los movimientos en bandeja o en tabla. La maqueta programada, con datos ficticios, está en matriz.concretoabstracto.com.
Por cerrar
Seis decisiones son para verlas contigo y cuatro datos dependen de terceros.
Contigo:
- Pila y repositorio: ¿dentro de MailDraft (Python, FastAPI y PostgreSQL) o como un servicio aparte? La referencia que existe es TypeScript.
- Instalación por cliente: una base de datos por cliente, con varias sociedades dentro. ¿Cómo encaja con el despliegue de MailDraft?
- Lo que puede dar ya el backend de MailDraft: avisar de un adjunto nuevo, consultar los hilos de una dirección, crear un borrador y un inicio de sesión común.
- Quién figura ante la AEAT como productor del programa de facturación y firma la declaración responsable.
- Qué modelo de IA lee las facturas, y con qué contrato de encargo del tratamiento.
- Reparto y estimación: quién hace la interfaz y quién el resto, y cuánto lleva cada fase.
Sin confirmar, con terceros:
- Enable Banking: el mínimo mensual, el precio por cuenta y si un contrato vale para las instalaciones de varios clientes.
- a3ERP: de quién es la API, qué cuesta, qué versión tiene el cliente B y cómo se llega a su servidor.
- Verifactu: si el aplazamiento a octubre de 2028 llega al BOE.
- El orden de las fases y los pilotos.
Fuentes
Consultadas el 14 de noviembre de 2026.
- Enable Banking: preguntas frecuentes y panel de control. De ahí salen la activación en producción, el modo restringido, el histórico y los límites.
- a3ERP: documentación de la API REST, con sus páginas de maestros, documentos, asientos y cartera, y la guía del conector de Chift.
- Verifactu: Real Decreto 1007/2023, texto consolidado, con última actualización del 3 de diciembre de 2025, y la nota de SuperContable del 9 de octubre de 2026 sobre el aplazamiento anunciado.
- El código y los documentos de los proyectos de los clientes A y B, y la interfaz de MailDraft.