Cambiando el tipo de cambio en los pagos en Odoo

3 de julio de 2023 por
Gustavo Orrillo
| Sin comentarios aún
 

Esto funciona a partir de la versión 15 de Odoo. A partir de esta versión de Odoo, cuando se crean los pagos en forma automática se crea el asiento contable relacionado. Este pago puede ser en moneda extranjera (supongamos USD o EUR) y el tipo de cambio que toma es el tipo de cambio existente para la fecha del pago (es un standard de Odoo, en Europa no pueden imaginar la paranoia cambiaria de America Latina). Este de cambio se usa para crear el asiento contable (el cual es en moneda local).

Por motivos comerciales muchas veces los clientes necesitan poder grabar los pagos con un tipo de cambio diferente al tipo de cambio vigente. Por eso desarrollamos el módulo payment_exchange_rate, el cual se puede instalar sin grandes requerimientos, no requiere nada. Este módulo se utiliza de la siguiente manera. Cuando se crea un pago, cuando se selecciona un pago de moneda de pago extranjera, se habilita el campo Tipo de Cambio:


Lo que permite ingresar el tipo de cambio en forma manual. Supongamos en este caso tenemos la empresa con el peso uruguayo como moneda local e ingresamos un pago en USD


Y cuando se guarda el pago pago, podemos apreciar como se creó el asiento contable con el nuevo tipo de cambio aplicado


Esto va a permitir confirmar el asiento del pago y utilizarlo para conciliar las diferentes facturas pendientes de pago (aplicando el tipo de cambio ingresado).

Notas técnicas

Este módulo usa una técnica que explicamos en un post sobre como ingresar información en un formulario de forma condicional. Con esta técnica usamos campos computados para saber cuando habilitar el ingreso del tipo de cambio por parte del usuario. Y se crea un nuevo campo en el modelo account.payment llamado exchange_rate que almacenará el tipo de cambio que usará el sistema para realizar la imputación contable de forma correcta:

display_exchange_rate = fields.Boolean('display_exchange_rate',compute=_compute_display_exchange_rate,store=True)
exchange_rate = fields.Float('Tipo de cambio')
converted_amount = fields.Float('Monto convertido',compute=_compute_converted_amount,store=True)


Lo más importante del módulo es que sobre-escribe (muchas veces no queda otra opción) el método _prepare_move_line_default_vals (que crea los valores que toman las lineas del asiento contable del pago) y aplica la misma lógica que se aplica en el core. La diferencia es que aplica el tipo de cambio ingresado por el usuario para calculos los débitos y créditos.

def _prepare_move_line_default_vals(self, write_off_line_vals=None):
...
if self.exchange_rate == 0:
write_off_balance = self.currency_id._convert(
write_off_amount_currency,
self.company_id.currency_id,
self.company_id,
self.date,
)
liquidity_balance = self.currency_id._convert(
liquidity_amount_currency,
self.company_id.currency_id,
self.company_id,
self.date,
)
else:
write_off_balance = write_off_amount_currency * self.exchange_rate
liquidity_balance = liquidity_amount_currency * self.exchange_rate
...

Esta es una técnica muy utilizada para customizar el comportamiento de Odoo, por eso lo indicamos aca. Algún día hablaremos más de ella.


Gustavo Orrillo 3 de julio de 2023
Compartir
Archivar
Identificarse dejar un comentario