62 lines
2.3 KiB
Python
62 lines
2.3 KiB
Python
|
# -*- coding: utf-8 -*-
|
||
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||
|
|
||
|
import re
|
||
|
|
||
|
from odoo import api, fields, models
|
||
|
from odoo.tools.misc import mod10r
|
||
|
|
||
|
|
||
|
def _is_l10n_ch_postal(account_ref):
|
||
|
""" Returns True iff the string account_ref is a valid postal account number,
|
||
|
i.e. it only contains ciphers and is last cipher is the result of a recursive
|
||
|
modulo 10 operation ran over the rest of it.
|
||
|
"""
|
||
|
if re.match('\d+$', account_ref or ''):
|
||
|
account_ref_without_check = account_ref[:-1]
|
||
|
return mod10r(account_ref_without_check) == account_ref
|
||
|
return False
|
||
|
|
||
|
|
||
|
class ResBank(models.Model):
|
||
|
_inherit = 'res.bank'
|
||
|
|
||
|
l10n_ch_postal_chf = fields.Char(string='CHF ISR reference', help='The postal reference of the bank, used to generate ISR payment slips in CHF.')
|
||
|
l10n_ch_postal_eur = fields.Char(string='EUR ISR reference', help='The postal reference of the bank, used to generate ISR payment slips in EUR.')
|
||
|
|
||
|
|
||
|
class ResPartnerBank(models.Model):
|
||
|
_inherit = 'res.partner.bank'
|
||
|
|
||
|
l10n_ch_postal = fields.Char(help='The ISR number of the company within the bank', compute='_compute_l10n_ch_postal')
|
||
|
|
||
|
@api.depends('acc_number')
|
||
|
def _compute_acc_type(self):
|
||
|
""" Overridden method enabling the recognition of swiss postal bank
|
||
|
account numbers.
|
||
|
"""
|
||
|
for record in self:
|
||
|
if _is_l10n_ch_postal(record.acc_number):
|
||
|
record.acc_type = 'postal'
|
||
|
else:
|
||
|
super(ResPartnerBank, record)._compute_acc_type()
|
||
|
|
||
|
@api.depends('acc_number')
|
||
|
def _compute_l10n_ch_postal(self):
|
||
|
for record in self:
|
||
|
if record.acc_type == 'iban':
|
||
|
record.l10n_ch_postal = record._retrieve_l10n_ch_postal(record.sanitized_acc_number)
|
||
|
else:
|
||
|
record.l10n_ch_postal = record.sanitized_acc_number
|
||
|
|
||
|
def _retrieve_l10n_ch_postal(self, iban):
|
||
|
""" Reads a swiss postal account number from a an IBAN and returns it as
|
||
|
a string. Returns None if no valid postal account number was found, or
|
||
|
the given iban was not from Switzerland.
|
||
|
"""
|
||
|
if iban[:2] == 'CH':
|
||
|
#the IBAN corresponds to a swiss account
|
||
|
if _is_l10n_ch_postal(iban[-12:]):
|
||
|
return iban[-12:]
|
||
|
return None
|