From 21bc911b20980614f9cd3f5757449c33ccd1d896 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Tue, 7 Jun 2016 00:58:19 +0200 Subject: [PATCH] Better handling of partner_bank_id and mandate_id on invoice: invisible/required/onchange --- .../models/account_invoice.py | 31 +++++++++++--- .../views/account_invoice_view.xml | 6 ++- .../views/account_payment_method.xml | 2 +- .../data/account_payment_method.xml | 1 + account_payment_partner/__openerp__.py | 1 + account_payment_partner/models/__init__.py | 1 + .../models/account_invoice.py | 40 +++++++++++++++---- .../models/account_payment_method.py | 14 +++++++ .../views/account_invoice_view.xml | 4 +- .../views/account_payment_method.xml | 20 ++++++++++ 10 files changed, 102 insertions(+), 18 deletions(-) create mode 100644 account_payment_partner/models/account_payment_method.py create mode 100644 account_payment_partner/views/account_payment_method.xml diff --git a/account_banking_mandate/models/account_invoice.py b/account_banking_mandate/models/account_invoice.py index 23255c58e..46d884493 100644 --- a/account_banking_mandate/models/account_invoice.py +++ b/account_banking_mandate/models/account_invoice.py @@ -15,6 +15,9 @@ class AccountInvoice(models.Model): 'account.banking.mandate', string='Direct Debit Mandate', ondelete='restrict', readonly=True, states={'draft': [('readonly', False)]}) + mandate_required = fields.Boolean( + related='payment_mode_id.payment_method_id.mandate_required', + readonly=True) @api.model def line_get_convert(self, line, part): @@ -41,16 +44,32 @@ class AccountInvoice(models.Model): vals['mandate_id'] = invoice.mandate_id.id return vals - @api.onchange('payment_mode_id') - def payment_mode_change(self): + @api.onchange('partner_id', 'company_id') + def _onchange_partner_id(self): """Select by default the first valid mandate of the partner""" + super(AccountInvoice, self)._onchange_partner_id() if ( - self.type in ('out_invoice', 'out_refund') and - self.payment_mode_id.payment_type == 'inbound' and - self.payment_mode_id.payment_method_id.mandate_required and - self.partner_id): + 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), ]) self.mandate_id = mandates[0] + else: + self.mandate_id = False + + @api.onchange('payment_mode_id') + def payment_mode_id_change(self): + super(AccountInvoice, self).payment_mode_id_change() + 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 diff --git a/account_banking_mandate/views/account_invoice_view.xml b/account_banking_mandate/views/account_invoice_view.xml index 41fcc966c..1c1e46647 100644 --- a/account_banking_mandate/views/account_invoice_view.xml +++ b/account_banking_mandate/views/account_invoice_view.xml @@ -12,9 +12,11 @@ account.invoice - + + domain="[('partner_id', '=', commercial_partner_id), ('state', '=', 'valid')]" + attrs="{'required': [('mandate_required', '=', True)], 'invisible': [('mandate_required', '=', False)]}"/> + diff --git a/account_banking_mandate/views/account_payment_method.xml b/account_banking_mandate/views/account_payment_method.xml index 2d4079533..c6067e150 100644 --- a/account_banking_mandate/views/account_payment_method.xml +++ b/account_banking_mandate/views/account_payment_method.xml @@ -6,7 +6,7 @@ account_banking_mandate.account.payment.method.form account.payment.method - + SEPA Credit Transfer to suppliers sepa_credit_transfer outbound + pain.001.001.03 diff --git a/account_payment_partner/__openerp__.py b/account_payment_partner/__openerp__.py index 8c1068021..844f5a553 100644 --- a/account_payment_partner/__openerp__.py +++ b/account_payment_partner/__openerp__.py @@ -16,6 +16,7 @@ 'depends': ['account_payment_mode'], 'data': [ 'views/res_partner_view.xml', + 'views/account_payment_method.xml', 'views/account_invoice_view.xml', 'views/account_move_line.xml', 'views/report_invoice.xml', diff --git a/account_payment_partner/models/__init__.py b/account_payment_partner/models/__init__.py index 152bb919c..caea9e62c 100644 --- a/account_payment_partner/models/__init__.py +++ b/account_payment_partner/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- from . import res_partner +from . import account_payment_method from . import account_invoice from . import account_move_line diff --git a/account_payment_partner/models/account_invoice.py b/account_payment_partner/models/account_invoice.py index b5fbb539f..ac7d6827e 100644 --- a/account_payment_partner/models/account_invoice.py +++ b/account_payment_partner/models/account_invoice.py @@ -13,22 +13,46 @@ class AccountInvoice(models.Model): comodel_name='account.payment.mode', string="Payment Mode", ondelete='restrict', readonly=True, states={'draft': [('readonly', False)]}) + bank_account_required = fields.Boolean( + related='payment_mode_id.payment_method_id.bank_account_required', + readonly=True) - @api.onchange('partner_id', 'company_id', 'type') + @api.onchange('partner_id', 'company_id') def _onchange_partner_id(self): super(AccountInvoice, self)._onchange_partner_id() - if self.partner_id and self.type: + if self.partner_id: if self.type == 'in_invoice': - self.payment_mode_id =\ - self.partner_id.supplier_payment_mode_id + pay_mode = self.partner_id.supplier_payment_mode_id + self.payment_mode_id = pay_mode + if ( + pay_mode and + pay_mode.payment_type == 'outbound' and + pay_mode.payment_method_id.bank_account_required and + self.commercial_partner_id.bank_ids): + self.partner_bank_id = self.commercial_partner_id.bank_ids[0] elif self.type == 'out_invoice': - payment_mode = self.partner_id.customer_payment_mode_id - self.payment_mode_id = payment_mode - if payment_mode and payment_mode.bank_account_link == 'fixed': - self.partner_bank_id = payment_mode.fixed_journal_id.\ + pay_mode = self.partner_id.customer_payment_mode_id + self.payment_mode_id = pay_mode + if pay_mode and pay_mode.bank_account_link == 'fixed': + self.partner_bank_id = pay_mode.fixed_journal_id.\ bank_account_id else: self.payment_mode_id = False + if self.type == 'in_invoice': + self.partner_bank_id = False + + @api.onchange('payment_mode_id') + def payment_mode_id_change(self): + if ( + self.payment_mode_id and + self.payment_mode_id.payment_type == 'outbound' and + not self.payment_mode_id.payment_method_id.\ + bank_account_required): + self.partner_bank_id = False + print "false" + elif not self.payment_mode_id: + self.partner_bank_id = False + print "false" @api.model def line_get_convert(self, line, part): diff --git a/account_payment_partner/models/account_payment_method.py b/account_payment_partner/models/account_payment_method.py new file mode 100644 index 000000000..97289f14f --- /dev/null +++ b/account_payment_partner/models/account_payment_method.py @@ -0,0 +1,14 @@ +# -*- coding: utf-8 -*- +# © 2016 Akretion (Alexis de Lattre ) +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, fields + + +class AccountPaymentMethod(models.Model): + _inherit = "account.payment.method" + + bank_account_required = fields.Boolean( + string='Bank Account Required', + help="Activate this option if this payment method requires to " + "set the bank account of your supplier on the vendor bills.") diff --git a/account_payment_partner/views/account_invoice_view.xml b/account_payment_partner/views/account_invoice_view.xml index 045efe7f9..0e59c514d 100644 --- a/account_payment_partner/views/account_invoice_view.xml +++ b/account_payment_partner/views/account_invoice_view.xml @@ -43,15 +43,17 @@ account.invoice - + + [('partner_id', '=', commercial_partner_id)] 0 + {'invisible': [('bank_account_required', '=', False)], 'required': [('bank_account_required', '=', True)]} diff --git a/account_payment_partner/views/account_payment_method.xml b/account_payment_partner/views/account_payment_method.xml new file mode 100644 index 000000000..4f2448ffa --- /dev/null +++ b/account_payment_partner/views/account_payment_method.xml @@ -0,0 +1,20 @@ + + + + + + + account_payment_partner.account.payment.method.form + account.payment.method + + + + + + + + + + +