[ADD] new module project_task_report

This commit is contained in:
Clément Mombereau
2024-12-09 12:32:12 -03:00
parent 5af6c895d0
commit c88e7b0bb4
10 changed files with 348 additions and 0 deletions

View File

@@ -0,0 +1 @@
from . import project_task_report

View 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"))

View 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>