Tengo una observacion respecto a las facturas deducción de anticipos,
cuando es total y la operacion gravada se va en 0, en el template xml no se genera el TaxSubtotal debido a un if en el template, por lo cual sunat no acepta el comprobante.
{% if doc.mtoOperGravadas %}
<cac:TaxSubtotal>
<cbc:TaxableAmount currencyID="{{ doc.tipoMoneda }}">{{ doc.mtoOperGravadas|n_format }}</cbc:TaxableAmount>
<cbc:TaxAmount currencyID="{{ doc.tipoMoneda }}">{{ doc.mtoIGV|n_format }}</cbc:TaxAmount>
<cac:TaxCategory>
<cac:TaxScheme>
<cbc:ID>1000</cbc:ID>
<cbc:Name>IGV</cbc:Name>
<cbc:TaxTypeCode>VAT</cbc:TaxTypeCode>
</cac:TaxScheme>
</cac:TaxCategory>
</cac:TaxSubtotal>
{% endif %}
Tuve que suprimir el if por el momento para obtener una respuesta de aceptación de sunat:
Quisiera que me den alguna acotación al respecto.

` $invoice = (new Invoice())
->setUblVersion('2.1')
->setTipoOperacion('0101') // Venta interna
->setTipoDoc('01')
->setSerie('F001')
->setCorrelativo('200')
->setFechaEmision(new DateTime())
->setFormaPago(new FormaPagoContado())
->setTipoMoneda('PEN')
->setClient($util->shared->getClient())
->setCompany($util->shared->getCompany(1))
// === TOTALES ===
->setMtoOperGravadas(0.00)
->setMtoIGV(0)
->setTotalImpuestos(0)
->setValorVenta(93.22)
->setSubTotal(110.00)
->setMtoImpVenta(0.00) // Total a pagar (cero, porque todo está deducido)
->setTotalAnticipos(110.00)
// === ANTICIPO ===
->setAnticipos([
(new Prepayment())
->setTipoDocRel('02') // catalog 12 (anticipo)
->setNroDocRel('F001-150')
->setTotal(110.00)
])
// === DESCUENTO GLOBAL TIPO 04 ===
->setDescuentos([
(new Charge())
->setCodTipo('04')
->setFactor(0.5)
->setMonto(93.22)
->setMontoBase(186.44)
])
// === DETALLE ===
->setDetails([
(new SaleDetail())
->setCodProducto('ANT-001')
->setUnidad('NIU')
->setDescripcion('DEDUCCIÓN TOTAL DEL ANTICIPO F001-150')
->setCantidad(2)
->setMtoValorUnitario(46.61)
->setMtoValorVenta(93.22)
->setMtoBaseIgv(93.22)
->setPorcentajeIgv(18)
->setIgv(16.78)
->setTipAfeIgv('10') // GRAVADO - Operación Onerosa
->setTotalImpuestos(16.78)
->setMtoPrecioUnitario(55.00) // con IGV
])
// === LEYENDA ===
->setLegends([
(new Legend())
->setCode('1000')
->setValue('CERO CON 00/100 SOLES')
]);`