From ebe8418f26cc5cc631ef8b32d97ce3158ceb3b6b Mon Sep 17 00:00:00 2001 From: Thibault Libioulle Date: Wed, 14 Apr 2021 11:18:47 +0200 Subject: [PATCH] [IMP] hr_timesheet: extend project update description This commit adds content in the default project update description. The informations added are related to the timesheeted time on project or project tasks. PR : #68899 task-2393768 --- addons/hr_timesheet/__manifest__.py | 1 + .../hr_timesheet/data/hr_timesheet_demo.xml | 18 +++++ addons/hr_timesheet/models/__init__.py | 1 + addons/hr_timesheet/models/project.py | 4 ++ addons/hr_timesheet/models/project_update.py | 72 +++++++++++++++++++ addons/hr_timesheet/models/res_company.py | 6 ++ .../views/project_update_templates.xml | 35 +++++++++ 7 files changed, 137 insertions(+) create mode 100644 addons/hr_timesheet/models/project_update.py create mode 100644 addons/hr_timesheet/views/project_update_templates.xml diff --git a/addons/hr_timesheet/__manifest__.py b/addons/hr_timesheet/__manifest__.py index c78d2fb2194..80b82ee6e29 100644 --- a/addons/hr_timesheet/__manifest__.py +++ b/addons/hr_timesheet/__manifest__.py @@ -29,6 +29,7 @@ up a management by affair. 'views/res_config_settings_views.xml', 'views/project_views.xml', 'views/project_portal_templates.xml', + 'views/project_update_templates.xml', 'views/hr_timesheet_portal_templates.xml', 'report/hr_timesheet_report_view.xml', 'report/report_timesheet_templates.xml', diff --git a/addons/hr_timesheet/data/hr_timesheet_demo.xml b/addons/hr_timesheet/data/hr_timesheet_demo.xml index 38d737381e6..d49ebb81ae8 100644 --- a/addons/hr_timesheet/data/hr_timesheet_demo.xml +++ b/addons/hr_timesheet/data/hr_timesheet_demo.xml @@ -3671,4 +3671,22 @@ -90.0 + + + + + + + Weekly review + + + on_hold + + + Weekly review + + + off_track + + diff --git a/addons/hr_timesheet/models/__init__.py b/addons/hr_timesheet/models/__init__.py index ee021539a0f..969632575ce 100644 --- a/addons/hr_timesheet/models/__init__.py +++ b/addons/hr_timesheet/models/__init__.py @@ -7,4 +7,5 @@ from . import ir_http from . import res_company from . import res_config_settings from . import project +from . import project_update from . import uom diff --git a/addons/hr_timesheet/models/project.py b/addons/hr_timesheet/models/project.py index 10839b11080..5b894822fc1 100644 --- a/addons/hr_timesheet/models/project.py +++ b/addons/hr_timesheet/models/project.py @@ -98,6 +98,10 @@ class Project(models.Model): warning_msg, self.env.ref('hr_timesheet.timesheet_action_project').id, _('See timesheet entries'), {'active_ids': projects_with_timesheets.ids}) + def _convert_project_uom_to_timesheet_encode_uom(self, time): + uom_from = self.company_id.project_time_mode_id + uom_to = self.env.company.timesheet_encode_uom_id + return round(uom_from._compute_quantity(time, uom_to, raise_if_failure=False), 2) class Task(models.Model): _name = "project.task" diff --git a/addons/hr_timesheet/models/project_update.py b/addons/hr_timesheet/models/project_update.py new file mode 100644 index 00000000000..797556e1807 --- /dev/null +++ b/addons/hr_timesheet/models/project_update.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from collections import defaultdict + +from odoo import api, fields, models +from odoo.tools.misc import formatLang + +class ProjectUpdate(models.Model): + _inherit = 'project.update' + + @api.model + def _get_template_values(self, project): + return { + **super(ProjectUpdate, self)._get_template_values(project), + 'people': self._get_people_values(project), + } + + @api.model + def _get_people_values(self, project): + return { + 'uom': self.env.company._timesheet_uom_text(), + 'is_uom_hour': self.env.company._is_timesheet_hour_uom(), + 'activities': self._get_activities(project) + } + + @api.model + def _get_activities(self, project): + if not self.user_has_groups('hr_timesheet.group_hr_timesheet_user'): + return [] + today = fields.Datetime.today() + query = """ + SELECT timesheet.employee_id as employee_id, + gs as period, + sum(timesheet.unit_amount) as unit_amount, + employee.name as name + FROM project_project p + INNER JOIN account_analytic_line timesheet + ON timesheet.project_id = p.id + INNER JOIN hr_employee employee + ON timesheet.employee_id = employee.id + CROSS JOIN generate_series( + %(today)s::date - '180 days'::interval, + %(today)s::date, + '30 days'::interval + ) gs + WHERE p.id = %(project_id)s + AND gs >= timesheet.date + AND gs - '30 days'::interval < timesheet.date + GROUP BY timesheet.employee_id, + gs, employee.name + ORDER BY gs DESC, employee.name ASC + """ + self.env.cr.execute(query, {'project_id': project.id, 'today': today}) + results = self.env.cr.dictfetchall() + activities = defaultdict(lambda: { + 'unit_amount': 0, + 'worked': False, + }) + digits = not self.env.company._is_timesheet_hour_uom() and 2 or 0 + for result in results: + if result['period'] == today: + activities[result['employee_id']] = { + 'name': result['name'], + 'unit_amount': formatLang(self.env, project._convert_project_uom_to_timesheet_encode_uom(result['unit_amount']), digits=digits), + 'worked': True, + 'new': True, + } + else: + name = activities[result['employee_id']].get('name', result['name']) + activities[result['employee_id']].update(name=name, new=False) + return list(activities.values()) diff --git a/addons/hr_timesheet/models/res_company.py b/addons/hr_timesheet/models/res_company.py index f22d7f9d60f..3d09c0d1459 100644 --- a/addons/hr_timesheet/models/res_company.py +++ b/addons/hr_timesheet/models/res_company.py @@ -63,3 +63,9 @@ class ResCompany(models.Model): }] project_ids = self.env['project.project'].create(results) return project_ids + + def _is_timesheet_hour_uom(self): + return self.timesheet_encode_uom_id and self.timesheet_encode_uom_id == self.env.ref('uom.product_uom_hour') + + def _timesheet_uom_text(self): + return self._is_timesheet_hour_uom() and _("hours") or _("days") diff --git a/addons/hr_timesheet/views/project_update_templates.xml b/addons/hr_timesheet/views/project_update_templates.xml new file mode 100644 index 00000000000..aac0956bdc7 --- /dev/null +++ b/addons/hr_timesheet/views/project_update_templates.xml @@ -0,0 +1,35 @@ + + + + +