From 8a585c0739fc10daa7ca8834ac51f17acbb719e8 Mon Sep 17 00:00:00 2001 From: Mitali Patel Date: Mon, 21 Jun 2021 13:32:56 +0000 Subject: [PATCH] [IMP] sale_(project), hr_timesheet: improve task analysis report Purpose of the commit is to improve the task analysis report of the project app. So in this commit, done the below changes: - removed the # of tasks measure - added the following measures: Rating Value (/5), Working Hours to Assign, Working Hours to Close - removed the # from the labels of the following measures: Days to Deadline, Working Days to Assign,Working Days to Close - renamed 'task title' into 'task' - added a search on tag_ids and sale_order_id - added the following filters: -My Projects + My Team's Projects -My Tasks + My Team's Tasks (rename 'Unassigned' into 'Unassigned Tasks') -Starred -Tasks Late + Tasks in Overtime - added the following group bys: task, customer, kanban state, assignment date, creation date, deadline, last stage update closes odoo/odoo#72587 Taskid: 2508645 Signed-off-by: LTU-Odoo --- .../report/project_report_view.xml | 16 +++++++++++++ addons/project/models/project.py | 4 ++-- addons/project/report/project_report.py | 18 +++++++++++---- .../project/report/project_report_views.xml | 23 +++++++++++++------ addons/project/views/project_views.xml | 2 +- addons/sale_project/__init__.py | 1 + addons/sale_project/__manifest__.py | 1 + addons/sale_project/report/__init__.py | 4 ++++ addons/sale_project/report/project_report.py | 16 +++++++++++++ .../report/project_report_views.xml | 15 ++++++++++++ 10 files changed, 86 insertions(+), 14 deletions(-) create mode 100644 addons/sale_project/report/__init__.py create mode 100644 addons/sale_project/report/project_report.py create mode 100644 addons/sale_project/report/project_report_views.xml diff --git a/addons/hr_timesheet/report/project_report_view.xml b/addons/hr_timesheet/report/project_report_view.xml index 0fd45d1c9df..22f2fbd82db 100644 --- a/addons/hr_timesheet/report/project_report_view.xml +++ b/addons/hr_timesheet/report/project_report_view.xml @@ -29,5 +29,21 @@ + + report.project.task.user.search.inherited + report.project.task.user + + + + + + + + + + + + + diff --git a/addons/project/models/project.py b/addons/project/models/project.py index 58b2a9185f2..b9c58484347 100644 --- a/addons/project/models/project.py +++ b/addons/project/models/project.py @@ -764,8 +764,8 @@ class Task(models.Model): compute='_compute_email_from', recursive=True, store=True, readonly=False) project_privacy_visibility = fields.Selection(related='project_id.privacy_visibility', string="Project Visibility") # Computed field about working time elapsed between record creation and assignation/closing. - working_hours_open = fields.Float(compute='_compute_elapsed', string='Working Hours to Assign', store=True, group_operator="avg") - working_hours_close = fields.Float(compute='_compute_elapsed', string='Working Hours to Close', store=True, group_operator="avg") + working_hours_open = fields.Float(compute='_compute_elapsed', string='Working Hours to Assign', digits=(16, 2), store=True, group_operator="avg") + working_hours_close = fields.Float(compute='_compute_elapsed', string='Working Hours to Close', digits=(16, 2), store=True, group_operator="avg") working_days_open = fields.Float(compute='_compute_elapsed', string='Working Days to Assign', store=True, group_operator="avg") working_days_close = fields.Float(compute='_compute_elapsed', string='Working Days to Close', store=True, group_operator="avg") # customer portal: include comment and incoming emails in communication history diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index c5fe0d285bb..ff61446a229 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -10,21 +10,25 @@ class ReportProjectTaskUser(models.Model): _order = 'name desc, project_id' _auto = False - name = fields.Char(string='Task Title', readonly=True) + name = fields.Char(string='Task', readonly=True) user_id = fields.Many2one('res.users', string='Assigned To', readonly=True) + create_date = fields.Datetime("Create Date", readonly=True) date_assign = fields.Datetime(string='Assignment Date', readonly=True) date_end = fields.Datetime(string='Ending Date', readonly=True) date_deadline = fields.Date(string='Deadline', readonly=True) date_last_stage_update = fields.Datetime(string='Last Stage Update', readonly=True) project_id = fields.Many2one('project.project', string='Project', readonly=True) - working_days_close = fields.Float(string='# Working Days to Close', + working_days_close = fields.Float(string='Working Days to Close', digits=(16,2), readonly=True, group_operator="avg", help="Number of Working Days to close the task") - working_days_open = fields.Float(string='# Working Days to Assign', + working_days_open = fields.Float(string='Working Days to Assign', digits=(16,2), readonly=True, group_operator="avg", help="Number of Working Days to open the task") - delay_endings_days = fields.Float(string='# Days to Deadline', digits=(16,2), readonly=True) + delay_endings_days = fields.Float(string='Days to Deadline', digits=(16, 2), group_operator="avg", readonly=True) nbr = fields.Integer('# of Tasks', readonly=True) # TDE FIXME master: rename into nbr_tasks + working_hours_open = fields.Float(string='Working Hours to Assign', digits=(16, 2), readonly=True, group_operator="avg", help="Number of Working Hours to open the task") + working_hours_close = fields.Float(string='Working Hours to Close', digits=(16, 2), readonly=True, group_operator="avg", help="Number of Working Hours to close the task") + rating_last_value = fields.Float('Rating Value (/5)', group_operator="avg", readonly=True, groups="project.group_project_rating") priority = fields.Selection([ ('0', 'Low'), ('1', 'Normal'), @@ -38,12 +42,15 @@ class ReportProjectTaskUser(models.Model): company_id = fields.Many2one('res.company', string='Company', readonly=True) partner_id = fields.Many2one('res.partner', string='Customer', readonly=True) stage_id = fields.Many2one('project.task.type', string='Stage', readonly=True) + task_id = fields.Many2one('project.task', string='Tasks', readonly=True) def _select(self): select_str = """ SELECT (select 1 ) AS nbr, t.id as id, + t.id as task_id, + t.create_date as create_date, t.date_assign as date_assign, t.date_end as date_end, t.date_last_stage_update as date_last_stage_update, @@ -56,8 +63,11 @@ class ReportProjectTaskUser(models.Model): t.partner_id, t.stage_id as stage_id, t.kanban_state as state, + NULLIF(t.rating_last_value, 0) as rating_last_value, t.working_days_close as working_days_close, t.working_days_open as working_days_open, + t.working_hours_open as working_hours_open, + t.working_hours_close as working_hours_close, (extract('epoch' from (t.date_deadline-(now() at time zone 'UTC'))))/(3600*24) as delay_endings_days """ return select_str diff --git a/addons/project/report/project_report_views.xml b/addons/project/report/project_report_views.xml index ddef388e991..9af70a56458 100644 --- a/addons/project/report/project_report_views.xml +++ b/addons/project/report/project_report_views.xml @@ -18,7 +18,7 @@ - + @@ -28,16 +28,23 @@ report.project.task.user + + + + + - - - - - + + + + + + + @@ -51,6 +58,8 @@ + + @@ -61,7 +70,7 @@ report.project.task.user graph,pivot - {'group_by_no_leaf':1,'group_by':[]} + {'group_by_no_leaf':1, 'group_by':[], 'graph_measure': '__count__'}

No data yet! diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml index 0a48fba6fb0..5ba388c9736 100644 --- a/addons/project/views/project_views.xml +++ b/addons/project/views/project_views.xml @@ -26,7 +26,7 @@ - + diff --git a/addons/sale_project/__init__.py b/addons/sale_project/__init__.py index 8c67f893b37..3226df762b3 100644 --- a/addons/sale_project/__init__.py +++ b/addons/sale_project/__init__.py @@ -3,3 +3,4 @@ from . import models from . import controllers +from . import report diff --git a/addons/sale_project/__manifest__.py b/addons/sale_project/__manifest__.py index 5c5692e8e84..5cefa3e96c9 100644 --- a/addons/sale_project/__manifest__.py +++ b/addons/sale_project/__manifest__.py @@ -13,6 +13,7 @@ This module allows to generate a project/task from sales orders. 'data': [ 'security/ir.model.access.csv', 'security/sale_project_security.xml', + 'report/project_report_views.xml', 'views/product_views.xml', 'views/project_task_views.xml', 'views/sale_order_views.xml', diff --git a/addons/sale_project/report/__init__.py b/addons/sale_project/report/__init__.py new file mode 100644 index 00000000000..3079695339d --- /dev/null +++ b/addons/sale_project/report/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from . import project_report diff --git a/addons/sale_project/report/project_report.py b/addons/sale_project/report/project_report.py new file mode 100644 index 00000000000..fb5bd73b58a --- /dev/null +++ b/addons/sale_project/report/project_report.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Part of Odoo. See LICENSE file for full copyright and licensing details. + +from odoo import fields, models + + +class ReportProjectTaskUser(models.Model): + _inherit = "report.project.task.user" + + sale_order_id = fields.Many2one('sale.order', string='Sales Order', readonly=True) + + def _select(self): + return super()._select() + ", t.sale_order_id" + + def _group_by(self): + return super()._group_by() + ", t.sale_order_id" diff --git a/addons/sale_project/report/project_report_views.xml b/addons/sale_project/report/project_report_views.xml new file mode 100644 index 00000000000..fe85a26bdfe --- /dev/null +++ b/addons/sale_project/report/project_report_views.xml @@ -0,0 +1,15 @@ + + + + + report.project.task.user.search.inherited + report.project.task.user + + + + + + + + +