mirror of
https://github.com/bringout/oca-workflow-process.git
synced 2026-04-18 14:32:02 +02:00
103 lines
3.4 KiB
Python
103 lines
3.4 KiB
Python
import ast
|
|
import json
|
|
|
|
from odoo import _, models
|
|
|
|
|
|
class Project(models.Model):
|
|
_inherit = "project.project"
|
|
|
|
def _get_execution(self):
|
|
all_tasks = self.env["project.task"].search(
|
|
[
|
|
("project_id", "=", self.id),
|
|
]
|
|
)
|
|
executed_tasks = all_tasks.filtered("stage_id.fold")
|
|
|
|
total_planned_hours = sum(all_tasks.mapped("planned_hours"))
|
|
total_excuted_hours = sum(executed_tasks.mapped("planned_hours"))
|
|
|
|
if total_excuted_hours and total_planned_hours:
|
|
execution = total_excuted_hours * 100 / total_planned_hours
|
|
else:
|
|
execution = 0
|
|
|
|
return {
|
|
"all_task": len(all_tasks),
|
|
"excuted": round(total_excuted_hours),
|
|
"percent": round(execution),
|
|
}
|
|
|
|
def _get_dedication(self):
|
|
all_tasks = self.env["project.task"].search(
|
|
[
|
|
("project_id", "=", self.id),
|
|
]
|
|
)
|
|
total_planned_hours = sum(all_tasks.mapped("planned_hours"))
|
|
total_dedicated_hours = sum(all_tasks.mapped("effective_hours"))
|
|
|
|
if total_dedicated_hours and total_planned_hours:
|
|
dedication = total_dedicated_hours * 100 / total_planned_hours
|
|
else:
|
|
dedication = 0
|
|
|
|
return {"dedicated": round(total_dedicated_hours), "percent": round(dedication)}
|
|
|
|
def action_view_excuted_tasks(self):
|
|
action = (
|
|
self.env["ir.actions.act_window"]
|
|
.with_context(active_id=self.id)
|
|
._for_xml_id("project_milestone_status.act_excuted_project_task")
|
|
)
|
|
action["display_name"] = _("%(name)s", name=self.name)
|
|
context = action["context"].replace("active_id", str(self.id))
|
|
context = ast.literal_eval(context)
|
|
context.update({"create": self.active, "active_test": self.active})
|
|
action["context"] = context
|
|
action["domain"] = [("project_id", "=", self.id), ("stage_id.fold", "=", True)]
|
|
return action
|
|
|
|
def _get_stat_buttons(self):
|
|
buttons = super()._get_stat_buttons()
|
|
execution = self._get_execution()
|
|
dedication = self._get_dedication()
|
|
|
|
if self.task_count and execution["all_task"]:
|
|
percent_tasks = round(self.task_count * 100 / execution["all_task"])
|
|
else:
|
|
percent_tasks = 0
|
|
|
|
buttons[0][
|
|
"number"
|
|
] = f"{self.task_count} / {execution['all_task']} ({percent_tasks}%)"
|
|
buttons.append(
|
|
{
|
|
"icon": "check-circle-o",
|
|
"text": _("Execution"),
|
|
"number": f"{execution['percent']}% ({execution['excuted']}h)",
|
|
"action_type": "object",
|
|
"action": "action_view_excuted_tasks",
|
|
"show": True,
|
|
"sequence": 5,
|
|
}
|
|
)
|
|
|
|
buttons.append(
|
|
{
|
|
"icon": "clock-o",
|
|
"text": _("Dedication"),
|
|
"number": f"{dedication['percent']}% ({dedication['dedicated']}h)",
|
|
"action_type": "action",
|
|
"action": "hr_timesheet.act_hr_timesheet_line_by_project",
|
|
"additional_context": json.dumps(
|
|
{
|
|
"active_id": self.id,
|
|
}
|
|
),
|
|
"show": True,
|
|
"sequence": 6,
|
|
}
|
|
)
|
|
return buttons
|