Skip to content

Commit

Permalink
Merge 42b788c into 35b0c63
Browse files Browse the repository at this point in the history
  • Loading branch information
i-vyshnevska committed Apr 18, 2019
2 parents 35b0c63 + 42b788c commit 4dd2f09
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 65 deletions.
7 changes: 2 additions & 5 deletions l10n_ch_base_bank/__manifest__.py
@@ -1,22 +1,19 @@
# Copyright 2012-2017 Camptocamp
# Copyright 2012-2019 Camptocamp
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).

{'name': 'Switzerland - Bank type',
'summary': 'Types and number validation for swiss electronic pmnt. DTA, ESR',
'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': [
'security/security.xml',
'views/bank.xml',
'views/invoice.xml',
],
'demo': [],
'test': [],
'auto_install': False,
'installable': True,
'images': []
}
30 changes: 19 additions & 11 deletions l10n_ch_base_bank/models/bank.py
Expand Up @@ -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):

Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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']
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand All @@ -369,10 +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
"""
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

Expand All @@ -395,7 +405,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()
Expand All @@ -405,7 +415,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():
Expand All @@ -415,9 +425,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()
65 changes: 17 additions & 48 deletions l10n_ch_base_bank/models/invoice.py
@@ -1,5 +1,4 @@
# 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.tools import mod10r
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
5 changes: 4 additions & 1 deletion l10n_ch_base_bank/tests/test_search_invoice.py
Expand Up @@ -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)
Expand All @@ -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(
Expand Down Expand Up @@ -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(
Expand All @@ -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(
Expand Down

0 comments on commit 4dd2f09

Please sign in to comment.