+
Maintenance Equipment Tier Validation
+
+
+

+
This module extends the functionality of maintenance equipment to
+support a tier validation process.
+
Table of contents
+
+
+
+
This module depends on base_tier_validation. You can find it at
+OCA/server-ux.
+
+
+
+
To configure this module, you need to:
+
+- Go to Settings > Technical > Tier Validations > Tier Definition.
+- Create as many tiers as you want for the Maintenance Equipment model.
+
+
+
+
+
To use this module, you need to:
+
+- Create a Maintenance Equipment record triggering at least one Tier
+Definition.
+- Click on Request Validation.
+- Reviewers can validate or reject the pending review.
+- Once all reviews are validated, click on Validate Equipment.
+
+
+
+
+
Bugs are tracked on GitHub Issues.
+In case of trouble, please check there if your issue has already been reported.
+If you spotted it first, help us to smash it by providing a detailed and welcomed
+feedback.
+
Do not contact contributors directly about support or help with technical issues.
+
+
+
+
+
+
+
+
This module is maintained by the OCA.
+
+
+
+
OCA, or the Odoo Community Association, is a nonprofit organization whose
+mission is to support the collaborative development of Odoo features and
+promote its widespread use.
+
Current maintainer:
+

+
This module is part of the OCA/maintenance project on GitHub.
+
You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.
+
+
+
+
+
diff --git a/maintenance_equipment_tier_validation/tests/__init__.py b/maintenance_equipment_tier_validation/tests/__init__.py
new file mode 100644
index 000000000..d7e10ee64
--- /dev/null
+++ b/maintenance_equipment_tier_validation/tests/__init__.py
@@ -0,0 +1,3 @@
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from . import test_maintenance_equipment_tier_validation
diff --git a/maintenance_equipment_tier_validation/tests/test_maintenance_equipment_tier_validation.py b/maintenance_equipment_tier_validation/tests/test_maintenance_equipment_tier_validation.py
new file mode 100644
index 000000000..51aaabc7b
--- /dev/null
+++ b/maintenance_equipment_tier_validation/tests/test_maintenance_equipment_tier_validation.py
@@ -0,0 +1,63 @@
+# Copyright 2026 Quartile
+# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
+
+from odoo.exceptions import ValidationError
+from odoo.tests import new_test_user, tagged
+from odoo.tests.common import TransactionCase
+
+
+@tagged("post_install", "-at_install")
+class TestMaintenanceEquipmentTierValidation(TransactionCase):
+ @classmethod
+ def setUpClass(cls):
+ super().setUpClass()
+ cls.Equipment = cls.env["maintenance.equipment"]
+ cls.TierDefinition = cls.env["tier.definition"]
+ cls.equipment_model = cls.env["ir.model"]._get("maintenance.equipment")
+ cls.reviewer = new_test_user(
+ cls.env,
+ name="Equipment Reviewer",
+ login="equipment_reviewer",
+ groups="base.group_system,maintenance.group_equipment_manager",
+ )
+ cls.requester = new_test_user(
+ cls.env,
+ name="Equipment Requester",
+ login="equipment_requester",
+ groups="base.group_system,maintenance.group_equipment_manager",
+ )
+ cls.TierDefinition.create(
+ {
+ "model_id": cls.equipment_model.id,
+ "review_type": "individual",
+ "reviewer_id": cls.reviewer.id,
+ "definition_domain": "[]",
+ }
+ )
+
+ def test_tier_validation_model_name(self):
+ self.assertIn(
+ "maintenance.equipment",
+ self.TierDefinition._get_tier_validation_model_names(),
+ )
+
+ def test_validation_maintenance_equipment(self):
+ equipment_to_block = self.Equipment.create({"name": "Equipment to block"})
+
+ with self.assertRaises(ValidationError):
+ equipment_to_block.with_user(self.requester).action_validate_equipment()
+
+ equipment = self.Equipment.create({"name": "Equipment to validate"})
+
+ self.assertEqual(equipment.state, "draft")
+ self.assertTrue(equipment.need_validation)
+
+ equipment.with_user(self.requester).request_validation()
+ self.assertTrue(equipment.review_ids)
+
+ equipment.with_user(self.reviewer).validate_tier()
+ self.assertEqual(equipment.validation_status, "validated")
+
+ equipment.invalidate_recordset()
+ equipment.with_user(self.requester).action_validate_equipment()
+ self.assertEqual(equipment.state, "confirmed")
diff --git a/maintenance_equipment_tier_validation/views/maintenance_equipment_views.xml b/maintenance_equipment_tier_validation/views/maintenance_equipment_views.xml
new file mode 100644
index 000000000..7eace3374
--- /dev/null
+++ b/maintenance_equipment_tier_validation/views/maintenance_equipment_views.xml
@@ -0,0 +1,46 @@
+
+
+