issue-106 #107
@ -7,7 +7,6 @@ import java.time.LocalDate;
 | 
				
			|||||||
public class TaskRepeatDayInfo {
 | 
					public class TaskRepeatDayInfo {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private int offset;
 | 
					    private int offset;
 | 
				
			||||||
    private DeadlineStrategy deadlineStrategy;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
 | 
				
			||||||
    private LocalDate endingDate;
 | 
					    private LocalDate endingDate;
 | 
				
			||||||
@ -20,14 +19,6 @@ public class TaskRepeatDayInfo {
 | 
				
			|||||||
        this.offset = offset;
 | 
					        this.offset = offset;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public DeadlineStrategy getDeadlineStrategy() {
 | 
					 | 
				
			||||||
        return deadlineStrategy;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setDeadlineStrategy(DeadlineStrategy deadlineStrategy) {
 | 
					 | 
				
			||||||
        this.deadlineStrategy = deadlineStrategy;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public LocalDate getEndingDate() {
 | 
					    public LocalDate getEndingDate() {
 | 
				
			||||||
        return endingDate;
 | 
					        return endingDate;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -15,7 +15,6 @@ public class TaskRepeatWeekInfo {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    @Size(min = 1, max = 7)
 | 
					    @Size(min = 1, max = 7)
 | 
				
			||||||
    private List<TaskRepeatWeekDayInfo> weekDayInfos;
 | 
					    private List<TaskRepeatWeekDayInfo> weekDayInfos;
 | 
				
			||||||
    private DeadlineStrategy deadlineStrategy;
 | 
					 | 
				
			||||||
    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
 | 
					    @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX")
 | 
				
			||||||
    private LocalDate endDate;
 | 
					    private LocalDate endDate;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -26,15 +25,6 @@ public class TaskRepeatWeekInfo {
 | 
				
			|||||||
    public void setWeekDayInfos(List<TaskRepeatWeekDayInfo> weekDayInfos) {
 | 
					    public void setWeekDayInfos(List<TaskRepeatWeekDayInfo> weekDayInfos) {
 | 
				
			||||||
        this.weekDayInfos = weekDayInfos;
 | 
					        this.weekDayInfos = weekDayInfos;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public DeadlineStrategy getDeadlineStrategy() {
 | 
					 | 
				
			||||||
        return deadlineStrategy;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void setDeadlineStrategy(DeadlineStrategy deadlineStrategy) {
 | 
					 | 
				
			||||||
        this.deadlineStrategy = deadlineStrategy;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public LocalDate getEndDate() {
 | 
					    public LocalDate getEndDate() {
 | 
				
			||||||
        return endDate;
 | 
					        return endDate;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
@ -88,25 +88,16 @@ public class Task {
 | 
				
			|||||||
       return new Tripel<>(clonedTask, clonedTasks, clonedSchedules);
 | 
					       return new Tripel<>(clonedTask, clonedTasks, clonedSchedules);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public void shiftTask(long startingDayDifference, long endingDayDifference) {
 | 
					    public void shiftTask(long offset) {
 | 
				
			||||||
       this.setStartDate(this.getStartDate().plusDays(startingDayDifference));
 | 
					       this.setStartDate(this.getStartDate().plusDays(offset));
 | 
				
			||||||
       this.setDeadline(this.getDeadline().plusDays(endingDayDifference));
 | 
					       this.setDeadline(this.getDeadline().plusDays(offset));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       for(AbstractSchedule abstractSchedule : this.basicTaskSchedules) {
 | 
					       for(AbstractSchedule abstractSchedule : this.basicTaskSchedules) {
 | 
				
			||||||
           abstractSchedule.shiftSchedule(startingDayDifference);
 | 
					           abstractSchedule.shiftSchedule(offset);
 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
       for(Task subtask: this.subtasks) {
 | 
					       for(Task subtask: this.subtasks) {
 | 
				
			||||||
           subtask.shiftTask(startingDayDifference, endingDayDifference);
 | 
					           subtask.shiftTask(offset);
 | 
				
			||||||
       }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void shiftTask(long startingDayDifference) {
 | 
					 | 
				
			||||||
        this.setStartDate(this.getStartDate().plusDays(startingDayDifference));
 | 
					 | 
				
			||||||
        this.setDeadline(this.getStartDate());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        for(Task subtask: this.subtasks) {
 | 
					 | 
				
			||||||
            subtask.shiftTask(startingDayDifference);
 | 
					 | 
				
			||||||
       }
 | 
					       }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -299,11 +290,4 @@ public class Task {
 | 
				
			|||||||
    public void increaseWorkTime(long minutes) {
 | 
					    public void increaseWorkTime(long minutes) {
 | 
				
			||||||
        this.workTime += (int) minutes;
 | 
					        this.workTime += (int) minutes;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					 | 
				
			||||||
    public void shiftStartingTask(long dayDifference) {
 | 
					 | 
				
			||||||
        this.setStartDate(this.getStartDate().plusDays(dayDifference));
 | 
					 | 
				
			||||||
        for (Task subtask : this.subtasks) {
 | 
					 | 
				
			||||||
            subtask.shiftTask(dayDifference);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -29,13 +29,13 @@ public class TaskSeriesService {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public ServiceExitCode createTaskSeries(TaskRepeatWeekInfo taskRepeatInfo) {
 | 
					    public ServiceExitCode createTaskSeries(TaskRepeatWeekInfo taskRepeatInfo) {
 | 
				
			||||||
        HashMap<Task, Tupel<Integer, Integer>> offsetMap = calcWeeklyOffsetMap(taskRepeatInfo);
 | 
					        HashMap<Task, Integer> offsetMap = calcWeeklyOffsetMap(taskRepeatInfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        TaskSerie taskSerie = new TaskSerie();
 | 
					        TaskSerie taskSerie = new TaskSerie();
 | 
				
			||||||
        List<Task> clonedTasks = new ArrayList<>();
 | 
					        List<Task> clonedTasks = new ArrayList<>();
 | 
				
			||||||
        List<AbstractSchedule> clonedSchedules = new ArrayList<>();
 | 
					        List<AbstractSchedule> clonedSchedules = new ArrayList<>();
 | 
				
			||||||
        int weekDayIndex = 0;
 | 
					        int weekDayIndex = 0;
 | 
				
			||||||
        for(Map.Entry<Task, Tupel<Integer, Integer>> repeatingTaskInfo: offsetMap.entrySet()) {
 | 
					        for(Map.Entry<Task, Integer> repeatingTaskInfo: offsetMap.entrySet()) {
 | 
				
			||||||
            Task rootTask = repeatingTaskInfo.getKey();
 | 
					            Task rootTask = repeatingTaskInfo.getKey();
 | 
				
			||||||
            TaskSerieItem rootItem = new TaskSerieItem(rootTask, weekDayIndex);
 | 
					            TaskSerieItem rootItem = new TaskSerieItem(rootTask, weekDayIndex);
 | 
				
			||||||
            taskSerie.addItem(rootItem);
 | 
					            taskSerie.addItem(rootItem);
 | 
				
			||||||
@ -58,11 +58,11 @@ public class TaskSeriesService {
 | 
				
			|||||||
        return ServiceExitCode.OK;
 | 
					        return ServiceExitCode.OK;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private Tupel<Collection<Task>, Collection<AbstractSchedule>> repeatTask(Task rootTask, LocalDate endingDate, HashMap<Task, Tupel<Integer, Integer>> offsetMap,TaskSerie taskSerie, int itemIndex) {
 | 
					    private Tupel<Collection<Task>, Collection<AbstractSchedule>> repeatTask(Task rootTask, LocalDate endingDate, HashMap<Task, Integer> offsetMap,TaskSerie taskSerie, int itemIndex) {
 | 
				
			||||||
        List<Task> clonedTasks = new ArrayList<>();
 | 
					        List<Task> clonedTasks = new ArrayList<>();
 | 
				
			||||||
        List<AbstractSchedule> clonedSchedules = new ArrayList<>();
 | 
					        List<AbstractSchedule> clonedSchedules = new ArrayList<>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        LocalDate currentDate = rootTask.getStartDate().plusDays(offsetMap.get(rootTask).getValue00());
 | 
					        LocalDate currentDate = rootTask.getStartDate().plusDays(offsetMap.get(rootTask));
 | 
				
			||||||
        while(currentDate.isBefore(endingDate)) {
 | 
					        while(currentDate.isBefore(endingDate)) {
 | 
				
			||||||
            var cloneResult = rootTask.cloneTask();
 | 
					            var cloneResult = rootTask.cloneTask();
 | 
				
			||||||
            Task clonedRootTask = cloneResult.getValue00();
 | 
					            Task clonedRootTask = cloneResult.getValue00();
 | 
				
			||||||
@ -74,87 +74,52 @@ public class TaskSeriesService {
 | 
				
			|||||||
                taskSerie.addItem(item);
 | 
					                taskSerie.addItem(item);
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            Tupel<Integer, Integer> offsetEntry = offsetMap.get(rootTask);
 | 
					            clonedRootTask.shiftTask(offsetMap.get(rootTask));
 | 
				
			||||||
            clonedRootTask.shiftTask(offsetEntry.getValue00(), offsetEntry.getValue01());
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
            currentDate = currentDate.plusDays(offsetEntry.getValue00());
 | 
					            currentDate = currentDate.plusDays(offsetMap.get(rootTask));
 | 
				
			||||||
            itemIndex += offsetMap.size();
 | 
					            itemIndex += offsetMap.size();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new Tupel<>(clonedTasks, clonedSchedules);
 | 
					        return new Tupel<>(clonedTasks, clonedSchedules);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private HashMap<Task, Tupel<Integer, Integer>> calcWeeklyOffsetMap(TaskRepeatWeekInfo weekInfo) throws NoSuchElementException {
 | 
					    private HashMap<Task, Integer> calcWeeklyOffsetMap(TaskRepeatWeekInfo weekInfo) throws NoSuchElementException {
 | 
				
			||||||
        HashMap<Task, Tupel<Integer, Integer>> offsetMap = new HashMap<>();
 | 
					        HashMap<Task,Integer> offsetMap = new HashMap<>();
 | 
				
			||||||
        weekInfo.getWeekDayInfos().sort(Comparator.comparing(TaskRepeatWeekDayInfo::getDayOfWeek));
 | 
					        weekInfo.getWeekDayInfos().sort(Comparator.comparing(TaskRepeatWeekDayInfo::getDayOfWeek));
 | 
				
			||||||
        for(int i=0; i<weekInfo.getWeekDayInfos().size(); i++) {
 | 
					        for(int i=0; i<weekInfo.getWeekDayInfos().size(); i++) {
 | 
				
			||||||
            Optional<Task> requestedTask = taskRepository.findById(weekInfo.getWeekDayInfos().get(i).getTaskID());
 | 
					            Optional<Task> requestedTask = taskRepository.findById(weekInfo.getWeekDayInfos().get(i).getTaskID());
 | 
				
			||||||
            if(requestedTask.isEmpty()) {
 | 
					            if(requestedTask.isEmpty()) {
 | 
				
			||||||
                throw new NoSuchElementException();
 | 
					                throw new NoSuchElementException();
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                if(weekInfo.getDeadlineStrategy() == DeadlineStrategy.DEADLINE_EQUAL_START) {
 | 
					 | 
				
			||||||
                int offset = weekInfo.getWeekDayInfos().get(i).getOffset()-1;
 | 
					                int offset = weekInfo.getWeekDayInfos().get(i).getOffset()-1;
 | 
				
			||||||
                    offsetMap.put(requestedTask.get(), new Tupel<>(offset, offset));
 | 
					                offsetMap.put(requestedTask.get(), offset);
 | 
				
			||||||
                } else {
 | 
					 | 
				
			||||||
                    int startingOffset = weekInfo.getWeekDayInfos().get(i).getOffset() -1;
 | 
					 | 
				
			||||||
                    int endingOffset = getEndingOffset(weekInfo, i, startingOffset);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                    offsetMap.put(requestedTask.get(), new Tupel<>(startingOffset, endingOffset));
 | 
					 | 
				
			||||||
                }
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        return offsetMap;
 | 
					        return offsetMap;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private static int getEndingOffset(TaskRepeatWeekInfo weekInfo, int i, int startingOffset) {
 | 
					 | 
				
			||||||
        DayOfWeek nextWeekday;
 | 
					 | 
				
			||||||
        if(i == weekInfo.getWeekDayInfos().size()-1) {
 | 
					 | 
				
			||||||
            nextWeekday = weekInfo.getWeekDayInfos().get(0).getDayOfWeek();
 | 
					 | 
				
			||||||
        } else {
 | 
					 | 
				
			||||||
            nextWeekday = weekInfo.getWeekDayInfos().get(i +1).getDayOfWeek();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        DayOfWeek currentWeekDay = weekInfo.getWeekDayInfos().get(i).getDayOfWeek();
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        int endingOffset = startingOffset + Math.abs(nextWeekday.getValue() - currentWeekDay.getValue());
 | 
					 | 
				
			||||||
        return endingOffset;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public ServiceExitCode createTaskSeries(Task rootTask, TaskRepeatDayInfo taskRepeatInfo) {
 | 
					    public ServiceExitCode createTaskSeries(Task rootTask, TaskRepeatDayInfo taskRepeatInfo) {
 | 
				
			||||||
        if(taskRepeatInfo.getDeadlineStrategy() == DeadlineStrategy.FIX_DEADLINE) {
 | 
					 | 
				
			||||||
            return ServiceExitCode.INVALID_PARAMETER;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        List<Task> taskList = new ArrayList<>();
 | 
					 | 
				
			||||||
        List<AbstractSchedule> abstractSchedules = new ArrayList<>();
 | 
					 | 
				
			||||||
        TaskSerie taskSerie = new TaskSerie();
 | 
					        TaskSerie taskSerie = new TaskSerie();
 | 
				
			||||||
        TaskSerieItem rootItem = taskSerie.addTask(rootTask);
 | 
					        TaskSerieItem rootItem = taskSerie.addTask(rootTask);
 | 
				
			||||||
        rootTask.setTaskSerieItem(rootItem);
 | 
					        rootTask.setTaskSerieItem(rootItem);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        HashMap<Task, Integer> offsetMap = new HashMap<>();
 | 
				
			||||||
 | 
					        offsetMap.put(rootTask, taskRepeatInfo.getOffset());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var repeatingResult = repeatTask(rootTask, taskRepeatInfo.getEndingDate(), offsetMap, taskSerie, 0);
 | 
				
			||||||
 | 
					        List<Task> clonedTasks = new ArrayList<>(repeatingResult.getValue00());
 | 
				
			||||||
 | 
					        List<AbstractSchedule> clonedSchedules = new ArrayList<>(repeatingResult.getValue01());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        taskSeriesRepository.save(taskSerie);
 | 
					        taskSeriesRepository.save(taskSerie);
 | 
				
			||||||
        taskRepository.saveAll(taskList);
 | 
					        taskRepository.saveAll(clonedTasks);
 | 
				
			||||||
        taskSerieItemRepository.saveAll(taskSerie.getTasks());
 | 
					        taskSerieItemRepository.saveAll(taskSerie.getTasks());
 | 
				
			||||||
        scheduleRepository.saveAll(abstractSchedules);
 | 
					        scheduleRepository.saveAll(clonedSchedules);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return ServiceExitCode.OK;
 | 
					        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) {
 | 
					    public void deleteTaskSeriesItem(Task task) {
 | 
				
			||||||
        TaskSerieItem item = task.getTaskSerieItem();
 | 
					        TaskSerieItem item = task.getTaskSerieItem();
 | 
				
			||||||
        TaskSerie taskSerie = task.getTaskSerieItem().getTaskSerie();
 | 
					        TaskSerie taskSerie = task.getTaskSerieItem().getTaskSerie();
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user