diff --git a/account_banking_mandate/models/account_move_line.py b/account_banking_mandate/models/account_move_line.py index 3df33cafe..b011c817e 100644 --- a/account_banking_mandate/models/account_move_line.py +++ b/account_banking_mandate/models/account_move_line.py @@ -1,5 +1,5 @@ # Copyright Akretion (http://www.akretion.com/) -# Copyright 2017 Carlos Dauden +# Copyright 2017-2021 Carlos Dauden # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). @@ -25,12 +25,8 @@ class AccountMoveLine(models.Model): mandate = mandate.browse(vals['mandate_id']) partner_bank_id = vals.get('partner_bank_id', False) if not mandate: - if partner_bank_id: - domain = [('partner_bank_id', '=', partner_bank_id)] - else: - domain = [('partner_id', '=', self.partner_id.id)] - domain.append(('state', '=', 'valid')) - mandate = mandate.search(domain, limit=1) + mandate = self.partner_id._get_first_valid_mandate( + partner_bank_id=partner_bank_id) vals.update({ 'mandate_id': mandate.id, 'partner_bank_id': mandate.partner_bank_id.id or partner_bank_id, diff --git a/account_banking_mandate/models/res_partner.py b/account_banking_mandate/models/res_partner.py index 8bfa022a0..39163d843 100644 --- a/account_banking_mandate/models/res_partner.py +++ b/account_banking_mandate/models/res_partner.py @@ -1,8 +1,9 @@ # Copyright 2016 Akretion (Alexis de Lattre ) -# Copyright 2017 Carlos Dauden +# Copyright 2017-2021 Carlos Dauden # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api +from odoo.fields import first class ResPartner(models.Model): @@ -26,25 +27,31 @@ class ResPartner(models.Model): for partner in self: partner.mandate_count = mapped_data.get(partner.id, 0) - @api.multi - def _compute_valid_mandate_id(self): - # Dict for reducing the duplicated searches on parent/child partners + def _get_first_valid_mandate(self, partner_bank_id=False): + self.ensure_one() company_id = self.env.context.get('force_company', False) if company_id: company = self.env['res.company'].browse(company_id) else: company = self.env['res.company']._company_default_get( 'account.banking.mandate') + mandates = self.commercial_partner_id.bank_ids.mapped('mandate_ids') + mandates = mandates.filtered( + lambda x: x.state == 'valid' and x.company_id == company) + if partner_bank_id: + mandates = mandates.filtered( + lambda m: m.partner_bank_id.id == partner_bank_id) or mandates + return first(mandates) + @api.multi + def _compute_valid_mandate_id(self): + # Dict for reducing the duplicated searches on parent/child partners mandates_dic = {} for partner in self: commercial_partner_id = partner.commercial_partner_id.id if commercial_partner_id in mandates_dic: partner.valid_mandate_id = mandates_dic[commercial_partner_id] else: - mandates = partner.commercial_partner_id.bank_ids.mapped( - 'mandate_ids').filtered( - lambda x: x.state == 'valid' and x.company_id == company) - first_valid_mandate_id = mandates[:1].id + first_valid_mandate_id = partner._get_first_valid_mandate() partner.valid_mandate_id = first_valid_mandate_id mandates_dic[commercial_partner_id] = first_valid_mandate_id diff --git a/account_banking_mandate/tests/test_invoice_mandate.py b/account_banking_mandate/tests/test_invoice_mandate.py index 5ccf5bcd3..51f0f60f2 100644 --- a/account_banking_mandate/tests/test_invoice_mandate.py +++ b/account_banking_mandate/tests/test_invoice_mandate.py @@ -60,6 +60,25 @@ class TestInvoiceMandate(TransactionCase): with self.assertRaises(ValidationError): payable_move_lines[0].mandate_id = mandate_2 + def test_post_invoice_default_mandate(self): + self.invoice.mandate_id = False + self.invoice.partner_bank_id = self.mandate.partner_bank_id + + self.invoice.action_invoice_open() + + self.env['account.invoice.payment.line.multi'].with_context( + active_model='account.invoice', + active_ids=self.invoice.ids + ).create({}).run() + + payment_order = self.env['account.payment.order'].search([]) + self.assertEqual(len(payment_order.ids), 1) + payment_order.payment_mode_id_change() + payment_order.draft2open() + payment_order.open2generated() + payment_order.generated2uploaded() + self.assertEqual(self.mandate.payment_line_ids_count, 1) + def test_post_invoice_and_refund_02(self): self.invoice._onchange_partner_id() self.invoice.action_invoice_open()