VerifactuMidAPI/documentacion/arqui.md

2.2 KiB

Arquitectura

Visión General

┌─────────────┐     ┌──────────────┐     ┌─────────────┐
│  Cliente    │────▶│  API REST   │────▶│   AEAT     │
│  (App)     │     │  (this)    │     │ VeriFactu  │
└─────────────┘     └──────────────┘     └─────────────┘

Capas

1. API Layer (api/)

  • handler.go: Handlers HTTP para endpoints
  • router.go: Registro de rutas

2. Business Logic (internal/)

  • factura.go: Servicio de facturas (alta, anulación)
  • formats/: Sistema de formatos de entrada con detección automática
    • registry.go: Registro y auto-detección de formatos
    • native/: Formato nativo de la API
    • dolibarr/: Formato compatible con Dolibarr BFF
  • transformer.go: Transformación JSON → datos de factura
  • hash.go: Cálculo de hash encadenado
  • models.go: Modelos y validación de entrada
  • config/: Carga de configuración
  • cert/: Gestión de certificados
  • crypto/: Criptografía RSA

3. External Communication (verifactu/)

  • client.go: Cliente SOAP para AEAT
  • soap.go: Construcción de mensajes SOAP
  • xml.go: Generación XML VeriFactu

Flujo de Datos

Request HTTP
    │
    ▼
JSON Input
    │
    ▼
TransformAuto() ──▶ Detecta formato (native, dolibarr, ...)
    │
    ▼
Transformer.Transform() ──▶ TransformResult
    │
    ▼
CalculateHash(prevHash)
    │
    ▼
BuildSOAPRequest()
    │
    ▼
SendToAEAT()
    │
    ▼
Response

Cifrado de Contraseñas

El cliente envía la contraseña del certificado cifrada con la clave pública RSA de la API:

1. GET /api/v1/auth/public-key → Obtener clave pública
2. RSA encrypt(password) → Cifrar contraseña
3. POST /api/v1/auth/register → Registrar cert con password cifrada

Tokens

Al registrar un certificado se genera un token que identifica la sesión:

{
  "success": true,
  "cert": {...},
  "token": "A1B2C3D4E5F6..."
}

Este token se usa en requests de facturas para identificar el certificado a usar.