Skip to content

fix: render impuesto exento rows in invoice PDF template#67

Merged
satcfdi merged 6 commits into
SAT-CFDI:mainfrom
alexmbar:fix/exento-impuesto-pdf-template
May 15, 2026
Merged

fix: render impuesto exento rows in invoice PDF template#67
satcfdi merged 6 commits into
SAT-CFDI:mainfrom
alexmbar:fix/exento-impuesto-pdf-template

Conversation

@alexmbar
Copy link
Copy Markdown
Contributor

Problema

La plantilla Conceptos.html no renderizaba correctamente las filas de impuestos cuando TipoFactor es 'Exento'.

Según la especificación del SAT para CFDI 4.0, cuando un traslado tiene TipoFactor="Exento", los atributos TasaOCuota e Importe no están presentes en el XML. Esto provocaba que:

  • La celda de Tasa o Cuota quedara vacía (Jinja2 Undefined ).
  • La celda de Importe quedara vacía.
  • La fila se dibujaba incompleta o en algunos casos no se mostraba visualmente en el PDF.

Solución

Se agrega una condición {% if v.TipoFactor == 'Exento' %} en dos lugares del template:

  1. Tabla de impuestos por concepto (desglose por cada concepto de la factura).
  2. Tabla de totales (resumen al pie de la factura).

Cuando TipoFactor == 'Exento', se muestra el texto Exento en la columna de Tasa o Cuota y la celda de Importe queda vacía (comportamiento correcto, sin TasaOCuota ni Importe).

Cambios

  • satcfdi/render/templates/Conceptos.html: manejo de TipoFactor == 'Exento' en traslados.

Referencia SAT

Especificación CFDI 4.0 — Nodo Traslado:

TasaOCuota: Requerido cuando TipoFactor sea Tasa o Cuota.
Importe: Requerido cuando TipoFactor sea Tasa o Cuota.
Cuando TipoFactor sea Exento, estos atributos no aplican.

Fix: evitar uso recursivo de cursores en SQLite usando cursores locales
When TipoFactor is 'Exento', the SAT spec does not include TasaOCuota
or Importe attributes. The template was silently skipping these rows
because the Importe cell rendered as empty/undefined.

This fix adds a conditional check for TipoFactor == 'Exento' in both
the per-concept tax breakdown and the totals section, displaying
'Exento' label instead of empty tasa/importe cells.
…nflict)

Accept upstream changes: use try/finally for cursor cleanup and
pickle protocol=4 in select(). No logic changes from our fix branch.
When TipoFactor is 'Exento', the SAT spec does not include TasaOCuota
or Importe attributes. The template was silently skipping these rows
because the Importe cell rendered as empty/undefined.

This fix adds a conditional check for TipoFactor == 'Exento' in both
the per-concept tax breakdown and the totals section, displaying
'Exento' label instead of empty tasa/importe cells.
…nflict)

Accept upstream changes: use try/finally for cursor cleanup and
pickle protocol=4 in select(). No logic changes from our fix branch.
@satcfdi satcfdi merged commit a0340ed into SAT-CFDI:main May 15, 2026
3 of 6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants