From 14c4ea027a73c839868738ec8be8ae59cd53a341 Mon Sep 17 00:00:00 2001 From: Murtuza Saleh Date: Tue, 29 Jul 2025 18:20:05 +0530 Subject: [PATCH] [IMP] FKO - Controlled Substance License on Partners --- .../data/res_partner_id_category_data.xml | 4 ++ .../models/res_partner.py | 39 +++++++++++++ .../tests/test_res_partner.py | 56 ++++++++++++++++++- .../views/res_partner_view.xml | 2 + 4 files changed, 99 insertions(+), 2 deletions(-) diff --git a/partner_identification_dea/data/res_partner_id_category_data.xml b/partner_identification_dea/data/res_partner_id_category_data.xml index 4bcd5beaccf..19e1fe62fa0 100644 --- a/partner_identification_dea/data/res_partner_id_category_data.xml +++ b/partner_identification_dea/data/res_partner_id_category_data.xml @@ -22,4 +22,8 @@ elif str( Medical License ML + + Controlled Substance + CS + diff --git a/partner_identification_dea/models/res_partner.py b/partner_identification_dea/models/res_partner.py index c8d097d955a..a411017e019 100644 --- a/partner_identification_dea/models/res_partner.py +++ b/partner_identification_dea/models/res_partner.py @@ -36,6 +36,16 @@ class ResPartner(models.Model): compute="_compute_dea_medical_license", store=True, ) + contr_subst_license = fields.Char( + string="Contr. Subst. License", + compute="_compute_dea_medical_license", + store=True, + ) + contr_subst_expired_date = fields.Date( + string="Contr. Subst. Expiration Date", + compute="_compute_dea_medical_license", + store=True, + ) @api.depends("id_numbers") def _compute_dea_medical_license(self): @@ -47,6 +57,10 @@ def _compute_dea_medical_license(self): "partner_identification_dea.res_partner_id_category_medical", raise_if_not_found=False, ) + controlled_subst_id = self.env.ref( + "partner_identification_dea.res_partner_id_category_controlled_substance", + raise_if_not_found=False, + ) partner_id_number_obj = self.env["res.partner.id_number"] for rec in self: dea_number = partner_id_number_obj.search( @@ -67,6 +81,15 @@ def _compute_dea_medical_license(self): order="id desc", limit=1, ) + controlled_subst = partner_id_number_obj.search( + [ + ("category_id", "=", controlled_subst_id and controlled_subst_id.id), + ("status", "=", "open"), + ("partner_id", "=", rec.id), + ], + order="id desc", + limit=1, + ) rec.dea_active = dea_number and "yes" or "no" rec.dea_expired_date = dea_number and dea_number.valid_until or False rec.dea_number = dea_number and dea_number.name or "" @@ -76,6 +99,10 @@ def _compute_dea_medical_license(self): rec.medical_license_expired_date = ( medical_license and medical_license.valid_until or False ) + rec.contr_subst_license = controlled_subst.name if controlled_subst else "" + rec.contr_subst_expired_date = ( + controlled_subst.valid_until if controlled_subst else False + ) @api.model def send_expiration_date_notification(self): @@ -116,3 +143,15 @@ def send_expiration_date_notification(self): # partner.id, # force_send=True, # ) + + @api.model + def name_search(self, name='', args=None, operator='ilike', limit=100): + args = args or [] + if name: + domain = [ + "|", + ("name", operator, name), + ("contr_subst_license", operator, name) + ] + return self.search(domain + args, limit=limit).name_get() + return super().name_search(name=name, args=args, operator=operator, limit=limit) diff --git a/partner_identification_dea/tests/test_res_partner.py b/partner_identification_dea/tests/test_res_partner.py index c1b96ad1b2f..86e6d51c6cf 100644 --- a/partner_identification_dea/tests/test_res_partner.py +++ b/partner_identification_dea/tests/test_res_partner.py @@ -18,21 +18,26 @@ def setUp(self): "partner_identification_dea.res_partner_id_category_medical", raise_if_not_found=False, ) + self.controlled_id = self.env.ref( + "partner_identification_dea.res_partner_id_category_controlled_substance", + raise_if_not_found=False, + ) self.date = fields.Date.today() + relativedelta(days=30) + self.expired_date = fields.Date.today() - relativedelta(days=10) self.partner_obj = self.env["res.partner"] self.partner_number_obj = self.env["res.partner.id_number"] self.partner_roy = self.partner_obj.create({"name": "Roy"}) self.partner_jimmy = self.partner_obj.create({"name": "Jimmy"}) + self.partner_john = self.partner_obj.create({"name": "John"}) self.partner_number_obj.create( { "partner_id": self.partner_roy.id, "category_id": self.dea_category_id.id, "status": "open", "valid_until": self.date, - "name": "12345600", + "name": "AA1270533", } ) - self.partner_number_obj.create( { "partner_id": self.partner_jimmy.id, @@ -42,6 +47,53 @@ def setUp(self): "name": "12360001", } ) + self.controlled_number = self.partner_number_obj.create( + { + "partner_id": self.partner_john.id, + "category_id": self.controlled_id.id, + "status": "open", + "valid_until": self.date, + "name": "78901234", + } + ) + + def test_dea_and_medical_license_fields_computed(self): + """Test DEA and medical license fields computed from ID numbers.""" + self.partner_roy.invalidate_cache() + self.partner_jimmy.invalidate_cache() + self.assertEqual(self.partner_roy.dea_number, "AA1270533") + self.assertEqual(self.partner_roy.dea_expired_date, self.date) + self.assertEqual(self.partner_jimmy.medical_license, "12360001") + self.assertEqual(self.partner_jimmy.medical_license_expired_date, self.date) + + def test_contr_subst_license_fields_computed(self): + """Test controlled substance license fields computed from ID number.""" + self.partner_john.invalidate_cache() + self.assertEqual(self.partner_john.contr_subst_license, "78901234") + self.assertEqual(self.partner_john.contr_subst_expired_date, self.date) + + def test_contr_subst_license_expired_or_inactive(self): + """Test license is ignored if expired or inactive.""" + # Test with status = 'closed' + self.controlled_number.status = 'close' + self.partner_john._compute_dea_medical_license() + self.assertEqual(self.partner_john.contr_subst_license, "") + self.assertFalse(self.partner_john.contr_subst_expired_date) + # Test with future status=open but expired date + self.controlled_number.write({ + 'status': 'open', + 'valid_until': self.expired_date, + }) + self.partner_john._compute_dea_medical_license() + self.assertEqual(self.partner_john.contr_subst_license, "78901234") + self.assertEqual(self.partner_john.contr_subst_expired_date, self.expired_date) + + def test_name_search_by_contr_subst_license(self): + """Test name_search can find partner by controlled substance license.""" + result = self.partner_obj.name_search(name="78901234") + self.assertTrue(result) + self.assertEqual(result[0][0], self.partner_john.id) + self.assertIn("John", result[0][1]) def test_send_expiration_date_notification(self): self.partner_obj.send_expiration_date_notification() diff --git a/partner_identification_dea/views/res_partner_view.xml b/partner_identification_dea/views/res_partner_view.xml index ec666381299..733894c6a78 100644 --- a/partner_identification_dea/views/res_partner_view.xml +++ b/partner_identification_dea/views/res_partner_view.xml @@ -11,6 +11,8 @@ + +