From e58e6addb9abd32432e50d4a72d04e14b032d775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 16 Mar 2024 10:09:38 +0100 Subject: [PATCH] Clone Schedules when Repeating Tasks --- .../timemanager/AbstractSchedule.java | 4 +++ .../timemanager/AdvancedTaskSchedule.java | 11 +++++++ .../timemanager/BasicTaskSchedule.java | 10 +++++++ .../java/core/services/TaskSeriesService.java | 29 ++++++++++++++++--- 4 files changed, 50 insertions(+), 4 deletions(-) diff --git a/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java b/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java index f7f4de1..a903c23 100644 --- a/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java +++ b/backend/src/main/java/core/entities/timemanager/AbstractSchedule.java @@ -124,4 +124,8 @@ public abstract class AbstractSchedule { return (int) duration.toMinutes(); } } + + public abstract AbstractSchedule cloneSchedule(); + + public abstract void shiftSchedule(long numberDays); } diff --git a/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java b/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java index 2289c09..91f1d7c 100644 --- a/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java +++ b/backend/src/main/java/core/entities/timemanager/AdvancedTaskSchedule.java @@ -71,4 +71,15 @@ public class AdvancedTaskSchedule extends AbstractSchedule { public boolean isMissed(LocalDateTime timeReference) { return startTime == null && scheduleEnd.toLocalDate().isBefore(timeReference.toLocalDate()); } + + @Override + public AbstractSchedule cloneSchedule() { + return new AdvancedTaskSchedule(this.task, this.scheduleStart, this.scheduleEnd); + } + + @Override + public void shiftSchedule(long numberDays) { + this.scheduleStart = this.scheduleStart.plusDays(numberDays); + this.scheduleEnd = this.scheduleEnd.plusDays(numberDays); + } } diff --git a/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java b/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java index fe6a393..07e13d5 100644 --- a/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java +++ b/backend/src/main/java/core/entities/timemanager/BasicTaskSchedule.java @@ -52,4 +52,14 @@ public class BasicTaskSchedule extends AbstractSchedule{ public boolean isMissed(LocalDateTime timeReference) { return startTime == null && scheduleDate.isBefore(timeReference.toLocalDate()); } + + @Override + public AbstractSchedule cloneSchedule() { + return new BasicTaskSchedule(this.task, this.scheduleDate); + } + + @Override + public void shiftSchedule(long numberDays) { + this.scheduleDate = this.scheduleDate.plusDays(numberDays); + } } diff --git a/backend/src/main/java/core/services/TaskSeriesService.java b/backend/src/main/java/core/services/TaskSeriesService.java index ac7bb54..7f1eb85 100644 --- a/backend/src/main/java/core/services/TaskSeriesService.java +++ b/backend/src/main/java/core/services/TaskSeriesService.java @@ -4,10 +4,8 @@ import core.api.models.timemanager.tasks.repeatinginfo.DeadlineStrategy; import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatDayInfo; import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatWeekDayInfo; import core.api.models.timemanager.tasks.repeatinginfo.TaskRepeatWeekInfo; -import core.entities.timemanager.Task; -import core.entities.timemanager.TaskSerie; -import core.entities.timemanager.TaskSerieItem; -import core.entities.timemanager.Taskgroup; +import core.entities.timemanager.*; +import core.repositories.timemanager.ScheduleRepository; import core.repositories.timemanager.TaskRepository; import core.repositories.timemanager.TaskSerieItemRepository; import core.repositories.timemanager.TaskSeriesRepository; @@ -16,6 +14,7 @@ import org.springframework.stereotype.Service; import java.time.Duration; import java.time.LocalDate; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Comparator; import java.util.List; @@ -27,11 +26,14 @@ public class TaskSeriesService { @Autowired private TaskRepository taskRepository; @Autowired private TaskSeriesRepository taskSeriesRepository; @Autowired private TaskSerieItemRepository taskSerieItemRepository; + @Autowired private ScheduleRepository scheduleRepository; public ServiceExitCode createTaskSeries(TaskRepeatWeekInfo taskRepeatInfo) { List createdTasks = new ArrayList<>(); TaskSerie taskSerie = new TaskSerie(); + List abstractSchedules = new ArrayList<>(); + for(TaskRepeatWeekDayInfo taskRepeatDayInfo : taskRepeatInfo.getWeekDayInfos()) { Optional task = taskRepository.findById(taskRepeatDayInfo.getTaskID()); if(task.isEmpty()) return ServiceExitCode.MISSING_ENTITY; @@ -48,6 +50,7 @@ public class TaskSeriesService { clonedTask.setTaskSerieItem(taskSerieItem); createdTasks.add(clonedTask); + abstractSchedules.addAll(cloneSchedules(task.get(), clonedTask)); currentTaskDate = currentTaskDate.plusDays(taskRepeatDayInfo.getOffset()); } } @@ -75,6 +78,7 @@ public class TaskSeriesService { taskSeriesRepository.save(taskSerie); taskRepository.saveAll(createdTasks); taskSerieItemRepository.saveAll(taskSerie.getTasks()); + scheduleRepository.saveAll(abstractSchedules); return ServiceExitCode.OK; } @@ -85,6 +89,7 @@ public class TaskSeriesService { } List taskList = new ArrayList<>(); + List abstractSchedules = new ArrayList<>(); TaskSerie taskSerie = new TaskSerie(); TaskSerieItem rootItem = taskSerie.addTask(rootTask); rootTask.setTaskSerieItem(rootItem); @@ -101,16 +106,32 @@ public class TaskSeriesService { TaskSerieItem taskSerieItem = taskSerie.addTask(task); taskList.add(task); task.setTaskSerieItem(taskSerieItem); + + abstractSchedules.addAll(cloneSchedules(rootTask, task)); currentTaskDate = currentTaskDate.plusDays(taskRepeatInfo.getOffset()); } taskSeriesRepository.save(taskSerie); taskRepository.saveAll(taskList); taskSerieItemRepository.saveAll(taskSerie.getTasks()); + scheduleRepository.saveAll(abstractSchedules); return ServiceExitCode.OK; } + public List cloneSchedules(Task previousTask, Task nextTask) { + long numberDays = ChronoUnit.DAYS.between(previousTask.getStartDate(), nextTask.getStartDate()); + + List clonedSchedules = new ArrayList<>(); + for(AbstractSchedule abstractSchedule : previousTask.getBasicTaskSchedules()) { + AbstractSchedule clonedSchedule = abstractSchedule.cloneSchedule(); + clonedSchedule.shiftSchedule(numberDays); + + clonedSchedules.add(clonedSchedule); + } + return clonedSchedules; + } + public void deleteTaskSeriesItem(Task task) { TaskSerieItem item = task.getTaskSerieItem(); TaskSerie taskSerie = task.getTaskSerieItem().getTaskSerie();