[ADD] new module project_task_report
This commit is contained in:
1
project_task_report/wizards/__init__.py
Normal file
1
project_task_report/wizards/__init__.py
Normal file
@@ -0,0 +1 @@
|
||||
from . import project_task_report
|
||||
84
project_task_report/wizards/project_task_report.py
Normal file
84
project_task_report/wizards/project_task_report.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# Copyright 2024 Akretion
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl).
|
||||
|
||||
from odoo import _, api, fields, models
|
||||
|
||||
|
||||
class ProjectTaskReport(models.TransientModel):
|
||||
_name = "project.task.report"
|
||||
_description = "Task Report"
|
||||
|
||||
start_date = fields.Date()
|
||||
end_date = fields.Date()
|
||||
project_ids = fields.Many2many("project.project", string="Projects")
|
||||
|
||||
def _create_line_ids(self):
|
||||
line_vals = []
|
||||
task_ids = self.env["project.task"].search(
|
||||
[("project_id", "in", self.project_ids.ids)]
|
||||
)
|
||||
field_stage_id = self.env["ir.model.fields"].search(
|
||||
[("model", "=", "project.task"), ("name", "=", "stage_id")]
|
||||
)
|
||||
|
||||
for task_id in task_ids:
|
||||
line_val = {"task_id": task_id.id, "timesheet_ids": []}
|
||||
|
||||
# Catch the timesheets between the start and end dates
|
||||
for timesheet_id in task_id.timesheet_ids:
|
||||
if self.start_date < timesheet_id.date < self.end_date:
|
||||
line_val["timesheet_ids"].append(timesheet_id.id)
|
||||
|
||||
# Catch the historic stage changes between the start and end dates
|
||||
track_ids = task_id.message_ids.tracking_value_ids.filtered(
|
||||
lambda t: t.field == field_stage_id
|
||||
and self.start_date < t.mail_message_id.date.date() < self.end_date
|
||||
).sorted(lambda t: t.mail_message_id.date)
|
||||
|
||||
if track_ids:
|
||||
line_val.update(
|
||||
{
|
||||
"start_stage_id": track_ids[0].old_value_integer,
|
||||
"end_stage_id": track_ids[-1].new_value_integer,
|
||||
}
|
||||
)
|
||||
|
||||
if line_val["timesheet_ids"] or line_val.get("start_stage_id"):
|
||||
# Fill stage fields in case there have been timesheets without stage change
|
||||
if not line_val.get("start_stage_id"):
|
||||
line_val.update(
|
||||
{
|
||||
"start_stage_id": task_id.stage_id.id,
|
||||
"end_stage_id": task_id.stage_id.id,
|
||||
}
|
||||
)
|
||||
line_vals.append(line_val)
|
||||
|
||||
return self.env["project.task.report.line"].create(line_vals)
|
||||
|
||||
def action_view_task_report(self):
|
||||
self.ensure_one()
|
||||
|
||||
line_ids = self._create_line_ids()
|
||||
|
||||
action_xml_id = "project_task_report.project_task_report_line_act_window"
|
||||
action = self.env["ir.actions.act_window"]._for_xml_id(action_xml_id)
|
||||
action.update({"domain": [("id", "in", line_ids.ids)]})
|
||||
return action
|
||||
|
||||
|
||||
class ProjectTaskReportLine(models.TransientModel):
|
||||
_name = "project.task.report.line"
|
||||
_description = "Task Report Line"
|
||||
|
||||
task_id = fields.Many2one("project.task", readonly=True)
|
||||
start_stage_id = fields.Many2one("project.task.type", readonly=True)
|
||||
end_stage_id = fields.Many2one("project.task.type", readonly=True)
|
||||
|
||||
timesheet_ids = fields.Many2many("account.analytic.line", readonly=True)
|
||||
hours_spent = fields.Float(compute="_compute_hours_spent", store=True)
|
||||
|
||||
@api.depends("timesheet_ids.unit_amount")
|
||||
def _compute_hours_spent(self):
|
||||
for rec in self:
|
||||
rec.hours_spent = sum(rec.timesheet_ids.mapped("unit_amount"))
|
||||
82
project_task_report/wizards/project_task_report.xml
Normal file
82
project_task_report/wizards/project_task_report.xml
Normal file
@@ -0,0 +1,82 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Copyright 2024 Akretion
|
||||
License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -->
|
||||
|
||||
<odoo>
|
||||
|
||||
<record id="project_task_report_form_view" model="ir.ui.view">
|
||||
<field name="model">project.task.report</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Project Task Report">
|
||||
<group>
|
||||
<field name="start_date"/>
|
||||
<field name="end_date"/>
|
||||
<field name="project_ids" widget="many2many_tags"/>
|
||||
</group>
|
||||
<footer>
|
||||
<button name="action_view_task_report"
|
||||
string="Create Task Report"
|
||||
class="btn-primary"
|
||||
type="object"/>
|
||||
<button string="Cancel"
|
||||
class="btn-default"
|
||||
special="cancel"/>
|
||||
</footer>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="project_task_report_act_window">
|
||||
<field name="name">Tasks Report</field>
|
||||
<field name="res_model">project.task.report</field>
|
||||
<field name="view_mode">form</field>
|
||||
<field name="target">new</field>
|
||||
</record>
|
||||
|
||||
<record id="project_task_report_line_tree_view" model="ir.ui.view">
|
||||
<field name="name">project.task.report.line.tree</field>
|
||||
<field name="model">project.task.report.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<tree string="Task Report" create="false" delete="false" edit="false">
|
||||
<field name="task_id"/>
|
||||
<field name="start_stage_id"/>
|
||||
<field name="end_stage_id"/>
|
||||
<field name="hours_spent" widget="timesheet_uom"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record id="project_task_report_line_form_view" model="ir.ui.view">
|
||||
<field name="model">project.task.report.line</field>
|
||||
<field name="arch" type="xml">
|
||||
<form string="Project Task Report Line">
|
||||
<sheet>
|
||||
<div class="oe_title">
|
||||
<label for="task_id"/>
|
||||
<h1><field name="task_id"/></h1>
|
||||
</div>
|
||||
<group class="col-12 col-lg-6">
|
||||
<field name="start_stage_id"/>
|
||||
<field name="end_stage_id"/>
|
||||
</group>
|
||||
<group class="col-12 col-lg-6">
|
||||
<field name="timesheet_ids"/>
|
||||
</group>
|
||||
</sheet>
|
||||
</form>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.actions.act_window" id="project_task_report_line_act_window">
|
||||
<field name="name">Tasks Report</field>
|
||||
<field name="res_model">project.task.report.line</field>
|
||||
<field name="view_mode">tree,form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.ui.menu" id="project_task_report_menu">
|
||||
<field name="name">Tasks Report</field>
|
||||
<field name="parent_id" ref="project.menu_project_report"/>
|
||||
<field name="action" ref="project_task_report_act_window"/>
|
||||
<field name="sequence" eval="10"/>
|
||||
</record>
|
||||
</odoo>
|
||||
Reference in New Issue
Block a user