From cc4a7b62e85f773814087261b352ef9d135c36ef Mon Sep 17 00:00:00 2001 From: Carlos Dauden Date: Tue, 24 Oct 2017 23:38:17 +0200 Subject: [PATCH] [IMP] account_banking_mandate: Fill payment line with first valid mandate + Add valid_mandate field and fix onchange (cherry picked from commit 25d2e4d) --- account_banking_mandate/README.rst | 7 +-- account_banking_mandate/__manifest__.py | 12 ++--- .../models/account_invoice.py | 45 +++++++------------ .../models/account_move_line.py | 33 +++++++++----- account_banking_mandate/models/res_partner.py | 24 +++++++++- 5 files changed, 70 insertions(+), 51 deletions(-) diff --git a/account_banking_mandate/README.rst b/account_banking_mandate/README.rst index 4edff4f4d..6dbfee105 100644 --- a/account_banking_mandate/README.rst +++ b/account_banking_mandate/README.rst @@ -30,7 +30,7 @@ TODO Usage ===== -To use this module, see menu "Accounting > payment > SEPA direct debit mandates" +To use this module, see menu "Accounting > payment > SEPA direct debit mandates" .. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas :alt: Try me on Runbot @@ -56,11 +56,12 @@ Contributors ------------ * Alexis de Lattre -* Pedro M. Baeza +* Pedro M. Baeza * Alexandre Fayolle * Stéphane Bidoul -* Sergio Teruel (Incaser) +* Sergio Teruel * Cédric Pigeon +* Carlos Dauden Maintainer ---------- diff --git a/account_banking_mandate/__manifest__.py b/account_banking_mandate/__manifest__.py index f06a45a39..77a3a6023 100644 --- a/account_banking_mandate/__manifest__.py +++ b/account_banking_mandate/__manifest__.py @@ -1,13 +1,15 @@ # -*- coding: utf-8 -*- -# © 2014 Compassion CH - Cyril Sester -# © 2014 Tecnativa - Pedro M. Baeza -# © 2015-2016 Akretion - Alexis de Lattre -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# Copyright 2014 Compassion CH - Cyril Sester +# Copyright 2014 Tecnativa - Pedro M. Baeza +# Copyright 2015-16 Akretion - Alexis de Lattre +# Copyright 2017 Tecnativa - Carlos Dauden +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). { 'name': 'Account Banking Mandate', 'summary': 'Banking mandates', - 'version': '11.0.1.0.1', + 'version': '11.0.1.0.0', + 'version': '10.0.1.1.3', 'license': 'AGPL-3', 'author': "Compassion CH, " "Tecnativa, " diff --git a/account_banking_mandate/models/account_invoice.py b/account_banking_mandate/models/account_invoice.py index 9d2aff82d..455f90804 100644 --- a/account_banking_mandate/models/account_invoice.py +++ b/account_banking_mandate/models/account_invoice.py @@ -1,8 +1,9 @@ # -*- coding: utf-8 -*- -# © 2014 Compassion CH - Cyril Sester -# © 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza -# © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# Copyright 2014 Compassion CH - Cyril Sester +# Copyright 2014 Serv. Tecnol. Avanzados - Pedro M. Baeza +# Copyright 2016 Akretion (Alexis de Lattre ) +# Copyright 2017 Carlos Dauden +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api @@ -35,6 +36,7 @@ class AccountInvoice(models.Model): creation, using same method as upstream.""" onchanges = { '_onchange_partner_id': ['mandate_id'], + 'payment_mode_id_change': ['mandate_id'], } for onchange_method, changed_fields in list(onchanges.items()): if any(f not in vals for f in changed_fields): @@ -43,7 +45,7 @@ class AccountInvoice(models.Model): for field in changed_fields: if field not in vals and invoice[field]: vals[field] = invoice._fields[field].convert_to_write( - invoice[field], invoice, + invoice[field], ) return super(AccountInvoice, self).create(vals) @@ -62,34 +64,19 @@ class AccountInvoice(models.Model): vals['mandate_id'] = invoice.mandate_id.id return vals + def set_mandate(self): + if self.payment_mode_id.payment_method_id.mandate_required: + self.mandate_id = self.partner_id.valid_mandate_id + else: + self.mandate_id = False + @api.onchange('partner_id', 'company_id') def _onchange_partner_id(self): """Select by default the first valid mandate of the partner""" - res = super(AccountInvoice, self)._onchange_partner_id() - if ( - self.type == 'out_invoice' and - self.partner_id.customer_payment_mode_id. - payment_type == 'inbound' and - self.partner_id.customer_payment_mode_id.payment_method_id. - mandate_required and - self.commercial_partner_id): - mandates = self.env['account.banking.mandate'].search([ - ('state', '=', 'valid'), - ('partner_id', '=', self.commercial_partner_id.id), - ]) - if mandates: - self.mandate_id = mandates[0] - else: - self.mandate_id = False - return res + super(AccountInvoice, self)._onchange_partner_id() + self.set_mandate() @api.onchange('payment_mode_id') def _onchange_payment_mode_id(self): super(AccountInvoice, self)._onchange_payment_mode_id() - if ( - self.payment_mode_id and - self.payment_mode_id.payment_type == 'inbound' and - not self.payment_mode_id.payment_method_id.mandate_required): - self.mandate_id = False - elif not self.payment_mode_id: - self.mandate_id = False + self.set_mandate() diff --git a/account_banking_mandate/models/account_move_line.py b/account_banking_mandate/models/account_move_line.py index a3b80011b..98e792633 100644 --- a/account_banking_mandate/models/account_move_line.py +++ b/account_banking_mandate/models/account_move_line.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- -# © 2016 Akretion (http://www.akretion.com/) -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# Copyright Akretion (http://www.akretion.com/) +# Copyright 2017 Carlos Dauden +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + from odoo import models, fields, api @@ -16,14 +18,21 @@ class AccountMoveLine(models.Model): def _prepare_payment_line_vals(self, payment_order): vals = super(AccountMoveLine, self)._prepare_payment_line_vals( payment_order) - if payment_order.payment_type == 'inbound' and self.mandate_id: - vals['mandate_id'] = self.mandate_id.id - vals['partner_bank_id'] = self.mandate_id.partner_bank_id.id - partner_bank_id = vals.get('partner_bank_id', False) - if partner_bank_id and 'mandate_id' not in vals: - mandate = self.env['account.banking.mandate'].search( - [('partner_bank_id', '=', partner_bank_id), - ('state', '=', 'valid')], limit=1) - if mandate: - vals['mandate_id'] = mandate.id + if payment_order.payment_type != 'inbound': + return vals + mandate = self.mandate_id + if not mandate and vals.get('mandate_id', False): + mandate = mandate.browse(vals['mandate_id']) + if not mandate: + partner_bank_id = vals.get('partner_bank_id', False) + 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) + vals.update({ + 'mandate_id': mandate.id, + 'partner_bank_id': mandate.partner_bank_id.id or partner_bank_id, + }) return vals diff --git a/account_banking_mandate/models/res_partner.py b/account_banking_mandate/models/res_partner.py index b9fae1890..f59a7ea73 100644 --- a/account_banking_mandate/models/res_partner.py +++ b/account_banking_mandate/models/res_partner.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- -# © 2016 Akretion (Alexis de Lattre ) -# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html). +# Copyright 2016 Akretion (Alexis de Lattre ) +# Copyright 2017 Carlos Dauden +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from odoo import models, fields, api @@ -11,6 +12,10 @@ class ResPartner(models.Model): mandate_count = fields.Integer( compute='_compute_mandate_count', string="Number of Mandates", readonly=True) + valid_mandate_id = fields.Many2one( + comodel_name='account.banking.mandate', + compute='compute_valid_mandate_id', + string='First Valid Mandate') @api.multi def _compute_mandate_count(self): @@ -21,3 +26,18 @@ class ResPartner(models.Model): for mandate in mandate_data]) 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 + 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') + first_valid_mandate_id = mandates[:1].id + partner.valid_mandate_id = first_valid_mandate_id + mandates_dic[commercial_partner_id] = first_valid_mandate_id