summaryrefslogtreecommitdiff
path: root/addons/project/report
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/project/report
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/project/report')
-rw-r--r--addons/project/report/__init__.py4
-rw-r--r--addons/project/report/project_report.py93
-rw-r--r--addons/project/report/project_report_views.xml67
3 files changed, 164 insertions, 0 deletions
diff --git a/addons/project/report/__init__.py b/addons/project/report/__init__.py
new file mode 100644
index 00000000..30796953
--- /dev/null
+++ b/addons/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/project/report/project_report.py b/addons/project/report/project_report.py
new file mode 100644
index 00000000..99411e77
--- /dev/null
+++ b/addons/project/report/project_report.py
@@ -0,0 +1,93 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from odoo import fields, models, tools
+
+
+class ReportProjectTaskUser(models.Model):
+ _name = "report.project.task.user"
+ _description = "Tasks Analysis"
+ _order = 'name desc, project_id'
+ _auto = False
+
+ name = fields.Char(string='Task Title', readonly=True)
+ user_id = fields.Many2one('res.users', string='Assigned To', 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',
+ 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',
+ 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)
+ nbr = fields.Integer('# of Tasks', readonly=True) # TDE FIXME master: rename into nbr_tasks
+ priority = fields.Selection([
+ ('0', 'Low'),
+ ('1', 'Normal'),
+ ('2', 'High')
+ ], readonly=True, string="Priority")
+ state = fields.Selection([
+ ('normal', 'In Progress'),
+ ('blocked', 'Blocked'),
+ ('done', 'Ready for next stage')
+ ], string='Kanban State', readonly=True)
+ 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)
+
+ def _select(self):
+ select_str = """
+ SELECT
+ (select 1 ) AS nbr,
+ t.id as id,
+ t.date_assign as date_assign,
+ t.date_end as date_end,
+ t.date_last_stage_update as date_last_stage_update,
+ t.date_deadline as date_deadline,
+ t.user_id,
+ t.project_id,
+ t.priority,
+ t.name as name,
+ t.company_id,
+ t.partner_id,
+ t.stage_id as stage_id,
+ t.kanban_state as state,
+ t.working_days_close as working_days_close,
+ t.working_days_open as working_days_open,
+ (extract('epoch' from (t.date_deadline-(now() at time zone 'UTC'))))/(3600*24) as delay_endings_days
+ """
+ return select_str
+
+ def _group_by(self):
+ group_by_str = """
+ GROUP BY
+ t.id,
+ t.create_date,
+ t.write_date,
+ t.date_assign,
+ t.date_end,
+ t.date_deadline,
+ t.date_last_stage_update,
+ t.user_id,
+ t.project_id,
+ t.priority,
+ t.name,
+ t.company_id,
+ t.partner_id,
+ t.stage_id
+ """
+ return group_by_str
+
+ def init(self):
+ tools.drop_view_if_exists(self._cr, self._table)
+ self._cr.execute("""
+ CREATE view %s as
+ %s
+ FROM project_task t
+ WHERE t.active = 'true'
+ %s
+ """ % (self._table, self._select(), self._group_by()))
diff --git a/addons/project/report/project_report_views.xml b/addons/project/report/project_report_views.xml
new file mode 100644
index 00000000..e4aedce0
--- /dev/null
+++ b/addons/project/report/project_report_views.xml
@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<odoo>
+
+ <record id="view_task_project_user_pivot" model="ir.ui.view">
+ <field name="name">report.project.task.user.pivot</field>
+ <field name="model">report.project.task.user</field>
+ <field name="arch" type="xml">
+ <pivot string="Tasks Analysis" display_quantity="true" disable_linking="True" sample="1">
+ <field name="project_id" type="row"/>
+ </pivot>
+ </field>
+ </record>
+
+ <record id="view_task_project_user_graph" model="ir.ui.view">
+ <field name="name">report.project.task.user.graph</field>
+ <field name="model">report.project.task.user</field>
+ <field name="arch" type="xml">
+ <graph string="Tasks Analysis" type="bar" sample="1" disable_linking="1">
+ <field name="project_id" type="row"/>
+ <field name="user_id" type="col"/>
+ <field name="nbr" type="measure"/>
+ </graph>
+ </field>
+ </record>
+
+ <record id="view_task_project_user_search" model="ir.ui.view">
+ <field name="name">report.project.task.user.search</field>
+ <field name="model">report.project.task.user</field>
+ <field name="arch" type="xml">
+ <search string="Tasks Analysis">
+ <field name="name" />
+ <field name="date_assign"/>
+ <field name="date_end"/>
+ <field name="date_deadline"/>
+ <field name="date_last_stage_update"/>
+ <field name="project_id"/>
+ <field name="user_id"/>
+ <field name="partner_id" filter_domain="[('partner_id', 'child_of', self)]"/>
+ <field name="stage_id"/>
+ <filter string="Unassigned" name="unassigned" domain="[('user_id', '=', False)]"/>
+ <separator/>
+ <filter name="filter_date_deadline" date="date_deadline"/>
+ <filter name="filter_date_assign" date="date_assign"/>
+ <filter name="filter_date_last_stage_update" date="date_last_stage_update"/>
+ <group expand="0" string="Extended Filters">
+ <field name="priority"/>
+ <field name="company_id" groups="base.group_multi_company"/>
+ </group>
+ <group expand="1" string="Group By">
+ <filter string="Project" name="project" context="{'group_by': 'project_id'}"/>
+ <filter string="Assigned to" name="User" context="{'group_by': 'user_id'}"/>
+ <filter string="Stage" name="Stage" context="{'group_by': 'stage_id'}"/>
+ </group>
+ </search>
+ </field>
+ </record>
+
+ <record id="action_project_task_user_tree" model="ir.actions.act_window">
+ <field name="name">Tasks Analysis</field>
+ <field name="res_model">report.project.task.user</field>
+ <field name="view_mode">graph,pivot</field>
+ <field name="search_view_id" ref="view_task_project_user_search"/>
+ <field name="context">{'group_by_no_leaf':1,'group_by':[]}</field>
+ <field name="help">This report allows you to analyse the performance of your projects and users. You can analyse the quantities of tasks, the hours spent compared to the planned hours, the average number of days to open or close a task, etc.</field>
+ </record>
+
+</odoo>