From 25429656c7d9e229e55158f9cf8e15e2f84e4caf Mon Sep 17 00:00:00 2001 From: Arthur Maniet Date: Mon, 16 Feb 2015 19:23:36 +0100 Subject: [PATCH] [FIX] account: rounding error when the balanced operation done in bank statement reconciliation is converted to the company currency. --- addons/account/account_bank_statement.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/addons/account/account_bank_statement.py b/addons/account/account_bank_statement.py index ff81ba64421..b39b999e82c 100644 --- a/addons/account/account_bank_statement.py +++ b/addons/account/account_bank_statement.py @@ -161,7 +161,7 @@ class account_bank_statement(osv.osv): } _defaults = { - 'name': '/', + 'name': '/', 'date': fields.date.context_today, 'state': 'draft', 'journal_id': _default_journal_id, @@ -242,7 +242,7 @@ class account_bank_statement(osv.osv): def _prepare_bank_move_line(self, cr, uid, st_line, move_id, amount, company_currency_id, context=None): """Compute the args to build the dict of values to create the counter part move line from a - statement line by calling the _prepare_move_line_vals. + statement line by calling the _prepare_move_line_vals. :param browse_record st_line: account.bank.statement.line record to create the move from. :param int/long move_id: ID of the account.move to link the move line @@ -388,7 +388,7 @@ class account_bank_statement(osv.osv): for item in self.browse(cr, uid, ids, context=context): if item.state != 'draft': raise osv.except_osv( - _('Invalid Action!'), + _('Invalid Action!'), _('In order to delete a bank statement, you must first cancel it to delete related journal items.') ) # Explicitly unlink bank statement lines @@ -436,7 +436,7 @@ class account_bank_statement_line(osv.osv): for item in self.browse(cr, uid, ids, context=context): if item.journal_entry_id: raise osv.except_osv( - _('Invalid Action!'), + _('Invalid Action!'), _('In order to delete a bank statement line, you must first cancel it to delete related journal items.') ) return super(account_bank_statement_line, self).unlink(cr, uid, ids, context=context) @@ -646,7 +646,7 @@ class account_bank_statement_line(osv.osv): """ mv_line_pool = self.pool.get('account.move.line') domain = self._domain_move_lines_for_reconciliation(cr, uid, st_line, excluded_ids=excluded_ids, str=str, additional_domain=additional_domain, context=context) - + # Get move lines ; in case of a partial reconciliation, only keep one line (the first whose amount is greater than # the residual amount because it is presumably the invoice, which is the relevant item in this situation) filtered_lines = [] @@ -811,6 +811,15 @@ class account_bank_statement_line(osv.osv): prorata_factor = (mv_line_dict['debit'] - mv_line_dict['credit']) / st_line.amount_currency mv_line_dict['amount_currency'] = prorata_factor * st_line.amount to_create.append(mv_line_dict) + # If the reconciliation is performed in another currency than the company currency, the amounts are converted to get the right debit/credit. + # If there is more than 1 debit and 1 credit, this can induce a rounding error, which we put in the foreign exchane gain/loss account. + if st_line_currency.id != company_currency.id: + diff_amount = bank_st_move_vals['debit'] - bank_st_move_vals['credit'] \ + + sum(aml['debit'] for aml in to_create) - sum(aml['credit'] for aml in to_create) + if not company_currency.is_zero(diff_amount): + diff_aml = self.get_currency_rate_line(cr, uid, st_line, diff_amount, move_id, context=context) + diff_aml['name'] = _('Rounding error from currency conversion') + to_create.append(diff_aml) # Create move lines move_line_pairs_to_reconcile = [] for mv_line_dict in to_create: