50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
from odoo import models, api, _
|
|
from odoo.exceptions import ValidationError
|
|
import logging
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
try:
|
|
from stdnum.ar.cbu import validate as validate_cbu
|
|
except ImportError:
|
|
import stdnum
|
|
_logger.warning("stdnum.ar.cbu is avalaible from stdnum >= 1.6. The one installed is %s" % stdnum.__version__)
|
|
|
|
def validate_cbu(number):
|
|
def _check_digit(number):
|
|
"""Calculate the check digit."""
|
|
weights = (3, 1, 7, 9)
|
|
check = sum(int(n) * weights[i % 4] for i, n in enumerate(reversed(number)))
|
|
return str((10 - check) % 10)
|
|
number = stdnum.util.clean(number, ' -').strip()
|
|
if len(number) != 22:
|
|
raise ValidationError(_('Invalid Length'))
|
|
if not number.isdigit():
|
|
raise ValidationError(_('Invalid Format'))
|
|
if _check_digit(number[:7]) != number[7]:
|
|
raise ValidationError(_('Invalid Checksum'))
|
|
if _check_digit(number[8:-1]) != number[-1]:
|
|
raise ValidationError(_('Invalid Checksum'))
|
|
return number
|
|
|
|
|
|
class ResPartnerBank(models.Model):
|
|
|
|
_inherit = 'res.partner.bank'
|
|
|
|
@api.model
|
|
def _get_supported_account_types(self):
|
|
""" Add new account type named cbu used in Argentina """
|
|
res = super()._get_supported_account_types()
|
|
res.append(('cbu', _('CBU')))
|
|
return res
|
|
|
|
@api.model
|
|
def retrieve_acc_type(self, acc_number):
|
|
try:
|
|
validate_cbu(acc_number)
|
|
except Exception:
|
|
return super().retrieve_acc_type(acc_number)
|
|
return 'cbu'
|