diff --git a/addons/project/models/project_milestone.py b/addons/project/models/project_milestone.py index ba6645d0434..24fef86195b 100644 --- a/addons/project/models/project_milestone.py +++ b/addons/project/models/project_milestone.py @@ -25,6 +25,7 @@ class ProjectMilestone(models.Model): is_deadline_exceeded = fields.Boolean(compute="_compute_is_deadline_exceeded") is_deadline_future = fields.Boolean(compute="_compute_is_deadline_future") task_count = fields.Integer('# of Tasks', compute='_compute_task_count', groups='project.group_project_milestone') + done_task_count = fields.Integer('# of Done Tasks', compute='_compute_task_count', groups='project.group_project_milestone') can_be_marked_as_done = fields.Boolean(compute='_compute_can_be_marked_as_done', groups='project.group_project_milestone') @api.depends('is_reached') @@ -45,10 +46,15 @@ class ProjectMilestone(models.Model): @api.depends('task_ids.milestone_id') def _compute_task_count(self): - task_read_group = self.env['project.task']._read_group([('milestone_id', 'in', self.ids), ('allow_milestones', '=', True)], ['milestone_id'], ['milestone_id']) - task_count_per_milestone = {res['milestone_id'][0]: res['milestone_id_count'] for res in task_read_group} + all_and_done_task_count_per_milestone = { + group['milestone_id'][0]: (group['milestone_id_count'], group['is_closed'].count(True)) + for group in self.env['project.task']._read_group( + [('milestone_id', 'in', self.ids), ('allow_milestones', '=', True)], + ['milestone_id', 'is_closed:array_agg'], ['milestone_id'] + ) + } for milestone in self: - milestone.task_count = task_count_per_milestone.get(milestone.id, 0) + milestone.task_count, milestone.done_task_count = all_and_done_task_count_per_milestone.get(milestone.id, (0, 0)) def _compute_can_be_marked_as_done(self): if not any(self._ids): diff --git a/addons/project/models/project_project.py b/addons/project/models/project_project.py index a4d89ab3fc7..1ebd49a71c0 100644 --- a/addons/project/models/project_project.py +++ b/addons/project/models/project_project.py @@ -97,8 +97,7 @@ class Project(models.Model): def _read_group_stage_ids(self, stages, domain, order): return self.env['project.project.stage'].search([], order=order) - name = fields.Char("Name", index='trigram', required=True, tracking=True, translate=True, default_export_compatible=True, - help="Name of your project. It can be anything you want e.g. the name of a customer or a service.") + name = fields.Char("Name", index='trigram', required=True, tracking=True, translate=True, default_export_compatible=True) description = fields.Html(help="Description to provide more information and context about this project") active = fields.Boolean(default=True, help="If the active field is set to False, it will allow you to hide the project without removing it.") diff --git a/addons/project/views/project_milestone_views.xml b/addons/project/views/project_milestone_views.xml index 10b91d16485..3e8c3284abb 100644 --- a/addons/project/views/project_milestone_views.xml +++ b/addons/project/views/project_milestone_views.xml @@ -18,9 +18,13 @@ >
- + + Tasks + + + + Done - Tasks
diff --git a/addons/project/views/project_project_views.xml b/addons/project/views/project_project_views.xml index 9bc0403db7f..1349c35f5fc 100644 --- a/addons/project/views/project_project_views.xml +++ b/addons/project/views/project_project_views.xml @@ -60,7 +60,7 @@ - + diff --git a/addons/project/views/project_task_views.xml b/addons/project/views/project_task_views.xml index 196e8c1c735..4e1541ff218 100644 --- a/addons/project/views/project_task_views.xml +++ b/addons/project/views/project_task_views.xml @@ -368,7 +368,7 @@ name="task_properties" nolabel="1" columns="2" hideKanbanOption="1"/> - + Sold Delivered Remaining +Invoiced @@ -20,6 +21,7 @@ +