-
Notifications
You must be signed in to change notification settings - Fork 248
[IMP] l10n_ar_tax: Hacer cálculo de percepciones de venta teniendo en cuenta el monto mínimo no imponible establecido en el impuesto. #1317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 18.0
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -100,3 +100,60 @@ def _check_tax_used_on_company_tax_fp(self): | |||||||||||||||
| raise UserError( | ||||||||||||||||
| "Error se esta usando en ws de estas cias %s" % ws.mapped("fiscal_position_id.company_id.name") | ||||||||||||||||
| ) | ||||||||||||||||
|
|
||||||||||||||||
|
|
||||||||||||||||
| def _get_tax_details( | ||||||||||||||||
| self, | ||||||||||||||||
| price_unit, | ||||||||||||||||
| quantity, | ||||||||||||||||
| precision_rounding=0.01, | ||||||||||||||||
| rounding_method="round_per_line", | ||||||||||||||||
| product=None, | ||||||||||||||||
| product_uom=None, | ||||||||||||||||
| special_mode=False, | ||||||||||||||||
| manual_tax_amounts=None, | ||||||||||||||||
| filter_tax_function=None, | ||||||||||||||||
| ): | ||||||||||||||||
| """ Hacer cálculo de percepciones de venta teniendo en cuenta el monto mínimo no imponible establecido en el impuesto.""" | ||||||||||||||||
|
||||||||||||||||
| """ Hacer cálculo de percepciones de venta teniendo en cuenta el monto mínimo no imponible establecido en el impuesto.""" | |
| """ Hacer cálculo de percepciones de venta (facturas y notas de crédito) teniendo en cuenta el monto mínimo no imponible establecido en el impuesto.""" |
Copilot
AI
Feb 26, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
La condición if not net_base y el bloque anidado if tax_data["tax_amount"] or tax_data["base_amount"] son redundantes. Cuando net_base es 0, siempre se debería actualizar tax_amount y base_amount a 0.0. La condición interna no agrega valor lógico porque:
- Si ambos valores ya son 0.0, asignarlos nuevamente a 0.0 es una operación sin efectos secundarios
- Si alguno no es 0.0, necesariamente deben ponerse en 0.0
Recomendación: Simplificar eliminando la condición interna y siempre ejecutar la actualización cuando net_base sea 0.
| if tax_data["tax_amount"] or tax_data["base_amount"]: | |
| tax_data["tax_amount"] = 0.0 | |
| tax_data["base_amount"] = 0.0 | |
| updated = True | |
| tax_data["tax_amount"] = 0.0 | |
| tax_data["base_amount"] = 0.0 | |
| updated = True |
Copilot
AI
Feb 26, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
El cálculo proporcional del tax_amount en la línea 148 podría generar problemas de precisión o redondeo. El método recibe un parámetro precision_rounding=0.01 que no se está utilizando al recalcular el monto del impuesto.
Cuando se calcula tax_data["tax_amount"] = tax_data["tax_amount"] * (net_base / base_amount), el resultado de la multiplicación podría tener más decimales de los esperados para una moneda. Esto podría causar diferencias de centavos en los totales.
Recomendación: Aplicar redondeo al resultado usando precision_rounding o la moneda correspondiente, por ejemplo usando float_round de odoo.tools o el método de redondeo de la moneda si está disponible en el contexto.
Copilot
AI
Feb 26, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
El recálculo del tax_amount en la línea 148 usa división pero no verifica si base_amount podría ser exactamente 0. Aunque hay una condición if base_amount que previene la división por cero, la estructura del código podría ser más clara.
Sin embargo, la lógica tiene una inconsistencia: cuando base_amount es 0 pero net_base no es 0 (lo cual es matemáticamente imposible dado que net_base = max(0, base_amount - l10n_ar_non_taxable_amount)), se establece tax_amount = 0.0 en línea 150. Esta rama del else nunca debería ejecutarse porque si base_amount = 0, entonces net_base también será 0 (ya procesado en el bloque if not net_base).
Recomendación: Simplificar la lógica eliminando la verificación redundante en línea 147, ya que si llegamos al bloque else (línea 146), sabemos que net_base > 0, lo que implica que base_amount > l10n_ar_non_taxable_amount, por lo tanto base_amount > 0 y no hay riesgo de división por cero.
| if base_amount: | |
| tax_data["tax_amount"] = tax_data["tax_amount"] * (net_base / base_amount) | |
| else: | |
| tax_data["tax_amount"] = 0.0 | |
| tax_data["tax_amount"] = tax_data["tax_amount"] * (net_base / base_amount) |
Copilot
AI
Feb 26, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
La nueva funcionalidad de cálculo de percepciones con monto mínimo no imponible carece de tests automatizados. Esto es importante porque:
- El módulo ya tiene tests en la carpeta
tests/ - La lógica introduce cálculos matemáticos no triviales (resta de monto no imponible, recálculo proporcional del tax_amount)
- Hay múltiples ramas condicionales que deberían validarse
Recomendación: Agregar tests que verifiquen:
- Caso a) Base > mínimo no imponible: verificar que el monto a percibir se calcula sobre (base - mínimo_no_imponible)
- Caso b) Base < mínimo no imponible: verificar que el monto a percibir es 0
- Caso c) Validar que funciona tanto para facturas como notas de crédito de venta
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
El comentario del docstring es excesivamente largo para una sola línea (más de 200 caracteres). Esto dificulta la legibilidad del código.
Recomendación: Reformatear el docstring para usar múltiples líneas, por ejemplo: