# VeriFactu - Protocolo AEAT

## Qué es VeriFactu

Sistema mandatory de facturación electrónica de la AEAT (Agencia Estatal de Administración Tributaria) de España.

## Obligatoriedad

A partir de cierta fecha, todas las facturas emitidas deben registrarse en VeriFactu, independientemente del formato (digital).

## Operaciones

### Alta

Registrar una factura nueva en el sistema.

**Tipos de factura:**
- F1: Factura completa
- F2: Factura simplificada (ticket)
- R1-R5: Rectificativas

### Anulación

Cancelar una factura previamente registrada.

### Subsanación

Corregir errores en facturas ya registradas.

### Consulta

Buscar facturas previamente enviadas.

## Encadenamiento de Hash

Cada factura incluye el hash de la anterior. El formato exacto validado por la AEAT es:

```
SHA256("IDEmisorFactura=NIF&NumSerieFactura=SERIE&FechaExpedicionFactura=dd-mm-yyyy&TipoFactura=F1&CuotaTotal=21.00&ImporteTotal=121.00&Huella=HASH_ANTERIOR&FechaHoraHusoGenRegistro=yyyy-mm-ddThh:mm:ss+hh:mm")
```

Para el primer registro de un emisor, `Huella` se deja vacío y en el XML se envía `<PrimerRegistro>S</PrimerRegistro>`. Para el resto, se envía `<RegistroAnterior>` con los datos de la factura anterior (nunca ambos a la vez).

## URLs

### Testing (Preproducción)
```
https://prewww1.aeat.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP
```

### Producción
```
https://www1.agenciatributaria.gob.es/wlpl/TIKE-CONT/ws/SistemaFacturacion/VerifactuSOAP
```

## Formato

SOAP 1.1 sobre HTTPS con mTLS (certificado cliente cualificado). Namespaces requeridos:

- `xmlns:sum` → `https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd`
- `xmlns:sum1` → `https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd`

Campos específicos a tener en cuenta:
- `TipoHuella`: valor `01` (no `SHA-256`)
- `FechaHoraHusoGenRegistro`: formato ISO 8601 con huso horario (`yyyy-mm-ddThh:mm:ss+hh:mm`)
- `IdSistemaInformatico`: 2 caracteres (`01`, no `1`)
- `Encadenamiento`: usa `xs:choice` — o `PrimerRegistro` o `RegistroAnterior`, nunca los dos

## CSV

Código de Verificación asignado por la AEAT con formato `A-XXXXXXXXXXXXX`. Acredita el registro de la factura en Hacienda. Cuando la API opera en modo fallback local devuelve el hash SHA-256 en su lugar y el estado indica `Correcto (local)`.

## Fallback Local

Cuando AEAT no está disponible (error de red, servidor caído, etc), la API guarda la factura localmente:
- Genera el hash localmente
- Guarda en `./data/` (hash storage)
- Devuelve el hash como CSV temporal
- Estado: "Correcto (local)"

Esto permite seguir operando sin conexión a AEAT.

## Certificado Cliente

La AEAT requiere certificado cliente para aceptar requests (mTLS):

```yaml
certificates:
  storage_path: ./data/certs/
  cert_file: ./data/certs/personal.p12
  cert_password: tu_contraseña
```

Sin certificado válido, la API cae en fallback local.

## Datos Obligatorios

- NIF del emisor
- Número de serie
- Fecha de expedición
- Tipo de factura
- Base imponible IVA
- Cuota IVA
- Importe total

## Límites

- Máximo 1000 facturas por request
- Rate limit: consultar documentación AEAT