Skip to content

Commit

Permalink
fix #4 Implements CBU validation
Browse files Browse the repository at this point in the history
  • Loading branch information
lukio committed Dec 5, 2017
1 parent ce7a523 commit 4e84a8f
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 1 deletion.
1 change: 1 addition & 0 deletions __init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ def register():
Pool.register(
Bank,
BankAccount,
BankAccountNumber,
Party,
Address,
Category,
Expand Down
75 changes: 74 additions & 1 deletion bank.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
# This file is part of the bank_ar module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from stdnum.ar import cbu

from trytond.model import fields
from trytond.pyson import Eval
from trytond.pool import PoolMeta

__all__ = ['Bank', 'BankAccount']
__all__ = ['Bank', 'BankAccount', 'BankAccountNumber']

NUMBERTYPE = [
('cbu', 'CBU'),
('iban', 'IBAN'),
('other', 'Other'),
]


class Bank:
Expand All @@ -27,3 +34,69 @@ class BankAccount:
journal = fields.Many2One('account.journal', 'Account Journal',
required=True, states={'readonly': ~Eval('active', True)},
depends=['active'])


class BankAccountNumber:
__metaclass__ = PoolMeta
__name__ = 'bank.account.number'

@classmethod
def default_type(cls):
return 'cbu'

@classmethod
def __setup__(cls):
super(BankAccountNumber, cls).__setup__()
cls.type.selection = NUMBERTYPE

cls._error_messages.update({
'invalid_cbu': 'Invalid CBU "%s".',
})

@classmethod
def create(cls, vlist):
vlist = [v.copy() for v in vlist]
for values in vlist:
if values.get('type') == 'cbu' and 'number' in values:
values['number'] = cbu.format(values['number'])
values['number_compact'] = cbu.compact(values['number'])
return super(BankAccountNumber, cls).create(vlist)

@classmethod
def write(cls, *args):
actions = iter(args)
args = []
for numbers, values in zip(actions, actions):
values = values.copy()
if values.get('type') == 'cbu' and 'number' in values:
values['number'] = cbu.format(values['number'])
values['number_compact'] = cbu.compact(values['number'])
args.extend((numbers, values))

super(BankAccountNumber, cls).write(*args)

to_write = []
for number in sum(args[::2], []):
if number.type == 'cbu':
formated_number = cbu.format(number.number)
compacted_number = cbu.compact(number.number)
if ((formated_number != number.number)
or (compacted_number != number.number_compact)):
to_write.extend(([number], {
'number': formated_number,
'number_compact': compacted_number,
}))
if to_write:
cls.write(*to_write)

@property
def compact_cbu(self):
return (cbu.compact(self.number) if self.type == 'cbu'
else self.number)

@fields.depends('type', 'number')
def pre_validate(self):
super(BankAccountNumber, self).pre_validate()
if (self.type == 'cbu' and self.number
and not cbu.is_valid(self.number)):
self.raise_user_error('invalid_cbu', self.number)

0 comments on commit 4e84a8f

Please sign in to comment.