Rounding improvements #12
Open
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Corrección Errores CFDI40215 y CFDI40221 - Resumen Técnico
Fecha: 5 de noviembre de 2025
Addon: cdfi_invoice
Archivo modificado:
models/account_invoice.pyProblemas Identificados
Error CFDI40215
"El campo Importe correspondiente a Traslado no es igual al redondeo de la suma de los importes de las bases trasladados registrados en los conceptos"
Ejemplo:
Error CFDI40221
"El campo Importe correspondiente a Traslado no es igual al redondeo de la suma de los importes de los impuestos trasladados registrados en los conceptos"
Ejemplo:
Causa Raíz
Problema 1: CFDI40215 (Nivel Línea)
El PAC valida que cada concepto (línea de factura) cumpla:
El código original:
Base: Valor sin redondear (solo formateado)Importe: Monto calculado por Odoo desde base sin redondearConsecuencia: Diferencias acumuladas en facturas con múltiples líneas.
Problema 2: CFDI40221 (Resumen vs Líneas)
El PAC valida que el total en resumen sea exactamente la suma de importes en conceptos.
El código original:
base_línea × tasabase_agrupada × tasaConsecuencia: Inconsistencia entre totales de conceptos vs resumen (diferencias de 0.01).
Solución Implementada
1. Impuestos Trasladados a Nivel Línea (líneas 387-422)
Antes:
Después:
2. Impuestos Retenidos a Nivel Línea (líneas 424-442)
Mismo patrón aplicado para retenciones.
3. Totales Resumen (líneas 586-603)
Antes (causaba CFDI40221):
Después:
Clave: El importe se calcula una sola vez a nivel línea, el resumen lo reutiliza (no lo recalcula).
4. Retenciones Resumen (líneas 609-622)
Cambio clave:
5. Impuestos Locales Traslados (líneas 447-452)
Antes:
Después:
6. Impuestos Locales Retenciones (líneas 454-459)
Mismo patrón aplicado para retenciones locales.
Cambios por Tipo de Factor
importe = ROUND(ROUND(base, 2) × tasa, 2)importe = ROUND(amount, 2)(monto fijo por unidad)Archivos Modificados
Líneas modificadas:
Total de líneas cambiadas: ~60 líneas
Compatibilidad
roundTraditional()existente