From e8ff12c5e51a04c0b205fdfbdd6f2c714073f647 Mon Sep 17 00:00:00 2001 From: cubells Date: Fri, 16 May 2025 12:00:00 +0200 Subject: [PATCH 01/11] [ADD] maintenance_equipment_certification: new module --- .../README.rst | 94 ++++ .../__init__.py | 1 + .../__manifest__.py | 19 + .../i18n/es.po | 103 ++++ .../maintenance_equipment_certification.pot | 99 ++++ .../models/__init__.py | 2 + .../models/maintenance_equipment.py | 13 + .../maintenance_equipment_certificate.py | 22 + .../readme/CONTRIBUTORS.rst | 3 + .../readme/DESCRIPTION.rst | 2 + .../readme/USAGE.rst | 3 + .../security/ir.model.access.csv | 3 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/index.html | 438 ++++++++++++++++++ .../tests/__init__.py | 1 + ...est_maintenance_equipment_certification.py | 41 ++ .../views/maintenance_equipment_views.xml | 27 ++ 17 files changed, 871 insertions(+) create mode 100644 maintenance_equipment_certification/README.rst create mode 100644 maintenance_equipment_certification/__init__.py create mode 100644 maintenance_equipment_certification/__manifest__.py create mode 100644 maintenance_equipment_certification/i18n/es.po create mode 100644 maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot create mode 100644 maintenance_equipment_certification/models/__init__.py create mode 100644 maintenance_equipment_certification/models/maintenance_equipment.py create mode 100644 maintenance_equipment_certification/models/maintenance_equipment_certificate.py create mode 100644 maintenance_equipment_certification/readme/CONTRIBUTORS.rst create mode 100644 maintenance_equipment_certification/readme/DESCRIPTION.rst create mode 100644 maintenance_equipment_certification/readme/USAGE.rst create mode 100644 maintenance_equipment_certification/security/ir.model.access.csv create mode 100644 maintenance_equipment_certification/static/description/icon.png create mode 100644 maintenance_equipment_certification/static/description/index.html create mode 100644 maintenance_equipment_certification/tests/__init__.py create mode 100644 maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py create mode 100644 maintenance_equipment_certification/views/maintenance_equipment_views.xml diff --git a/maintenance_equipment_certification/README.rst b/maintenance_equipment_certification/README.rst new file mode 100644 index 000000000..ba79e4ab5 --- /dev/null +++ b/maintenance_equipment_certification/README.rst @@ -0,0 +1,94 @@ +=================================== +Maintenance equipment certification +=================================== + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:73d6dedecc9753187ee8d4627069ea90fe0ec5baf550af7b0d0208b7134ce46b + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Fmaintenance-lightgray.png?logo=github + :target: https://github.com/OCA/maintenance/tree/16.0/maintenance_equipment_certification + :alt: OCA/maintenance +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/maintenance-16-0/maintenance-16-0-maintenance_equipment_certification + :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/maintenance&target_branch=16.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +Allows you to store a record of the certifications associated with a piece of +equipment. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +* Got to **Maintenance > Equipment** menu. +* Open any equipment. +* You will see a Certification tab. + +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 +~~~~~~~ + +* Trey (www.trey.es) + +Contributors +~~~~~~~~~~~~ + +* `Trey `_: + + * Vicent Cubells + +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-cubells| image:: https://github.com/cubells.png?size=40px + :target: https://github.com/cubells + :alt: cubells + +Current `maintainer `__: + +|maintainer-cubells| + +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_certification/__init__.py b/maintenance_equipment_certification/__init__.py new file mode 100644 index 000000000..0650744f6 --- /dev/null +++ b/maintenance_equipment_certification/__init__.py @@ -0,0 +1 @@ +from . import models diff --git a/maintenance_equipment_certification/__manifest__.py b/maintenance_equipment_certification/__manifest__.py new file mode 100644 index 000000000..c16a658ba --- /dev/null +++ b/maintenance_equipment_certification/__manifest__.py @@ -0,0 +1,19 @@ +# Copyright 2025 Trey, Kilobytes de Soluciones - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +{ + "name": "Maintenance equipment certification", + "summary": "Add to store certifications associated with a equipment.", + "category": "Human Resources", + "version": "16.0.1.0.0", + "author": "Trey (www.trey.es), Odoo Community Association (OCA)", + "website": "https://github.com/OCA/maintenance", + "maintainers": ["cubells"], + "license": "AGPL-3", + "depends": [ + "maintenance", + ], + "data": [ + "security/ir.model.access.csv", + "views/maintenance_equipment_views.xml", + ], +} diff --git a/maintenance_equipment_certification/i18n/es.po b/maintenance_equipment_certification/i18n/es.po new file mode 100644 index 000000000..8ad46adb2 --- /dev/null +++ b/maintenance_equipment_certification/i18n/es.po @@ -0,0 +1,103 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_equipment_certification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-05-20 15:45+0000\n" +"PO-Revision-Date: 2025-05-20 17:48+0200\n" +"Last-Translator: \n" +"Language-Team: \n" +"Language: es\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Generator: Poedit 3.6\n" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_file +msgid "Certificate" +msgstr "Certificado" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_filename +msgid "Certificate file name" +msgstr "Nombre del fichero del certificado" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__certificate_ids +msgid "Certificates" +msgstr "Certificados" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.hr_equipment_view_form +msgid "Certifications" +msgstr "Certificaciones" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_uid +msgid "Created by" +msgstr "Creado por" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_date +msgid "Created on" +msgstr "Creado el" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__date +msgid "Date" +msgstr "Fecha" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__display_name +msgid "Display Name" +msgstr "Nombre a mostrar" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__equipment_id +msgid "Equipment" +msgstr "Equipo" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id +msgid "ID" +msgstr "Identificador" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate____last_update +msgid "Last Modified on" +msgstr "Última modificación el" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_uid +msgid "Last Updated by" +msgstr "Última modificación por" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_date +msgid "Last Updated on" +msgstr "Última actualización el" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Equipo de mantenimiento" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment_certificate +msgid "Maintenance equipment certificate" +msgstr "Certificado del equipo de mantenimiento" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__name +msgid "Name" +msgstr "Nombre" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__notes +msgid "Notes" +msgstr "Notas" diff --git a/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot b/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot new file mode 100644 index 000000000..5ef0fbe50 --- /dev/null +++ b/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot @@ -0,0 +1,99 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_equipment_certification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"Last-Translator: \n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_file +msgid "Certificate" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_filename +msgid "Certificate file name" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__certificate_ids +msgid "Certificates" +msgstr "" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.hr_equipment_view_form +msgid "Certifications" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_uid +msgid "Created by" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_date +msgid "Created on" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__date +msgid "Date" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__display_name +msgid "Display Name" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__equipment_id +msgid "Equipment" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id +msgid "ID" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate____last_update +msgid "Last Modified on" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_uid +msgid "Last Updated by" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_date +msgid "Last Updated on" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment_certificate +msgid "Maintenance equipment certificate" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__name +msgid "Name" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__notes +msgid "Notes" +msgstr "" diff --git a/maintenance_equipment_certification/models/__init__.py b/maintenance_equipment_certification/models/__init__.py new file mode 100644 index 000000000..5b46a543e --- /dev/null +++ b/maintenance_equipment_certification/models/__init__.py @@ -0,0 +1,2 @@ +from . import maintenance_equipment +from . import maintenance_equipment_certificate diff --git a/maintenance_equipment_certification/models/maintenance_equipment.py b/maintenance_equipment_certification/models/maintenance_equipment.py new file mode 100644 index 000000000..7f5c7ee0b --- /dev/null +++ b/maintenance_equipment_certification/models/maintenance_equipment.py @@ -0,0 +1,13 @@ +# Copyright 2025 Trey, Kilobytes de Soluciones - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class MaintenanceEquipment(models.Model): + _inherit = "maintenance.equipment" + + certificate_ids = fields.One2many( + comodel_name="maintenance.equipment.certificate", + inverse_name="equipment_id", + string="Certificates", + ) diff --git a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py new file mode 100644 index 000000000..fef284d63 --- /dev/null +++ b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py @@ -0,0 +1,22 @@ +# Copyright 2025 Trey, Kilobytes de Soluciones - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class MaintenanceEquipmentCertificate(models.Model): + _name = "maintenance.equipment.certificate" + _description = "Maintenance equipment certificate" + + name = fields.Char() + notes = fields.Text() + date = fields.Date() + certificate_file = fields.Binary( + string="Certificate", + attachment=True, + ) + certificate_filename = fields.Char( + string="Certificate file name", + ) + equipment_id = fields.Many2one( + comodel_name="maintenance.equipment", + ) diff --git a/maintenance_equipment_certification/readme/CONTRIBUTORS.rst b/maintenance_equipment_certification/readme/CONTRIBUTORS.rst new file mode 100644 index 000000000..0a10eb601 --- /dev/null +++ b/maintenance_equipment_certification/readme/CONTRIBUTORS.rst @@ -0,0 +1,3 @@ +* `Trey `_: + + * Vicent Cubells diff --git a/maintenance_equipment_certification/readme/DESCRIPTION.rst b/maintenance_equipment_certification/readme/DESCRIPTION.rst new file mode 100644 index 000000000..4cd413b4d --- /dev/null +++ b/maintenance_equipment_certification/readme/DESCRIPTION.rst @@ -0,0 +1,2 @@ +Allows you to store a record of the certifications associated with a piece of +equipment. diff --git a/maintenance_equipment_certification/readme/USAGE.rst b/maintenance_equipment_certification/readme/USAGE.rst new file mode 100644 index 000000000..f5a47b18c --- /dev/null +++ b/maintenance_equipment_certification/readme/USAGE.rst @@ -0,0 +1,3 @@ +* Got to **Maintenance > Equipment** menu. +* Open any equipment. +* You will see a Certification tab. diff --git a/maintenance_equipment_certification/security/ir.model.access.csv b/maintenance_equipment_certification/security/ir.model.access.csv new file mode 100644 index 000000000..6cfaec656 --- /dev/null +++ b/maintenance_equipment_certification/security/ir.model.access.csv @@ -0,0 +1,3 @@ +id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink +access_equipment_certification_user,Certification user,model_maintenance_equipment_certificate,base.group_user,1,0,0,0 +access_equipment_certification_admin,Certification admin,model_maintenance_equipment_certificate,maintenance.group_equipment_manager,1,1,1,1 diff --git a/maintenance_equipment_certification/static/description/icon.png b/maintenance_equipment_certification/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0328b516c4980e8e44cdb63fd945757ddd132d GIT binary patch literal 9455 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 z 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 Xviia!U7SGha1wx#SCgwmn*{w2TRX*I literal 0 HcmV?d00001 diff --git a/maintenance_equipment_certification/static/description/index.html b/maintenance_equipment_certification/static/description/index.html new file mode 100644 index 000000000..111ebf8c9 --- /dev/null +++ b/maintenance_equipment_certification/static/description/index.html @@ -0,0 +1,438 @@ + + + + + +Maintenance equipment certification + + + +
+

Maintenance equipment certification

+ + +

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

+

Allows you to store a record of the certifications associated with a piece of +equipment.

+

Table of contents

+ +
+

Usage

+
    +
  • Got to Maintenance > Equipment menu.
  • +
  • Open any equipment.
  • +
  • You will see a Certification tab.
  • +
+
+
+

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

+
    +
  • Trey (www.trey.es)
  • +
+
+
+

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:

+

cubells

+

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_certification/tests/__init__.py b/maintenance_equipment_certification/tests/__init__.py new file mode 100644 index 000000000..2dbc3e89e --- /dev/null +++ b/maintenance_equipment_certification/tests/__init__.py @@ -0,0 +1 @@ +from . import test_maintenance_equipment_certification diff --git a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py new file mode 100644 index 000000000..7ff02893a --- /dev/null +++ b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py @@ -0,0 +1,41 @@ +# Copyright 2025 Trey, Kilobytes de Soluciones - Vicent Cubells +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo.exceptions import AccessError +from odoo.tests.common import TransactionCase + + +class TestMaintenanceEquipmentCertification(TransactionCase): + def setUp(self): + super().setUp() + self.equipment = self.env["maintenance.equipment"].create( + { + "name": "Test equipment", + } + ) + self.user_demo = self.env["res.users"].create( + { + "name": "Demo User", + "login": "Demo", + "email": "demo@user.com", + "groups_id": [ + (6, 0, [self.env.ref("base.group_user").id]), + ], + } + ) + + def test_user_with_no_permission(self): + """Test user with no permission can not modify equipment.""" + with self.assertRaises(AccessError): + self.equipment.with_user(self.user_demo).name = "Test equipment rename" + + def test_user_with_permission(self): + """Test user with permission can modify equipment.""" + self.user_demo.write( + { + "groups_id": [ + (6, 0, [self.env.ref("maintenance.group_equipment_manager").id]) + ], + } + ) + self.equipment.with_user(self.user_demo).name = "Test equipment rename" + self.assertEqual(self.equipment.name, "Test equipment rename") diff --git a/maintenance_equipment_certification/views/maintenance_equipment_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_views.xml new file mode 100644 index 000000000..60e5a06ca --- /dev/null +++ b/maintenance_equipment_certification/views/maintenance_equipment_views.xml @@ -0,0 +1,27 @@ + + + + maintenance.equipment + + + + + + + + + + + + + + + + + + + + From f37b67545e4738111bfcbe6ccd079f5b87a4f321 Mon Sep 17 00:00:00 2001 From: mymage Date: Thu, 22 May 2025 08:28:09 +0000 Subject: [PATCH 02/11] Added translation using Weblate (Italian) --- .../i18n/it.po | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 maintenance_equipment_certification/i18n/it.po diff --git a/maintenance_equipment_certification/i18n/it.po b/maintenance_equipment_certification/i18n/it.po new file mode 100644 index 000000000..6179888c2 --- /dev/null +++ b/maintenance_equipment_certification/i18n/it.po @@ -0,0 +1,102 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_equipment_certification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 16.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2025-06-04 10:26+0000\n" +"Last-Translator: mymage \n" +"Language-Team: none\n" +"Language: it\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" +"X-Generator: Weblate 5.10.4\n" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_file +msgid "Certificate" +msgstr "Certificato" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_filename +msgid "Certificate file name" +msgstr "Nome file certificato" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__certificate_ids +msgid "Certificates" +msgstr "Certificati" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.hr_equipment_view_form +msgid "Certifications" +msgstr "Certificati" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_uid +msgid "Created by" +msgstr "Creato da" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_date +msgid "Created on" +msgstr "Creato il" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__date +msgid "Date" +msgstr "Data" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__display_name +msgid "Display Name" +msgstr "Nome visualizzato" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__equipment_id +msgid "Equipment" +msgstr "Attrezzatura" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id +msgid "ID" +msgstr "ID" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate____last_update +msgid "Last Modified on" +msgstr "Ultima modifica il" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_uid +msgid "Last Updated by" +msgstr "Ultimo aggiornamento di" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_date +msgid "Last Updated on" +msgstr "Ultimo aggiornamento il" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Attrezzatura manutenzione" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment_certificate +msgid "Maintenance equipment certificate" +msgstr "Certificato attrezzatura manutenzione" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__name +msgid "Name" +msgstr "Nome" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__notes +msgid "Notes" +msgstr "Note" From f5df0d3588c86c3db27cd21e04855ab8eda0fde0 Mon Sep 17 00:00:00 2001 From: JasminSForgeFlow Date: Fri, 20 Mar 2026 09:14:55 +0000 Subject: [PATCH 03/11] [IMP] maintenance_equipment_certification: pre-commit auto fixes --- .../README.rst | 36 ++++++++++--------- .../pyproject.toml | 3 ++ .../readme/CONTRIBUTORS.md | 2 ++ .../readme/CONTRIBUTORS.rst | 3 -- .../{DESCRIPTION.rst => DESCRIPTION.md} | 4 +-- .../readme/USAGE.md | 3 ++ .../readme/USAGE.rst | 3 -- .../static/description/index.html | 34 ++++++++++-------- 8 files changed, 50 insertions(+), 38 deletions(-) create mode 100644 maintenance_equipment_certification/pyproject.toml create mode 100644 maintenance_equipment_certification/readme/CONTRIBUTORS.md delete mode 100644 maintenance_equipment_certification/readme/CONTRIBUTORS.rst rename maintenance_equipment_certification/readme/{DESCRIPTION.rst => DESCRIPTION.md} (71%) create mode 100644 maintenance_equipment_certification/readme/USAGE.md delete mode 100644 maintenance_equipment_certification/readme/USAGE.rst diff --git a/maintenance_equipment_certification/README.rst b/maintenance_equipment_certification/README.rst index ba79e4ab5..72744b0d1 100644 --- a/maintenance_equipment_certification/README.rst +++ b/maintenance_equipment_certification/README.rst @@ -1,3 +1,7 @@ +.. image:: https://odoo-community.org/readme-banner-image + :target: https://odoo-community.org/get-involved?utm_source=readme + :alt: Odoo Community Association + =================================== Maintenance equipment certification =================================== @@ -13,23 +17,23 @@ Maintenance equipment certification .. |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 +.. |badge2| image:: https://img.shields.io/badge/license-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%2Fmaintenance-lightgray.png?logo=github - :target: https://github.com/OCA/maintenance/tree/16.0/maintenance_equipment_certification + :target: https://github.com/OCA/maintenance/tree/19.0/maintenance_equipment_certification :alt: OCA/maintenance .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/maintenance-16-0/maintenance-16-0-maintenance_equipment_certification + :target: https://translation.odoo-community.org/projects/maintenance-19-0/maintenance-19-0-maintenance_equipment_certification :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/maintenance&target_branch=16.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/maintenance&target_branch=19.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| -Allows you to store a record of the certifications associated with a piece of -equipment. +Allows you to store a record of the certifications associated with a +piece of equipment. **Table of contents** @@ -39,9 +43,9 @@ equipment. Usage ===== -* Got to **Maintenance > Equipment** menu. -* Open any equipment. -* You will see a Certification tab. +- Got to **Maintenance > Equipment** menu. +- Open any equipment. +- You will see a Certification tab. Bug Tracker =========== @@ -49,7 +53,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -57,19 +61,19 @@ Credits ======= Authors -~~~~~~~ +------- * Trey (www.trey.es) Contributors -~~~~~~~~~~~~ +------------ -* `Trey `_: +- `Trey `__: - * Vicent Cubells + - Vicent Cubells Maintainers -~~~~~~~~~~~ +----------- This module is maintained by the OCA. @@ -89,6 +93,6 @@ Current `maintainer `__: |maintainer-cubells| -This module is part of the `OCA/maintenance `_ project on GitHub. +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_certification/pyproject.toml b/maintenance_equipment_certification/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/maintenance_equipment_certification/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/maintenance_equipment_certification/readme/CONTRIBUTORS.md b/maintenance_equipment_certification/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..9ad0800b4 --- /dev/null +++ b/maintenance_equipment_certification/readme/CONTRIBUTORS.md @@ -0,0 +1,2 @@ +- [Trey](https://www.trey.es): + - Vicent Cubells \ diff --git a/maintenance_equipment_certification/readme/CONTRIBUTORS.rst b/maintenance_equipment_certification/readme/CONTRIBUTORS.rst deleted file mode 100644 index 0a10eb601..000000000 --- a/maintenance_equipment_certification/readme/CONTRIBUTORS.rst +++ /dev/null @@ -1,3 +0,0 @@ -* `Trey `_: - - * Vicent Cubells diff --git a/maintenance_equipment_certification/readme/DESCRIPTION.rst b/maintenance_equipment_certification/readme/DESCRIPTION.md similarity index 71% rename from maintenance_equipment_certification/readme/DESCRIPTION.rst rename to maintenance_equipment_certification/readme/DESCRIPTION.md index 4cd413b4d..122012713 100644 --- a/maintenance_equipment_certification/readme/DESCRIPTION.rst +++ b/maintenance_equipment_certification/readme/DESCRIPTION.md @@ -1,2 +1,2 @@ -Allows you to store a record of the certifications associated with a piece of -equipment. +Allows you to store a record of the certifications associated with a +piece of equipment. diff --git a/maintenance_equipment_certification/readme/USAGE.md b/maintenance_equipment_certification/readme/USAGE.md new file mode 100644 index 000000000..e34d8dd7e --- /dev/null +++ b/maintenance_equipment_certification/readme/USAGE.md @@ -0,0 +1,3 @@ +- Got to **Maintenance \> Equipment** menu. +- Open any equipment. +- You will see a Certification tab. diff --git a/maintenance_equipment_certification/readme/USAGE.rst b/maintenance_equipment_certification/readme/USAGE.rst deleted file mode 100644 index f5a47b18c..000000000 --- a/maintenance_equipment_certification/readme/USAGE.rst +++ /dev/null @@ -1,3 +0,0 @@ -* Got to **Maintenance > Equipment** menu. -* Open any equipment. -* You will see a Certification tab. diff --git a/maintenance_equipment_certification/static/description/index.html b/maintenance_equipment_certification/static/description/index.html index 111ebf8c9..3231fb7f8 100644 --- a/maintenance_equipment_certification/static/description/index.html +++ b/maintenance_equipment_certification/static/description/index.html @@ -3,7 +3,7 @@ -Maintenance equipment certification +README.rst -
-

Maintenance equipment certification

+
+ + +Odoo Community Association + +
+

Maintenance equipment certification

-

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

-

Allows you to store a record of the certifications associated with a piece of -equipment.

+

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

+

Allows you to store a record of the certifications associated with a +piece of equipment.

Table of contents

    @@ -386,7 +391,7 @@

    Maintenance equipment certification

-

Usage

+

Usage

  • Got to Maintenance > Equipment menu.
  • Open any equipment.
  • @@ -394,23 +399,23 @@

    Usage

-

Bug Tracker

+

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.

+feedback.

Do not contact contributors directly about support or help with technical issues.

-

Credits

+

Credits

-

Authors

+

Authors

  • Trey (www.trey.es)
-

Contributors

+

Contributors

-

Maintainers

+

Maintainers

This module is maintained by the OCA.

Odoo Community Association @@ -429,10 +434,11 @@

Maintainers

promote its widespread use.

Current maintainer:

cubells

-

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

+

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.

+
From 67f73c61179e1ad574f0ee5248be1b75aa82a7b8 Mon Sep 17 00:00:00 2001 From: JasminSForgeFlow Date: Fri, 20 Mar 2026 09:45:52 +0000 Subject: [PATCH 04/11] [MIG] maintenance_equipment_certification: Migration to 19.0 --- maintenance_equipment_certification/__manifest__.py | 2 +- .../tests/test_maintenance_equipment_certification.py | 4 ++-- .../views/maintenance_equipment_views.xml | 10 +++++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/maintenance_equipment_certification/__manifest__.py b/maintenance_equipment_certification/__manifest__.py index c16a658ba..5eaeefe80 100644 --- a/maintenance_equipment_certification/__manifest__.py +++ b/maintenance_equipment_certification/__manifest__.py @@ -4,7 +4,7 @@ "name": "Maintenance equipment certification", "summary": "Add to store certifications associated with a equipment.", "category": "Human Resources", - "version": "16.0.1.0.0", + "version": "19.0.1.0.0", "author": "Trey (www.trey.es), Odoo Community Association (OCA)", "website": "https://github.com/OCA/maintenance", "maintainers": ["cubells"], diff --git a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py index 7ff02893a..f9ee79e9c 100644 --- a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py +++ b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py @@ -17,7 +17,7 @@ def setUp(self): "name": "Demo User", "login": "Demo", "email": "demo@user.com", - "groups_id": [ + "group_ids": [ (6, 0, [self.env.ref("base.group_user").id]), ], } @@ -32,7 +32,7 @@ def test_user_with_permission(self): """Test user with permission can modify equipment.""" self.user_demo.write( { - "groups_id": [ + "group_ids": [ (6, 0, [self.env.ref("maintenance.group_equipment_manager").id]) ], } diff --git a/maintenance_equipment_certification/views/maintenance_equipment_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_views.xml index 60e5a06ca..a2138806e 100644 --- a/maintenance_equipment_certification/views/maintenance_equipment_views.xml +++ b/maintenance_equipment_certification/views/maintenance_equipment_views.xml @@ -8,16 +8,20 @@ - + - + - + From c2389586a55e0c7639421f9c53dd0cc2476e03d9 Mon Sep 17 00:00:00 2001 From: JasminSForgeFlow Date: Mon, 23 Mar 2026 09:00:41 +0000 Subject: [PATCH 05/11] [IMP] maintenance_equipment_certification: add certificate number and renewal date --- maintenance_equipment_certification/README.rst | 4 ++++ .../models/maintenance_equipment_certificate.py | 2 ++ maintenance_equipment_certification/readme/CONTRIBUTORS.md | 2 ++ .../static/description/index.html | 4 ++++ .../views/maintenance_equipment_views.xml | 2 ++ 5 files changed, 14 insertions(+) diff --git a/maintenance_equipment_certification/README.rst b/maintenance_equipment_certification/README.rst index 72744b0d1..022e771dc 100644 --- a/maintenance_equipment_certification/README.rst +++ b/maintenance_equipment_certification/README.rst @@ -72,6 +72,10 @@ Contributors - Vicent Cubells +- `ForgeFlow `__: + + - Jasmin Solanki + Maintainers ----------- diff --git a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py index fef284d63..ea1581311 100644 --- a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py +++ b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py @@ -8,8 +8,10 @@ class MaintenanceEquipmentCertificate(models.Model): _description = "Maintenance equipment certificate" name = fields.Char() + certificate_number = fields.Char() notes = fields.Text() date = fields.Date() + renewal_date = fields.Date() certificate_file = fields.Binary( string="Certificate", attachment=True, diff --git a/maintenance_equipment_certification/readme/CONTRIBUTORS.md b/maintenance_equipment_certification/readme/CONTRIBUTORS.md index 9ad0800b4..b9e511b31 100644 --- a/maintenance_equipment_certification/readme/CONTRIBUTORS.md +++ b/maintenance_equipment_certification/readme/CONTRIBUTORS.md @@ -1,2 +1,4 @@ - [Trey](https://www.trey.es): - Vicent Cubells \ +- [ForgeFlow](https://www.forgeflow.com): + - Jasmin Solanki \ No newline at end of file diff --git a/maintenance_equipment_certification/static/description/index.html b/maintenance_equipment_certification/static/description/index.html index 3231fb7f8..6e4dccce0 100644 --- a/maintenance_equipment_certification/static/description/index.html +++ b/maintenance_equipment_certification/static/description/index.html @@ -421,6 +421,10 @@

Contributors

  • Vicent Cubells <vicent@trey.es>
  • +
  • ForgeFlow:
      +
    • Jasmin Solanki
    • +
    +
  • diff --git a/maintenance_equipment_certification/views/maintenance_equipment_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_views.xml index a2138806e..526f34644 100644 --- a/maintenance_equipment_certification/views/maintenance_equipment_views.xml +++ b/maintenance_equipment_certification/views/maintenance_equipment_views.xml @@ -10,7 +10,9 @@ + + Date: Tue, 31 Mar 2026 05:31:35 +0000 Subject: [PATCH 06/11] [IMP] maintenance_equipment_certification: add certificate menu and alert when a certificate is about to expire --- .../README.rst | 15 ++ .../__manifest__.py | 5 + .../data/ir_cron_data.xml | 11 ++ .../data/mail_template_data.xml | 46 +++++ .../models/__init__.py | 2 + .../models/certificate_reminder_rule.py | 19 ++ .../maintenance_equipment_certificate.py | 61 +++++- .../models/res_config_settings.py | 13 ++ .../readme/DESCRIPTION.md | 6 + .../readme/USAGE.md | 9 + .../security/ir.model.access.csv | 2 + .../static/description/index.html | 14 ++ ...est_maintenance_equipment_certification.py | 176 ++++++++++++++++-- .../views/certificate_reminder_rule_views.xml | 28 +++ ...aintenance_equipment_certificate_views.xml | 86 +++++++++ .../views/res_config_settings_views.xml | 33 ++++ 16 files changed, 509 insertions(+), 17 deletions(-) create mode 100644 maintenance_equipment_certification/data/ir_cron_data.xml create mode 100644 maintenance_equipment_certification/data/mail_template_data.xml create mode 100644 maintenance_equipment_certification/models/certificate_reminder_rule.py create mode 100644 maintenance_equipment_certification/models/res_config_settings.py create mode 100644 maintenance_equipment_certification/views/certificate_reminder_rule_views.xml create mode 100644 maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml create mode 100644 maintenance_equipment_certification/views/res_config_settings_views.xml diff --git a/maintenance_equipment_certification/README.rst b/maintenance_equipment_certification/README.rst index 022e771dc..220562a38 100644 --- a/maintenance_equipment_certification/README.rst +++ b/maintenance_equipment_certification/README.rst @@ -35,6 +35,12 @@ Maintenance equipment certification Allows you to store a record of the certifications associated with a piece of equipment. +Additionally, a daily cron job can notify responsible users when +certificates are about to expire. Notifications are sent via email. You +can configure reminder rules to control how many days before expiration +each notification is sent, and enable or disable the feature from +**Settings > Maintenance**. + **Table of contents** .. contents:: @@ -47,6 +53,15 @@ Usage - Open any equipment. - You will see a Certification tab. +To configure expiration notifications: + +- Go to **Settings > Maintenance** and enable **Certificate Expiration + Alert**. +- Go to **Maintenance > Configuration > Certificate Reminder Rules** to + define how many days before expiration each reminder is sent. +- The daily cron job **Maintenance: Notify Expiring Certificates** will + send email notifications to the assigned technician or owner. + Bug Tracker =========== diff --git a/maintenance_equipment_certification/__manifest__.py b/maintenance_equipment_certification/__manifest__.py index 5eaeefe80..fcfbbbd39 100644 --- a/maintenance_equipment_certification/__manifest__.py +++ b/maintenance_equipment_certification/__manifest__.py @@ -14,6 +14,11 @@ ], "data": [ "security/ir.model.access.csv", + "data/mail_template_data.xml", + "data/ir_cron_data.xml", "views/maintenance_equipment_views.xml", + "views/maintenance_equipment_certificate_views.xml", + "views/certificate_reminder_rule_views.xml", + "views/res_config_settings_views.xml", ], } diff --git a/maintenance_equipment_certification/data/ir_cron_data.xml b/maintenance_equipment_certification/data/ir_cron_data.xml new file mode 100644 index 000000000..d5167f453 --- /dev/null +++ b/maintenance_equipment_certification/data/ir_cron_data.xml @@ -0,0 +1,11 @@ + + + + Maintenance: Notify Expiring Certificates + + code + model._cron_notify_expiring_certificates() + 1 + days + + diff --git a/maintenance_equipment_certification/data/mail_template_data.xml b/maintenance_equipment_certification/data/mail_template_data.xml new file mode 100644 index 000000000..4c300e1ba --- /dev/null +++ b/maintenance_equipment_certification/data/mail_template_data.xml @@ -0,0 +1,46 @@ + + + + Certificate Expiration Reminder + + Certificate Expiring: {{ object.name }} – {{ object.equipment_id.name }} + {{ (object.equipment_id.technician_user_id or object.equipment_id.owner_user_id).partner_id.id }} + + Sent automatically when a certificate is approaching its renewal date. + + +
    + + Dear Team, +

    + The following certificate is approaching its expiration date + and requires your attention: +

    + Certificate: + Certificate name +
    + + Number: + CERT-001 +
    +
    + Equipment: + Equipment name +
    + Renewal Date: + 2026-12-31 +

    + Please take the necessary steps to renew this certificate + before it expires. +
    +
    + +
    +
    diff --git a/maintenance_equipment_certification/models/__init__.py b/maintenance_equipment_certification/models/__init__.py index 5b46a543e..e433733ff 100644 --- a/maintenance_equipment_certification/models/__init__.py +++ b/maintenance_equipment_certification/models/__init__.py @@ -1,2 +1,4 @@ +from . import certificate_reminder_rule from . import maintenance_equipment from . import maintenance_equipment_certificate +from . import res_config_settings diff --git a/maintenance_equipment_certification/models/certificate_reminder_rule.py b/maintenance_equipment_certification/models/certificate_reminder_rule.py new file mode 100644 index 000000000..45fe2cbb4 --- /dev/null +++ b/maintenance_equipment_certification/models/certificate_reminder_rule.py @@ -0,0 +1,19 @@ +# Copyright 2026 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class CertificateReminderRule(models.Model): + _name = "maintenance.certificate.reminder.rule" + _description = "Certificate expiration reminder rule" + _order = "days_before desc" + + name = fields.Char( + string="Rule Name", + required=True, + ) + days_before = fields.Integer( + string="Days Before Expiration", + required=True, + help="How many days before the renewal date to schedule the reminder.", + ) diff --git a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py index ea1581311..cb8d3cc92 100644 --- a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py +++ b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py @@ -1,6 +1,9 @@ # Copyright 2025 Trey, Kilobytes de Soluciones - Vicent Cubells +# Copyright 2026 ForgeFlow S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). -from odoo import fields, models +from datetime import timedelta + +from odoo import api, fields, models class MaintenanceEquipmentCertificate(models.Model): @@ -22,3 +25,59 @@ class MaintenanceEquipmentCertificate(models.Model): equipment_id = fields.Many2one( comodel_name="maintenance.equipment", ) + expiration_notify_count = fields.Integer( + string="Notifications Sent", + default=0, + copy=False, + ) + + def write(self, vals): + if "renewal_date" in vals: + vals = dict(vals) + vals.setdefault("expiration_notify_count", 0) + return super().write(vals) + + @api.model + def _cron_notify_expiring_certificates(self): + ICP = self.env["ir.config_parameter"].sudo() + enabled = ICP.get_param( + "maintenance_equipment_certification.expiration_notify_enabled", False + ) + if not enabled or enabled == "False": + return False + rules = self.env["maintenance.certificate.reminder.rule"].search( + [], order="days_before desc", limit=False + ) + if not rules: + return False + template = self.env.ref( + "maintenance_equipment_certification.mail_template_certificate_expiration", + raise_if_not_found=False, + ) + today = fields.Date.context_today(self) + max_days = rules[0].days_before + deadline = today + timedelta(days=max_days) + certificates = self.search( + [ + ("renewal_date", "<=", deadline), + ("renewal_date", ">=", today), + ("expiration_notify_count", "<", len(rules)), + ("equipment_id", "!=", False), + ] + ) + for cert in certificates: + days_remaining = (cert.renewal_date - today).days + # Count how many rules have triggered (days_before >= days_remaining) + expected = sum(1 for r in rules if r.days_before >= days_remaining) + if cert.expiration_notify_count >= expected: + continue + equipment = cert.equipment_id + user = equipment.technician_user_id or equipment.owner_user_id + if not user: + continue + if template: + template.send_mail( + cert.id, + email_layout_xmlid="mail.mail_notification_light", + ) + cert.expiration_notify_count = expected diff --git a/maintenance_equipment_certification/models/res_config_settings.py b/maintenance_equipment_certification/models/res_config_settings.py new file mode 100644 index 000000000..a40edc2d3 --- /dev/null +++ b/maintenance_equipment_certification/models/res_config_settings.py @@ -0,0 +1,13 @@ +# Copyright 2026 ForgeFlow S.L. +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from odoo import fields, models + + +class ResConfigSettings(models.TransientModel): + _inherit = "res.config.settings" + + cert_expiration_notify_enabled = fields.Boolean( + string="Certificate Expiration Alert", + config_parameter="maintenance_equipment_certification.expiration_notify_enabled", + help="Send an email notification when a certificate is about to expire.", + ) diff --git a/maintenance_equipment_certification/readme/DESCRIPTION.md b/maintenance_equipment_certification/readme/DESCRIPTION.md index 122012713..c9badbc1a 100644 --- a/maintenance_equipment_certification/readme/DESCRIPTION.md +++ b/maintenance_equipment_certification/readme/DESCRIPTION.md @@ -1,2 +1,8 @@ Allows you to store a record of the certifications associated with a piece of equipment. + +Additionally, a daily cron job can notify responsible users when +certificates are about to expire. Notifications are sent via email. +You can configure reminder rules to control how many days before +expiration each notification is sent, and enable or disable the +feature from **Settings > Maintenance**. diff --git a/maintenance_equipment_certification/readme/USAGE.md b/maintenance_equipment_certification/readme/USAGE.md index e34d8dd7e..f4d891b8e 100644 --- a/maintenance_equipment_certification/readme/USAGE.md +++ b/maintenance_equipment_certification/readme/USAGE.md @@ -1,3 +1,12 @@ - Got to **Maintenance \> Equipment** menu. - Open any equipment. - You will see a Certification tab. + +To configure expiration notifications: + +- Go to **Settings \> Maintenance** and enable + **Certificate Expiration Alert**. +- Go to **Maintenance \> Configuration \> Certificate Reminder Rules** + to define how many days before expiration each reminder is sent. +- The daily cron job **Maintenance: Notify Expiring Certificates** + will send email notifications to the assigned technician or owner. diff --git a/maintenance_equipment_certification/security/ir.model.access.csv b/maintenance_equipment_certification/security/ir.model.access.csv index 6cfaec656..d4f6be200 100644 --- a/maintenance_equipment_certification/security/ir.model.access.csv +++ b/maintenance_equipment_certification/security/ir.model.access.csv @@ -1,3 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_equipment_certification_user,Certification user,model_maintenance_equipment_certificate,base.group_user,1,0,0,0 access_equipment_certification_admin,Certification admin,model_maintenance_equipment_certificate,maintenance.group_equipment_manager,1,1,1,1 +access_cert_reminder_rule_user,Certificate reminder rule user,model_maintenance_certificate_reminder_rule,base.group_user,1,0,0,0 +access_cert_reminder_rule_admin,Certificate reminder rule admin,model_maintenance_certificate_reminder_rule,maintenance.group_equipment_manager,1,1,1,1 diff --git a/maintenance_equipment_certification/static/description/index.html b/maintenance_equipment_certification/static/description/index.html index 6e4dccce0..c801dc28b 100644 --- a/maintenance_equipment_certification/static/description/index.html +++ b/maintenance_equipment_certification/static/description/index.html @@ -377,6 +377,11 @@

    Maintenance equipment certification

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

    Allows you to store a record of the certifications associated with a piece of equipment.

    +

    Additionally, a daily cron job can notify responsible users when +certificates are about to expire. Notifications are sent via email. You +can configure reminder rules to control how many days before expiration +each notification is sent, and enable or disable the feature from +Settings > Maintenance.

    Table of contents

      @@ -397,6 +402,15 @@

      Usage

    • Open any equipment.
    • You will see a Certification tab.
    +

    To configure expiration notifications:

    +
      +
    • Go to Settings > Maintenance and enable Certificate Expiration +Alert.
    • +
    • Go to Maintenance > Configuration > Certificate Reminder Rules to +define how many days before expiration each reminder is sent.
    • +
    • The daily cron job Maintenance: Notify Expiring Certificates will +send email notifications to the assigned technician or owner.
    • +

    Bug Tracker

    diff --git a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py index f9ee79e9c..c2c2814c0 100644 --- a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py +++ b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py @@ -1,35 +1,84 @@ # Copyright 2025 Trey, Kilobytes de Soluciones - Vicent Cubells +# Copyright 2026 ForgeFlow S.L. # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl). +from datetime import timedelta + +from odoo import fields from odoo.exceptions import AccessError from odoo.tests.common import TransactionCase +_PARAM_ENABLED = "maintenance_equipment_certification.expiration_notify_enabled" + class TestMaintenanceEquipmentCertification(TransactionCase): - def setUp(self): - super().setUp() - self.equipment = self.env["maintenance.equipment"].create( + @classmethod + def setUpClass(cls): + super().setUpClass() + cls.user_demo = cls.env["res.users"].create( { - "name": "Test equipment", + "name": "Demo User", + "login": "demo_cert", + "email": "demo@user.com", + "group_ids": [(6, 0, [cls.env.ref("base.group_user").id])], } ) - self.user_demo = self.env["res.users"].create( + cls.technician = cls.env["res.users"].create( { - "name": "Demo User", - "login": "Demo", - "email": "demo@user.com", + "name": "Technician", + "login": "tech_cert", + "email": "tech@example.com", "group_ids": [ - (6, 0, [self.env.ref("base.group_user").id]), + (6, 0, [cls.env.ref("maintenance.group_equipment_manager").id]), ], } ) + cls.equipment = cls.env["maintenance.equipment"].create( + { + "name": "Test equipment", + "technician_user_id": cls.technician.id, + } + ) + cls.env["ir.config_parameter"].sudo().set_param(_PARAM_ENABLED, "True") + cls.rule_30 = cls.env["maintenance.certificate.reminder.rule"].create( + {"name": "30 Days Before", "days_before": 30} + ) + + # -------- + # Helpers + # -------- + + def _make_certificate(self, renewal_offset_days, **kwargs): + today = fields.Date.context_today(self.env["maintenance.equipment.certificate"]) + vals = { + "name": "Test Certificate", + "certificate_number": "CERT-001", + "equipment_id": self.equipment.id, + "date": today - timedelta(days=365), + "renewal_date": today + timedelta(days=renewal_offset_days), + } + vals.update(kwargs) + return self.env["maintenance.equipment.certificate"].create(vals) + + def _run_cron(self): + self.env[ + "maintenance.equipment.certificate" + ]._cron_notify_expiring_certificates() + + def _shift_renewal(self, cert, offset_days): + cert.renewal_date = fields.Date.context_today(cert) + timedelta( + days=offset_days + ) - def test_user_with_no_permission(self): - """Test user with no permission can not modify equipment.""" + # ------------------------------------------------------------------ + # 1. Access control + # ------------------------------------------------------------------ + + def test_access_control(self): + """A plain user cannot edit equipment; granting the maintenance + manager group unlocks write access.""" with self.assertRaises(AccessError): - self.equipment.with_user(self.user_demo).name = "Test equipment rename" + self.equipment.with_user(self.user_demo).name = "rename blocked" - def test_user_with_permission(self): - """Test user with permission can modify equipment.""" self.user_demo.write( { "group_ids": [ @@ -37,5 +86,100 @@ def test_user_with_permission(self): ], } ) - self.equipment.with_user(self.user_demo).name = "Test equipment rename" - self.assertEqual(self.equipment.name, "Test equipment rename") + self.equipment.with_user(self.user_demo).name = "rename allowed" + self.assertEqual(self.equipment.name, "rename allowed") + + # ------------------------------------------------------------------ + # 2. Full notification lifecycle (happy path + multi-rule + reset + + # idempotency) + # ------------------------------------------------------------------ + + def test_full_notification_lifecycle(self): + """End-to-end flow: progressively crossing reminder thresholds + increments notify_count once per rule, re-running the cron is a + no-op, and pushing the renewal date out resets and re-arms the + cycle.""" + rule_7 = self.env["maintenance.certificate.reminder.rule"].create( + {"name": "7 Days Before", "days_before": 7} + ) + rule_1 = self.env["maintenance.certificate.reminder.rule"].create( + {"name": "1 Day Before", "days_before": 1} + ) + + # 25 days out: only the 30-day rule has triggered. + cert = self._make_certificate(25) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 1) + + # 5 days out: 30-day + 7-day rules now triggered. + self._shift_renewal(cert, 5) + cert.write({"expiration_notify_count": 1}) # reset clears; re-seed + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 2) + + # 1 day out: all three rules triggered. + self._shift_renewal(cert, 1) + cert.write({"expiration_notify_count": 2}) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 3) + + # Idempotency: running the cron again sends nothing more. + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 3) + + # Pushing the renewal date out resets the counter and re-arms + # the 30-day rule on the next cron run. + self._shift_renewal(cert, 20) + self.assertEqual(cert.expiration_notify_count, 0) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 1) + + rule_7.unlink() + rule_1.unlink() + + # ------------------------------------------------------------------ + # 3. Cron guard conditions — every reason the cron should do nothing + # ------------------------------------------------------------------ + + def test_cron_guard_conditions(self): + """The cron must NOT create a notification when: the feature is + disabled, no rules exist, the certificate is already expired, it + is too far in the future, or the equipment has no responsible + user.""" + with self.subTest("feature disabled"): + self.env["ir.config_parameter"].sudo().set_param(_PARAM_ENABLED, "False") + cert = self._make_certificate(10) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 0) + self.env["ir.config_parameter"].sudo().set_param(_PARAM_ENABLED, "True") + cert.unlink() + + with self.subTest("no reminder rules"): + self.rule_30.unlink() + cert = self._make_certificate(10) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 0) + cert.unlink() + self.__class__.rule_30 = self.env[ + "maintenance.certificate.reminder.rule" + ].create({"name": "30 Days Before", "days_before": 30}) + + with self.subTest("certificate already expired"): + cert = self._make_certificate(-5) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 0) + cert.unlink() + + with self.subTest("certificate too far in the future"): + cert = self._make_certificate(60) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 0) + cert.unlink() + + with self.subTest("equipment has no responsible user"): + equipment_no_user = self.env["maintenance.equipment"].create( + {"name": "Unassigned Equipment"} + ) + cert = self._make_certificate(10, equipment_id=equipment_no_user.id) + self._run_cron() + self.assertEqual(cert.expiration_notify_count, 0) diff --git a/maintenance_equipment_certification/views/certificate_reminder_rule_views.xml b/maintenance_equipment_certification/views/certificate_reminder_rule_views.xml new file mode 100644 index 000000000..e7ddfe261 --- /dev/null +++ b/maintenance_equipment_certification/views/certificate_reminder_rule_views.xml @@ -0,0 +1,28 @@ + + + + maintenance.certificate.reminder.rule.list + maintenance.certificate.reminder.rule + + + + + + + + + + Certificate Reminder Rules + maintenance.certificate.reminder.rule + list + + + + diff --git a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml new file mode 100644 index 000000000..da5149f30 --- /dev/null +++ b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml @@ -0,0 +1,86 @@ + + + + maintenance.equipment.certificate.list + maintenance.equipment.certificate + + + + + + + + + + + + + + maintenance.equipment.certificate.form + maintenance.equipment.certificate + +
    + + + + + + + + + + + + + + + + + + +
    +
    +
    + + + maintenance.equipment.certificate.search + maintenance.equipment.certificate + + + + + + + + + + + + + + + Certificates + maintenance.equipment.certificate + list,form + + + +
    diff --git a/maintenance_equipment_certification/views/res_config_settings_views.xml b/maintenance_equipment_certification/views/res_config_settings_views.xml new file mode 100644 index 000000000..7cc7c0652 --- /dev/null +++ b/maintenance_equipment_certification/views/res_config_settings_views.xml @@ -0,0 +1,33 @@ + + + + + res.config.settings.view.form.inherit.maintenance.equipment.certification + + res.config.settings + + + + + + + + + + + + + From f094e834004e189f65fc94528ae79fb600262140 Mon Sep 17 00:00:00 2001 From: JasminSForgeFlow Date: Wed, 1 Apr 2026 09:24:42 +0000 Subject: [PATCH 07/11] [IMP] maintenance_equipment_certification: add active/inactive feature --- .../README.rst | 2 +- .../maintenance_equipment_certification.pot | 156 +++++++++++++++++- .../models/maintenance_equipment.py | 1 + .../maintenance_equipment_certificate.py | 1 + .../static/description/index.html | 2 +- ...aintenance_equipment_certificate_views.xml | 13 ++ .../views/maintenance_equipment_views.xml | 1 + 7 files changed, 169 insertions(+), 7 deletions(-) diff --git a/maintenance_equipment_certification/README.rst b/maintenance_equipment_certification/README.rst index 220562a38..0386d4d21 100644 --- a/maintenance_equipment_certification/README.rst +++ b/maintenance_equipment_certification/README.rst @@ -11,7 +11,7 @@ Maintenance equipment certification !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! source digest: sha256:73d6dedecc9753187ee8d4627069ea90fe0ec5baf550af7b0d0208b7134ce46b + !! source digest: sha256:a2d5ea8992324282ae0b1b3b0ba316bd8fc3f41360adc32515d73ff58cec00b4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! .. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png diff --git a/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot b/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot index 5ef0fbe50..0ace0b3ca 100644 --- a/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot +++ b/maintenance_equipment_certification/i18n/maintenance_equipment_certification.pot @@ -4,7 +4,7 @@ # msgid "" msgstr "" -"Project-Id-Version: Odoo Server 16.0\n" +"Project-Id-Version: Odoo Server 19.0\n" "Report-Msgid-Bugs-To: \n" "Last-Translator: \n" "Language-Team: \n" @@ -13,32 +13,128 @@ msgstr "" "Content-Transfer-Encoding: \n" "Plural-Forms: \n" +#. module: maintenance_equipment_certification +#: model:mail.template,description:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"\n" +" Sent automatically when a certificate is approaching its renewal date.\n" +" " +msgstr "" + +#. module: maintenance_equipment_certification +#: model:mail.template,body_html:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"
    \n" +" \n" +" Dear Team,\n" +"

    \n" +" The following certificate is approaching its expiration date\n" +" and requires your attention:\n" +"

    \n" +" Certificate:\n" +" Certificate name\n" +"
    \n" +" \n" +" Number:\n" +" CERT-001\n" +"
    \n" +"
    \n" +" Equipment:\n" +" Equipment name\n" +"
    \n" +" Renewal Date:\n" +" 2026-12-31\n" +"

    \n" +" Please take the necessary steps to renew this certificate\n" +" before it expires.\n" +"
    \n" +" " +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__active +msgid "Active" +msgstr "" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Archived" +msgstr "" + #. module: maintenance_equipment_certification #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_file msgid "Certificate" msgstr "" +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__cert_expiration_notify_enabled +msgid "Certificate Expiration Alert" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:mail.template,name:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "Certificate Expiration Reminder" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:mail.template,subject:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"Certificate Expiring: {{ object.name }} – {{ object.equipment_id.name }}" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_number +msgid "Certificate Number" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.actions.act_window,name:maintenance_equipment_certification.certificate_reminder_rule_action +#: model:ir.ui.menu,name:maintenance_equipment_certification.menu_certificate_reminder_rule +msgid "Certificate Reminder Rules" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_certificate_reminder_rule +msgid "Certificate expiration reminder rule" +msgstr "" + #. module: maintenance_equipment_certification #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_filename msgid "Certificate file name" msgstr "" #. module: maintenance_equipment_certification +#: model:ir.actions.act_window,name:maintenance_equipment_certification.maintenance_equipment_certificate_action #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__certificate_ids +#: model:ir.ui.menu,name:maintenance_equipment_certification.menu_maintenance_certificate msgid "Certificates" msgstr "" #. module: maintenance_equipment_certification #: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.hr_equipment_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form msgid "Certifications" msgstr "" #. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_res_config_settings +msgid "Config Settings" +msgstr "" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Configure Reminder Rules" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__create_uid #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_uid msgid "Created by" msgstr "" #. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__create_date #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_date msgid "Created on" msgstr "" @@ -49,31 +145,55 @@ msgid "Date" msgstr "" #. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__days_before +msgid "Days Before Expiration" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__display_name #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__display_name msgid "Display Name" msgstr "" #. module: maintenance_equipment_certification #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__equipment_id +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search msgid "Equipment" msgstr "" #. module: maintenance_equipment_certification -#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id -msgid "ID" +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Expiration Alert" +msgstr "" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Expiring" msgstr "" #. module: maintenance_equipment_certification -#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate____last_update -msgid "Last Modified on" +#: model:ir.model.fields,help:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__days_before +msgid "How many days before the renewal date to schedule the reminder." msgstr "" #. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__id +msgid "ID" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__write_uid #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_uid msgid "Last Updated by" msgstr "" #. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__write_date #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_date msgid "Last Updated on" msgstr "" @@ -88,6 +208,11 @@ msgstr "" msgid "Maintenance equipment certificate" msgstr "" +#. module: maintenance_equipment_certification +#: model:ir.actions.server,name:maintenance_equipment_certification.ir_cron_notify_expiring_certificates_ir_actions_server +msgid "Maintenance: Notify Expiring Certificates" +msgstr "" + #. module: maintenance_equipment_certification #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__name msgid "Name" @@ -97,3 +222,24 @@ msgstr "" #: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__notes msgid "Notes" msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__expiration_notify_count +msgid "Notifications Sent" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__renewal_date +msgid "Renewal Date" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__name +msgid "Rule Name" +msgstr "" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,help:maintenance_equipment_certification.field_res_config_settings__cert_expiration_notify_enabled +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Send an email notification when a certificate is about to expire." +msgstr "" diff --git a/maintenance_equipment_certification/models/maintenance_equipment.py b/maintenance_equipment_certification/models/maintenance_equipment.py index 7f5c7ee0b..9efbd5e75 100644 --- a/maintenance_equipment_certification/models/maintenance_equipment.py +++ b/maintenance_equipment_certification/models/maintenance_equipment.py @@ -10,4 +10,5 @@ class MaintenanceEquipment(models.Model): comodel_name="maintenance.equipment.certificate", inverse_name="equipment_id", string="Certificates", + context={"active_test": False}, ) diff --git a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py index cb8d3cc92..e08eab18b 100644 --- a/maintenance_equipment_certification/models/maintenance_equipment_certificate.py +++ b/maintenance_equipment_certification/models/maintenance_equipment_certificate.py @@ -10,6 +10,7 @@ class MaintenanceEquipmentCertificate(models.Model): _name = "maintenance.equipment.certificate" _description = "Maintenance equipment certificate" + active = fields.Boolean(default=True) name = fields.Char() certificate_number = fields.Char() notes = fields.Text() diff --git a/maintenance_equipment_certification/static/description/index.html b/maintenance_equipment_certification/static/description/index.html index c801dc28b..2c94d116f 100644 --- a/maintenance_equipment_certification/static/description/index.html +++ b/maintenance_equipment_certification/static/description/index.html @@ -372,7 +372,7 @@

    Maintenance equipment certification

    !! This file is generated by oca-gen-addon-readme !! !! changes will be overwritten. !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -!! source digest: sha256:73d6dedecc9753187ee8d4627069ea90fe0ec5baf550af7b0d0208b7134ce46b +!! source digest: sha256:a2d5ea8992324282ae0b1b3b0ba316bd8fc3f41360adc32515d73ff58cec00b4 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->

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

    Allows you to store a record of the certifications associated with a diff --git a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml index da5149f30..2b9b49c9d 100644 --- a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml +++ b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml @@ -20,6 +20,13 @@ maintenance.equipment.certificate

    + + @@ -53,6 +60,12 @@ + + + From 88427883ca49324a35abc66249694e2e545c9cac Mon Sep 17 00:00:00 2001 From: Laura V Date: Wed, 8 Jul 2026 14:15:11 +0000 Subject: [PATCH 08/11] Added translation using Weblate (Danish) --- .../i18n/da.po | 282 ++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 maintenance_equipment_certification/i18n/da.po diff --git a/maintenance_equipment_certification/i18n/da.po b/maintenance_equipment_certification/i18n/da.po new file mode 100644 index 000000000..0353c40ae --- /dev/null +++ b/maintenance_equipment_certification/i18n/da.po @@ -0,0 +1,282 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_equipment_certification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-07-08 16:46+0000\n" +"Last-Translator: Laura V \n" +"Language-Team: none\n" +"Language: da\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" +"X-Generator: Weblate 5.15.2\n" + +#. module: maintenance_equipment_certification +#: model:mail.template,description:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"\n" +" Sent automatically when a certificate is approaching its renewal date.\n" +" " +msgstr "" +"\n" +" Sendes automatisk, når et certifikat nærmer sig sin " +"fornyelsesdato.\n" +" " + +#. module: maintenance_equipment_certification +#: model:mail.template,body_html:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"
    \n" +" \n" +" Dear Team,\n" +"

    \n" +" The following certificate is approaching its expiration date\n" +" and requires your attention:\n" +"

    \n" +" Certificate:\n" +" Certificate name\n" +"
    \n" +" \n" +" Number:\n" +" CERT-001\n" +"
    \n" +"
    \n" +" Equipment:\n" +" Equipment name\n" +"
    \n" +" Renewal Date:\n" +" 2026-12-31\n" +"

    \n" +" Please take the necessary steps to renew this certificate\n" +" before it expires.\n" +"
    \n" +" " +msgstr "" +"
    \n" +" \n" +" Kære Team,\n" +"

    \n" +" Følgende certifikat nærmer sig sin udløbsdato\n" +" og kræver din opmærksomhed:\n" +"

    \n" +" Certifikat:\n" +" Certificate name\n" +"
    \n" +" \n" +" Nummer:\n" +" CERT-001\n" +"
    \n" +"
    \n" +" Udstyr:\n" +" Equipment name\n" +"
    \n" +" Fornyelsesdato:\n" +" 2026-12-31" +"\n" +"

    \n" +" Tag venligst de nødvendige skridt til at forny dette " +"certifikat,\n" +" inden det udløber.\n" +"
    \n" +" " + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__active +msgid "Active" +msgstr "Aktiv" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Archived" +msgstr "Arkiveret" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_file +msgid "Certificate" +msgstr "Certifikat" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__cert_expiration_notify_enabled +msgid "Certificate Expiration Alert" +msgstr "Certifikatudløbsadvarsel" + +#. module: maintenance_equipment_certification +#: model:mail.template,name:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "Certificate Expiration Reminder" +msgstr "Påmindelse om certifikatudløb" + +#. module: maintenance_equipment_certification +#: model:mail.template,subject:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"Certificate Expiring: {{ object.name }} – {{ object.equipment_id.name }}" +msgstr "Certifikat udløber: {{ object.name }} – {{ object.equipment_id.name }}" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_number +msgid "Certificate Number" +msgstr "Certifikatnummer" + +#. module: maintenance_equipment_certification +#: model:ir.actions.act_window,name:maintenance_equipment_certification.certificate_reminder_rule_action +#: model:ir.ui.menu,name:maintenance_equipment_certification.menu_certificate_reminder_rule +msgid "Certificate Reminder Rules" +msgstr "Regler for certifikatpåmindelse" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_certificate_reminder_rule +msgid "Certificate expiration reminder rule" +msgstr "Regel for påmindelse om certifikatudløb" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_filename +msgid "Certificate file name" +msgstr "Certifikatets filnavn" + +#. module: maintenance_equipment_certification +#: model:ir.actions.act_window,name:maintenance_equipment_certification.maintenance_equipment_certificate_action +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__certificate_ids +#: model:ir.ui.menu,name:maintenance_equipment_certification.menu_maintenance_certificate +msgid "Certificates" +msgstr "Certifikater" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.hr_equipment_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Certifications" +msgstr "Certificeringer" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_res_config_settings +msgid "Config Settings" +msgstr "Konfigurationsindstillinger" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Configure Reminder Rules" +msgstr "Konfigurér påmindelsesregler" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__create_uid +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_uid +msgid "Created by" +msgstr "Oprettet af" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__create_date +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_date +msgid "Created on" +msgstr "Oprettet den" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__date +msgid "Date" +msgstr "Dato" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__days_before +msgid "Days Before Expiration" +msgstr "Dage før udløb" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__display_name +msgid "Display Name" +msgstr "Vis navn" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__equipment_id +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Equipment" +msgstr "Udstyr" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Expiration Alert" +msgstr "Udløbsadvarsel" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Expiring" +msgstr "Udløber" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,help:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__days_before +msgid "How many days before the renewal date to schedule the reminder." +msgstr "Hvor mange dage før fornyelsesdatoen påmindelsen skal planlægges." + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__id +msgid "ID" +msgstr "ID" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__write_uid +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_uid +msgid "Last Updated by" +msgstr "Sidst opdateret af" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__write_date +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_date +msgid "Last Updated on" +msgstr "Sidst opdateret den" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Vedligeholdelsesudstyr" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment_certificate +msgid "Maintenance equipment certificate" +msgstr "Vedligeholdelsesudstyrscertifikat" + +#. module: maintenance_equipment_certification +#: model:ir.actions.server,name:maintenance_equipment_certification.ir_cron_notify_expiring_certificates_ir_actions_server +msgid "Maintenance: Notify Expiring Certificates" +msgstr "Vedligeholdelse: Underret om udløbende certifikater" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__name +msgid "Name" +msgstr "Navn" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__notes +msgid "Notes" +msgstr "Noter" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__expiration_notify_count +msgid "Notifications Sent" +msgstr "Underretninger sendt" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__renewal_date +msgid "Renewal Date" +msgstr "Fornyelsesdato" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__name +msgid "Rule Name" +msgstr "Regelnavn" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,help:maintenance_equipment_certification.field_res_config_settings__cert_expiration_notify_enabled +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Send an email notification when a certificate is about to expire." +msgstr "Send en e-mail-underretning, når et certifikat er ved at udløbe." From 5d04a7a7ca5595ebbd1de3c4c469258c80bcb2be Mon Sep 17 00:00:00 2001 From: Laura V Date: Wed, 8 Jul 2026 14:15:11 +0000 Subject: [PATCH 09/11] Added translation using Weblate (Swedish) --- .../i18n/sv.po | 281 ++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 maintenance_equipment_certification/i18n/sv.po diff --git a/maintenance_equipment_certification/i18n/sv.po b/maintenance_equipment_certification/i18n/sv.po new file mode 100644 index 000000000..60d12c27d --- /dev/null +++ b/maintenance_equipment_certification/i18n/sv.po @@ -0,0 +1,281 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * maintenance_equipment_certification +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 19.0\n" +"Report-Msgid-Bugs-To: \n" +"PO-Revision-Date: 2026-07-08 16:46+0000\n" +"Last-Translator: Laura V \n" +"Language-Team: none\n" +"Language: sv\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" +"X-Generator: Weblate 5.15.2\n" + +#. module: maintenance_equipment_certification +#: model:mail.template,description:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"\n" +" Sent automatically when a certificate is approaching its renewal date.\n" +" " +msgstr "" +"\n" +" Skickas automatiskt när ett certifikat närmar sig sitt " +"förnyelsedatum.\n" +" " + +#. module: maintenance_equipment_certification +#: model:mail.template,body_html:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"
    \n" +" \n" +" Dear Team,\n" +"

    \n" +" The following certificate is approaching its expiration date\n" +" and requires your attention:\n" +"

    \n" +" Certificate:\n" +" Certificate name\n" +"
    \n" +" \n" +" Number:\n" +" CERT-001\n" +"
    \n" +"
    \n" +" Equipment:\n" +" Equipment name\n" +"
    \n" +" Renewal Date:\n" +" 2026-12-31\n" +"

    \n" +" Please take the necessary steps to renew this certificate\n" +" before it expires.\n" +"
    \n" +" " +msgstr "" +"
    \n" +" \n" +" Hej Team,\n" +"

    \n" +" Följande certifikat närmar sig sitt utgångsdatum\n" +" och kräver din uppmärksamhet:\n" +"

    \n" +" Certifikat:\n" +" Certificate name\n" +"
    \n" +" \n" +" Nummer:\n" +" CERT-001\n" +"
    \n" +"
    \n" +" Utrustning:\n" +" Equipment name\n" +"
    \n" +" Förnyelsedatum:\n" +" 2026-12-31" +"\n" +"

    \n" +" Vidta nödvändiga åtgärder för att förnya detta certifikat\n" +" innan det går ut.\n" +"
    \n" +" " + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__active +msgid "Active" +msgstr "Aktiv" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Archived" +msgstr "Arkiverad" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_file +msgid "Certificate" +msgstr "Certifikat" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__cert_expiration_notify_enabled +msgid "Certificate Expiration Alert" +msgstr "Certifikatutgångsvarning" + +#. module: maintenance_equipment_certification +#: model:mail.template,name:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "Certificate Expiration Reminder" +msgstr "Påminnelse om certifikatutgång" + +#. module: maintenance_equipment_certification +#: model:mail.template,subject:maintenance_equipment_certification.mail_template_certificate_expiration +msgid "" +"Certificate Expiring: {{ object.name }} – {{ object.equipment_id.name }}" +msgstr "Certifikat går ut: {{ object.name }} – {{ object.equipment_id.name }}" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_number +msgid "Certificate Number" +msgstr "Certifikatnummer" + +#. module: maintenance_equipment_certification +#: model:ir.actions.act_window,name:maintenance_equipment_certification.certificate_reminder_rule_action +#: model:ir.ui.menu,name:maintenance_equipment_certification.menu_certificate_reminder_rule +msgid "Certificate Reminder Rules" +msgstr "Regler för certifikatpåminnelse" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_certificate_reminder_rule +msgid "Certificate expiration reminder rule" +msgstr "Regel för påminnelse om certifikatutgång" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__certificate_filename +msgid "Certificate file name" +msgstr "Certifikatets filnamn" + +#. module: maintenance_equipment_certification +#: model:ir.actions.act_window,name:maintenance_equipment_certification.maintenance_equipment_certificate_action +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__certificate_ids +#: model:ir.ui.menu,name:maintenance_equipment_certification.menu_maintenance_certificate +msgid "Certificates" +msgstr "Certifikat" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.hr_equipment_view_form +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Certifications" +msgstr "Certifieringar" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_res_config_settings +msgid "Config Settings" +msgstr "Inställningar" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Configure Reminder Rules" +msgstr "Konfigurera påminnelseregler" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__create_uid +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_uid +msgid "Created by" +msgstr "Skapad av" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__create_date +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__create_date +msgid "Created on" +msgstr "Skapad den" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__date +msgid "Date" +msgstr "Datum" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__days_before +msgid "Days Before Expiration" +msgstr "Dagar före utgång" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__display_name +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__display_name +msgid "Display Name" +msgstr "Visningsnamn" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__equipment_id +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Equipment" +msgstr "Utrustning" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Expiration Alert" +msgstr "Utgångsvarning" + +#. module: maintenance_equipment_certification +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.maintenance_equipment_certificate_view_search +msgid "Expiring" +msgstr "Går ut" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,help:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__days_before +msgid "How many days before the renewal date to schedule the reminder." +msgstr "Hur många dagar före förnyelsedatumet påminnelsen ska schemaläggas." + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__id +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_res_config_settings__id +msgid "ID" +msgstr "ID" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__write_uid +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_uid +msgid "Last Updated by" +msgstr "Senast uppdaterad av" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__write_date +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__write_date +msgid "Last Updated on" +msgstr "Senast uppdaterad den" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment +msgid "Maintenance Equipment" +msgstr "Underhållsutrustning" + +#. module: maintenance_equipment_certification +#: model:ir.model,name:maintenance_equipment_certification.model_maintenance_equipment_certificate +msgid "Maintenance equipment certificate" +msgstr "Underhållsutrustningscertifikat" + +#. module: maintenance_equipment_certification +#: model:ir.actions.server,name:maintenance_equipment_certification.ir_cron_notify_expiring_certificates_ir_actions_server +msgid "Maintenance: Notify Expiring Certificates" +msgstr "Underhåll: Meddela om utgående certifikat" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__name +msgid "Name" +msgstr "Namn" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__notes +msgid "Notes" +msgstr "Anteckningar" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__expiration_notify_count +msgid "Notifications Sent" +msgstr "Meddelanden skickade" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_equipment_certificate__renewal_date +msgid "Renewal Date" +msgstr "Förnyelsedatum" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,field_description:maintenance_equipment_certification.field_maintenance_certificate_reminder_rule__name +msgid "Rule Name" +msgstr "Regelnamn" + +#. module: maintenance_equipment_certification +#: model:ir.model.fields,help:maintenance_equipment_certification.field_res_config_settings__cert_expiration_notify_enabled +#: model_terms:ir.ui.view,arch_db:maintenance_equipment_certification.res_config_settings_view_form +msgid "Send an email notification when a certificate is about to expire." +msgstr "Skicka ett e-postmeddelande när ett certifikat håller på att gå ut." From 729ff987c7ab93521827057f5f1fbecfe07e356b Mon Sep 17 00:00:00 2001 From: Simone Rubino Date: Wed, 9 Sep 2026 11:14:34 +0200 Subject: [PATCH 10/11] [MIG] maintenance_equipment_certification: Migration to 18.0 --- .../README.rst | 27 ++++++------ .../__manifest__.py | 2 +- .../readme/USAGE.md | 8 ++-- .../static/description/index.html | 41 ++++++++----------- ...est_maintenance_equipment_certification.py | 14 ++++--- ...aintenance_equipment_certificate_views.xml | 1 - 6 files changed, 44 insertions(+), 49 deletions(-) diff --git a/maintenance_equipment_certification/README.rst b/maintenance_equipment_certification/README.rst index 0386d4d21..cabc6245b 100644 --- a/maintenance_equipment_certification/README.rst +++ b/maintenance_equipment_certification/README.rst @@ -1,7 +1,3 @@ -.. image:: https://odoo-community.org/readme-banner-image - :target: https://odoo-community.org/get-involved?utm_source=readme - :alt: Odoo Community Association - =================================== Maintenance equipment certification =================================== @@ -17,17 +13,17 @@ Maintenance equipment certification .. |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/license-AGPL--3-blue.png +.. |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%2Fmaintenance-lightgray.png?logo=github - :target: https://github.com/OCA/maintenance/tree/19.0/maintenance_equipment_certification + :target: https://github.com/OCA/maintenance/tree/18.0/maintenance_equipment_certification :alt: OCA/maintenance .. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/maintenance-19-0/maintenance-19-0-maintenance_equipment_certification + :target: https://translation.odoo-community.org/projects/maintenance-18-0/maintenance-18-0-maintenance_equipment_certification :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/maintenance&target_branch=19.0 + :target: https://runboat.odoo-community.org/builds?repo=OCA/maintenance&target_branch=18.0 :alt: Try me on Runboat |badge1| |badge2| |badge3| |badge4| |badge5| @@ -51,14 +47,15 @@ Usage - Got to **Maintenance > Equipment** menu. - Open any equipment. -- You will see a Certification tab. +- You will see a Certifications tab. To configure expiration notifications: -- Go to **Settings > Maintenance** and enable **Certificate Expiration - Alert**. -- Go to **Maintenance > Configuration > Certificate Reminder Rules** to - define how many days before expiration each reminder is sent. +- Go to **Settings > Maintenance > Certification** and enable + **Expiration Alert**: **Configure Reminder Rules** link is shown to + define how many days before expiration each reminder is sent. They are + also accessible in **Maintenance > Configuration > Certificate + Reminder Rules**. - The daily cron job **Maintenance: Notify Expiring Certificates** will send email notifications to the assigned technician or owner. @@ -68,7 +65,7 @@ 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 `_. +`feedback `_. Do not contact contributors directly about support or help with technical issues. @@ -112,6 +109,6 @@ Current `maintainer `__: |maintainer-cubells| -This module is part of the `OCA/maintenance `_ project on GitHub. +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_certification/__manifest__.py b/maintenance_equipment_certification/__manifest__.py index fcfbbbd39..e39c2ba76 100644 --- a/maintenance_equipment_certification/__manifest__.py +++ b/maintenance_equipment_certification/__manifest__.py @@ -4,7 +4,7 @@ "name": "Maintenance equipment certification", "summary": "Add to store certifications associated with a equipment.", "category": "Human Resources", - "version": "19.0.1.0.0", + "version": "18.0.1.0.0", "author": "Trey (www.trey.es), Odoo Community Association (OCA)", "website": "https://github.com/OCA/maintenance", "maintainers": ["cubells"], diff --git a/maintenance_equipment_certification/readme/USAGE.md b/maintenance_equipment_certification/readme/USAGE.md index f4d891b8e..74d90893c 100644 --- a/maintenance_equipment_certification/readme/USAGE.md +++ b/maintenance_equipment_certification/readme/USAGE.md @@ -1,12 +1,12 @@ - Got to **Maintenance \> Equipment** menu. - Open any equipment. -- You will see a Certification tab. +- You will see a Certifications tab. To configure expiration notifications: -- Go to **Settings \> Maintenance** and enable - **Certificate Expiration Alert**. -- Go to **Maintenance \> Configuration \> Certificate Reminder Rules** +- Go to **Settings \> Maintenance \> Certification** and enable + **Expiration Alert**: **Configure Reminder Rules** link is shown to define how many days before expiration each reminder is sent. + They are also accessible in **Maintenance \> Configuration \> Certificate Reminder Rules**. - The daily cron job **Maintenance: Notify Expiring Certificates** will send email notifications to the assigned technician or owner. diff --git a/maintenance_equipment_certification/static/description/index.html b/maintenance_equipment_certification/static/description/index.html index 2c94d116f..309179273 100644 --- a/maintenance_equipment_certification/static/description/index.html +++ b/maintenance_equipment_certification/static/description/index.html @@ -3,7 +3,7 @@ -README.rst +Maintenance equipment certification -
    +
    +

    Maintenance equipment certification

    - - -Odoo Community Association - -
    -

    Maintenance equipment certification

    -

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

    +

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

    Allows you to store a record of the certifications associated with a piece of equipment.

    Additionally, a daily cron job can notify responsible users when @@ -396,40 +391,41 @@

    Maintenance equipment certification

    -

    Usage

    +

    Usage

    • Got to Maintenance > Equipment menu.
    • Open any equipment.
    • -
    • You will see a Certification tab.
    • +
    • You will see a Certifications tab.

    To configure expiration notifications:

      -
    • Go to Settings > Maintenance and enable Certificate Expiration -Alert.
    • -
    • Go to Maintenance > Configuration > Certificate Reminder Rules to -define how many days before expiration each reminder is sent.
    • +
    • Go to Settings > Maintenance > Certification and enable +Expiration Alert: Configure Reminder Rules link is shown to +define how many days before expiration each reminder is sent. They are +also accessible in Maintenance > Configuration > Certificate +Reminder Rules.
    • The daily cron job Maintenance: Notify Expiring Certificates will send email notifications to the assigned technician or owner.
    -

    Bug Tracker

    +

    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.

    +feedback.

    Do not contact contributors directly about support or help with technical issues.

    -

    Credits

    +

    Credits

    -

    Authors

    +

    Authors

    • Trey (www.trey.es)
    -

    Contributors

    +

    Contributors

    -

    Maintainers

    +

    Maintainers

    This module is maintained by the OCA.

    Odoo Community Association @@ -452,11 +448,10 @@

    Maintainers

    promote its widespread use.

    Current maintainer:

    cubells

    -

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

    +

    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_certification/tests/test_maintenance_equipment_certification.py b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py index c2c2814c0..c5a6fb338 100644 --- a/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py +++ b/maintenance_equipment_certification/tests/test_maintenance_equipment_certification.py @@ -19,7 +19,7 @@ def setUpClass(cls): "name": "Demo User", "login": "demo_cert", "email": "demo@user.com", - "group_ids": [(6, 0, [cls.env.ref("base.group_user").id])], + "groups_id": [fields.Command.set(cls.env.ref("base.group_user").ids)], } ) cls.technician = cls.env["res.users"].create( @@ -27,8 +27,10 @@ def setUpClass(cls): "name": "Technician", "login": "tech_cert", "email": "tech@example.com", - "group_ids": [ - (6, 0, [cls.env.ref("maintenance.group_equipment_manager").id]), + "groups_id": [ + fields.Command.set( + cls.env.ref("maintenance.group_equipment_manager").ids + ), ], } ) @@ -81,8 +83,10 @@ def test_access_control(self): self.user_demo.write( { - "group_ids": [ - (6, 0, [self.env.ref("maintenance.group_equipment_manager").id]) + "groups_id": [ + fields.Command.set( + self.env.ref("maintenance.group_equipment_manager").ids + ) ], } ) diff --git a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml index 2b9b49c9d..b65025c57 100644 --- a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml +++ b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml @@ -20,7 +20,6 @@ maintenance.equipment.certificate - Date: Wed, 9 Sep 2026 11:04:25 +0200 Subject: [PATCH 11/11] [FIX] maintenance_equipment_certification: Show ribbon on sheet --- .../maintenance_equipment_certificate_views.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml index b65025c57..44a519b6a 100644 --- a/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml +++ b/maintenance_equipment_certification/views/maintenance_equipment_certificate_views.xml @@ -20,13 +20,13 @@ maintenance.equipment.certificate - +