diff --git a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py index 4a3f5b1413..2c53705e74 100644 --- a/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py +++ b/src/ifcopenshell-python/ifcopenshell/api/sequence/calculate_task_duration.py @@ -47,11 +47,11 @@ class Usecase: work_day_duration = ifcopenshell.util.date.ifc2datetime(psets["Pset_WorkControlCommon"]["WorkDayDuration"]) return work_day_duration.seconds - def get_work_schedule(self): - for rel in self.settings["task"].HasAssignments or []: + def get_work_schedule(self, task): + for rel in task.HasAssignments or []: if rel.is_a("IfcRelAssignsToControl") and rel.RelatingControl.is_a("IfcWorkSchedule"): return rel.RelatingControl - for rel in self.settings["task"].Nests or []: + for rel in task.Nests or []: return self.get_work_schedule(rel.RelatingObject) def calculate_duration_in_days(self, resource): diff --git a/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py b/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py index 7fe64f7fe1..7718af4025 100644 --- a/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py +++ b/src/ifcopenshell-python/test/api/sequence/test_calculate_task_duration.py @@ -24,3 +24,47 @@ class TestCalculateTaskDuration(test.bootstrap.IFC4): ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource) ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task) assert task.TaskTime.ScheduleDuration == "P4D" + + def test_calculating_a_task_duration_without_a_work_schedule_defining_workday_duration(self): + ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + task = ifcopenshell.api.run("sequence.add_task", self.file) + resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") + resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource) + resource_time.ScheduleWork = "P2D" + ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource) + ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task) + assert task.TaskTime.ScheduleDuration == "P2D" + + def test_calculating_a_task_duration_with_a_custom_workday_duration(self): + ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file) + pset = ifcopenshell.api.run("pset.add_pset", self.file, product=schedule, name="Pset_WorkControlCommon") + ifcopenshell.api.run("pset.edit_pset", self.file, pset=pset, properties={"WorkDayDuration": "PT2H"}) + task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule) + resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") + resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource) + resource_time.ScheduleWork = "PT48H" + ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource) + ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task) + assert task.TaskTime.ScheduleDuration == "P24D" + + def test_failing_to_calculate_if_no_schedule_work_usage(self): + ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file) + task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule) + resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") + ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=task, related_object=resource) + ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=task) + assert task.TaskTime is None + + def test_calculating_a_nested_task_duration_based_on_a_labour_resource_with_work_hours(self): + ifcopenshell.api.run("root.create_entity", self.file, ifc_class="IfcProject") + schedule = ifcopenshell.api.run("sequence.add_work_schedule", self.file) + task = ifcopenshell.api.run("sequence.add_task", self.file, work_schedule=schedule) + subtask = ifcopenshell.api.run("sequence.add_task", self.file, parent_task=task) + resource = ifcopenshell.api.run("resource.add_resource", self.file, ifc_class="IfcLaborResource") + resource_time = ifcopenshell.api.run("resource.add_resource_time", self.file, resource=resource) + resource_time.ScheduleWork = "PT48H" + ifcopenshell.api.run("sequence.assign_process", self.file, relating_process=subtask, related_object=resource) + ifcopenshell.api.run("sequence.calculate_task_duration", self.file, task=subtask) + assert subtask.TaskTime.ScheduleDuration == "P6D"