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 @@
+
+