BP-833, add correct order of users even after a phase has ended
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java
index 345f45d..9bed8fd 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/controller/planning/PlanningController.java
@@ -136,8 +136,9 @@
 					LOGGER.debug("Start Plannig for phase " + entry.getKey());

 					PlanningPhaseDto dto = entry.getValue();

 					this.createMsgStartOfPhase(entry.getKey(), dto);

-					lastStartUserId = this.calculatePlanForPhase(dto, lastStartUserId, username, entry.getKey(),

-							lastCalcDate);

+					PlanningBodyResultDto planningBodyResultDto = this.calculatePlanForPhase(dto, lastStartUserId,

+							username, entry.getKey(), lastCalcDate);

+					lastStartUserId = planningBodyResultDto.getLastUserId();

 					this.createMsgEndOfPhase(entry.getKey());

 					LOGGER.debug("End Plannig for phase " + entry.getKey());

 				}

@@ -362,10 +363,11 @@
 

 	}

 

-	public Long calculatePlanForPhase(PlanningPhaseDto dto, Long lastStartUserId, String username, int phaseNumber,

-			Date lastCalcDate) throws SpException {

+	public PlanningBodyResultDto calculatePlanForPhase(PlanningPhaseDto dto, Long lastStartUserId, String username,

+			int phaseNumber, Date lastCalcDate) throws SpException {

 		try {

 			List<UserInStandbyGroup> lsUserInGroup = dto.getLsUsers();

+			Long lastTurnUserId = lastStartUserId;

 

 			Collections.sort(lsUserInGroup,

 					(UserInStandbyGroup o1, UserInStandbyGroup o2) -> o1.getPosition().compareTo(o2.getPosition()));

@@ -377,18 +379,21 @@
 			}

 			Date tmpDate = dto.getStartDate();

 

+			PlanningBodyResultDto planningBodyResultDto = null;

 			while (tmpDate.getTime() < dto.getEndDate().getTime()) {

 

 				// reset position if end of list has been reached

-				PlanningBodyResultDto planningBodyResultDto = this.calculateScheduleBodyEntries(lsUserInGroup,

-						dto.getStartDate(), tmpDate, lastCalcDate, currentPosition, username, lastStartUserId,

-						phaseNumber);

+				planningBodyResultDto = this.calculateScheduleBodyEntries(lsUserInGroup, dto.getStartDate(), tmpDate,

+						lastCalcDate, lastTurnUserId, username, lastStartUserId, phaseNumber);

 				tmpDate = planningBodyResultDto.getTempDate();

 				currentPosition = planningBodyResultDto.getNewPosition();

 				lastStartUserId = planningBodyResultDto.getLastStartUserId();

+				lastTurnUserId = planningBodyResultDto.getLastUserId();

+

 				this.addMessagesToList(planningBodyResultDto.getLsMsg());

 			}

-			return lastStartUserId;

+			planningBodyResultDto.setLastUserId(lastTurnUserId);

+			return planningBodyResultDto;

 		} catch (Exception e) {

 			LOGGER.error(e, e);

 			SpErrorEntry ee = SpExceptionEnum.DEFAULT_EXCEPTION.getEntry();

@@ -580,12 +585,14 @@
 	}

 

 	public PlanningBodyResultDto calculateScheduleBodyEntries(List<UserInStandbyGroup> lsUserInGroup, Date startDate,

-			Date currentDate, Date lastDate, int currentPosition, String username, Long lastStartUserId,

+			Date currentDate, Date lastDate, Long lastTurnUserId, String username, Long lastStartUserId,

 			int phaseNumber) {

 		StandbyGroup group = lsUserInGroup.get(0).getStandbyGroup();

+		int currentPosition = this.getIndexOfLastPlannedUser(lastTurnUserId, lsUserInGroup);

 		PlanningBodyResultDto resultObj = new PlanningBodyResultDto();

 		resultObj.setLastStartUserId(lastStartUserId);

 		resultObj.setNewPosition(currentPosition);

+		resultObj.setLastUserId(lsUserInGroup.get(currentPosition).getUser().getId());

 

 		// read fitting duration for the current phase.

 		List<StandbyDuration> lsFittingDurations = new ArrayList<>();

@@ -598,7 +605,6 @@
 

 		if (!lsFittingDurations.isEmpty()) {

 			for (StandbyDuration fittingDuration : lsFittingDurations) {

-				// int startWeekDayInt = fittingDuration.getValidDayFrom();

 				int startWeekDayInt = DateHelper.getDayOfWeek(currentDate);

 				int endWeekDayInt = fittingDuration.getValidDayTo();

 				int coveredDays = DateHelper.calculateDifferenceOfDays(startWeekDayInt, endWeekDayInt,

@@ -628,6 +634,7 @@
 			}

 			resultObj.setNewPosition(currentPosition);

 			resultObj.setTempDate(DateHelper.addDaysToDate(currentDate, 1));

+			resultObj.setLastUserId(lsUserInGroup.get(currentPosition).getUser().getId());

 

 		} else {

 			resultObj.setTempDate(DateHelper.addDaysToDate(currentDate, 1));

diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java
index 11ed82b..dead5ba 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/dto/planning/PlanningBodyResultDto.java
@@ -18,11 +18,12 @@
 
 import javax.xml.bind.annotation.XmlRootElement;
 
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonInclude.Include;
 import org.eclipse.openk.sp.abstracts.AbstractDto;
 import org.eclipse.openk.sp.db.model.StandbyDuration;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
 /**
  * The "Address" Data Transfer Object (DTO)
  */
@@ -36,14 +37,16 @@
 	private static final long serialVersionUID = 1L;
 
 	private Integer newPosition = 0;
-	
+
 	private Long lastStartUserId = 0L;
 
+	private Long lastUserId = 0L;
+
 	private Date tempDate = null;
 
 	private List<PlanningMsgDto> lsMsg = new ArrayList<>();
-	
-	private StandbyDuration currentDuration; 
+
+	private StandbyDuration currentDuration;
 
 	/**
 	 * @return the newPosition
@@ -98,7 +101,8 @@
 	}
 
 	/**
-	 * @param lastStartUserId the lastStartUserId to set
+	 * @param lastStartUserId
+	 *            the lastStartUserId to set
 	 */
 	public void setLastStartUserId(Long lastStartUserId) {
 		this.lastStartUserId = lastStartUserId;
@@ -112,9 +116,25 @@
 	}
 
 	/**
-	 * @param currentDuration the currentDuration to set
+	 * @param currentDuration
+	 *            the currentDuration to set
 	 */
 	public void setCurrentDuration(StandbyDuration currentDuration) {
 		this.currentDuration = currentDuration;
 	}
+
+	/**
+	 * @return the lastUserId
+	 */
+	public Long getLastUserId() {
+		return lastUserId;
+	}
+
+	/**
+	 * @param lastUserId
+	 *            the lastUserId to set
+	 */
+	public void setLastUserId(Long lastUserId) {
+		this.lastUserId = lastUserId;
+	}
 }
\ No newline at end of file
diff --git a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java
index f8fee86..0712458 100644
--- a/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java
+++ b/oKBereitschaftsplanungBackend/src/test/java/org/eclipse/openk/sp/controller/planning/PlanningControllerTest.java
@@ -148,15 +148,15 @@
 			Mockito.doReturn(stbyGroup).when(standbyGroupRepository).findOne(Mockito.any());

 			Mockito.doReturn(true).when(planningController).validateInputForPlanCalculation(standbyBlueprintDto);

 			Mockito.doReturn(planningPhaseMap).when(planningController).calculatePlanningPhaseMap(standbyBlueprintDto);

-			Mockito.doReturn(1L).when(planningController).calculatePlanForPhase(Mockito.any(), Mockito.any(),

-					Mockito.any(), Mockito.anyInt(), Mockito.any());

+			Mockito.doReturn(new PlanningBodyResultDto()).when(planningController).calculatePlanForPhase(Mockito.any(),

+					Mockito.any(), Mockito.any(), Mockito.anyInt(), Mockito.any());

 			planningController.startPlanning(standbyBlueprintDto, username);

 

 			// success test 02 - invalidInput

 			Mockito.doReturn(false).when(planningController).validateInputForPlanCalculation(standbyBlueprintDto);

 			Mockito.doReturn(planningPhaseMap).when(planningController).calculatePlanningPhaseMap(standbyBlueprintDto);

-			Mockito.doReturn(1L).when(planningController).calculatePlanForPhase(Mockito.any(), Mockito.any(),

-					Mockito.any(), Mockito.anyInt(), Mockito.any());

+			Mockito.doReturn(new PlanningBodyResultDto()).when(planningController).calculatePlanForPhase(Mockito.any(),

+					Mockito.any(), Mockito.any(), Mockito.anyInt(), Mockito.any());

 			planningController.startPlanning(standbyBlueprintDto, username);

 		} catch (SpException e) {

 			assertNull(e);

@@ -260,7 +260,6 @@
 		Date startDate = new Date();

 		Date currentDate = new Date();

 		Date lastDate = new Date();

-		int currentPosition = 0;

 		String username = "JUnit";

 		Long lastUserId = 1L;

 		List<UserInStandbyGroup> lsUserInStandbyGroup = this.getTestDataForUserInStandbyGroups();

@@ -283,7 +282,7 @@
 		// covered days = 1

 		try {

 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,

-					currentDate, lastDate, currentPosition, username, lastUserId, 1);

+					currentDate, lastDate, lastUserId, username, lastUserId, 1);

 			assertNotNull(dto);

 		} catch (Exception e) {

 			assertNotNull(e);

@@ -294,7 +293,7 @@
 		lastDate = DateHelper.addDaysToDate(new Date(), 5);

 		try {

 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,

-					currentDate, lastDate, currentPosition, username, lastUserId, 1);

+					currentDate, lastDate, lastUserId, username, lastUserId, 1);

 			assertNotNull(dto);

 		} catch (Exception e) {

 			assertNotNull(e);

@@ -305,7 +304,7 @@
 			currentDate = DateHelper.addDaysToDate(new Date(), 1);

 			lastDate = DateHelper.addDaysToDate(new Date(), 1);

 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,

-					currentDate, lastDate, currentPosition, username, lastUserId, 1);

+					currentDate, lastDate, lastUserId, username, lastUserId, 1);

 			assertNotNull(dto);

 		} catch (Exception e) {

 			assertNotNull(e);

@@ -315,7 +314,7 @@
 		when(standbyDurationRepository.findDurationForValidFromDay(Mockito.any(), Mockito.any())).thenReturn(null);

 		try {

 			PlanningBodyResultDto dto = planningController.calculateScheduleBodyEntries(lsUserInStandbyGroup, startDate,

-					currentDate, lastDate, currentPosition, username, lastUserId, 1);

+					currentDate, lastDate, lastUserId, username, lastUserId, 1);

 			assertNotNull(dto);

 			assertTrue(

 					dto.getLsMsg().get(0).getMsg().contains("wurde kein aktiver Zeitraum für folgenden Tag gefunden"));