From bd64974ada232e684643e6c997e73c50589b2e1f Mon Sep 17 00:00:00 2001 From: Iryna Vyshnevska Date: Thu, 18 Apr 2019 11:50:25 +0300 Subject: [PATCH 1/2] [IMP] updates for partenr_banks_to_show method --- l10n_ch_base_bank/__manifest__.py | 7 +- l10n_ch_base_bank/models/bank.py | 32 +++++---- l10n_ch_base_bank/models/invoice.py | 67 +++++-------------- .../tests/test_search_invoice.py | 9 ++- 4 files changed, 45 insertions(+), 70 deletions(-) diff --git a/l10n_ch_base_bank/__manifest__.py b/l10n_ch_base_bank/__manifest__.py index 2fba05cdfd..97960b1fef 100644 --- a/l10n_ch_base_bank/__manifest__.py +++ b/l10n_ch_base_bank/__manifest__.py @@ -1,4 +1,4 @@ -# Copyright 2012-2017 Camptocamp +# Copyright 2012-2019 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). {'name': 'Switzerland - Bank type', @@ -6,7 +6,7 @@ 'version': '11.0.1.2.0', 'author': "Camptocamp,Odoo Community Association (OCA)", 'category': 'Localization', - 'website': 'http://www.camptocamp.com', + 'website': 'https://github.com/OCA/l10n-switzerland', 'license': 'AGPL-3', 'depends': ['account_payment_partner', 'base_iban'], 'data': [ @@ -14,9 +14,6 @@ 'views/bank.xml', 'views/invoice.xml', ], - 'demo': [], - 'test': [], 'auto_install': False, 'installable': True, - 'images': [] } diff --git a/l10n_ch_base_bank/models/bank.py b/l10n_ch_base_bank/models/bank.py index 1daa233e5d..6ea0835686 100644 --- a/l10n_ch_base_bank/models/bank.py +++ b/l10n_ch_base_bank/models/bank.py @@ -7,6 +7,9 @@ from odoo.addons.base_iban.models.res_partner_bank import normalize_iban +# bic for all switzerland's post offices is defined +CH_POST_BIC = 'POFICHBEXXX' + class BankCommon(object): @@ -119,7 +122,7 @@ def _check_postal_num(self): @api.multi def is_swiss_post(self): - return self.bic == 'POFICHBEXXX' + return self.bic == CH_POST_BIC @api.multi def name_get(self): @@ -216,6 +219,12 @@ class ResPartnerBank(models.Model, BankCommon): 'The ISR adherent number/ccp pair must be unique !'), ] + @api.model + def _get_supported_account_types(self): + rslt = super(ResPartnerBank, self)._get_supported_account_types() + rslt.append(('postal', _('Postal'))) + return rslt + @api.depends('acc_number') def _compute_acc_type(self): todo = self.env['res.partner.bank'] @@ -274,7 +283,7 @@ def _update_acc_name(self): part_name = self.env['res.partner'].browse(partner_id)[0].name self.acc_number = self._compute_name_ccp(part_name, self.ccp) - @api.multi + @api.model def _compute_name_ccp(self, partner_name, ccp): """This method makes sure to generate a unique name""" if partner_name and ccp: @@ -349,7 +358,7 @@ def onchange_acc_number_set_swiss_bank(self): bank = ( self.env['res.bank'].search([('ccp', '=', ccp)], limit=1) or bank or - self.env['res.bank'].search([('bic', '=', 'POFICHBEXXX')], + self.env['res.bank'].search([('bic', '=', CH_POST_BIC)], limit=1)) elif self.acc_type == 'iban': if not bank: @@ -369,10 +378,9 @@ def onchange_acc_number_set_swiss_bank(self): @api.onchange('ccp') def onchange_ccp_set_acc_number(self): - """If ccp changes and it's a postal bank update acc_number to ccp - we don't want make acc_number as computed to have possibility set it - manually and also avoid to shadow other logic on acc_number if exist - """ + # If ccp changes and it's a postal bank update acc_number to ccp + # we don't want make acc_number as computed to have possibility set it + # manually and also avoid to shadow other logic on acc_number if exist if self.acc_type == 'iban': return @@ -395,7 +403,7 @@ def onchange_ccp_set_acc_number(self): if ccp and self.is_swiss_postal_num(ccp) and not self.bank_id.id: bank = (self.env['res.bank'].search([('ccp', '=', ccp)], limit=1) or - self.env['res.bank'].search([('bic', '=', 'POFICHBEXXX')], + self.env['res.bank'].search([('bic', '=', CH_POST_BIC)], limit=1)) if not bank.is_swiss_post(): self._update_acc_name() @@ -405,7 +413,7 @@ def onchange_ccp_set_acc_number(self): @api.onchange('bank_id') def onchange_bank_set_acc_number(self): - """ Track bank change to update acc_name if needed""" + # Track bank change to update acc_name if needed if not self.bank_id or self.acc_type == 'iban': return if self.bank_id.is_swiss_post(): @@ -415,9 +423,7 @@ def onchange_bank_set_acc_number(self): @api.onchange('partner_id') def onchange_partner_set_acc_number(self): - """ - when acc_number was computed automatically we call regeneration - as partner name is part of acc_number - """ + # When acc_number was computed automatically we call regeneration + # as partner name is part of acc_number if self.acc_type == 'bank' and self.ccp: self._update_acc_name() diff --git a/l10n_ch_base_bank/models/invoice.py b/l10n_ch_base_bank/models/invoice.py index f0138d947d..a0ee1181ee 100644 --- a/l10n_ch_base_bank/models/invoice.py +++ b/l10n_ch_base_bank/models/invoice.py @@ -1,7 +1,6 @@ -# Copyright 2012 Nicolas Bessi (Camptocamp SA) -# Copyright 2015 Yannick Vaucher (Camptocamp SA) +# Copyright 2012-2019 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, api, _ +from odoo import models, api, fields, _ from odoo.tools import mod10r from odoo import exceptions @@ -73,20 +72,15 @@ def onchange_reference(self): def _check_bank_type_for_type_isr(self): for invoice in self: if invoice.reference_type == 'isr': - bank_acc = invoice.partner_bank_id + bank_acc = invoice.partner_banks_to_show() if not (bank_acc.acc_type == 'postal' or bank_acc.acc_type != 'postal' and (bank_acc.ccp or bank_acc.bank_id.ccp)): - if invoice.type in ('in_invoice', 'in_refund'): - raise exceptions.ValidationError( - _('ISR Reference type needs a postal account' - ' number on the customer.') - ) - else: - raise exceptions.ValidationError( - _('ISR Reference type needs a postal account' - ' number on your company') - ) + raise exceptions.ValidationError( + _("Bank account shouldn't be empty, for IRS reference " + "type, you can set it manually or set appropriate" + " payment mode.") + ) return True @api.multi @@ -121,40 +115,15 @@ def _check_isr(self): invoice._is_isr_reference() return True - def write(self, vals): - """Override to update partner_bank_id before constraints if needed and - to be consistent with create + def partner_banks_to_show(self): + """ + Extend method from account_payment_partner to add specific + logic for switzerland bank payments if base method does not give + a result """ - if not self.partner_bank_id or not vals.get('partner_bank_id'): - type_defined = vals.get('type') or self.type - if type_defined == 'out_invoice': - banks = self.partner_banks_to_show() - if banks: - vals['partner_bank_id'] = banks[0].id - return super().write(vals) - - @api.model - def create(self, vals): - """We override create in order to have customer invoices - generated by the comercial flow as on change partner is - not systemtically call""" - type_defined = vals.get('type') or self.env.context.get('type', False) - if type_defined == 'out_invoice' and not vals.get('partner_bank_id'): - partner = self.env.user.company_id.partner_id - vals['partner_bank_id'] = self._get_bank_id( - partner, vals.get('journal_id'), vals.get('reference_type'), - ) - return super(AccountInvoice, self).create(vals) - def _get_bank_id(self, partner, journal_id, ref_type): - if journal_id: - return self.env['account.journal'].browse(journal_id). \ - bank_account_id.id - if ref_type == 'isr': - bank_ids = partner.bank_ids.filtered( - lambda s: s.acc_type == 'postal' - ) - else: - bank_ids = partner.bank_ids - if bank_ids: - return bank_ids[0].id + res = super().partner_banks_to_show() + if not res: + if self.journal_id: + return self.journal_id.bank_account_id + return res diff --git a/l10n_ch_base_bank/tests/test_search_invoice.py b/l10n_ch_base_bank/tests/test_search_invoice.py index ff3d0ffae6..5685666d5f 100644 --- a/l10n_ch_base_bank/tests/test_search_invoice.py +++ b/l10n_ch_base_bank/tests/test_search_invoice.py @@ -18,7 +18,7 @@ def setUp(self): bank_account = self.env['res.partner.bank'].create({ 'partner_id': self.company.partner_id.id, 'bank_id': bank.id, - 'acc_number': 'Bank/CCP 01-1234-1', + 'acc_number': '01-1234-1', }) self.company.partner_id.bank_ids = bank_account self.partner = self.env['res.partner'].create( @@ -29,7 +29,7 @@ def setUp(self): 'type': 'bank', 'code': 'BNK42', 'bank_id': bank.id, - 'bank_acc_number': '01-1234-1', + 'bank_acc_number': '10-8060-7', }) def assert_find_ref(self, reference, operator, value): @@ -37,6 +37,7 @@ def assert_find_ref(self, reference, operator, value): 'partner_id': self.partner.id, 'type': 'out_invoice', 'reference_type': 'isr', + 'journal_id': self.bank_journal.id, 'reference': reference, } invoice = self.env['account.invoice'].create(values) @@ -50,8 +51,8 @@ def assert_not_find_ref(self, reference, operator, value): 'partner_id': self.partner.id, 'type': 'out_invoice', 'reference_type': 'isr', - 'reference': reference, 'journal_id': self.bank_journal.id, + 'reference': reference, } self.env['account.invoice'].create(values) found = self.env['account.invoice'].search( @@ -116,6 +117,7 @@ def test_search_other_field(self): 'type': 'out_invoice', 'reference_type': 'isr', 'reference': '27 29990 00000 00001 70400 25019', + 'journal_id': self.bank_journal.id, } invoice = self.env['account.invoice'].create(values) found = self.env['account.invoice'].search( @@ -129,6 +131,7 @@ def test_search_unary_operator(self): 'type': 'out_invoice', 'reference_type': 'isr', 'reference': '27 29990 00000 00001 70400 25019', + 'journal_id': self.bank_journal.id, } invoice = self.env['account.invoice'].create(values) found = self.env['account.invoice'].search( From 42b788c220c3325bccc93a2708b24cb041d04d96 Mon Sep 17 00:00:00 2001 From: Iryna Vyshnevska Date: Thu, 18 Apr 2019 16:21:52 +0300 Subject: [PATCH 2/2] fixup! [IMP] updates for partenr_banks_to_show method --- l10n_ch_base_bank/models/bank.py | 8 +++++--- l10n_ch_base_bank/models/invoice.py | 2 +- l10n_ch_base_bank/tests/test_search_invoice.py | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/l10n_ch_base_bank/models/bank.py b/l10n_ch_base_bank/models/bank.py index 6ea0835686..b106724962 100644 --- a/l10n_ch_base_bank/models/bank.py +++ b/l10n_ch_base_bank/models/bank.py @@ -378,9 +378,11 @@ def onchange_acc_number_set_swiss_bank(self): @api.onchange('ccp') def onchange_ccp_set_acc_number(self): - # If ccp changes and it's a postal bank update acc_number to ccp - # we don't want make acc_number as computed to have possibility set it - # manually and also avoid to shadow other logic on acc_number if exist + """ + If ccp changes and it's a postal bank update acc_number to ccp + we don't want make acc_number as computed to have possibility set it + manually and also avoid to shadow other logic on acc_number if exist + """ if self.acc_type == 'iban': return diff --git a/l10n_ch_base_bank/models/invoice.py b/l10n_ch_base_bank/models/invoice.py index a0ee1181ee..65f177f56e 100644 --- a/l10n_ch_base_bank/models/invoice.py +++ b/l10n_ch_base_bank/models/invoice.py @@ -1,6 +1,6 @@ # Copyright 2012-2019 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import models, api, fields, _ +from odoo import models, api, _ from odoo.tools import mod10r from odoo import exceptions diff --git a/l10n_ch_base_bank/tests/test_search_invoice.py b/l10n_ch_base_bank/tests/test_search_invoice.py index 5685666d5f..bb89b7d870 100644 --- a/l10n_ch_base_bank/tests/test_search_invoice.py +++ b/l10n_ch_base_bank/tests/test_search_invoice.py @@ -18,7 +18,7 @@ def setUp(self): bank_account = self.env['res.partner.bank'].create({ 'partner_id': self.company.partner_id.id, 'bank_id': bank.id, - 'acc_number': '01-1234-1', + 'acc_number': 'Bank/CCP 01-1234-1', }) self.company.partner_id.bank_ids = bank_account self.partner = self.env['res.partner'].create( @@ -29,7 +29,7 @@ def setUp(self): 'type': 'bank', 'code': 'BNK42', 'bank_id': bank.id, - 'bank_acc_number': '10-8060-7', + 'bank_acc_number': '01-1234-1', }) def assert_find_ref(self, reference, operator, value):