Skip to content

Commit

Permalink
En este commit arreglamos dos cosas:
Browse files Browse the repository at this point in the history
1. una que era NTH, es que cambiar cotizacion en una factura no resetee impuestos modificados a mano
2. que al postear una factura en otra divisa, tampoco se reseteen impuestos modificados a mano.
Ambas cosas las logramos agregando en el vals tax_totals que de alguna manera luego es interpretado por "account_invoice_tax" quien es el responsable de mantener impuestos fijos que se modificaron

fix similar pero con approach de cambiar fechas lo tenemos en pr #844

closes #843

Signed-off-by: Juan José Scarafía <jjs@adhoc.com.ar>
  • Loading branch information
jjscarafia committed May 7, 2024
1 parent 7ce397f commit 60efb2d
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 40 deletions.
45 changes: 16 additions & 29 deletions l10n_ar_ux/models/account_move.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,16 +92,24 @@ def _is_manual_document_number(self):
return res

def _post(self, soft=True):
""" Estamos sobreescribiendo este método para hacer cosas que en odoo oficial no se puede tanto previo como posterior a la validación de la factura. """

# para facturas argentinas y que no usen documentos tmb guardamos rate para mantener mismo comportamiento que en
# las que si y además porque nosotros siempre estamos mostrando la cotización (facturas con y sin). de esta
# manera queda mucho más consistente
# estamos haciendo varias cosas acá:
# 1. para facturas sin documentos guardamos el rate (en l10n_ar solo se hace para las que usan documentos)
# 2. en vez de que el rate se seete luego de postear (que es lo que l10n_ar) lo hacaemos antes para garantizar que
# se actualicen los apuntes contables con el rate que efectivamente se va a autilizar
# hacemos el hack del +1 porque sin eso no termina de actualizar
# el metodo _set_afip_rate super lo llama pero no va a hacer nada porque ya llega con un de l10n_ar_currency_rate seteado
not_use_doc_with_currency_ar_invoices = self.filtered(
lambda x: x.company_id.account_fiscal_country_id.code == "AR" and x.is_invoice(include_receipts=True)
and x.currency_id != x.company_currency_id and not x.l10n_ar_currency_rate
and not x.l10n_latam_use_documents)
not_use_doc_with_currency_ar_invoices._set_afip_rate()
and x.currency_id != x.company_currency_id and not x.l10n_ar_currency_rate)
for rec in not_use_doc_with_currency_ar_invoices:
rate = self.env['res.currency']._get_conversion_rate(
from_currency=rec.currency_id,
to_currency=rec.company_id.currency_id,
company=rec.company_id,
date=rec.invoice_date or fields.Date.context_today(rec),
)
rec.write({'l10n_ar_currency_rate': rate + 1, 'tax_totals': rec.tax_totals})
rec.write({'l10n_ar_currency_rate': rate, 'tax_totals': rec.tax_totals})
res = super()._post(soft=soft)
return res

Expand All @@ -116,24 +124,3 @@ def _compute_l10n_latam_document_type(self):
document_types = rec.l10n_latam_available_document_type_ids._origin
document_types = document_types.filtered(lambda x: x.internal_type == 'debit_note')
rec.l10n_latam_document_type_id = document_types and document_types[0].id

def _set_afip_rate(self):
""" Lo sobre escribimos por completo el metodo que esta en l10n_ar, Es igual el metodo, lo unico que cambio es que hacemos
un write explicito del campo l10n_ar_currency_rate. Esto lo hacemos para forzar el recomputo de la tasa y las lineas de factura
para que tengan correcto los montos en pesos segun la cotizacion usada. Esto resuelve los siguientes problemas
1. Facturas creadas días atrás y dejadas en borrador usen cotización actual al validar en lugar de la cotizacion del dia de creación.
3. Forzar cotización mantiene comportamiento correcto: usa la cotización forzada sin importar que fecha sea.
PENDIENTE: NO logramos hacerlo: Actualiza cotización si esta fue cambiada posterior a cuando fue usada en la factura.
"""
for rec in self:
if rec.company_id.currency_id == rec.currency_id:
rec.l10n_ar_currency_rate = 1.0
elif not rec.l10n_ar_currency_rate:
rec.write({'l10n_ar_currency_rate': self.env['res.currency']._get_conversion_rate(
from_currency=rec.currency_id,
to_currency=rec.company_id.currency_id,
company=rec.company_id,
date=rec.invoice_date or fields.Date.context_today(rec),
)})
18 changes: 7 additions & 11 deletions l10n_ar_ux/wizards/account_move_change_rate.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,18 +35,14 @@ def _onchange_move(self):
self.currency_rate = self.move_id.l10n_ar_currency_rate or self.move_id.computed_currency_rate

def confirm(self):
# Agrego este contexto para obtenerlo desde el modulo account_invoice_tax y evitar que se recompute el monto (amount_currency ) de los impuestos fijos
# al cambiar la cotizacion de la moneda
# Si bien no seria necesario si no esta instalado este modulo, nos evita un modulo puente
context = {
'tax_list_origin': self.move_id.mapped('invoice_line_ids.tax_ids'),
'tax_total_origin': self.move_id.tax_totals
}
if self.day_rate:
message = _("Currency rate changed from %s to %s") % (self.move_id.l10n_ar_currency_rate or self.move_id.computed_currency_rate, float_round(self.move_id.computed_currency_rate,2))
self.move_id.with_context(context).l10n_ar_currency_rate = 0.0
message = _("The forced rate '%s' was removed, date rate will be use") % (self.move_id.l10n_ar_currency_rate)
rate = 0.0
else:
message = _("Currency rate changed from %s to %s . Currency rate forced") % (float_round(self.move_id.l10n_ar_currency_rate or self.move_id.computed_currency_rate, 2), float_round(self.currency_rate, 2))
self.move_id.with_context(context).l10n_ar_currency_rate = self.currency_rate
message = _("Currency rate changed from '%s' to '%s' . Currency rate forced") % (float_round(self.move_id.l10n_ar_currency_rate or self.move_id.computed_currency_rate, 2), float_round(self.currency_rate, 2))
rate = self.currency_rate
# pasamos el tax_totals porque es lo que termina usando account_invoice_tax para poder mantener impuestos forzados
# lo podemos hacer aca de anera segura porque sabemos que solo cambia rate y no cambia ningun importe
self.move_id.write({'l10n_ar_currency_rate': rate, 'tax_totals': self.move_id.tax_totals})
self.move_id.message_post(body=message)
return {'type': 'ir.actions.act_window_close'}

0 comments on commit 60efb2d

Please sign in to comment.