VeriFactuDev
Resumen Ejecutivo y Estado Actual
Este panel ofrece una visión global de la integración de VeriFactu y TicketBAI. Actualmente, el núcleo criptográfico (Hashing encadenado y Firma XAdES) está completado en Java. El siguiente gran hito es la implementación del **Backend Spring Boot**, la capa de **Transporte Seguro** y la **Infraestructura Docker**.
Módulo Cripto
100%
Implementado
Transporte
15%
En Diseño
Infraestructura
Docker
Planificación
Componentes del Sistema
Próximos Pasos Críticos
Validar Criptografía
Hash SHA-256 encadenado y Firma RSA probados.
Levantar Spring Boot
Crear controladores y servicios de facturación.
Configurar Persistencia
PostgreSQL + JPA para guardar estado de facturas.
Implementar Retry/Queue
Vital para evitar sanciones por fallos de red.
Arquitectura Spring Boot
La aplicación Java debe estructurarse en capas claras para separar la lógica de negocio (generación de facturas), la lógica de seguridad (firmas) y la lógica de transporte (envío a Hacienda). A continuación, interactúa con el diagrama para ver las responsabilidades de cada capa.
Selecciona una capa a la izquierda para ver detalles de implementación.
@RestController InvoiceController
@PostMapping("/api/v1/invoices")
public ResponseEntity<InvoiceResult> create(@RequestBody InvoiceDTO invoice) {
// 1. Recibe datos crudos desde la App
// 2. Valida formato básico
// 3. Llama al servicio asíncrono
return ResponseEntity.ok(invoiceService.process(invoice));
}
El controlador debe ser ligero. Su única función es recibir la petición HTTP y delegar. No realiza cálculos.
@Service InvoiceService
@Transactional
public InvoiceResult process(InvoiceDTO data) {
// 1. Recuperar Hash Anterior (Encadenamiento)
String prevHash = repo.findLastHash();
// 2. Generar Huella
String newHash = hashGenerator.getHashNew(data, prevHash);
// 3. Firmar (Si es TicketBAI)
String signature = signer.sign(newHash, keyManager.getPrivKey());
// 4. Guardar estado "PENDIENTE_ENVIO"
repo.save(new InvoiceEntity(data, newHash, signature));
// 5. Disparar envío asíncrono
eventPublisher.publish(new SendInvoiceEvent(id));
}
El corazón del sistema. Garantiza que la factura se guarde y se encadene antes de intentar enviarla.
Component: KeyManager & Signer
Integra tus clases existentes:
HashGenerator.java: Implementa SHA-256.Signer.java: UsaSHA256withRSA.KeyManager.java: Carga el.p12desde volumen seguro.
/secure/cert.p12.
Transport Strategy
Patrón "Strategy" para elegir protocolo:
public interface FiscalSender {
void send(Invoice inv);
}
// Para AEAT (Nacional)
public class VerifactuSoapSender implements FiscalSender { ... }
// Para Bizkaia (Batuz)
public class TicketBaiRestSender implements FiscalSender { ... }
Esto permite añadir nuevas haciendas (Navarra, Álava) sin tocar el código principal.
Persistence Layer
Schema PostgreSQL vital para integridad:
TABLE invoices (
id SERIAL PRIMARY KEY,
chain_hash VARCHAR(64) NOT NULL,
prev_hash VARCHAR(64) NOT NULL,
signature TEXT,
status VARCHAR(20) DEFAULT 'PENDING', -- PENDING, SENT, ERROR
aeat_csv VARCHAR(100), -- Código Seguro Verificación devuelto
retry_count INT DEFAULT 0
);
El "Router" Fiscal
Dependiendo de la sede fiscal del emisor, la aplicación debe comportarse como una agencia de viajes inteligente, empaquetando los datos en diferentes formatos (XML SOAP vs JSON/XML REST). Selecciona una región para ver el flujo.
Sistema de Reintentos y Cola
Hacienda impone sanciones si las facturas no se envían secuencialmente o si se pierden. Si la conexión falla, NO se debe perder la factura. Implementaremos un sistema de "Exponential Backoff" (espera incremental) y una cola persistente.
Estrategia de Backoff Exponencial
Tiempo de espera entre intentos (segundos)
Reglas de Negocio
-
1
Persistencia Primero: Nunca intentar enviar si la factura no está guardada en BD con estado
PENDING. - 2 Hilo Asíncrono: El usuario recibe "OK" en la App en cuanto se guarda en BD. El envío es transparente en background.
-
3
Ack/Nack: Si Hacienda devuelve error 4xx/5xx, incrementar contador de reintentos. Si devuelve 200 OK + CSV, marcar como
SENT. - 4 Alerta: Tras 10 intentos fallidos, notificar al admin (Dashboard) pero NO borrar la factura.
Infraestructura Docker & Despliegue
Para garantizar la portabilidad (Raspberry Pi -> Cloud), usaremos Docker Compose. La seguridad SSL es crítica para que la App Flutter se comunique con el Backend.
Docker Compose Stack
Checklist Migración / Setup
1. Dominio & DDNS (Raspberry Pi)
Configurar ddclient o script en el router para actualizar la IP dinámica. El dominio debe apuntar a la IP pública.
2. Certificados SSL (LetsEncrypt)
Usar Certbot en Docker para generar certificados válidos. Flutter rechazará certificados autofirmados en producción.
3. Volumen de Datos
Mapear la carpeta de DB fuera del contenedor: - ./pgdata:/var/lib/postgresql/data. Esto permite migrar copiando esa carpeta.
4. Migración a Cloud (AWS/Azure)
Simplemente copiar el docker-compose.yml y la carpeta pgdata. Cambiar DNS y regenerar SSL. Tiempo estimado: 15 min.