From 0c9a2e9cd46b16578eb4c93a098ae6d9a664a921 Mon Sep 17 00:00:00 2001 From: Patryk Pyczko Date: Mon, 14 Oct 2024 14:08:49 +0200 Subject: [PATCH] [17.0][ADD] quality_control_oca_timesheet: New module quality_control_oca_timesheet --- quality_control_oca_timesheet/README.rst | 102 ++++++++++++++ quality_control_oca_timesheet/__init__.py | 3 + quality_control_oca_timesheet/__manifest__.py | 16 +++ quality_control_oca_timesheet/i18n/ca.po | 59 +++++++++ quality_control_oca_timesheet/i18n/es.po | 59 +++++++++ .../models/__init__.py | 4 + .../models/hr_timesheet.py | 14 ++ .../models/qc_inspection.py | 28 ++++ quality_control_oca_timesheet/pyproject.toml | 3 + .../readme/CONTRIBUTORS.md | 3 + .../readme/DESCRIPTION.md | 1 + quality_control_oca_timesheet/readme/USAGE.md | 1 + .../static/description/icon.png | Bin 0 -> 9455 bytes .../static/description/icon.svg | 79 +++++++++++ .../static/description/index.html | 124 ++++++++++++++++++ .../tests/__init__.py | 3 + .../test_quality_control_oca_timesheet.py | 75 +++++++++++ .../views/qc_inspection_view.xml | 51 +++++++ 18 files changed, 625 insertions(+) create mode 100644 quality_control_oca_timesheet/README.rst create mode 100644 quality_control_oca_timesheet/__init__.py create mode 100644 quality_control_oca_timesheet/__manifest__.py create mode 100644 quality_control_oca_timesheet/i18n/ca.po create mode 100644 quality_control_oca_timesheet/i18n/es.po create mode 100644 quality_control_oca_timesheet/models/__init__.py create mode 100644 quality_control_oca_timesheet/models/hr_timesheet.py create mode 100644 quality_control_oca_timesheet/models/qc_inspection.py create mode 100644 quality_control_oca_timesheet/pyproject.toml create mode 100644 quality_control_oca_timesheet/readme/CONTRIBUTORS.md create mode 100644 quality_control_oca_timesheet/readme/DESCRIPTION.md create mode 100644 quality_control_oca_timesheet/readme/USAGE.md create mode 100644 quality_control_oca_timesheet/static/description/icon.png create mode 100644 quality_control_oca_timesheet/static/description/icon.svg create mode 100644 quality_control_oca_timesheet/static/description/index.html create mode 100644 quality_control_oca_timesheet/tests/__init__.py create mode 100644 quality_control_oca_timesheet/tests/test_quality_control_oca_timesheet.py create mode 100644 quality_control_oca_timesheet/views/qc_inspection_view.xml diff --git a/quality_control_oca_timesheet/README.rst b/quality_control_oca_timesheet/README.rst new file mode 100644 index 000000000..f6e99fe9d --- /dev/null +++ b/quality_control_oca_timesheet/README.rst @@ -0,0 +1,102 @@ +================================= +Quality Control - Timesheet (OCA) +================================= + +.. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + !! 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%2Fmanufacture-lightgray.png?logo=github + :target: https://github.com/OCA/manufacture/tree/17.0/quality_control_oca_timesheet + :alt: OCA/manufacture +.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png + :target: https://translation.odoo-community.org/projects/manufacture-17-0/manufacture-17-0-quality_control_oca_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/manufacture&target_branch=17.0 + :alt: Try me on Runboat + +|badge1| |badge2| |badge3| |badge4| |badge5| + +This module integrates timesheet tracking with quality control +inspections. It adds a "Timesheets" tab to the quality control +inspection form, allowing users to log and track the time spent on each +inspection through timesheet entries. Users can record detailed +timesheet data, such as the project, task, date, and duration for each +inspection. Additionally, the module automatically calculates the total +hours spent on inspections and displays this information in both the +form view and the list view of quality control inspections. + +**Table of contents** + +.. contents:: + :local: + +Usage +===== + +When creating or editing a quality control inspection, you will find a +new Timesheets tab within the inspection form. In this tab, you can log +and track the time spent on the inspection by adding timesheet entries. +Each entry allows you to specify the project, task, date, and the time +spent on the inspection 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/manufacture `_ project on GitHub. + +You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. diff --git a/quality_control_oca_timesheet/__init__.py b/quality_control_oca_timesheet/__init__.py new file mode 100644 index 000000000..31660d6a9 --- /dev/null +++ b/quality_control_oca_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/quality_control_oca_timesheet/__manifest__.py b/quality_control_oca_timesheet/__manifest__.py new file mode 100644 index 000000000..7043baa2b --- /dev/null +++ b/quality_control_oca_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": "Quality Control - Timesheet (OCA)", + "version": "17.0.1.0.0", + "category": "Quality Control", + "website": "https://github.com/OCA/manufacture", + "author": "APSL-Nagarro, Odoo Community Association (OCA)", + "maintainers": ["ppyczko"], + "license": "AGPL-3", + "application": False, + "installable": True, + "depends": ["quality_control_oca", "hr_timesheet"], + "data": ["views/qc_inspection_view.xml"], +} diff --git a/quality_control_oca_timesheet/i18n/ca.po b/quality_control_oca_timesheet/i18n/ca.po new file mode 100644 index 000000000..ce977e2c0 --- /dev/null +++ b/quality_control_oca_timesheet/i18n/ca.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_oca_timesheet +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-15 11:09+0000\n" +"PO-Revision-Date: 2024-10-15 11:09+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: quality_control_oca_timesheet +#: model:ir.model,name:quality_control_oca_timesheet.model_account_analytic_line +msgid "Analytic Line" +msgstr "Línia analítica" + +#. module: quality_control_oca_timesheet +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_form_view_timesheet_inherit +msgid "Duration (Hour(s))" +msgstr "Durada (Hora/es)" + +#. module: quality_control_oca_timesheet +#: model:ir.model,name:quality_control_oca_timesheet.model_qc_inspection +msgid "Quality control inspection" +msgstr "Inspecció de control de qualitat" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,field_description:quality_control_oca_timesheet.field_account_analytic_line__qc_inspection_id +msgid "Related QC Inspection" +msgstr "Inspecció de QC relacionada" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,help:quality_control_oca_timesheet.field_account_analytic_line__qc_inspection_id +msgid "The quality control inspection related to this timesheet entry." +msgstr "La inspecció de control de qualitat relacionada amb aquesta entrada de full d'hores." + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,field_description:quality_control_oca_timesheet.field_qc_inspection__timesheet_ids +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_form_view_timesheet_inherit +msgid "Timesheets" +msgstr "Fulls d'hores" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,field_description:quality_control_oca_timesheet.field_qc_inspection__timesheet_total_hours +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_form_view_timesheet_inherit +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_tree_view_timesheet_inherit +msgid "Total Hours" +msgstr "Hores totals" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,help:quality_control_oca_timesheet.field_qc_inspection__timesheet_total_hours +msgid "Total hours spent on this quality control inspection." +msgstr "Hores totals dedicades a aquesta inspecció de control de qualitat." diff --git a/quality_control_oca_timesheet/i18n/es.po b/quality_control_oca_timesheet/i18n/es.po new file mode 100644 index 000000000..5490e6e9b --- /dev/null +++ b/quality_control_oca_timesheet/i18n/es.po @@ -0,0 +1,59 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * quality_control_oca_timesheet +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 17.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2024-10-15 11:10+0000\n" +"PO-Revision-Date: 2024-10-15 11:10+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: quality_control_oca_timesheet +#: model:ir.model,name:quality_control_oca_timesheet.model_account_analytic_line +msgid "Analytic Line" +msgstr "Línea analítica" + +#. module: quality_control_oca_timesheet +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_form_view_timesheet_inherit +msgid "Duration (Hour(s))" +msgstr "Duración (Hora/s)" + +#. module: quality_control_oca_timesheet +#: model:ir.model,name:quality_control_oca_timesheet.model_qc_inspection +msgid "Quality control inspection" +msgstr "Inspección del control de calidad" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,field_description:quality_control_oca_timesheet.field_account_analytic_line__qc_inspection_id +msgid "Related QC Inspection" +msgstr "Inspección de QC relacionada" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,help:quality_control_oca_timesheet.field_account_analytic_line__qc_inspection_id +msgid "The quality control inspection related to this timesheet entry." +msgstr "La inspección de control de calidad relacionada con esta entrada de parte de horas." + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,field_description:quality_control_oca_timesheet.field_qc_inspection__timesheet_ids +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_form_view_timesheet_inherit +msgid "Timesheets" +msgstr "Partes de horas" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,field_description:quality_control_oca_timesheet.field_qc_inspection__timesheet_total_hours +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_form_view_timesheet_inherit +#: model_terms:ir.ui.view,arch_db:quality_control_oca_timesheet.qc_inspection_tree_view_timesheet_inherit +msgid "Total Hours" +msgstr "Horas totales" + +#. module: quality_control_oca_timesheet +#: model:ir.model.fields,help:quality_control_oca_timesheet.field_qc_inspection__timesheet_total_hours +msgid "Total hours spent on this quality control inspection." +msgstr "Horas totales dedicadas a esta inspección de control de calidad." diff --git a/quality_control_oca_timesheet/models/__init__.py b/quality_control_oca_timesheet/models/__init__.py new file mode 100644 index 000000000..cd0cc7efa --- /dev/null +++ b/quality_control_oca_timesheet/models/__init__.py @@ -0,0 +1,4 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import qc_inspection +from . import hr_timesheet diff --git a/quality_control_oca_timesheet/models/hr_timesheet.py b/quality_control_oca_timesheet/models/hr_timesheet.py new file mode 100644 index 000000000..a1211ee25 --- /dev/null +++ b/quality_control_oca_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" + + qc_inspection_id = fields.Many2one( + "qc.inspection", + string="Related QC Inspection", + help="The quality control inspection related to this timesheet entry.", + ) diff --git a/quality_control_oca_timesheet/models/qc_inspection.py b/quality_control_oca_timesheet/models/qc_inspection.py new file mode 100644 index 000000000..c438226b3 --- /dev/null +++ b/quality_control_oca_timesheet/models/qc_inspection.py @@ -0,0 +1,28 @@ +# 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 QcInspection(models.Model): + _inherit = "qc.inspection" + + timesheet_ids = fields.One2many( + "account.analytic.line", + "qc_inspection_id", + string="Timesheets", + ) + + timesheet_total_hours = fields.Float( + string="Total Hours", + compute="_compute_timesheet_total_hours", + store=True, + help="Total hours spent on this quality control inspection.", + ) + + @api.depends("timesheet_ids.unit_amount") + def _compute_timesheet_total_hours(self): + for inspection in self: + inspection.timesheet_total_hours = sum( + inspection.timesheet_ids.mapped("unit_amount") + ) diff --git a/quality_control_oca_timesheet/pyproject.toml b/quality_control_oca_timesheet/pyproject.toml new file mode 100644 index 000000000..4231d0ccc --- /dev/null +++ b/quality_control_oca_timesheet/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ["whool"] +build-backend = "whool.buildapi" diff --git a/quality_control_oca_timesheet/readme/CONTRIBUTORS.md b/quality_control_oca_timesheet/readme/CONTRIBUTORS.md new file mode 100644 index 000000000..f413e1013 --- /dev/null +++ b/quality_control_oca_timesheet/readme/CONTRIBUTORS.md @@ -0,0 +1,3 @@ +- [APSL-Nagarro](https://apsl.tech): + + > - Patryk Pyczko \<\> diff --git a/quality_control_oca_timesheet/readme/DESCRIPTION.md b/quality_control_oca_timesheet/readme/DESCRIPTION.md new file mode 100644 index 000000000..5a2ef80d3 --- /dev/null +++ b/quality_control_oca_timesheet/readme/DESCRIPTION.md @@ -0,0 +1 @@ +This module integrates timesheet tracking with quality control inspections. It adds a "Timesheets" tab to the quality control inspection form, allowing users to log and track the time spent on each inspection through timesheet entries. Users can record detailed timesheet data, such as the project, task, date, and duration for each inspection. Additionally, the module automatically calculates the total hours spent on inspections and displays this information in both the form view and the list view of quality control inspections. \ No newline at end of file diff --git a/quality_control_oca_timesheet/readme/USAGE.md b/quality_control_oca_timesheet/readme/USAGE.md new file mode 100644 index 000000000..c42f2929f --- /dev/null +++ b/quality_control_oca_timesheet/readme/USAGE.md @@ -0,0 +1 @@ +When creating or editing a quality control inspection, you will find a new Timesheets tab within the inspection form. In this tab, you can log and track the time spent on the inspection by adding timesheet entries. Each entry allows you to specify the project, task, date, and the time spent on the inspection in hours and minutes. \ No newline at end of file diff --git a/quality_control_oca_timesheet/static/description/icon.png b/quality_control_oca_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/quality_control_oca_timesheet/static/description/icon.svg b/quality_control_oca_timesheet/static/description/icon.svg new file mode 100644 index 000000000..a7a26d093 --- /dev/null +++ b/quality_control_oca_timesheet/static/description/icon.svg @@ -0,0 +1,79 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/quality_control_oca_timesheet/static/description/index.html b/quality_control_oca_timesheet/static/description/index.html new file mode 100644 index 000000000..f92d18ab8 --- /dev/null +++ b/quality_control_oca_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/quality_control_oca_timesheet/tests/__init__.py b/quality_control_oca_timesheet/tests/__init__.py new file mode 100644 index 000000000..8ccb23e25 --- /dev/null +++ b/quality_control_oca_timesheet/tests/__init__.py @@ -0,0 +1,3 @@ +# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). + +from . import test_quality_control_oca_timesheet diff --git a/quality_control_oca_timesheet/tests/test_quality_control_oca_timesheet.py b/quality_control_oca_timesheet/tests/test_quality_control_oca_timesheet.py new file mode 100644 index 000000000..2edbb83d1 --- /dev/null +++ b/quality_control_oca_timesheet/tests/test_quality_control_oca_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 TestQcInspectionTimesheetTotalHours(TransactionCase): + @classmethod + def setUpClass(cls): + super().setUpClass() + + cls.qc_inspection = cls.env["qc.inspection"].create( + { + "name": "Test Inspection", + } + ) + + def test_no_timesheets(self): + """Test total hours when no timesheets are associated""" + self.assertEqual( + self.qc_inspection.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( + { + "qc_inspection_id": self.qc_inspection.id, + "unit_amount": 5.0, + "name": "Timesheet 1", + } + ) + + self.qc_inspection._compute_timesheet_total_hours() + + self.assertEqual( + self.qc_inspection.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( + { + "qc_inspection_id": self.qc_inspection.id, + "unit_amount": 3.0, + "name": "Timesheet 1", + } + ) + self.env["account.analytic.line"].create( + { + "qc_inspection_id": self.qc_inspection.id, + "unit_amount": 2.5, + "name": "Timesheet 2", + } + ) + self.env["account.analytic.line"].create( + { + "qc_inspection_id": self.qc_inspection.id, + "unit_amount": 1.5, + "name": "Timesheet 3", + } + ) + + self.qc_inspection._compute_timesheet_total_hours() + + self.assertEqual( + self.qc_inspection.timesheet_total_hours, + 7.0, + "Total hours should be 7 (3 + 2.5 + 1.5) with multiple timesheets.", + ) diff --git a/quality_control_oca_timesheet/views/qc_inspection_view.xml b/quality_control_oca_timesheet/views/qc_inspection_view.xml new file mode 100644 index 000000000..ac382ac3f --- /dev/null +++ b/quality_control_oca_timesheet/views/qc_inspection_view.xml @@ -0,0 +1,51 @@ + + + qc.inspection.form.view.timesheet + qc.inspection + + + + + + + + + + + + + + + + + + + + + + + + + qc.inspection.tree.view.timesheet.inherit + qc.inspection + + + + + + + + +