From c5eeae0d5a4a697ea038591b3aa64f9d6e3c20af Mon Sep 17 00:00:00 2001 From: Wolfgang Taferner Date: Mon, 19 Nov 2018 06:44:45 +0000 Subject: [PATCH] [FIX] account: negative bank statement amount - Create a bank statement for a negative amount, e.g. -100. - Click 'Reconcile'. - Create a counterpart line for this bank statement, but specify receivable account. The payment created has `partner_type` set as `supplier`. Although a receivable account is used for customers. This use case can arise in case of a credit note to a customer: the reimbursement should create a customer payment, not a supplier payment. Co-authored-by: Nicolas Martinelli opw-1910807 closes odoo/odoo#30232 --- addons/account/models/account_bank_statement.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/account/models/account_bank_statement.py b/addons/account/models/account_bank_statement.py index 9db78e9b5d2..72489e226c9 100644 --- a/addons/account/models/account_bank_statement.py +++ b/addons/account/models/account_bank_statement.py @@ -864,6 +864,8 @@ class AccountBankStatementLine(models.Model): :returns: The journal entries with which the transaction was matched. If there was at least an entry in counterpart_aml_dicts or new_aml_dicts, this list contains the move created by the reconciliation, containing entries for the statement.line (1), the counterpart move lines (0..*) and the new move lines (0..*). """ + payable_account_type = self.env.ref('account.data_account_type_payable') + receivable_account_type = self.env.ref('account.data_account_type_receivable') counterpart_aml_dicts = counterpart_aml_dicts or [] payment_aml_rec = payment_aml_rec or self.env['account.move.line'] new_aml_dicts = new_aml_dicts or [] @@ -884,10 +886,16 @@ class AccountBankStatementLine(models.Model): raise UserError(_('A selected move line was already reconciled.')) if isinstance(aml_dict['move_line'], pycompat.integer_types): aml_dict['move_line'] = aml_obj.browse(aml_dict['move_line']) + + account_types = self.env['account.account.type'] for aml_dict in (counterpart_aml_dicts + new_aml_dicts): if aml_dict.get('tax_ids') and isinstance(aml_dict['tax_ids'][0], pycompat.integer_types): # Transform the value in the format required for One2many and Many2many fields aml_dict['tax_ids'] = [(4, id, None) for id in aml_dict['tax_ids']] + + user_type_id = self.env['account.account'].browse(aml_dict.get('account_id')).user_type_id + if user_type_id in [payable_account_type, receivable_account_type] and user_type_id not in account_types: + account_types |= user_type_id if any(line.journal_entry_ids for line in self): raise UserError(_('A selected statement line was already reconciled with an account move.')) @@ -915,7 +923,9 @@ class AccountBankStatementLine(models.Model): if abs(total)>0.00001: partner_id = self.partner_id and self.partner_id.id or False partner_type = False - if partner_id: + if partner_id and len(account_types) == 1: + partner_type = 'customer' if account_types == receivable_account_type else 'supplier' + if partner_id and not partner_type: if total < 0: partner_type = 'supplier' else: