From ca808c0c134573ae4760c627d08517a892fd3318 Mon Sep 17 00:00:00 2001 From: Patryk Pyczko Date: Wed, 16 Oct 2024 11:11:12 +0200 Subject: [PATCH] [17.0][ADD] repair_timesheet: New module repair_timesheet --- repair_timesheet/README.rst | 101 ++++++++++++++ repair_timesheet/__init__.py | 3 + repair_timesheet/__manifest__.py | 16 +++ repair_timesheet/i18n/ca.po | 57 ++++++++ repair_timesheet/i18n/es.po | 57 ++++++++ repair_timesheet/models/__init__.py | 4 + repair_timesheet/models/hr_timesheet.py | 14 ++ repair_timesheet/models/repair.py | 23 ++++ repair_timesheet/pyproject.toml | 3 + repair_timesheet/readme/CONTRIBUTORS.md | 3 + repair_timesheet/readme/DESCRIPTION.md | 1 + repair_timesheet/readme/USAGE.md | 1 + repair_timesheet/static/description/icon.png | Bin 0 -> 9455 bytes repair_timesheet/static/description/icon.svg | 79 +++++++++++ .../static/description/index.html | 124 ++++++++++++++++++ repair_timesheet/tests/__init__.py | 3 + .../tests/test_repair_timesheet.py | 75 +++++++++++ repair_timesheet/views/repair_views.xml | 44 +++++++ 18 files changed, 608 insertions(+) create mode 100644 repair_timesheet/README.rst create mode 100644 repair_timesheet/__init__.py create mode 100644 repair_timesheet/__manifest__.py create mode 100644 repair_timesheet/i18n/ca.po create mode 100644 repair_timesheet/i18n/es.po create mode 100644 repair_timesheet/models/__init__.py create mode 100644 repair_timesheet/models/hr_timesheet.py create mode 100644 repair_timesheet/models/repair.py create mode 100644 repair_timesheet/pyproject.toml create mode 100644 repair_timesheet/readme/CONTRIBUTORS.md create mode 100644 repair_timesheet/readme/DESCRIPTION.md create mode 100644 repair_timesheet/readme/USAGE.md create mode 100644 repair_timesheet/static/description/icon.png create mode 100644 repair_timesheet/static/description/icon.svg create mode 100644 repair_timesheet/static/description/index.html create mode 100644 repair_timesheet/tests/__init__.py create mode 100644 repair_timesheet/tests/test_repair_timesheet.py create mode 100644 repair_timesheet/views/repair_views.xml diff --git a/repair_timesheet/README.rst b/repair_timesheet/README.rst new file mode 100644 index 00000000..ce4b1d74 --- /dev/null +++ b/repair_timesheet/README.rst @@ -0,0 +1,101 @@ +================ +Repair Timesheet +================ + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! This file is generated by oca-gen-addon-readme !! + !! changes will be overwritten. !! + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! source digest: sha256:c2e64dc6606c845bb75e06ed854b15fc84a222c2d97408272e22e530092f5b86 + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +.. |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%2Frepair-lightgray.png?logo=github + :target: https://github.com/OCA/repair/tree/17.0/repair_timesheet + :alt: OCA/repair +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/repair-17-0/repair-17-0-repair_timesheet + :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/repair&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module integrates timesheet tracking with repair orders. It adds a +"Timesheets" tab to the repair order form, allowing users to log and +track the time spent on each repair through timesheet entries. Users can +record detailed timesheet data, such as the project, task, date, and +duration for each repair. Additionally, the module automatically +calculates the total hours spent on repairs and displays this +information in both the form view and the list view of repair orders. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +When creating or editing a repair order, you will find a new Timesheets +tab within the repair order form. In this tab, you can log and track the +time spent on the repair by adding timesheet entries. Each entry allows +you to specify the project, task, date, and the time spent on the repair +in hours and minutes. + +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 +------- + +* APSL-Nagarro + +Contributors +------------ + +- `APSL-Nagarro `__: + + - Patryk Pyczko + +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-ppyczko| image:: https://github.com/ppyczko.png?size=40px + :target: https://github.com/ppyczko + :alt: ppyczko + +Current `maintainer `__: + +|maintainer-ppyczko| + +This module is part of the `OCA/repair `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/repair_timesheet/__init__.py b/repair_timesheet/__init__.py new file mode 100644 index 00000000..31660d6a --- /dev/null +++ b/repair_timesheet/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import models diff --git a/repair_timesheet/__manifest__.py b/repair_timesheet/__manifest__.py new file mode 100644 index 00000000..8ba826be --- /dev/null +++ b/repair_timesheet/__manifest__.py @@ -0,0 +1,16 @@ +# Copyright 2024 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +{ + "name": "Repair Timesheet", + "version": "17.0.1.0.0", + "category": "Repair", + "website": "https://github.com/OCA/repair", + "author": "APSL-Nagarro, Odoo Community Association (OCA)", + "maintainers": ["ppyczko"], + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["repair", "hr_timesheet"], + "data": ["views/repair_views.xml"], +} diff --git a/repair_timesheet/i18n/ca.po b/repair_timesheet/i18n/ca.po new file mode 100644 index 00000000..c9698c7b --- /dev/null +++ b/repair_timesheet/i18n/ca.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * repair_timesheet +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-16 08:59+0000\n" +"PO-Revision-Date: 2024-10-16 08:59+0000\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: repair_timesheet +#: model:ir.model,name:repair_timesheet.model_account_analytic_line +msgid "Analytic Line" +msgstr "Línia analítica" + +#. module: repair_timesheet +#: model_terms:ir.ui.view,arch_db:repair_timesheet.repair_order_form_view_timesheet_inherit +msgid "Duration (Hour(s))" +msgstr "Durada (Hora/es)" + +#. module: repair_timesheet +#: model:ir.model.fields,field_description:repair_timesheet.field_account_analytic_line__repair_order_id +msgid "Related Repair Order" +msgstr "Ordre de reparació relacionada" + +#. module: repair_timesheet +#: model:ir.model,name:repair_timesheet.model_repair_order +msgid "Repair Order" +msgstr "Ordre de reparació" + +#. module: repair_timesheet +#: model:ir.model.fields,help:repair_timesheet.field_account_analytic_line__repair_order_id +msgid "The repair order related to this timesheet entry." +msgstr "L'ordre de reparació relacionada amb aquesta entrada de full d'hores." + +#. module: repair_timesheet +#: model:ir.model.fields,field_description:repair_timesheet.field_repair_order__timesheet_ids +#: model_terms:ir.ui.view,arch_db:repair_timesheet.repair_order_form_view_timesheet_inherit +msgid "Timesheets" +msgstr "Fulls d'hores" + +#. module: repair_timesheet +#: model:ir.model.fields,field_description:repair_timesheet.field_repair_order__timesheet_total_hours +msgid "Total Hours" +msgstr "Hores totals" + +#. module: repair_timesheet +#: model:ir.model.fields,help:repair_timesheet.field_repair_order__timesheet_total_hours +msgid "Total hours spent on this repair order." +msgstr "Hores totals dedicades a aquesta ordre de reparació." diff --git a/repair_timesheet/i18n/es.po b/repair_timesheet/i18n/es.po new file mode 100644 index 00000000..fa73a074 --- /dev/null +++ b/repair_timesheet/i18n/es.po @@ -0,0 +1,57 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * repair_timesheet +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-16 09:00+0000\n" +"PO-Revision-Date: 2024-10-16 09:00+0000\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: repair_timesheet +#: model:ir.model,name:repair_timesheet.model_account_analytic_line +msgid "Analytic Line" +msgstr "Línea analítica" + +#. module: repair_timesheet +#: model_terms:ir.ui.view,arch_db:repair_timesheet.repair_order_form_view_timesheet_inherit +msgid "Duration (Hour(s))" +msgstr "Duración (Hora/s)" + +#. module: repair_timesheet +#: model:ir.model.fields,field_description:repair_timesheet.field_account_analytic_line__repair_order_id +msgid "Related Repair Order" +msgstr "Orden de reparación relacionada" + +#. module: repair_timesheet +#: model:ir.model,name:repair_timesheet.model_repair_order +msgid "Repair Order" +msgstr "Orden de reparación" + +#. module: repair_timesheet +#: model:ir.model.fields,help:repair_timesheet.field_account_analytic_line__repair_order_id +msgid "The repair order related to this timesheet entry." +msgstr "La orden de reparación relacionada con esta entrada de parte de horas." + +#. module: repair_timesheet +#: model:ir.model.fields,field_description:repair_timesheet.field_repair_order__timesheet_ids +#: model_terms:ir.ui.view,arch_db:repair_timesheet.repair_order_form_view_timesheet_inherit +msgid "Timesheets" +msgstr "Partes de horas" + +#. module: repair_timesheet +#: model:ir.model.fields,field_description:repair_timesheet.field_repair_order__timesheet_total_hours +msgid "Total Hours" +msgstr "Horas totales" + +#. module: repair_timesheet +#: model:ir.model.fields,help:repair_timesheet.field_repair_order__timesheet_total_hours +msgid "Total hours spent on this repair order." +msgstr "Horas totales dedicadas a esta orden de reparación." diff --git a/repair_timesheet/models/__init__.py b/repair_timesheet/models/__init__.py new file mode 100644 index 00000000..611c2acd --- /dev/null +++ b/repair_timesheet/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import repair +from . import hr_timesheet diff --git a/repair_timesheet/models/hr_timesheet.py b/repair_timesheet/models/hr_timesheet.py new file mode 100644 index 00000000..e3fe8770 --- /dev/null +++ b/repair_timesheet/models/hr_timesheet.py @@ -0,0 +1,14 @@ +# Copyright 2024 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import fields, models + + +class AccountAnalyticLine(models.Model): + _inherit = "account.analytic.line" + + repair_order_id = fields.Many2one( + "repair.order", + string="Related Repair Order", + help="The repair order related to this timesheet entry.", + ) diff --git a/repair_timesheet/models/repair.py b/repair_timesheet/models/repair.py new file mode 100644 index 00000000..bcd6d482 --- /dev/null +++ b/repair_timesheet/models/repair.py @@ -0,0 +1,23 @@ +# Copyright 2024 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from odoo import api, fields, models + + +class RepairOrder(models.Model): + _inherit = "repair.order" + + timesheet_ids = fields.One2many( + "account.analytic.line", "repair_order_id", string="Timesheets" + ) + timesheet_total_hours = fields.Float( + string="Total Hours", + compute="_compute_timesheet_total_hours", + store=True, + help="Total hours spent on this repair order.", + ) + + @api.depends("timesheet_ids.unit_amount") + def _compute_timesheet_total_hours(self): + for order in self: + order.timesheet_total_hours = sum(order.timesheet_ids.mapped("unit_amount")) diff --git a/repair_timesheet/pyproject.toml b/repair_timesheet/pyproject.toml new file mode 100644 index 00000000..4231d0cc --- /dev/null +++ b/repair_timesheet/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/repair_timesheet/readme/CONTRIBUTORS.md b/repair_timesheet/readme/CONTRIBUTORS.md new file mode 100644 index 00000000..f413e101 --- /dev/null +++ b/repair_timesheet/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [APSL-Nagarro](https://apsl.tech): + + > - Patryk Pyczko \<\> diff --git a/repair_timesheet/readme/DESCRIPTION.md b/repair_timesheet/readme/DESCRIPTION.md new file mode 100644 index 00000000..2ae63756 --- /dev/null +++ b/repair_timesheet/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module integrates timesheet tracking with repair orders. It adds a "Timesheets" tab to the repair order form, allowing users to log and track the time spent on each repair through timesheet entries. Users can record detailed timesheet data, such as the project, task, date, and duration for each repair. Additionally, the module automatically calculates the total hours spent on repairs and displays this information in both the form view and the list view of repair orders. \ No newline at end of file diff --git a/repair_timesheet/readme/USAGE.md b/repair_timesheet/readme/USAGE.md new file mode 100644 index 00000000..0d095e40 --- /dev/null +++ b/repair_timesheet/readme/USAGE.md @@ -0,0 +1 @@ +When creating or editing a repair order, you will find a new Timesheets tab within the repair order form. In this tab, you can log and track the time spent on the repair by adding timesheet entries. Each entry allows you to specify the project, task, date, and the time spent on the repair in hours and minutes. \ No newline at end of file diff --git a/repair_timesheet/static/description/icon.png b/repair_timesheet/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/repair_timesheet/static/description/icon.svg b/repair_timesheet/static/description/icon.svg new file mode 100644 index 00000000..a7a26d09 --- /dev/null +++ b/repair_timesheet/static/description/icon.svg @@ -0,0 +1,79 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/repair_timesheet/static/description/index.html b/repair_timesheet/static/description/index.html new file mode 100644 index 00000000..f92d18ab --- /dev/null +++ b/repair_timesheet/static/description/index.html @@ -0,0 +1,124 @@ +
+
+
+

Module name

+

This module was written to extend the functionality of ... to support ... and allow you to ...

+
+
+
+ +
+
+
+

Installation

+
+
+

To install this module, you need to: +

    +
  • ...
  • +
+

+
+
+
+ + + +
+
+
+
+ +
+
+
+

Configuration

+
+
+

To configure this module, you need to: +

    +
  • ...
  • +
+

+
+
+
+ + + +
+
+
+
+ +
+
+
+

Usage

+
+
+

To use this module, you need to: +

    +
  • ...
  • +
+

+

For further information, please visit: +

+

+
+
+
+ + + +
+
+
+
+ +
+
+
+

Known issues / Roadmap

+
+
+

+

    +
  • ...
  • +
+

+
+
+
+ + + +
+
+
+
+ +
+
+
+

Credits

+
+
+

Contributors

+ +
+
+

Maintainer

+

+ This module is maintained by the OCA.
+ OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.
+ To contribute to this module, please visit http://odoo-community.org.
+ +

+
+
+
diff --git a/repair_timesheet/tests/__init__.py b/repair_timesheet/tests/__init__.py new file mode 100644 index 00000000..05dc4eeb --- /dev/null +++ b/repair_timesheet/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_repair_timesheet diff --git a/repair_timesheet/tests/test_repair_timesheet.py b/repair_timesheet/tests/test_repair_timesheet.py new file mode 100644 index 00000000..cee22404 --- /dev/null +++ b/repair_timesheet/tests/test_repair_timesheet.py @@ -0,0 +1,75 @@ +# Copyright 2024 Patryk Pyczko (APSL-Nagarro) +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + + +from odoo.tests.common import TransactionCase + + +class TestRepairOrderTimesheetTotalHours(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.repair_order = cls.env["repair.order"].create( + { + "name": "Test Repair Order", + } + ) + + def test_no_timesheets(self): + """Test total hours when no timesheets are associated""" + self.assertEqual( + self.repair_order.timesheet_total_hours, + 0, + "Total hours should be 0 when there are no timesheets.", + ) + + def test_one_timesheet(self): + """Test total hours with one timesheet""" + self.env["account.analytic.line"].create( + { + "repair_order_id": self.repair_order.id, + "unit_amount": 5.0, + "name": "Timesheet 1", + } + ) + + self.repair_order._compute_timesheet_total_hours() + + self.assertEqual( + self.repair_order.timesheet_total_hours, + 5.0, + "Total hours should be 5 with one timesheet entry.", + ) + + def test_multiple_timesheets(self): + """Test total hours with multiple timesheets""" + self.env["account.analytic.line"].create( + { + "repair_order_id": self.repair_order.id, + "unit_amount": 3.0, + "name": "Timesheet 1", + } + ) + self.env["account.analytic.line"].create( + { + "repair_order_id": self.repair_order.id, + "unit_amount": 2.5, + "name": "Timesheet 2", + } + ) + self.env["account.analytic.line"].create( + { + "repair_order_id": self.repair_order.id, + "unit_amount": 1.5, + "name": "Timesheet 3", + } + ) + + self.repair_order._compute_timesheet_total_hours() + + self.assertEqual( + self.repair_order.timesheet_total_hours, + 7.0, + "Total hours should be 7 (3 + 2.5 + 1.5) with multiple timesheets.", + ) diff --git a/repair_timesheet/views/repair_views.xml b/repair_timesheet/views/repair_views.xml new file mode 100644 index 00000000..cb52d781 --- /dev/null +++ b/repair_timesheet/views/repair_views.xml @@ -0,0 +1,44 @@ + + + + repair.order.form.view.timesheet + repair.order + + + + + + + + + + + + + + + + + + + + + + + + + + repair.order.tree.view.timesheet + repair.order + + + + + + + +