# Set de pruebas SII — proceso de certificación desde api-a-conta-fact

Este documento describe cómo pasar el set de pruebas que el SII entrega al solicitar certificación, **emitido desde api-a-conta-fact** (no desde DTEngine). Una vez aceptado, el RUT queda habilitado para producción y los DTEs reales pueden emitirse desde el mismo sistema.

## Contexto

La certificación SII es por **RUT emisor + sistema productivo**. Si los DTEs reales van a salir desde `api-a-conta-fact`, el set debe pasarse desde acá — de lo contrario el SII puede rechazar DTEs productivos por divergencia con el sistema certificado.

> Alternativa: pasar la certificación con DTEengine y migrar después a api-a-conta-fact garantizando XML byte-idénticos. Riesgo alto si los XMLs difieren mínimamente.

## Flujo completo

```
1. Empresa solicita certificación al SII (web)
                ↓
2. SII entrega set de prueba específico (CSV o documento)
                ↓
3. Traducir set a JSON local → tests/Fixtures/SetPruebasSII/{cliente}.json
                ↓
4. php artisan dte:emitir-set-pruebas {json}
                ↓
5. Para cada DTE: emisión + envío + esperar EPR
                ↓
6. Generar libros del período:
   - php artisan dte:generar-libro {empresa} --tipo=VENTA --periodo=YYYY-MM
   - php artisan dte:generar-libro {empresa} --tipo=COMPRA --periodo=YYYY-MM --compras-json=...
   - php artisan dte:generar-libro {empresa} --tipo=GUIA --periodo=YYYY-MM
                ↓
7. Enviar libros al SII:
   - php artisan dte:test-libro {empresa} {xml} --tipo=VENTA  --endpoint=iecv
   - php artisan dte:test-libro {empresa} {xml} --tipo=COMPRA --endpoint=iecv
   - php artisan dte:test-libro {empresa} {xml} --tipo=GUIA   --endpoint=iecv
                ↓
8. Esperar resultado en correo SII (Estado del Envio de Libro + Estado del Libro)
                ↓
9. Una vez todos LOK/aceptados → SII habilita RUT para producción
```

## Pre-requisitos

Antes de ejecutar el set:

| # | Pre-requisito | Cómo verificar |
|---|---|---|
| 1 | Empresa con `facturacion=1` en `par_empresas` | `SELECT id, rut, facturacion FROM par_empresas WHERE id=1` |
| 2 | Certificado PFX cargado en `dte_certificados` | `SELECT * FROM dte_certificados WHERE par_empresa_id=1 AND activo=1` |
| 3 | CAFs de todos los tipos a emitir en `dte_cafs` | Uno por cada tipo: 33, 34, 39, 41, 52, 56, 61 |
| 4 | `.env` con `DTE_EMITTER=internal` y `DTE_SII_ENV=certificacion` | Ver `FLUJO_PRUEBAS.md` §4 |
| 5 | Conexión a internet al SII (maullin/rahue) | `curl https://maullin.sii.cl/DTEWS/CrSeed.jws` |

## Formato del JSON del set

Estructura esperada en `tests/Fixtures/SetPruebasSII/{cliente}.json`:

```json
{
  "empresa_id": 1,
  "casos": [
    {
      "id": "set-caso-1-factura-afecta",
      "tipo_dte": 33,
      "descripcion": "Factura electronica afecta con un item",
      "receptor": {
        "rut": "55555555-5",
        "razon_social": "CLIENTE DE PRUEBA",
        "direccion": "AV ANDRES BELLO 2425",
        "comuna": "PROVIDENCIA"
      },
      "items": [
        { "nombre": "Servicio", "cantidad": 1, "precio": 1000000, "total": 1190000, "exento": false }
      ],
      "referencias": []
    }
  ]
}
```

Ejemplo completo con los 6 casos típicos: `tests/Fixtures/SetPruebasSII/ejemplo.json`.

### Campos por caso

| Campo | Obligatorio | Notas |
|---|---|---|
| `id` | Sí | Identificador del caso (ej. nombre del SII) |
| `tipo_dte` | Sí | 33, 34, 39, 41, 52, 56, 61 |
| `receptor.rut` | Sí | RUT real para facturas/NC/ND/guías. 66666666-6 solo válido en boletas |
| `receptor.razon_social` | Sí | Hasta 100 chars |
| `items[]` | Sí | Al menos 1 ítem |
| `items[].total` | Sí | Monto bruto del ítem (con IVA si no es exento). El builder recalcula neto/IVA |
| `items[].exento` | No | true para ítems exentos |
| `referencias[]` | Solo NC/ND | Array con tipo_doc, folio, fecha, codigo, razon |

### Códigos de referencia (NC/ND)

- `1` = Anulación de documento
- `2` = Corrige monto
- `3` = Corrige texto

## Generación de libros tras emitir los DTEs

Después de que todos los DTEs del set sean aceptados (EPR aceptado), generar los 3 libros del período.

### Libro de Ventas

Toma automáticamente todos los DTEs del período con estado `aceptado`/`aceptado_reparos`/`enviado`:

```bash
php artisan dte:generar-libro 1 --tipo=VENTA --periodo=2026-05
```

Output:
- `storage/app/dte/empresas/1/libros/VENTA_2026-05.xml` (firmado, listo para enviar)
- Registro en `libro_intentos` con `estado=firmado`

### Libro de Compras

Las compras no las emite el sistema (vienen de proveedores). Para el set de certificación, el SII suele asignar también un libro de compras específico — preparar un JSON manual con los registros:

```json
[
  {
    "tipo_doc": 33,
    "folio": 1234,
    "fecha_doc": "2026-05-10",
    "rut_doc": "76123456-7",
    "razon_social": "PROVEEDOR SPA",
    "mnt_neto": 100000,
    "mnt_iva": 19000,
    "mnt_total": 119000
  }
]
```

Guardar en `tests/Fixtures/SetPruebasSII/compras_2026-05.json` y:

```bash
php artisan dte:generar-libro 1 --tipo=COMPRA --periodo=2026-05 --compras-json=tests/Fixtures/SetPruebasSII/compras_2026-05.json
```

### Libro de Guías

Solo si emitiste guías (tipo 52) en el período:

```bash
php artisan dte:generar-libro 1 --tipo=GUIA --periodo=2026-05
```

## Envío de libros al SII

Una vez generados los XMLs firmados, enviarlos:

```bash
# Libro de Ventas
php artisan dte:test-libro 1 storage/app/dte/empresas/1/libros/VENTA_2026-05.xml --tipo=VENTA --endpoint=iecv

# Libro de Compras
php artisan dte:test-libro 1 storage/app/dte/empresas/1/libros/COMPRA_2026-05.xml --tipo=COMPRA --endpoint=iecv

# Libro de Guías
php artisan dte:test-libro 1 storage/app/dte/empresas/1/libros/GUIA_2026-05.xml --tipo=GUIA --endpoint=iecv
```

Si `IECVUpload` no responde, usar `--endpoint=dte` para experimento contra `DTEUpload` (mismo URL que DTEs):

```bash
php artisan dte:test-libro 1 .../VENTA_2026-05.xml --tipo=VENTA --endpoint=dte
```

Cada envío persiste en `libro_intentos` con `track_id` y `respuesta_raw` del SII.

## Estados que devuelve el SII para libros

| Estado SII | Significado | Interpretación |
|---|---|---|
| LOK | Libro OK | ✅ Aceptado |
| LTC | Libro tributario completo | ✅ Aceptado |
| LRH | Libro rechazado por hash | ❌ Firma inválida |
| LRR | Libro rechazado | ❌ Estructura/contenido inválido |
| LNC | Libro no contiene documentos | ⚠️ Aceptado pero vacío |
| LNV | Libro no contiene ventas | ⚠️ Aceptado pero sin ventas |
| EPR | Envío procesado | ⏳ En proceso, esperar |
| PENDIENTE | Pendiente | ⏳ Aún no procesado |

`LibroRespuestaParser::inferirEstadoOperativo()` mapea estos a `aceptado`/`rechazado`/`pendiente`/`procesando`.

## Checklist para certificación

- [ ] Cert PFX cargado en `dte_certificados` (activo, no vencido)
- [ ] CAFs cargados para cada tipo a emitir (33, 34, 39, 41, 52, 56, 61)
- [ ] `dte_fecha_resolucion` y `dte_nro_resolucion` configurados (env o `par_empresas`)
- [ ] JSON del set creado con casos asignados por SII
- [ ] `php artisan dte:emitir-set-pruebas` ejecutado, todos los DTEs aceptados
- [ ] Libros de Ventas, Compras y Guías generados con `dte:generar-libro`
- [ ] Libros enviados al SII y aceptados (LOK/LTC)
- [ ] Resultado del SII registrado (correo confirma habilitación)
- [ ] `DTE_SII_ENV=produccion` cuando se cambie a producción

## Limitaciones conocidas

| Limitación | Impacto | Cuándo abordar |
|---|---|---|
| Solo soporta `TipoEnvio=TOTAL` mensual | No se pueden enviar libros parciales o de ajuste | Si el SII lo exige durante certificación, ampliar `LibroBuilder` |
| Compras requieren JSON manual | No hay módulo de recepción de DTEs de terceros | Después de certificación, integrar con módulo de compras existente |
| Sin retención IVA, sin otros impuestos (combustibles, etc.) | Falta detalle en libros | Solo si el cliente lo usa |
| Sin manejo de intercambio comercial (Recibo Mercaderías, Aprobación Comercial) | Cliente debe responder DTEs recibidos por otra vía | Después de certificación |

## Referencias

| Recurso | Para qué |
|---|---|
| `COMPRACION_DTENGINE.md` | Estado componente por componente vs DTEngine |
| `ANALISIS_FIRMAS.md` | Gaps técnicos de firmas y cómo se cerraron |
| `FLUJO_PRUEBAS.md` | Setup inicial: PFX, CAF, primera emisión simple |
| `TRAZABILIDAD.md` | Modelo de datos: dte_envios, dte_logs, libro_intentos |
| `ERRORES.md` | Catálogo de errores conocidos |
| Proceso oficial SII | https://www.sii.cl/factura_electronica/factura_mercado/proceso_certificacion.htm |
