Cambiando el tipo de cambio en los pagos en Odoo

Gustavo Orrillo
- 21/12/2022 - 2 min. de lectura

Bien... esto funciona en Odoo 15, no ya en Odoo 14. Ya verán porque. En Odoo 15 se permite el ingreso de los pagos; los cuales generan en forma automática un asiento contable al momento de ser creados. Dicho pago puede ser ingresado en moneda extranjera (supongamos USD) y el tipo de cambio que toma es el tipo de cambio existente para la fecha del pago. Dicho tipo de cambio se utiliza para crear el asiento contable (el cual es en moneda local).

Lo que se necesita (por motivos comerciales) es poder grabar los pagos con un tipo de cambio diferente al tipo de cambio vigente. Para ello desarrollamos el módulo payment_exchange_rate, el cual lo pueden descargar e instalar. Dicho módulo se utiliza de la siguiente forma. Al momento de crear un pago, al seleccionarse una moneda de pago extranjera, se puede ver 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


Al momento de guardar el pago, podemos ver como se genera el asiento contable con el tipo de cambio manual 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

El módulo hace uso de campos computados para saber cuando se debe permitir al usuario ingresar el tipo de cambio. Y define un nuevo campo en el modelo account.payment llamado exchange_rate que es el campo donde el usuario ingresa el tipo de cambio que va a utilizar

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)

Ahora, lo que hace el módulo es sobreescribir el método _prepare_move_line_default_vals (que son los valores que toman las lineas del asiento contable del pago) y aplica la misma lógica que se aplica en el core, la única diferencia es que cuando llega el momento de aplicar el tipo de cambio evalua si el usuario ingreso un tipo de cambio manual. Si es así, aplica el tipo de cambio aplicado por el usuario.

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.

Acerca de:

Gustavo Orrillo

Passionate about programming, he has implemented Odoo for different types of businesses since 2010. In Moldeo Interactive he is a founding Partner and Programmer; In addition to writing on the Blog about different topics related to the developments he makes.