mirror of
https://github.com/bringout/oca-project.git
synced 2026-04-19 07:42:01 +02:00
Move 124 sale modules to oca-sale, create oca-project with 56 project modules from oca-workflow-process
🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
parent
9eb7ae5807
commit
6094c218b2
2332 changed files with 125826 additions and 0 deletions
|
|
@ -0,0 +1,103 @@
|
|||
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
|
||||
Loading…
Add table
Add a link
Reference in a new issue