diff --git a/l10n_nl_bsn/__manifest__.py b/l10n_nl_bsn/__manifest__.py index 8e6ccce74..58e9e9ea3 100644 --- a/l10n_nl_bsn/__manifest__.py +++ b/l10n_nl_bsn/__manifest__.py @@ -1,9 +1,9 @@ -# Copyright 2016-2018 Onestein () +# Copyright 2016-2019 Onestein () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). { 'name': 'Burgerservicenummer (BSN) for Partners', - 'version': '12.0.1.0.0', + 'version': '12.0.1.0.1', 'development_status': 'Production/Stable', 'category': 'Localization', 'author': 'Onestein, Odoo Community Association (OCA)', diff --git a/l10n_nl_bsn/models/res_partner.py b/l10n_nl_bsn/models/res_partner.py index 8109c7a1b..7ee9dcd68 100644 --- a/l10n_nl_bsn/models/res_partner.py +++ b/l10n_nl_bsn/models/res_partner.py @@ -1,9 +1,10 @@ -# Copyright 2016-2018 Onestein () +# Copyright 2016-2019 Onestein () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). import logging from odoo import api, fields, models, _ +from odoo.osv import expression _logger = logging.getLogger(__name__) try: @@ -66,3 +67,30 @@ def _warn_bsn_existing(self): 'message': msg % (self.name, self.bsn_number) } return warning + + @api.model + def search(self, args, offset=0, limit=None, order=None, count=False): + res_domain = [] + for domain in args: + if ( + len(domain) > 2 and domain[0] == 'bsn_number' and + isinstance(domain[2], str) and domain[2] + ): + operator = domain[1] + bsn_number = domain[2] + bsn_compact = bsn.compact(bsn_number) + bsn_domain = expression.OR([ + [('bsn_number', operator, bsn_number)], + [('bsn_number', operator, bsn_compact)], + ]) + if bsn.is_valid(bsn_number): + bsn_format = bsn.format(bsn_number) + bsn_domain = expression.OR([ + bsn_domain, + [('bsn_number', operator, bsn_format)], + ]) + res_domain += bsn_domain + else: + res_domain.append(domain) + return super().search( + res_domain, offset=offset, limit=limit, order=order, count=count) diff --git a/l10n_nl_bsn/tests/test_l10n_nl_bsn.py b/l10n_nl_bsn/tests/test_l10n_nl_bsn.py index 184a88ee9..198079c9e 100644 --- a/l10n_nl_bsn/tests/test_l10n_nl_bsn.py +++ b/l10n_nl_bsn/tests/test_l10n_nl_bsn.py @@ -1,4 +1,4 @@ -# Copyright 2017-2018 Onestein () +# Copyright 2017-2019 Onestein () # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). from odoo.tests.common import TransactionCase @@ -48,3 +48,43 @@ def test_03_bsn_another_partner(self): title = warning.get('title') self.assertTrue(title) self.assertEqual(title, 'Warning!') + + def test_04_search_bsn_number(self): + self.partner_bsn.bsn_number = '100000009' + self.partner_bsn.onchange_bsn_number() + self.partner_bsn.write({}) + self.assertEqual(self.partner_bsn.bsn_number, '1000.00.009') + + res = self.env['res.partner'].search([ + ('bsn_number', '=', '100000009'), + ]) + self.assertTrue(res) + self.assertEqual(len(res), 1) + res = self.env['res.partner'].search([ + ('bsn_number', '=', '1000.00.009'), + ]) + self.assertTrue(res) + self.assertEqual(len(res), 1) + res = self.env['res.partner'].search([ + ('bsn_number', 'ilike', '1000.00.00'), + ]) + self.assertTrue(res) + self.assertEqual(len(res), 1) + res = self.env['res.partner'].search([ + ('bsn_number', 'ilike', '00.00.009'), + ]) + self.assertTrue(res) + self.assertEqual(len(res), 1) + res = self.env['res.partner'].search([ + ('bsn_number', 'ilike', '00.00.00'), + ]) + self.assertTrue(res) + self.assertEqual(len(res), 1) + res = self.env['res.partner'].search([ + ('bsn_number', '=', '10000000'), + ]) + self.assertFalse(res) + res = self.env['res.partner'].search([ + ('bsn_number', '=', '1000.00.00'), + ]) + self.assertFalse(res)