VeriFactu — Facturación electrónica
Pool-Control genera registros de facturación compatibles con VeriFactu: huella SHA-256 encadenada, XML SOAP y código QR en el PDF.
Qué está implementado
| Función | Estado |
|---|---|
| Huella y encadenamiento al emitir factura | Disponible |
| XML VeriFactu (borrador SOAP) | Disponible |
| QR de validación en PDF | Disponible |
| Descarga XML desde detalle de factura | Disponible |
| Rectificativas (abono R1) con referencia a factura original | Disponible |
| Inmutabilidad: no editar facturas emitidas | Disponible |
| Certificado por empresa (.pfx) | Ajustes → Empresa → Certificado VeriFactu |
| Envío a AEAT preproducción | Certificado tenant + ALLOW_AEAT_SEND=confirm en servidor |
| Firma XAdES | Pendiente (producción homologada) |
| Producción AEAT real | Bloqueada (ALLOW_PROD + XAdES) |
Flujo habitual
- Cree o genere un borrador de factura.
- Revise datos y pulse Emitir — se asigna número, huella y XML.
- La factura no se puede editar (solo rectificar con abono).
- Descargue PDF (con QR) o XML.
- Opcional: Enviar AEAT (PRE) desde el detalle (solo si el servidor tiene certificado del obligado emisor).
Requisitos para envío AEAT
- Subir el certificado .pfx/.p12 del obligado emisor en Ajustes de empresa (el NIF del certificado debe coincidir con el NIF de la empresa).
- Razón social = nombre en censo AEAT (debe coincidir con el certificado).
- NIF productor software configurado en SuperAdmin → VeriFactu (distinto del NIF del tenant).
- Entorno preproducción por defecto (
verifactuProduction = false). - En desarrollo local puede usarse
VERIFACTU_CERT_PATH(no en producción Render). - Al subir el certificado en Ajustes: se informa del cifrado AES-256-GCM, finalidad AEAT y posibilidad de borrado; detalle en política de privacidad y Ajustes de empresa.
Matriz de tests automáticos
| Suite | Qué valida |
|---|---|
verifactu-hash.test.ts | Huella F1/F2/R1 |
verifactu-xml.test.ts | XML destinatario, encadenamiento |
verifactu-aeat-response.test.ts | Parser Correcto/Incorrecto |
verifactu-compliance.test.ts | Reglas legales API (inmutabilidad, compras sin VF) |
pnpm test:verifactu-xsd | Muestras XML (estructura / XSD si xmllint) |
RUN_AEAT_INTEGRATION=1 | Envío PRE real (opcional, no CI) |
Cuentas de prueba internas
| Cuenta | Subdominio | Uso |
|---|---|---|
| Demo pública | AquaDemo | Testers — datos ficticios (CIF demo) |
| Laboratorio VF | vf-lab | Pruebas VeriFactu con datos reales del desarrollador — no es la demo pública |
Acceso laboratorio (seed): admin@vf-lab.test / password123
Comando para recrear datos dinámicos del lab:
cd packages/server && pnpm seed:vf-lab -- --resetCompras y VeriFactu
Las facturas de proveedor, recepciones, pagos a proveedor y anulaciones/abonos de compra en el ERP no se envían a AEAT como alta VeriFactu.
| Documento | ¿VeriFactu desde Pool-Control? | Motivo |
|---|---|---|
| Factura de venta (cliente) | Sí — hash, XML, QR, envío PRE | Usted es el obligado emisor |
| Abono / rectificativa venta (R1) | Sí | Rectifica una factura que usted emitió |
| Factura de proveedor (compra) | No | La registra su proveedor; usted solo contabiliza la recepción |
| Abono o anulación de compra | No | No es un registro de alta de su facturación emitida |
Si su proveedor está obligado a VeriFactu, él remite el XML a Hacienda; Pool-Control no sustituye ese envío.
Registro legal vs auditoría interna
| Capa | Qué guarda | Dónde verlo |
|---|---|---|
| Registro VeriFactu (obligatorio emisor) | Huella SHA-256, encadenamiento, XML SOAP, estado AEAT | Factura emitida: campos técnicos + descarga XML |
| Auditoría de negocio | Quién emitió, intentos de editar bloqueados, envíos AEAT PRE | Configuración → Auditoría (SETTINGS_VIEW_LOGS) |
Acciones relevantes en auditoría: INVOICE_ISSUED, VERIFACTU_EDIT_BLOCKED, VERIFACTU_AEAT_SEND.
El libro de registro exportable (CSV/XML masivo para inspección) está pendiente; hoy el registro técnico está en cada factura emitida.
Entorno PRE hasta alta oficial en censo
Hasta que la empresa esté dada de alta y el censo AEAT coincida con certificado y razón social:
- Usar solo preproducción (
verifactuProduction = false, hostprewww1). - Envíos solo con
ALLOW_AEAT_SEND=confirmy supervisión. - Validar en tenant
vf-lab(no demo pública AquaDemo). - No activar producción AEAT ni
ALLOW_PRODen Render.
Cuando el alta oficial esté lista: certificado del tenant en Ajustes, prueba PRE Correcta desde la app, luego homologación (XAdES) antes de producción.
Rectificar ≠ borrar
No se pueden eliminar facturas emitidas. Para corregir: use Rectificar → abono (R1) y, si aplica, nueva factura.