Cuando migramos datos históricos a Odoo muchas veces necesitamos cargar una factura en moneda extranjera (por ejemplo USD) con un tipo de cambio particular. Esto puede llegar a ser complicados, porque Odoo cuando crea una factura le setea el tipo de cambio cargado para la fecha de la factura, no para el tipo de cambio particular que necesitemos. Pero ello muchas veces no es posible porque nos encontramos con clientes que cargan facturas con el tipo de cambio que les conviene según la humedad del día. Como podemos hacer para resolver este problema?
Necesitamos en el modelo account.move sobreescribir el método _computed_expected_currency_rate. Este método devuelve el tipo de cambio que se espera para la fecha de la factura
@api.depends('currency_id', 'company_currency_id', 'company_id', 'invoice_date', 'taxable_supply_date')
def _compute_expected_currency_rate(self):
for move in self:
if self.env.context.get('custom_rate'):
move.expected_currency_rate = 1 / self.env.context.get('scat_rate')
elif move.currency_id:
move.expected_currency_rate = move._get_expected_currency_rate_at(move._get_invoice_currency_rate_date())
else:
move.expected_currency_rate = 1
Lo que hacemos es chequear si esta seteado el contexto para la clave custom_rate (puede ser la clave que necesiten) y si lo es, se devuelte el tipo de cambio que se pasa por contexto. Así de facil.
Entonces, cuando llega el momento de migrar, tenemos un código como el siguiente:
if moneda == 'USD':
move_id = self.env['account.move'].with_context(custom_rate=row.get('TC')).create(vals)
else:
move_id = self.env['account.move'].create(vals)
Donde chequeamos si la moneda es USD, creamos con contexto la factura.
Bueno, fue un truco que aprendí esta mañana que la verdad me resuelve unos cuantos problemas. Lo mejor? No necesité nada de chatgpt ni herramienta de IA para hacerlo, solo revisar el código de Odoo.