Módulo de Dolibarr para la integración con el sistema VeriFactu de la Agencia Estatal de Administración Tributaria (AEAT), en cumplimiento de la Ley 11/2021 (Ley Antifraude) y el Real Decreto 1007/2023 que establece los requisitos técnicos para los sistemas de facturación en España.
Este proyecto tiene su origen en el código abierto verifactu desarrollado originalmente por Alberto SuperAdmin (Alberto Luque Rivas) de easysoft.es y distribuido bajo licencia GPL v3.
Este módulo fue desarrollado a partir del módulo original licenciado bajo GPL v3 (GNU General Public License version 3). Sobre esta base:
- Se reorganizó y modularizó el código para mejorar la mantenibilidad
- Se tradujeron la documentación y los comentarios al inglés
- Se creó una nueva librería interna (OpenAEAT\Billing)
Este fork mantiene todo el código bajo GPL v3, respetando la licencia original y los derechos de los autores originales, añadiendo la atribución correspondiente en todos los archivos.
VeriFactu es el sistema de verificación de facturas de la AEAT que permite:
- Envío automático de facturas a la AEAT
- Generación de códigos QR de verificación
- Encadenamiento criptográfico de facturas (SHA-256)
- Consulta del estado de facturas enviadas
- Anulación de facturas
- Gestión de facturas rectificativas
- Dolibarr 13.0 o superior
- PHP 7.4 o superior
- Extensión PHP SOAP habilitada
- Extensión PHP OpenSSL habilitada
- Extensión PHP GD habilitada (para QR)
- Certificado digital válido (FNMT o equivalente)
- Copiar la carpeta
verifactuen el directoriohtdocs/custom/de Dolibarr - Ir a Configuración > Módulos en Dolibarr
- Buscar "VeriFactu" en la lista de módulos
- Activar el módulo
Ir a Configuración > Módulos > VeriFactu > Configuración
- Entorno: Seleccionar Pruebas o Producción
- NIF Emisor: Número de identificación fiscal de la empresa
- Nombre/Razón Social: Nombre de la empresa
Ir a Configuración > Módulos > VeriFactu > Certificados
- Subir el certificado en formato PFX/P12
- Introducir la contraseña del certificado
- Verificar que el certificado es válido
El certificado debe ser:
- Certificado de persona jurídica (empresa)
- Emitido por una CA reconocida (FNMT, etc.)
- Válido y no revocado
Configurar los datos del sistema de facturación:
- NIF Desarrollador: NIF del desarrollador del software
- Nombre del Sistema: Nombre del sistema de facturación
- ID del Sistema: Identificador único del sistema
- Versión: Versión del software
El módulo descarga y cachea localmente los esquemas WSDL y XSD necesarios para la comunicación SOAP con la AEAT. Esto evita dependencias de servidores externos (AEAT, W3C) y previene errores de rate-limiting al procesar muchas facturas seguidas.
- Los esquemas se descargan automáticamente la primera vez que se envía una factura
- En Configuración > Módulos > VeriFactu > Configuración se muestra el estado de los esquemas
- Usar el botón Descargar/Actualizar esquemas para forzar la re-descarga si la AEAT actualiza los esquemas
- Crear una factura en Dolibarr
- Validar la factura
- En la pestaña "VeriFactu" de la factura:
- Hacer clic en "Enviar a AEAT"
- Verificar el estado de la respuesta
La validación masiva de facturas procesa cada factura en una transacción independiente:
- Si una factura falla, las demás continúan procesándose normalmente
- Se detectan automáticamente conflictos de fechas con VeriFactu (orden cronológico)
- Si hay conflictos, se muestra un diálogo de confirmación antes de ajustar las fechas
- Las facturas se procesan ordenadas por fecha (de menor a mayor)
Al validar una factura individual (PROV), el sistema:
- Ajusta automáticamente la fecha a
max(hoy, última_factura_validada)para respetar el orden cronológico de VeriFactu - Muestra un aviso en el diálogo de confirmación si la fecha fue ajustada, indicando la fecha original, la nueva fecha y la referencia de la última factura validada
- Ir a Facturación > VeriFactu > Consulta AEAT
- Seleccionar los filtros de búsqueda:
- Período de imputación (año/mes)
- Rango de fechas
- Contraparte (NIF del cliente)
- Hacer clic en "Consultar"
- Acceder a la factura enviada
- En la pestaña "VeriFactu":
- Hacer clic en "Anular en AEAT"
- Seleccionar el tipo de anulación
- Confirmar la operación
El código QR se genera automáticamente al enviar la factura y se muestra en:
- La vista de la factura
- El PDF de la factura (si está configurado)
- El ticket de TPV (si está habilitado)
| Código | Descripción |
|---|---|
| F1 | Factura completa |
| F2 | Factura simplificada |
| F3 | Factura sustitutiva de simplificadas |
| R1 | Rectificativa (error fundado en derecho) |
| R2 | Rectificativa (Art. 80.3) |
| R3 | Rectificativa (Art. 80.4) |
| R4 | Rectificativa (otras) |
| R5 | Rectificativa en factura simplificada |
- Español (es_ES)
- Catalán (ca_ES)
- Euskera (eu_ES)
- Gallego (gl_ES)
- Inglés (en_US)
El módulo incluye un sistema completo de Declaración Responsable en cumplimiento con la normativa española vigente:
- RD 1007/2023 - Reglamento VeriFactu
- RD 254/2025 - Modificaciones y plazos
- Orden HAC/1177/2024 - Especificaciones técnicas
- Art. 29.2.j) Ley 58/2003 - Ley General Tributaria
La configuración se encuentra en conf/declaracion_responsable.conf.php e incluye:
| Sección | Contenido |
|---|---|
| Datos del Productor | NIF, razón social, dirección, contacto |
| Datos del Sistema | Nombre, IdSistemaInformatico, versión |
| Componentes | Software y hardware requeridos |
| Especificaciones Técnicas | Tipo de firma (XAdES), algoritmo hash (SHA-256) |
| Integridad | Hash del módulo calculado dinámicamente |
| Cumplimiento | Declaración según Art. 29.2.j) LGT |
| Suscripción | Fecha, lugar y firmante |
// Obtener configuración completa con hash calculado
$declaracion = obtenerDeclaracionResponsable(true);
// Validar campos obligatorios
$errores = validarDeclaracionResponsable();
// Calcular hash SHA-256 del módulo
$hash = calcularHashModuloVerifactu();
// Exportar en formato JSON
$json = exportarDeclaracionJSON();La declaración responsable está disponible en:
- Menú: VeriFactu > Declaración Responsable
- Exportación JSON:
/verifactu/views/declaration_json.php
Para más detalles, ver docs/responsible_declaration.md.
verifactu/
├── admin/ # Páginas de administración
│ ├── setup.php # Configuración general
│ ├── managecertificates.php # Gestión de certificados
│ └── uploadcertificates.php # Subida de certificados
├── class/ # Clases PHP
│ ├── actions_verifactu.class.php # Hooks y acciones
│ ├── api_verifactu.class.php # API REST
│ └── verifactu.utils.php # Utilidades
├── conf/ # Configuración
│ └── declaracion_responsable.conf.php # Declaración responsable
├── core/
│ ├── modules/ # Descriptor del módulo
│ └── triggers/ # Triggers automáticos
│ ├── interface_900_modVerifactu_BillRestrictions.class.php
│ └── interface_999_modVerifactu_VerifactuTriggers.class.php
├── docs/ # Documentación
│ └── responsible_declaration.md # Doc. declaración responsable
├── lib/
│ ├── newfenix/ # Librería OpenAEAT Billing
│ │ ├── src/ # Clases principales
│ │ │ ├── SchemaManager.php # Gestión de esquemas WSDL/XSD
│ │ │ ├── SoapClient.php # Transporte SOAP
│ │ │ ├── Config.php # Configuración
│ │ │ ├── Manager.php # Orquestador
│ │ │ ├── Invoice.php # Modelo de factura
│ │ │ ├── Cancellation.php # Modelo de anulación
│ │ │ └── Query.php # Modelo de consulta
│ │ └── vendor/ # Dependencias (QRCode)
│ └── functions/ # Funciones del módulo
│ ├── functions.submission.php # Envío de facturas
│ ├── functions.query.php # Consultas AEAT
│ ├── functions.cancellation.php # Anulación
│ ├── functions.certificates.php # Certificados
│ ├── functions.compatibility.php # Funciones de compatibilidad
│ ├── functions.qr.php # Generación QR
│ └── functions.response.php # Respuestas AEAT
├── tests/ # Tests
│ ├── MassValidateInterceptionTest.php # Tests validación masiva
│ └── SchemaManagerTest.php # Tests gestión de esquemas
├── views/ # Vistas y páginas
│ ├── list.facture.php # Lista de facturas
│ ├── query.facture.php # Consulta AEAT
│ ├── tabVERIFACTU.facture.php # Pestaña VeriFactu
│ ├── declaration.php # Declaración responsable
│ ├── declaration_json.php # Exportación JSON declaración
│ ├── faq.php # Ayuda y FAQ
│ ├── pos.facture.php # Ticket TPV
│ └── documentation.php # Documentación
├── langs/ # Archivos de idioma
├── css/ # Estilos CSS
├── js/ # JavaScript
└── README.md # Este archivo
El módulo expone una API REST para integración externa:
GET /api/index.php/verifactu/integrity
Este error indica un problema con la estructura del mensaje SOAP. Verificar:
- Formato de fecha (DD-MM-AAAA)
- Datos del emisor y destinatario
- Configuración del certificado
Si aparecen errores al crear el SoapClient al procesar muchas facturas seguidas, es porque PHP intenta descargar xmldsig-core-schema.xsd desde w3.org y este servidor aplica rate-limiting. Solución:
- Ir a Configuración > Módulos > VeriFactu > Configuración
- Pulsar el botón Descargar/Actualizar esquemas para cachear los WSDL/XSD localmente
- Los esquemas se descargan automáticamente en el primer uso, pero se puede forzar desde aquí
Si el certificado no es reconocido:
- Verificar que el certificado no ha expirado
- Comprobar que la contraseña es correcta
- Asegurarse de que el certificado es de persona jurídica
Si aparece una pantalla en blanco al ver facturas:
- Revisar los logs de PHP en busca de errores
- Verificar que todas las extensiones PHP están instaladas
El módulo calcula correctamente el ImporteTotal para VeriFactu excluyendo la retención IRPF:
ImporteTotal= Base Imponible + IVA + Recargo de Equivalencia (sin deducir IRPF)- El código QR refleja este importe correcto
- Las consultas a AEAT comparan con el importe correcto
- Versión: 1.0.4
- Autor: Germán Luis Aracil Boned
- Email: garacilb@gmail.com
- Licencia: GPL-3.0-or-later
- Dedicado a: Mi compañero y amigo Ildefonso González Rodríguez
-
Retención IRPF en VeriFactu: Corregido el cálculo de
ImporteTotalen el código QR y en las consultas a AEAT. Las facturas con retención IRPF ahora envían correctamenteImporteTotal = Base + IVA + Recargosin deducir el IRPF. Creada función helpergetVerifactuImporteTotal()para centralizar el cálculo. -
Validación masiva con transacciones independientes: Reescrito completamente el sistema de validación masiva de facturas. Cada factura se procesa en su propia transacción de base de datos, de modo que si una falla, las demás continúan procesándose. Se intercepta la acción estándar de Dolibarr
massvalidationcon procesamiento individual por factura. -
Orden cronológico de fechas en validación masiva: Antes de validar masivamente, el sistema detecta si alguna factura tiene fecha anterior a la última factura validada en VeriFactu. Si hay conflicto, muestra un diálogo de confirmación y ajusta las fechas automáticamente. Las facturas se procesan ordenadas por fecha ascendente y la fecha mínima se va actualizando conforme se procesan.
-
Orden cronológico de fechas en validación individual: Al validar una factura individual (PROV), la fecha se ajusta a
max(hoy, última_factura_validada)en vez de solo ahoy. Si la fecha se ajustó, se muestra un aviso en el diálogo de confirmación. -
Envío masivo desde lista de facturas: Corregido el problema por el que al confirmar el envío masivo desde la lista de facturas no se transmitían los IDs seleccionados (el diálogo
formconfirmno soporta arrays). Se usa ahora un campo ocultoverifactu_toselectcon IDs separados por comas. Las facturas ya enviadas se filtran automáticamente. -
Archivos PEM al renovar certificado: Al subir un nuevo certificado P12/PFX, los archivos PEM antiguos no se eliminaban, provocando que el sistema siguiera usando el certificado anterior (potencialmente expirado). Añadida función
deleteExistingPemFiles()que limpia los PEM antes de procesar el nuevo certificado. Añadida visualización de la fecha de expiración del certificado con indicadores de color (expirado/próximo a expirar/válido).
- Caché local de esquemas WSDL/XSD: Nueva clase
SchemaManagerque descarga los 7 archivos de esquema (1 WSDL + 5 XSD de AEAT + 1 XSD de W3C) localmente y reescribe las referenciasschemaLocationpara eliminar dependencias externas. Esto previene errores de rate-limiting de w3.org al procesar muchas facturas. Los esquemas se descargan automáticamente en el primer uso y pueden actualizarse desde la página de configuración.
class/actions_verifactu.class.php- Validación masiva e individual con transacciones independientes y control de fechaslib/functions/functions.compatibility.php- Nueva funcióngetVerifactuImporteTotal()lib/functions/functions.qr.php- Corrección importes QR con IRPFlib/functions/functions.query.php- Corrección comparación importes AEATlib/functions/functions.submission.php- Integración SchemaManagerlib/newfenix/src/SchemaManager.php- Nueva clase gestión de esquemaslib/newfenix/src/SoapClient.php- Uso de WSDL local con fallback remotolib/newfenix/src/Config.php- PropiedadlocalWsdlPathlib/newfenix/src/Manager.php- IntegraciónsetSchemasDir()admin/setup.php- Sección estado de esquemas con botón de descarga + expiración de certificadoadmin/managecertificates.php- Limpieza de PEM al subir nuevo certificadoadmin/uploadcertificates.php- Limpieza de PEM al subir nuevo certificadolib/functions/functions.certificates.php- Nueva funcióndeleteExistingPemFiles()views/list.facture.php- Corrección transmisión IDs en envío masivo- Todos los archivos de idioma (es_ES, en_US, ca_ES, eu_ES, gl_ES)
tests/MassValidateInterceptionTest.php- 52 tests para validación masiva, transacciones, fechastests/SchemaManagerTest.php- 19 tests para gestión de esquemas
- Fechas obligatorias VeriFactu actualizadas: Ajustadas las fechas de transición automática a producción de 2026 a 2027 según el anuncio del Gobierno:
- Sociedades: 1 de enero de 2027 (antes 1 de enero de 2026)
- Autónomos: 1 de julio de 2027 (antes 1 de julio de 2026)
- Documentación del proyecto simplificada: Simplificada la sección de historia del proyecto en el README manteniendo la atribución GPL v3 al autor original
- Declaración responsable actualizada: Configurados los datos del productor con la información de 7Kas Servicios de Internet SL (CIF B98515273, Benicasim, Castellón)
lib/functions/functions.configuration.php- Lógica de cambio de entornoadmin/setup.php- Fechas de visualización de estadoconf/declaracion_responsable.conf.php- Datos del productor 7Kas Servicios de Internet SL- Todos los archivos de idioma (es_ES, en_US, ca_ES, eu_ES, gl_ES)
- Declaración Responsable configurable: Añadido archivo de configuración
conf/declaracion_responsable.conf.phpque cumple con la normativa española (RD 1007/2023, Orden HAC/1177/2024):- Datos del productor (NIF, dirección, contacto)
- Datos del sistema informático (IdSistemaInformatico, versión)
- Especificaciones técnicas (firma XAdES, hash SHA-256)
- Hash de integridad del módulo calculado dinámicamente
- Declaración de cumplimiento con referencias legales
- Exportación JSON: Nuevo endpoint
/views/declaration_json.phppara exportar la declaración responsable en formato JSON - Documentación: Añadido
docs/responsible_declaration.mdcon guía de configuración completa
- Actualizada la página de Declaración Responsable para usar los datos del archivo de configuración
- Validación automática de campos obligatorios con mensajes de aviso
- Visualización del hash de integridad del módulo en la declaración
- Gestión de errores en validación masiva de facturas: Corregido el problema por el que facturas con errores de VeriFactu cancelaban todo el proceso de validación por lotes. Ahora, cuando una factura falla al enviar a VeriFactu:
- La factura permanece como borrador con referencia PROV en lugar de ser validada y luego revertida
- Las demás facturas del lote continúan procesándose normalmente
- Mejorada la gestión de conexiones PostgreSQL para evitar errores "connection already closed"
- Los mensajes de error se muestran correctamente al usuario