If you want to create and exchange rate difference journal entry in Odoo follow the following code:
 rate_diff = rec.debit_move_id.debit / rec.debit_move_id.amount_currency - rec.credit_move_id.credit / -rec.credit_move_id.amount_currency
                if rec.amount_currency and rec.company_id.currency_id.round(rec.amount_currency * rate_diff):
                    if not rec.company_id.currency_exchange_journal_id:
                        raise UserError(_("You should configure the 'Exchange Rate Journal' in the accounting settings, to manage automatically the booking of accounting entries related to differences between exchange rates."))
                    if not self.company_id.income_currency_exchange_account_id.id:
                        raise UserError(_("You should configure the 'Gain Exchange Rate Account' in the accounting settings, to manage automatically the booking of accounting entries related to differences between exchange rates."))
                    if not self.company_id.expense_currency_exchange_account_id.id:
                        raise UserError(_("You should configure the 'Loss Exchange Rate Account' in the accounting settings, to manage automatically the booking of accounting entries related to differences between exchange rates."))
                    amount_diff = rec.company_id.currency_id.round(rec.amount_currency * rate_diff)
                    move = rec.env['account.move'].create({'journal_id': rec.company_id.currency_exchange_journal_id.id, 'rate_diff_partial_rec_id': rec.id})
                    line_to_reconcile = rec.env['account.move.line'].with_context(check_move_validity=False).create({
                        'name': _('Currency exchange rate difference'),
                        'debit': amount_diff < 0 and -amount_diff or 0.0,
                        'credit': amount_diff > 0 and amount_diff or 0.0,
                        'account_id': rec.debit_move_id.account_id.id,
                        'move_id': move.id,
                        'currency_id': rec.currency_id.id,
                    })
                    rec.env['account.move.line'].create({
                        'name': _('Currency exchange rate difference'),
                        'debit': amount_diff > 0 and amount_diff or 0.0,
                        'credit': amount_diff < 0 and -amount_diff or 0.0,
                        'account_id': amount_diff > 0 and rec.company_id.currency_exchange_journal_id.default_debit_account_id.id or rec.company_id.currency_exchange_journal_id.default_credit_account_id.id,
                        'move_id': move.id,
                        'currency_id': rec.currency_id.id,
                    })
                    rec.env['account.partial.reconcile'].create({
                        'debit_move_id': amount_diff < 0 and line_to_reconcile.id or rec.debit_move_id.id,
                        'credit_move_id': amount_diff > 0 and line_to_reconcile.id or rec.credit_move_id.id,
                        'amount': abs(amount_diff),
                        'amount_currency': 0.0,
                        'currency_id': rec.debit_move_id.currency_id.id,
                    })
                    move.post()
    @api.model
    def create(self, vals):
        res = super(AccountPartialReconcile, self).create(vals)
        #eventually create a journal entry to book the difference due to foreign currency's exchange rate that fluctuates
        res.create_exchange_rate_entry()
        return res
    @api.multi
    def unlink(self):
        """ When removing a link between entries, we need to revert the eventual journal entries we created to book the
            fluctuation of the foreign currency's exchange rate.
        """
        exchange_rate_entries = self.env['account.move'].search([('rate_diff_partial_rec_id', 'in', self.ids)])
        exchange_rate_entries.reverse_moves()
        return super(AccountPartialReconcile, self).unlink()
                       
                    
0 Comment(s)