Clone Schedules when Repeating Tasks
All checks were successful
Java CI with Maven / build-and-push-frontend (push) Successful in 7s
Java CI with Maven / build-and-push-backend (push) Successful in 7s

This commit is contained in:
Sebastian Böckelmann 2024-03-16 10:09:38 +01:00
parent e7283c030d
commit e58e6addb9
4 changed files with 50 additions and 4 deletions

View File

@ -124,4 +124,8 @@ public abstract class AbstractSchedule {
return (int) duration.toMinutes();
}
}
public abstract AbstractSchedule cloneSchedule();
public abstract void shiftSchedule(long numberDays);
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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<Task> createdTasks = new ArrayList<>();
TaskSerie taskSerie = new TaskSerie();
List<AbstractSchedule> abstractSchedules = new ArrayList<>();
for(TaskRepeatWeekDayInfo taskRepeatDayInfo : taskRepeatInfo.getWeekDayInfos()) {
Optional<Task> 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<Task> taskList = new ArrayList<>();
List<AbstractSchedule> 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<AbstractSchedule> cloneSchedules(Task previousTask, Task nextTask) {
long numberDays = ChronoUnit.DAYS.between(previousTask.getStartDate(), nextTask.getStartDate());
List<AbstractSchedule> 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();