# Libro de Compras v1 - EVENTSUD - SOK

**Identificador del Set SII:** `4841002`
**Tipo de Set:** LIBRO DE COMPRAS - Version 1
**RUT Emisor:** `78073481-7`
**RUT Firmante (RutEnvia):** `16658678-K`
**Track ID:** `249686324`
**FolioNotificacion:** `5` (5to intento)
**Fecha:** 2026-05-26
**Estado SII envio:** OK
**Estado SII revision del set:** `SOK - SET DE PRUEBA CORRECTO`

## Contenido del libro

Libro **TipoLibro=ESPECIAL, TipoEnvio=TOTAL** con 7 registros manuales del set
certificación SII (datos del TXT SIISetDePruebas780734817.txt):

| # | TpoDoc | Folio | RUTDoc | Glosa | MntExe | MntNeto | MntIVA | MntTotal | Especial |
|---|---|---|---|---|---|---|---|---|---|
| 1 | 30 | 234 | 76148283-1 | Factura del giro con derecho a credito | 0 | 6.832 | 1.298 | 8.130 | — |
| 2 | 33 | 32 | 76148283-1 | Factura del giro con derecho a credito | 8.034 | 4.288 | 815 | 13.137 | — |
| 3 | 30 | 781 | 76148283-1 | Factura IVA Uso Comun | 0 | 29.611 | 5.626 | 35.237 | **IVAUsoComun** FctProp=0.6 |
| 4 | 60 | 451 | 76148283-1 | NC manual descuento factura 234 | 0 | 2.624 | 499 | 3.123 | TpoDocRef=30/234 |
| 5 | 33 | 67 | 76148283-1 | Entrega gratuita del proveedor | 0 | 9.071 | 1.723* | 10.794 | **IVANoRec** CodIVANoRec=4 |
| 6 | 46 | 9 | 76148283-1 | Compra electronica con retencion total IVA | 0 | 9.096 | 1.728 | **9.096** | **OtrosImp** CodImp=15, TasaImp=19 |
| 7 | 60 | 211 | 76148283-1 | NC manual descuento factura electronica 32 | 0 | 2.389 | 454 | 2.843 | TpoDocRef=33/32 |

(*) En IVANoRec el monto va dentro de `<IVANoRec><MntIVANoRec>` y MntIVA del Detalle queda en 0.

## Casos especiales del set de compras

### 1. IVA Uso Comun (TpoDoc=30, folio 781)

Factura con IVA cuyo derecho a crédito se distribuye proporcionalmente (en
este set, factor 0.60). El IVA total (5.626) no va a `TotMntIVA` general
sino a `TotIVAUsoComun`. El crédito recuperable se calcula:
`TotCredIVAUsoComun = round(TotIVAUsoComun * FctProp) = round(5626 * 0.6) = 3376`.

**Detalle:** `<MntIVA>0</MntIVA><IVAUsoComun>5626</IVAUsoComun>`
**Resumen TpoDoc=30:** `TotIVAUsoComun=5626, FctProp=0.6, TotCredIVAUsoComun=3376`.

### 2. IVA No Recuperable (TpoDoc=33, folio 67)

Entrega gratuita del proveedor: el IVA existe pero no genera crédito fiscal.
Va dentro de `<IVANoRec>` con código del motivo (4=Entregas Gratuitas).

**Detalle:** `<MntIVA>0</MntIVA><IVANoRec><CodIVANoRec>4</CodIVANoRec><MntIVANoRec>1723</MntIVANoRec></IVANoRec>`
**Resumen TpoDoc=33:** `TotIVANoRec/CodIVANoRec=4/TotOpIVANoRec=1/TotMntIVANoRec=1723`.

### 3. Retencion Total IVA (TpoDoc=46, folio 9)

Factura de compra electronica donde el comprador retiene el 100% del IVA al
proveedor y lo paga directamente al SII. El IVA SI existe en el documento
(MntIVA = MntNeto * TasaImp), pero ademas debe reportarse en `<OtrosImp>`
con `CodImp=15` (IVA Retenido Total) Y `TasaImp` obligatorio en el Detalle.

**Detalle:**
```xml
<MntIVA>1728</MntIVA>
<OtrosImp>
  <CodImp>15</CodImp>
  <TasaImp>19</TasaImp>
  <MntImp>1728</MntImp>
</OtrosImp>
<MntTotal>9096</MntTotal>  <!-- = MntNeto, sin sumar IVA retenido -->
```

**Resumen TpoDoc=46:** `TotMntIVA=1728, TotOtrosImp/CodImp=15/TotMntImp=1728` (sin TasaImp en TotOtrosImp), `TotMntTotal=9096`.

### 4. NC manuales (TpoDoc=60, folios 451 y 211)

NCs en papel (no electronicas) que descuentan facturas previas. Cada NC
debe indicar `<TpoDocRef>` + `<FolioDocRef>` apuntando al documento original.

## Historial de intentos hasta SOK

| Intento | TrackID | Resultado | Diagnostico |
|---|---|---|---|
| v1 | 249680740 | LRF (firma) | C14N del SignedInfo aislado no incluia xmlns:xsi heredado del root |
| v2 | 249681598 | LRC (caratula) | RutEnvia=RUT emisor + TipoLibro=MENSUAL con FolioNotificacion |
| v3 | 249684094 | SRH revisión | NC 211 era tipo 61 en vez de tipo 60 (manual); resumen no cuadraba lineas |
| v4 | 249684952 | LRS schema | XML en una sola linea de 4194 chars (> 4090 limite SII) |
| v5 | 249685896 | LRH descuadrado | TpoDoc 46: MntIVA=0 + OtrosImp sin TasaImp |
| **v6** | **249686324** | **SOK** | OK |

## Fixes incorporados al motor

1. **firma libro construyendo SignedInfo dentro del DOM** (commit `f44525a`)
2. **caratula libros: RutEnvia=cert + TipoLibro=ESPECIAL + TpoDocRef/FolioDocRef** (commit `c97d47a`)
3. **NC 211 tipo 60 + buildResumen ordenado XSD** (commit `c..`)
4. **3 casos especiales de IVA en compras** (commit `..`)
   - IVAUsoComun + FctProp + TotCredIVAUsoComun para Uso Comun
   - IVANoRec + CodIVANoRec para entrega gratuita
   - OtrosImp + CodImp + TasaImp para Retencion Total IVA
5. **DOMDocument formatOutput=true** (commit `498cb1d`) — line length < 4090.
6. **TpoDoc 46: MntIVA real + TasaImp en OtrosImp** (commit `a97b916`).

## Como reproducir

```bash
php artisan tinker --execute='
use App\Models\Parametros\ParEmpresa;
use App\Services\FacturacionElectronica\Services\CertificateService;
use App\Services\FacturacionElectronica\Services\EnvelopeService;
use App\Services\FacturacionElectronica\Services\LibroBuilder;
$emp = ParEmpresa::find(1);
$cert = app(CertificateService::class)->loadCertificate(1);
$registros = [
  ["tipo_doc"=>30, "folio"=>234, ..., "mnt_iva"=>1298, "mnt_total"=>8130],
  ["tipo_doc"=>33, "folio"=>32, ..., "mnt_exe"=>8034, "mnt_iva"=>815, "mnt_total"=>13137],
  ["tipo_doc"=>30, "folio"=>781, ..., "mnt_iva"=>5626, "iva_uso_comun"=>true, "factor_proporcionalidad"=>0.60],
  ["tipo_doc"=>60, "folio"=>451, ..., "tipo_doc_ref"=>30, "folio_doc_ref"=>"234"],
  ["tipo_doc"=>33, "folio"=>67, ..., "iva_no_recuperable_cod"=>4],
  ["tipo_doc"=>46, "folio"=>9, ..., "mnt_total"=>9096, "otros_imp_cod"=>15, "otros_imp_tasa"=>19],
  ["tipo_doc"=>60, "folio"=>211, ..., "tipo_doc_ref"=>33, "folio_doc_ref"=>"32"],
];
$r = app(LibroBuilder::class)->buildCompras($emp, "2026-05", $registros, 5, $cert->getId(), "ESPECIAL");
$xml = app(EnvelopeService::class)->firmarLibro($r["xml"], $cert, "LibroCOMPRA_78073481-7_2026-05");
file_put_contents("libro_compras.xml", $xml);
'
```

(ver `libro_compras_v1_eventsud_envelope_249686324.xml` para el contenido byte-exacto que paso SOK)

## Notas operacionales

- **NC/ND manuales son tipo 60/55**, no 61/56. Tipo 61/56 son las electronicas.
- **TasaImp es opcional en TotOtrosImp** pero **obligatorio en OtrosImp** del Detalle.
- **MntTotal en TpoDoc=46 (Retencion Total)** = MntNeto, sin sumar el IVA retenido.
- **MntIVA en TpoDoc=46** SI lleva el IVA real (= MntNeto * TasaImp). El SII valida
  esa formula independientemente de que el IVA esté retenido.
- **IVAUsoComun y IVANoRec van con MntIVA=0** en el Detalle (no se duplican).
- **FctProp se serializa con la menor cantidad de decimales**: 0.6 (no 0.60).
- **El SII rechaza lineas > 4090 chars**: usar DOMDocument formatOutput=true.
