diff --git a/fleet_vehicle_technical_control/README.rst b/fleet_vehicle_technical_control/README.rst new file mode 100644 index 00000000..70d166cb --- /dev/null +++ b/fleet_vehicle_technical_control/README.rst @@ -0,0 +1,119 @@ +=============================== +Fleet Vehicle Technical Control +=============================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:28ffa6cf4d1a378bc0ae1f850c1340e5c3e44a3b24981cae0a0c36850558698f + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png + :target: https://odoo-community.org/page/development-status + :alt: Beta +.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 +.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Ffleet-lightgray.png?logo=github + :target: https://github.com/OCA/fleet/tree/18.0/fleet_vehicle_technical_control + :alt: OCA/fleet +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/fleet-18-0/fleet-18-0-fleet_vehicle_technical_control + :alt: Translate me on Weblate +.. |badge5| image:: https://img.shields.io/badge/runboat-Try%20me-875A7B.png + :target: https://runboat.odoo-community.org/builds?repo=OCA/fleet&target_branch=18.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module extends Fleet vehicles with technical control tracking. + +It adds a Technical Control page on the vehicle form where users can +define the control frequency in months, see the last and next technical +control dates, and review the history of completed controls. + +**Table of contents** + +.. contents:: + :local: + +Configuration +============= + +Fleet managers can set the control frequency directly on each vehicle +from the Technical Control page using the +``Technical Control Every (Months)`` field. The default frequency is 12 +months. + +Usage +===== + +To configure technical control planning: + +- Go to Fleet > Vehicles. +- Open a vehicle. +- Open the Technical Control page. +- Fill Technical Control Every (Months). + +To record a completed technical control: + +- Click Technical Control Done. +- Fill the control date and result. +- If the result is Not Valid, fill the comment. +- Optionally upload an attachment. +- Save the form. + +A new line is added to the history. The vehicle's last technical control +date is computed from the most recent history line, and the next +technical control date is computed from that date and the configured +frequency. + +Bug Tracker +=========== + +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. + +Credits +======= + +Authors +------- + +* ACSONE SA/NV + +Contributors +------------ + +- Souheil Bejaoui - ACSONE SA/NV souheil.bejaoui@acsone.eu + +Maintainers +----------- + +This module is maintained by the OCA. + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +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. + +.. |maintainer-sbejaoui| image:: https://github.com/sbejaoui.png?size=40px + :target: https://github.com/sbejaoui + :alt: sbejaoui + +Current `maintainer `__: + +|maintainer-sbejaoui| + +This module is part of the `OCA/fleet `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/fleet_vehicle_technical_control/__init__.py b/fleet_vehicle_technical_control/__init__.py new file mode 100644 index 00000000..0650744f --- /dev/null +++ b/fleet_vehicle_technical_control/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/fleet_vehicle_technical_control/__manifest__.py b/fleet_vehicle_technical_control/__manifest__.py new file mode 100644 index 00000000..25cdad0d --- /dev/null +++ b/fleet_vehicle_technical_control/__manifest__.py @@ -0,0 +1,20 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Fleet Vehicle Technical Control", + "summary": "Track vehicle technical controls in Fleet", + "version": "18.0.1.0.0", + "license": "AGPL-3", + "author": "ACSONE SA/NV,Odoo Community Association (OCA)", + "website": "https://github.com/OCA/fleet", + "depends": [ + "fleet", + ], + "data": [ + "security/fleet_vehicle_technical_control.xml", + "views/fleet_vehicle_technical_control.xml", + "views/fleet_vehicle.xml", + ], + "maintainers": ["sbejaoui"], +} diff --git a/fleet_vehicle_technical_control/i18n/fr.po b/fleet_vehicle_technical_control/i18n/fr.po new file mode 100644 index 00000000..c0490053 --- /dev/null +++ b/fleet_vehicle_technical_control/i18n/fr.po @@ -0,0 +1,153 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * fleet_vehicle_technical_control +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 18.0+e\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2026-06-29 14:40+0000\n" +"PO-Revision-Date: 2026-06-29 14:40+0000\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: fr\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#. module: fleet_vehicle_technical_control +#. odoo-python +#: code:addons/fleet_vehicle_technical_control/models/fleet_vehicle_technical_control.py:0 +msgid "A comment is required when the technical control is not valid." +msgstr "Un commentaire est requis lorsque le contrôle technique n'est pas valide." + +#. module: fleet_vehicle_technical_control +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_technical_control.fleet_vehicle_view_form +msgid "Actions" +msgstr "Actions" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__attachment_id +msgid "Attachment" +msgstr "Pièce jointe" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__attachment_filename +msgid "Attachment Filename" +msgstr "Nom du fichier joint" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__comment +msgid "Comment" +msgstr "Commentaire" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__create_uid +msgid "Created by" +msgstr "Créé par" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__create_date +msgid "Created on" +msgstr "Créé le" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__date +msgid "Date" +msgstr "Date" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__display_name +msgid "Display Name" +msgstr "Nom affiché" + +#. module: fleet_vehicle_technical_control +#: model:ir.model,name:fleet_vehicle_technical_control.model_fleet_vehicle_technical_control +msgid "Fleet Vehicle Technical Control" +msgstr "Contrôle technique du véhicule de flotte" + +#. module: fleet_vehicle_technical_control +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_technical_control.fleet_vehicle_view_form +msgid "History" +msgstr "Historique" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__id +msgid "ID" +msgstr "ID" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle__date_last_technical_control +msgid "Last Technical Control Date" +msgstr "Date du dernier contrôle technique" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__write_uid +msgid "Last Updated by" +msgstr "Dernière mise à jour par" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__write_date +msgid "Last Updated on" +msgstr "Dernière mise à jour le" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle__date_next_technical_control +msgid "Next Technical Control Date" +msgstr "Date du prochain contrôle technique" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields.selection,name:fleet_vehicle_technical_control.selection__fleet_vehicle_technical_control__result__not_valid +msgid "Not Valid" +msgstr "Non valide" + +#. module: fleet_vehicle_technical_control +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_technical_control.fleet_vehicle_view_form +msgid "Planning" +msgstr "Planification" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__result +msgid "Result" +msgstr "Résultat" + +#. module: fleet_vehicle_technical_control +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_technical_control.fleet_vehicle_view_form +msgid "Technical Control" +msgstr "Contrôle technique" + +#. module: fleet_vehicle_technical_control +#. odoo-python +#: code:addons/fleet_vehicle_technical_control/models/fleet_vehicle.py:0 +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_technical_control.fleet_vehicle_technical_control_view_form +#: model_terms:ir.ui.view,arch_db:fleet_vehicle_technical_control.fleet_vehicle_view_form +msgid "Technical Control Done" +msgstr "Contrôle technique effectué" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle__technical_control_every_months +msgid "Technical Control Every (Months)" +msgstr "Contrôle technique tous les (mois)" + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle__technical_control_ids +msgid "Technical Controls" +msgstr "Contrôles techniques" + +#. module: fleet_vehicle_technical_control +#. odoo-python +#: code:addons/fleet_vehicle_technical_control/models/fleet_vehicle.py:0 +msgid "Technical control frequency must be greater than or equal to 0." +msgstr "La fréquence du contrôle technique doit être supérieure ou égale à 0." + +#. module: fleet_vehicle_technical_control +#: model:ir.model.fields.selection,name:fleet_vehicle_technical_control.selection__fleet_vehicle_technical_control__result__valid +msgid "Valid" +msgstr "Valide" + +#. module: fleet_vehicle_technical_control +#: model:ir.model,name:fleet_vehicle_technical_control.model_fleet_vehicle +#: model:ir.model.fields,field_description:fleet_vehicle_technical_control.field_fleet_vehicle_technical_control__vehicle_id +msgid "Vehicle" +msgstr "Véhicule" diff --git a/fleet_vehicle_technical_control/models/__init__.py b/fleet_vehicle_technical_control/models/__init__.py new file mode 100644 index 00000000..304f41aa --- /dev/null +++ b/fleet_vehicle_technical_control/models/__init__.py @@ -0,0 +1,2 @@ +from . import fleet_vehicle +from . import fleet_vehicle_technical_control diff --git a/fleet_vehicle_technical_control/models/fleet_vehicle.py b/fleet_vehicle_technical_control/models/fleet_vehicle.py new file mode 100644 index 00000000..73541da5 --- /dev/null +++ b/fleet_vehicle_technical_control/models/fleet_vehicle.py @@ -0,0 +1,72 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from dateutil.relativedelta import relativedelta + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class FleetVehicle(models.Model): + _inherit = "fleet.vehicle" + + technical_control_every_months = fields.Integer( + string="Technical Control Every (Months)", + default=12, + ) + date_last_technical_control = fields.Date( + string="Last Technical Control Date", + compute="_compute_date_last_technical_control", + store=True, + ) + date_next_technical_control = fields.Date( + string="Next Technical Control Date", + compute="_compute_date_next_technical_control", + ) + technical_control_ids = fields.One2many( + comodel_name="fleet.vehicle.technical.control", + inverse_name="vehicle_id", + string="Technical Controls", + ) + + @api.depends("technical_control_ids.date") + def _compute_date_last_technical_control(self): + for vehicle in self: + vehicle.date_last_technical_control = max( + vehicle.technical_control_ids.mapped("date") or [False] + ) + + @api.depends("date_last_technical_control", "technical_control_every_months") + def _compute_date_next_technical_control(self): + for vehicle in self: + if ( + vehicle.date_last_technical_control + and vehicle.technical_control_every_months + ): + vehicle.date_next_technical_control = ( + vehicle.date_last_technical_control + + relativedelta(months=vehicle.technical_control_every_months) + ) + else: + vehicle.date_next_technical_control = False + + @api.constrains("technical_control_every_months") + def _check_technical_control_every_months(self): + for vehicle in self: + if vehicle.technical_control_every_months < 0: + raise ValidationError( + _("Technical control frequency must be greater than or equal to 0.") + ) + + def action_technical_control_done(self): + self.ensure_one() + return { + "type": "ir.actions.act_window", + "name": _("Technical Control Done"), + "res_model": "fleet.vehicle.technical.control", + "view_mode": "form", + "target": "new", + "context": { + "default_vehicle_id": self.id, + }, + } diff --git a/fleet_vehicle_technical_control/models/fleet_vehicle_technical_control.py b/fleet_vehicle_technical_control/models/fleet_vehicle_technical_control.py new file mode 100644 index 00000000..c6eda84c --- /dev/null +++ b/fleet_vehicle_technical_control/models/fleet_vehicle_technical_control.py @@ -0,0 +1,33 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from odoo import _, api, fields, models +from odoo.exceptions import ValidationError + + +class FleetVehicleTechnicalControl(models.Model): + _name = "fleet.vehicle.technical.control" + _description = "Fleet Vehicle Technical Control" + _order = "date desc, id desc" + + vehicle_id = fields.Many2one( + comodel_name="fleet.vehicle", + required=True, + ondelete="cascade", + ) + date = fields.Date(required=True) + result = fields.Selection( + selection=[("valid", "Valid"), ("not_valid", "Not Valid")], + required=True, + ) + comment = fields.Text() + attachment_id = fields.Binary(attachment=True) + attachment_filename = fields.Char() + + @api.constrains("result", "comment") + def _check_comment_required_if_not_valid(self): + for control in self: + if control.result == "not_valid" and not control.comment: + raise ValidationError( + _("A comment is required when the technical control is not valid.") + ) diff --git a/fleet_vehicle_technical_control/pyproject.toml b/fleet_vehicle_technical_control/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/fleet_vehicle_technical_control/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/fleet_vehicle_technical_control/readme/CONFIGURE.md b/fleet_vehicle_technical_control/readme/CONFIGURE.md new file mode 100644 index 00000000..13d6be04 --- /dev/null +++ b/fleet_vehicle_technical_control/readme/CONFIGURE.md @@ -0,0 +1,2 @@ +Fleet managers can set the control frequency directly on each vehicle from the Technical Control page using the `Technical Control Every (Months)` field. +The default frequency is 12 months. diff --git a/fleet_vehicle_technical_control/readme/CONTRIBUTORS.md b/fleet_vehicle_technical_control/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..80fec2f6 --- /dev/null +++ b/fleet_vehicle_technical_control/readme/CONTRIBUTORS.md @@ -0,0 +1 @@ +- Souheil Bejaoui - ACSONE SA/NV diff --git a/fleet_vehicle_technical_control/readme/DESCRIPTION.md b/fleet_vehicle_technical_control/readme/DESCRIPTION.md new file mode 100644 index 00000000..7096c914 --- /dev/null +++ b/fleet_vehicle_technical_control/readme/DESCRIPTION.md @@ -0,0 +1,5 @@ +This module extends Fleet vehicles with technical control tracking. + +It adds a Technical Control page on the vehicle form where users can define +the control frequency in months, see the last and next technical control +dates, and review the history of completed controls. diff --git a/fleet_vehicle_technical_control/readme/USAGE.md b/fleet_vehicle_technical_control/readme/USAGE.md new file mode 100644 index 00000000..710c6746 --- /dev/null +++ b/fleet_vehicle_technical_control/readme/USAGE.md @@ -0,0 +1,18 @@ +To configure technical control planning: + +- Go to Fleet > Vehicles. +- Open a vehicle. +- Open the Technical Control page. +- Fill Technical Control Every (Months). + +To record a completed technical control: + +- Click Technical Control Done. +- Fill the control date and result. +- If the result is Not Valid, fill the comment. +- Optionally upload an attachment. +- Save the form. + +A new line is added to the history. The vehicle's last technical control +date is computed from the most recent history line, and the next technical +control date is computed from that date and the configured frequency. diff --git a/fleet_vehicle_technical_control/security/fleet_vehicle_technical_control.xml b/fleet_vehicle_technical_control/security/fleet_vehicle_technical_control.xml new file mode 100644 index 00000000..baf2896d --- /dev/null +++ b/fleet_vehicle_technical_control/security/fleet_vehicle_technical_control.xml @@ -0,0 +1,24 @@ + + + + + fleet.vehicle.technical.control access user + + + + + + + + + + fleet.vehicle.technical.control access manager + + + + + + + + diff --git a/fleet_vehicle_technical_control/static/description/icon.png b/fleet_vehicle_technical_control/static/description/icon.png new file mode 100644 index 00000000..3a0328b5 Binary files /dev/null and b/fleet_vehicle_technical_control/static/description/icon.png differ diff --git a/fleet_vehicle_technical_control/static/description/index.html b/fleet_vehicle_technical_control/static/description/index.html new file mode 100644 index 00000000..bcac3779 --- /dev/null +++ b/fleet_vehicle_technical_control/static/description/index.html @@ -0,0 +1,459 @@ + + + + + +Fleet Vehicle Technical Control + + + +
+

Fleet Vehicle Technical Control

+ + +

Beta License: AGPL-3 OCA/fleet Translate me on Weblate Try me on Runboat

+

This module extends Fleet vehicles with technical control tracking.

+

It adds a Technical Control page on the vehicle form where users can +define the control frequency in months, see the last and next technical +control dates, and review the history of completed controls.

+

Table of contents

+ +
+

Configuration

+

Fleet managers can set the control frequency directly on each vehicle +from the Technical Control page using the +Technical Control Every (Months) field. The default frequency is 12 +months.

+
+
+

Usage

+

To configure technical control planning:

+
    +
  • Go to Fleet > Vehicles.
  • +
  • Open a vehicle.
  • +
  • Open the Technical Control page.
  • +
  • Fill Technical Control Every (Months).
  • +
+

To record a completed technical control:

+
    +
  • Click Technical Control Done.
  • +
  • Fill the control date and result.
  • +
  • If the result is Not Valid, fill the comment.
  • +
  • Optionally upload an attachment.
  • +
  • Save the form.
  • +
+

A new line is added to the history. The vehicle’s last technical control +date is computed from the most recent history line, and the next +technical control date is computed from that date and the configured +frequency.

+
+
+

Bug Tracker

+

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.

+
+
+

Credits

+
+

Authors

+
    +
  • ACSONE SA/NV
  • +
+
+
+

Contributors

+ +
+
+

Maintainers

+

This module is maintained by the OCA.

+ +Odoo Community Association + +

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:

+

sbejaoui

+

This module is part of the OCA/fleet project on GitHub.

+

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.

+
+
+
+ + diff --git a/fleet_vehicle_technical_control/tests/__init__.py b/fleet_vehicle_technical_control/tests/__init__.py new file mode 100644 index 00000000..ce034af2 --- /dev/null +++ b/fleet_vehicle_technical_control/tests/__init__.py @@ -0,0 +1 @@ +from . import test_fleet_vehicle_technical_control diff --git a/fleet_vehicle_technical_control/tests/test_fleet_vehicle_technical_control.py b/fleet_vehicle_technical_control/tests/test_fleet_vehicle_technical_control.py new file mode 100644 index 00000000..09c96ee6 --- /dev/null +++ b/fleet_vehicle_technical_control/tests/test_fleet_vehicle_technical_control.py @@ -0,0 +1,88 @@ +# Copyright 2026 ACSONE SA/NV +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). + +from datetime import date + +from odoo.exceptions import ValidationError +from odoo.tests.common import TransactionCase + + +class TestFleetVehicleTechnicalControl(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.Vehicle = cls.env["fleet.vehicle"] + cls.TechnicalControl = cls.env["fleet.vehicle.technical.control"] + cls.brand = cls.env["fleet.vehicle.model.brand"].create({"name": "Test Brand"}) + cls.model = cls.env["fleet.vehicle.model"].create( + {"name": "Test Model", "brand_id": cls.brand.id} + ) + + def _create_vehicle(self, **values): + vals = {"model_id": self.model.id, "license_plate": "TC-001"} + vals.update(values) + return self.Vehicle.create(vals) + + def test_vehicle_default_frequency_and_next_control_date(self): + vehicle = self._create_vehicle() + self.TechnicalControl.create( + {"vehicle_id": vehicle.id, "date": "2026-01-15", "result": "valid"} + ) + + self.assertEqual(vehicle.technical_control_every_months, 12) + self.assertTrue( + self.Vehicle._fields["date_last_technical_control"].store, + "Last technical control date must be stored.", + ) + self.assertFalse( + self.Vehicle._fields["date_next_technical_control"].store, + "Next technical control date must not be stored.", + ) + self.assertEqual(vehicle.date_last_technical_control, date(2026, 1, 15)) + self.assertEqual(vehicle.date_next_technical_control, date(2027, 1, 15)) + + vehicle.technical_control_every_months = 6 + self.assertEqual(vehicle.date_next_technical_control, date(2026, 7, 15)) + + def test_negative_frequency_is_rejected(self): + with self.assertRaisesRegex( + ValidationError, + "Technical control frequency must be greater than or equal to 0", + ): + self._create_vehicle(technical_control_every_months=-1) + + def test_not_valid_control_requires_comment(self): + vehicle = self._create_vehicle() + + with self.assertRaisesRegex( + ValidationError, + "A comment is required when the technical control is not valid", + ): + self.TechnicalControl.create( + {"vehicle_id": vehicle.id, "date": "2026-02-01", "result": "not_valid"} + ) + + def test_last_control_date_is_max_history_date(self): + vehicle = self._create_vehicle() + + recent_control = self.TechnicalControl.create( + {"vehicle_id": vehicle.id, "date": "2026-03-10", "result": "valid"} + ) + old_control = self.TechnicalControl.create( + {"vehicle_id": vehicle.id, "date": "2026-01-05", "result": "valid"} + ) + + self.assertEqual(vehicle.date_last_technical_control, date(2026, 3, 10)) + self.assertIn(recent_control, vehicle.technical_control_ids) + self.assertIn(old_control, vehicle.technical_control_ids) + + def test_action_technical_control_done(self): + vehicle = self._create_vehicle() + + action = vehicle.action_technical_control_done() + + self.assertEqual(action["type"], "ir.actions.act_window") + self.assertEqual(action["res_model"], "fleet.vehicle.technical.control") + self.assertEqual(action["view_mode"], "form") + self.assertEqual(action["target"], "new") + self.assertEqual(action["context"]["default_vehicle_id"], vehicle.id) diff --git a/fleet_vehicle_technical_control/views/fleet_vehicle.xml b/fleet_vehicle_technical_control/views/fleet_vehicle.xml new file mode 100644 index 00000000..457d73a2 --- /dev/null +++ b/fleet_vehicle_technical_control/views/fleet_vehicle.xml @@ -0,0 +1,39 @@ + + + + + fleet.vehicle + + + + + + + + + + + +