diff --git a/bemade_fsm/models/task.py b/bemade_fsm/models/task.py index e8ba4fc..c6ebd46 100644 --- a/bemade_fsm/models/task.py +++ b/bemade_fsm/models/task.py @@ -49,8 +49,6 @@ class Task(models.Model): visit_id = fields.Many2one(comodel_name='bemade_fsm.visit') - is_complete = fields.Boolean(compute="_compute_is_complete") - # user_id = fields.Many2one('res.users', compute='_compute_user_id') # # @api.depends('user_ids') @@ -71,13 +69,6 @@ class Task(models.Model): for project in self.project_id } - @api.depends('project_id', 'stage_id.is_closed') - def _compute_is_complete(self): - closing_stages = self._get_closed_stage_by_project() - for rec in self: - rec.is_complete = rec.stage_id == (rec.project_id - and closing_stages[rec.project_id]) - def _get_related_planning_slots(self): domain = expression.AND([ self._get_domain_compute_forecast_hours(), @@ -148,3 +139,15 @@ class Task(models.Model): rec.allow_billable = False else: rec.allow_billable = rec.project_id.allow_billable + + def action_fsm_validate(self): + visits = self.filtered(lambda t: t.visit_id) + non_visits = self - visits + super(Task, non_visits).action_fsm_validate() + + visits._stop_all_timers_and_create_timesheets() + closed_stage_by_project = visits._get_closed_stage_by_project() + super(Task, visits.child_ids).action_fsm_validate() + for visit in visits: + stage = closed_stage_by_project[visit.project_id] + visits.write({'stage_id': stage.id, 'fsm_done': True}) diff --git a/bemade_fsm/tests/test_fsm_visit.py b/bemade_fsm/tests/test_fsm_visit.py index 23bd99e..17f0619 100644 --- a/bemade_fsm/tests/test_fsm_visit.py +++ b/bemade_fsm/tests/test_fsm_visit.py @@ -101,3 +101,16 @@ class FSMVisitTest(BemadeFSMBaseTest): self.assertEqual(len(so.order_line), 3) + def test_marking_visit_task_done_completes_descendants(self): + so, visit, sol1, sol2 = self._generate_so_with_one_visit_two_lines() + so.action_confirm() + parent, child1, child2 = visit.task_id, sol1.task_id, sol2.task_id + + parent.action_fsm_validate() + + self.assertTrue(parent.is_closed) + self.assertTrue(child1.is_closed) + self.assertTrue(child2.is_closed) + self.assertEqual(sol1.qty_to_deliver, 0) + self.assertEqual(sol2.qty_to_deliver, 0) + self.assertTrue(visit.is_completed)