diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java index 4144eb46c..8fc884bc9 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/ITaskElementService.java @@ -1,5 +1,6 @@ package org.navalplanner.business.planner.services; +import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.planner.entities.TaskElement; /** @@ -11,4 +12,10 @@ public interface ITaskElementService { TaskElement findById(Long id); + /** + * @param order + * @return + */ + TaskElement convertToInitialSchedule(OrderElement order); + } diff --git a/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java index 580eff280..bce578df9 100644 --- a/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java +++ b/navalplanner-business/src/main/java/org/navalplanner/business/planner/services/TaskElementService.java @@ -1,8 +1,14 @@ package org.navalplanner.business.planner.services; import org.navalplanner.business.common.exceptions.InstanceNotFoundException; +import org.navalplanner.business.orders.entities.HoursGroup; +import org.navalplanner.business.orders.entities.OrderElement; +import org.navalplanner.business.orders.entities.OrderLine; +import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.planner.daos.ITaskElementDao; +import org.navalplanner.business.planner.entities.Task; import org.navalplanner.business.planner.entities.TaskElement; +import org.navalplanner.business.planner.entities.TaskGroup; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Scope; @@ -34,4 +40,50 @@ public class TaskElementService implements ITaskElementService { } } + @Override + public TaskElement convertToInitialSchedule(OrderElement order) { + if (order instanceof OrderLineGroup) { + OrderLineGroup group = (OrderLineGroup) order; + return convertToTaskGroup(group); + } else { + OrderLine line = (OrderLine) order; + if (line.getHoursGroups().isEmpty()) + throw new IllegalArgumentException( + "the line must have at least one " + + HoursGroup.class.getSimpleName() + + " associated"); + return line.getHoursGroups().size() > 1 ? convertToTaskGroup(line) + : convertToTask(line); + } + } + + private TaskGroup convertToTaskGroup(OrderLine line) { + TaskGroup result = new TaskGroup(); + result.setOrderElement(line); + for (HoursGroup hoursGroup : line.getHoursGroups()) { + result.addTaskElement(taskFrom(line, hoursGroup)); + } + return result; + } + + private Task convertToTask(OrderLine line) { + HoursGroup hoursGroup = line.getHoursGroups().get(0); + return taskFrom(line, hoursGroup); + } + + private Task taskFrom(OrderLine line, HoursGroup hoursGroup) { + Task result = Task.createTask(hoursGroup); + result.setOrderElement(line); + return result; + } + + private TaskGroup convertToTaskGroup(OrderLineGroup group) { + TaskGroup result = new TaskGroup(); + result.setOrderElement(group); + for (OrderElement orderElement : group.getChildren()) { + result.addTaskElement(convertToInitialSchedule(orderElement)); + } + return result; + } + } diff --git a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java index 50272fced..928dbe480 100644 --- a/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java +++ b/navalplanner-business/src/test/java/org/navalplanner/business/test/planner/services/TaskElementServiceTest.java @@ -2,6 +2,7 @@ package org.navalplanner.business.test.planner.services; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.not; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; @@ -14,11 +15,14 @@ import java.util.List; import org.hibernate.SessionFactory; import org.junit.Test; +import org.junit.matchers.JUnitMatchers; import org.junit.runner.RunWith; import org.navalplanner.business.common.exceptions.ValidationException; import org.navalplanner.business.orders.entities.HoursGroup; import org.navalplanner.business.orders.entities.Order; +import org.navalplanner.business.orders.entities.OrderElement; import org.navalplanner.business.orders.entities.OrderLine; +import org.navalplanner.business.orders.entities.OrderLineGroup; import org.navalplanner.business.orders.services.IOrderService; import org.navalplanner.business.planner.entities.Dependency; import org.navalplanner.business.planner.entities.Task; @@ -166,4 +170,97 @@ public class TaskElementServiceTest { assertTrue(reloaded.getTaskElements().get(1) .getDependenciesWithThisOrigin().isEmpty()); } + + @Test + public void aOrderLineGroupIsConvertedToATaskGroup() { + OrderLineGroup orderLineGroup = new OrderLineGroup(); + orderLineGroup.setName("foo"); + TaskElement task = taskElementService + .convertToInitialSchedule(orderLineGroup); + assertThat(task, is(TaskGroup.class)); + + TaskGroup group = (TaskGroup) task; + assertThat(group.getOrderElement(), + equalTo((OrderElement) orderLineGroup)); + } + + @Test + public void aOrderLineWithOneHourIsConvertedToATask() { + OrderLine orderLine = new OrderLine(); + orderLine.setName("bla"); + HoursGroup hoursGroup = createHoursGroup(30); + orderLine.addHoursGroup(hoursGroup); + TaskElement taskElement = taskElementService + .convertToInitialSchedule(orderLine); + assertThat(taskElement, is(Task.class)); + + Task group = (Task) taskElement; + assertThat(group.getOrderElement(), equalTo((OrderElement) orderLine)); + assertThat(group.getHoursGroup(), equalTo(hoursGroup)); + } + + @Test + public void theSublinesOfAnOrderLineGroupAreConverted() { + OrderLineGroup orderLineGroup = new OrderLineGroup(); + orderLineGroup.setName("foo"); + OrderLine orderLine = new OrderLine(); + orderLine.setName("bla"); + HoursGroup hoursGroup = createHoursGroup(30); + orderLine.addHoursGroup(hoursGroup); + orderLineGroup.add(orderLine); + TaskElement task = taskElementService + .convertToInitialSchedule(orderLineGroup); + assertThat(task, is(TaskGroup.class)); + + TaskGroup group = (TaskGroup) task; + + assertThat(group.getOrderElement(), + equalTo((OrderElement) orderLineGroup)); + assertThat(group.getTaskElements().size(), equalTo(1)); + assertThat(group.getTaskElements().get(0).getOrderElement(), + equalTo((OrderElement) orderLine)); + } + + @Test(expected = IllegalArgumentException.class) + public void aOrderLineWithNoHoursIsRejected() { + OrderLine orderLine = new OrderLine(); + orderLine.setName("bla"); + taskElementService.convertToInitialSchedule(orderLine); + } + + private HoursGroup createHoursGroup(int hours) { + HoursGroup result = new HoursGroup(); + result.setWorkingHours(hours); + return result; + } + + @Test + public void aOrderLineWithMoreThanOneHourIsConvertedToATaskGroup() { + OrderLine orderLine = new OrderLine(); + orderLine.setName("bla"); + HoursGroup hours1 = createHoursGroup(30); + orderLine.addHoursGroup(hours1); + HoursGroup hours2 = createHoursGroup(10); + orderLine.addHoursGroup(hours2); + TaskElement taskElement = taskElementService + .convertToInitialSchedule(orderLine); + assertThat(taskElement, is(TaskGroup.class)); + + TaskGroup group = (TaskGroup) taskElement; + assertThat(group.getOrderElement(), equalTo((OrderElement) orderLine)); + assertThat(group.getTaskElements().size(), equalTo(2)); + + Task child1 = (Task) group.getTaskElements().get(0); + Task child2 = (Task) group.getTaskElements().get(1); + + assertThat(child1.getOrderElement(), equalTo((OrderElement) orderLine)); + assertThat(child2.getOrderElement(), equalTo((OrderElement) orderLine)); + + assertThat(child1.getHoursGroup(), not(equalTo(child2.getHoursGroup()))); + + assertThat(child1.getHoursGroup(), JUnitMatchers + .either(equalTo(hours1)).or(equalTo(hours2))); + assertThat(child2.getHoursGroup(), JUnitMatchers + .either(equalTo(hours1)).or(equalTo(hours2))); + } }