BP-738, fix error of calculating when start phase is between duration start and end
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 1af8f6c..117a79b 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
@@ -821,6 +821,40 @@
}
/**
+ * Method to get a list of {@link StandbyDuration} where the time is around the
+ * searched date. startOfDuration <= searchedDate <= endDate
+ *
+ * @param group
+ * @param date
+ * @return null if no fitting duration is available
+ */
+ public List<StandbyDuration> getFittingDurationsAroundDate(StandbyGroup group, Date date) {
+ int dayOfWeek = DateHelper.getDayOfWeek(date);
+ List<StandbyDuration> lsFittingDurations = new ArrayList<>();
+ List<StandbyDuration> lsDurations = standbyDurationRepository.findById(group.getId());
+ for (StandbyDuration dur : lsDurations) {
+ if (dur.getValidDayFrom() == dur.getValidDayTo() && dayOfWeek == dur.getValidDayFrom()) {
+ // start - end and current are equal
+ lsFittingDurations.add(dur);
+ } else if (dur.getValidDayFrom() <= dayOfWeek && dayOfWeek <= dur.getValidDayTo()) {
+ // start <= current <= end
+ lsFittingDurations.add(dur);
+ } else if (dur.getValidDayFrom() > dur.getValidDayTo()) {
+ // start > end
+ int calcValue = dayOfWeek;
+ if (dur.getValidDayFrom() > dayOfWeek) {
+ // AND start > current
+ calcValue = dayOfWeek + 7;
+ }
+ if (dur.getValidDayFrom() <= calcValue && calcValue <= (dur.getValidDayTo() + 7)) {
+ lsFittingDurations.add(dur);
+ }
+ }
+ }
+ return lsFittingDurations;
+ }
+
+ /**
* Method to set the currentPosition to 0 if end of list is reached.
*
* @param currentPosition
@@ -1313,7 +1347,7 @@
StandbyGroup group, Date startDate, Date currentDate) {
// Only at the start of a new phase the ending durations have to be used, too.
if (startDate.equals(currentDate)) {
- List<StandbyDuration> lsFittingDurationsEndingAtStart = this.getFittingDurationsByValidTo(group,
+ List<StandbyDuration> lsFittingDurationsEndingAtStart = this.getFittingDurationsAroundDate(group,
currentDate);
if (lsFittingDurationsEndingAtStart != null && !lsFittingDurationsEndingAtStart.isEmpty()) {
for (StandbyDuration dur : lsFittingDurationsEndingAtStart) {
@@ -1325,7 +1359,7 @@
// only durations should be added that start at least one day before and their
// ending at the phase start
StandbyDuration tmpDuration = dur.copy();
- tmpDuration.setValidFrom(DateHelper.getStartOfDay(dur.getValidTo()));
+ tmpDuration.setValidFrom(DateHelper.getStartOfDay(currentDate));
tmpDuration.setValidDayFrom(dur.getValidDayTo());
lsFittingDurations.add(tmpDuration);
}
diff --git a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/db/dao/StandbyDurationRepository.java b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/db/dao/StandbyDurationRepository.java
index 1ca7ac4..8d03de8 100644
--- a/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/db/dao/StandbyDurationRepository.java
+++ b/oKBereitschaftsplanungBackend/src/main/java/org/eclipse/openk/sp/db/dao/StandbyDurationRepository.java
@@ -35,4 +35,10 @@
+ "ORDER BY dur.validTo ASC")
public List<StandbyDuration> findDurationForValidToDay(@Param("groupId") Long groupId,
@Param("validToDay") Integer validToDay);
+
+ @Query(value = "SELECT dur FROM StandbyDuration dur WHERE (dur.standbyGroup.id = :groupId AND "
+ + "( (dur.validDayTo >= :validDay AND dur.validDayFrom <= :validDay) "
+ + "OR (dur.validDayFrom >= dur.validDayTo AND :validDay <= dur.validTo AND :validDay >= dur.validFrom))) ORDER BY dur.validTo ASC")
+ public List<StandbyDuration> findDurationsAroundValidDay(@Param("groupId") Long groupId,
+ @Param("validDay") Integer validDay);
}
\ No newline at end of file