issue-20 #46
@ -3,12 +3,14 @@ package core.api.controller;
|
||||
|
||||
import core.api.models.auth.SimpleStatusResponse;
|
||||
import core.api.models.timemanager.taskSchedule.*;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.BasicScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.ScheduleFieldInfo;
|
||||
import core.entities.timemanager.AbstractSchedule;
|
||||
import core.entities.timemanager.BasicTaskSchedule;
|
||||
import core.entities.timemanager.Task;
|
||||
import core.services.*;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.security.core.context.SecurityContextHolder;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
@ -63,6 +65,9 @@ public class ScheduleController {
|
||||
if(scheduleFieldInfo instanceof BasicScheduleFieldInfo) {
|
||||
ServiceResult<AbstractSchedule> scheduleResult = taskScheduleService.scheduleBasic(permissionResult.getResult(), (BasicScheduleFieldInfo) scheduleFieldInfo);
|
||||
return ResponseEntity.ok(scheduleResult.getResult().toScheduleInfo());
|
||||
} else if(scheduleFieldInfo instanceof AdvancedScheduleFieldInfo) {
|
||||
ServiceResult<AbstractSchedule> scheduleResult = taskScheduleService.scheduleAdvanced(permissionResult.getResult(), (AdvancedScheduleFieldInfo) scheduleFieldInfo);
|
||||
return ResponseEntity.ok(scheduleResult.getResult().toScheduleInfo());
|
||||
} else {
|
||||
return ResponseEntity.status(400).body(new SimpleStatusResponse("failed"));
|
||||
}
|
||||
|
@ -1,4 +0,0 @@
|
||||
package core.api.models.timemanager.taskSchedule;
|
||||
|
||||
public abstract class ScheduleFieldInfo {
|
||||
}
|
@ -0,0 +1,36 @@
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
public class AdvancedScheduleFieldInfo extends ScheduleFieldInfo {
|
||||
|
||||
@NotNull
|
||||
private LocalDateTime scheduleStartTime;
|
||||
@NotNull
|
||||
private LocalDateTime scheduleStopTime;
|
||||
|
||||
public AdvancedScheduleFieldInfo(LocalDateTime scheduleStartTime, LocalDateTime scheduleStopTime) {
|
||||
this.scheduleStartTime = scheduleStartTime;
|
||||
this.scheduleStopTime = scheduleStopTime;
|
||||
}
|
||||
|
||||
public AdvancedScheduleFieldInfo() {
|
||||
}
|
||||
|
||||
public LocalDateTime getScheduleStartTime() {
|
||||
return scheduleStartTime;
|
||||
}
|
||||
|
||||
public void setScheduleStartTime(LocalDateTime scheduleStartTime) {
|
||||
this.scheduleStartTime = scheduleStartTime;
|
||||
}
|
||||
|
||||
public LocalDateTime getScheduleStopTime() {
|
||||
return scheduleStopTime;
|
||||
}
|
||||
|
||||
public void setScheduleStopTime(LocalDateTime scheduleStopTime) {
|
||||
this.scheduleStopTime = scheduleStopTime;
|
||||
}
|
||||
}
|
@ -0,0 +1,35 @@
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||
import core.entities.timemanager.Task;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
public class AdvancedScheduleInfo extends ScheduleInfo {
|
||||
|
||||
private LocalDateTime plannedStartTime;
|
||||
private LocalDateTime plannedStopTime;
|
||||
|
||||
public AdvancedScheduleInfo(long scheduleID, ScheduleType scheduleType, LocalDateTime startTime, LocalDateTime stopTime, int activeMinutes, Task task, List<TaskgroupEntityInfo> taskgroupPath, LocalDateTime plannedStartTime, LocalDateTime plannedStopTime) {
|
||||
super(scheduleID, scheduleType, startTime, stopTime, activeMinutes, task, taskgroupPath);
|
||||
this.plannedStartTime = plannedStartTime;
|
||||
this.plannedStopTime = plannedStopTime;
|
||||
}
|
||||
|
||||
public LocalDateTime getPlannedStartTime() {
|
||||
return plannedStartTime;
|
||||
}
|
||||
|
||||
public void setPlannedStartTime(LocalDateTime plannedStartTime) {
|
||||
this.plannedStartTime = plannedStartTime;
|
||||
}
|
||||
|
||||
public LocalDateTime getPlannedStopTime() {
|
||||
return plannedStopTime;
|
||||
}
|
||||
|
||||
public void setPlannedStopTime(LocalDateTime plannedStopTime) {
|
||||
this.plannedStopTime = plannedStopTime;
|
||||
}
|
||||
}
|
@ -1,4 +1,4 @@
|
||||
package core.api.models.timemanager.taskSchedule;
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDate;
|
@ -1,4 +1,4 @@
|
||||
package core.api.models.timemanager.taskSchedule;
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||
import core.entities.timemanager.Task;
|
@ -0,0 +1,4 @@
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
public abstract class ScheduleFieldInfo {
|
||||
}
|
@ -1,10 +1,9 @@
|
||||
package core.api.models.timemanager.taskSchedule;
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
import com.fasterxml.jackson.annotation.JsonProperty;
|
||||
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||
import core.api.models.timemanager.tasks.TaskShortInfo;
|
||||
import core.entities.timemanager.Task;
|
||||
import core.entities.timemanager.Taskgroup;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
@ -1,4 +1,4 @@
|
||||
package core.api.models.timemanager.taskSchedule;
|
||||
package core.api.models.timemanager.taskSchedule.scheduleInfos;
|
||||
|
||||
public enum ScheduleType {
|
||||
|
@ -1,10 +1,9 @@
|
||||
package core.entities.timemanager;
|
||||
|
||||
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.ScheduleInfo;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.Objects;
|
||||
|
||||
@ -109,4 +108,16 @@ public abstract class AbstractSchedule {
|
||||
}
|
||||
|
||||
public abstract boolean isMissed(LocalDateTime timeReference);
|
||||
|
||||
public int calcActiveMinutes() {
|
||||
if(startTime == null) {
|
||||
return 0;
|
||||
} else if(stopTime == null) {
|
||||
Duration duration = Duration.between(startTime, LocalDateTime.now());
|
||||
return (int) duration.toMinutes();
|
||||
} else {
|
||||
Duration duration = Duration.between(startTime, stopTime);
|
||||
return (int) duration.toMinutes();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,15 @@
|
||||
package core.entities.timemanager;
|
||||
|
||||
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.ScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.ScheduleType;
|
||||
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||
|
||||
import javax.persistence.DiscriminatorValue;
|
||||
import javax.persistence.Entity;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@DiscriminatorValue("1")
|
||||
public class AdvancedTaskSchedule extends AbstractSchedule {
|
||||
@ -12,13 +17,42 @@ public class AdvancedTaskSchedule extends AbstractSchedule {
|
||||
private LocalDateTime scheduleStart;
|
||||
private LocalDateTime scheduleEnd;
|
||||
|
||||
public AdvancedTaskSchedule(LocalDateTime scheduleStart, LocalDateTime scheduleEnd) {
|
||||
this.scheduleStart = scheduleStart;
|
||||
this.scheduleEnd = scheduleEnd;
|
||||
}
|
||||
|
||||
public AdvancedTaskSchedule(Task task, LocalDateTime startTime, LocalDateTime stopTime, LocalDateTime scheduleStart, LocalDateTime scheduleEnd) {
|
||||
super(task, startTime, stopTime);
|
||||
this.scheduleStart = scheduleStart;
|
||||
this.scheduleEnd = scheduleEnd;
|
||||
}
|
||||
|
||||
public AdvancedTaskSchedule(Task task, LocalDateTime startTime, LocalDateTime scheduleStart, LocalDateTime scheduleEnd) {
|
||||
super(task, startTime);
|
||||
this.scheduleStart = scheduleStart;
|
||||
this.scheduleEnd = scheduleEnd;
|
||||
}
|
||||
|
||||
public AdvancedTaskSchedule(Task task, LocalDateTime scheduleStart, LocalDateTime scheduleEnd) {
|
||||
super(task);
|
||||
this.scheduleStart = scheduleStart;
|
||||
this.scheduleEnd = scheduleEnd;
|
||||
}
|
||||
|
||||
public AdvancedTaskSchedule() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public ScheduleInfo toScheduleInfo() {
|
||||
return null;
|
||||
int activeMinutes = calcActiveMinutes();
|
||||
List<TaskgroupEntityInfo> taskgroupEntityInfos = Taskgroup.getAncestorList(task.getTaskgroup()).stream().map(TaskgroupEntityInfo::new).toList();
|
||||
return new AdvancedScheduleInfo(scheduleID, ScheduleType.ADVANCED, startTime, stopTime, activeMinutes, task, taskgroupEntityInfos, scheduleStart, scheduleEnd);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isMissed(LocalDateTime timeReference) {
|
||||
return false;
|
||||
return startTime == null && scheduleEnd.isBefore(timeReference);
|
||||
}
|
||||
}
|
||||
|
@ -1,17 +1,14 @@
|
||||
package core.entities.timemanager;
|
||||
|
||||
import core.api.models.timemanager.taskSchedule.BasicScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.ScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.ScheduleType;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.BasicScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.ScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.ScheduleType;
|
||||
import core.api.models.timemanager.taskgroup.TaskgroupEntityInfo;
|
||||
import core.api.models.timemanager.tasks.TaskEntityInfo;
|
||||
|
||||
import javax.persistence.*;
|
||||
import java.time.Duration;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
@Entity
|
||||
@DiscriminatorValue("0")
|
||||
@ -55,16 +52,4 @@ public class BasicTaskSchedule extends AbstractSchedule{
|
||||
public boolean isMissed(LocalDateTime timeReference) {
|
||||
return startTime == null && scheduleDate.isBefore(timeReference.toLocalDate());
|
||||
}
|
||||
|
||||
public int calcActiveMinutes() {
|
||||
if(startTime == null) {
|
||||
return 0;
|
||||
} else if(stopTime == null) {
|
||||
Duration duration = Duration.between(startTime, LocalDateTime.now());
|
||||
return (int) duration.toMinutes();
|
||||
} else {
|
||||
Duration duration = Duration.between(startTime, stopTime);
|
||||
return (int) duration.toMinutes();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,8 +1,11 @@
|
||||
package core.services;
|
||||
|
||||
import core.api.models.timemanager.taskSchedule.BasicScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.BasicScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.ForgottenScheduleInfo;
|
||||
import core.entities.timemanager.AbstractSchedule;
|
||||
import core.entities.timemanager.AdvancedTaskSchedule;
|
||||
import core.entities.timemanager.BasicTaskSchedule;
|
||||
import core.entities.timemanager.Task;
|
||||
import core.repositories.UserRepository;
|
||||
@ -41,6 +44,24 @@ public class TaskScheduleService {
|
||||
return new ServiceResult<>(basicTaskSchedule);
|
||||
}
|
||||
|
||||
public ServiceResult<AbstractSchedule> scheduleAdvanced(Task task, AdvancedScheduleFieldInfo scheduleFieldInfo) {
|
||||
LocalDate startDate = scheduleFieldInfo.getScheduleStartTime().toLocalDate();
|
||||
LocalDate endDate = scheduleFieldInfo.getScheduleStopTime().toLocalDate();
|
||||
|
||||
if(task.isFinished() || startDate.isBefore(LocalDate.now()) || endDate.isBefore(LocalDate.now())) {
|
||||
return new ServiceResult<>(ServiceExitCode.INVALID_OPERATION);
|
||||
}
|
||||
|
||||
if(scheduleFieldInfo.getScheduleStartTime().isAfter(scheduleFieldInfo.getScheduleStopTime())) {
|
||||
return new ServiceResult<>(ServiceExitCode.INVALID_PARAMETER);
|
||||
}
|
||||
|
||||
AdvancedTaskSchedule advancedTaskSchedule = new AdvancedTaskSchedule(task, scheduleFieldInfo.getScheduleStartTime(), scheduleFieldInfo.getScheduleStopTime());
|
||||
scheduleRepository.save(advancedTaskSchedule);
|
||||
|
||||
return new ServiceResult<>(advancedTaskSchedule);
|
||||
}
|
||||
|
||||
public PermissionResult<AbstractSchedule> getSchedulePermissions(long scheduleID, String username) {
|
||||
Optional<AbstractSchedule> abstractSchedule = scheduleRepository.findById(scheduleID);
|
||||
return abstractSchedule.map(schedule -> new PermissionResult<>(schedule, schedule.getTask().getTaskgroup().getUser().getUsername().equals(username))).orElseGet(() -> new PermissionResult<>(ServiceExitCode.MISSING_ENTITY));
|
||||
|
@ -1,16 +1,15 @@
|
||||
package core.schedules;
|
||||
|
||||
import core.api.models.timemanager.taskSchedule.BasicScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.BasicScheduleInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.AdvancedScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.scheduleInfos.BasicScheduleFieldInfo;
|
||||
import core.api.models.timemanager.taskSchedule.ForgottenScheduleInfo;
|
||||
import core.entities.timemanager.AbstractSchedule;
|
||||
import core.entities.timemanager.AdvancedTaskSchedule;
|
||||
import core.entities.timemanager.BasicTaskSchedule;
|
||||
import core.entities.timemanager.Task;
|
||||
import core.repositories.timemanager.TaskgroupRepository;
|
||||
import core.services.ServiceExitCode;
|
||||
import core.services.ServiceResult;
|
||||
import core.services.TaskScheduleService;
|
||||
import core.services.TaskgroupService;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
@ -234,4 +233,40 @@ public class ScheduleServiceTest {
|
||||
void getAllMissedSchedulesOfUser() {
|
||||
assertEquals(1, taskScheduleService.getAllMissedSchedulesOfUser(username).size());
|
||||
}
|
||||
|
||||
@Test
|
||||
@SqlGroup({
|
||||
@Sql("classpath:taskgroupRepositoryTestEntries.sql"),
|
||||
@Sql("classpath:taskRepositoryEntries.sql"),
|
||||
@Sql("classpath:basicScheduleEntries.sql")
|
||||
})
|
||||
void scheduleAdvanced() {
|
||||
//Situation 1: Schedule finished Task
|
||||
ServiceResult<AbstractSchedule> result_1 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 18L),
|
||||
new AdvancedScheduleFieldInfo(LocalDateTime.now().plusHours(1L), LocalDateTime.now().plusHours(2L)));
|
||||
assertEquals(ServiceExitCode.INVALID_OPERATION, result_1.getExitCode());
|
||||
|
||||
//Situation 2: Schedule Start is before today
|
||||
ServiceResult<AbstractSchedule> result_2 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
|
||||
new AdvancedScheduleFieldInfo(LocalDateTime.now().minusDays(1L), LocalDateTime.now().plusHours(2L)));
|
||||
assertEquals(ServiceExitCode.INVALID_OPERATION, result_2.getExitCode());
|
||||
|
||||
//Situation 3: Schedule End is before today
|
||||
ServiceResult<AbstractSchedule> result_3 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
|
||||
new AdvancedScheduleFieldInfo(LocalDateTime.now().minusDays(2L), LocalDateTime.now().minusDays(1L)));
|
||||
assertEquals(ServiceExitCode.INVALID_OPERATION, result_3.getExitCode());
|
||||
|
||||
//Situation 4: Start after stop
|
||||
ServiceResult<AbstractSchedule> result_4 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
|
||||
new AdvancedScheduleFieldInfo(LocalDateTime.now().plusHours(2L), LocalDateTime.now().plusHours(1L)));
|
||||
assertEquals(ServiceExitCode.INVALID_PARAMETER, result_4.getExitCode());
|
||||
|
||||
//Situation 5: Valid schedule
|
||||
ServiceResult<AbstractSchedule> result_5 = taskScheduleService.scheduleAdvanced(entityManager.find(Task.class, 17L),
|
||||
new AdvancedScheduleFieldInfo(LocalDateTime.now(), LocalDateTime.now().plusHours(1L)));
|
||||
assertEquals(ServiceExitCode.OK, result_5.getExitCode());
|
||||
assertThat(entityManager.find(AdvancedTaskSchedule.class, result_5.getResult().getScheduleID())).isNotNull();
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -5,4 +5,10 @@ VALUES (0, 1, null, null, '2010-11-11', 1, null, null),
|
||||
(0, 4, '2023-10-10', null, '2024-11-11', 3, null, null),
|
||||
(0, 5, null, null, '2024-11-11', 5, null, null),
|
||||
(0, 6, '2023-10-10', null, '2024-11-11', 16, null, null),
|
||||
(0, 7, '2023-10-10', null, '2024-11-11', 16, null, null);
|
||||
(0, 7, '2023-10-10', null, '2024-11-11', 16, null, null);
|
||||
|
||||
INSERT INTO abstract_schedule (schedule_type, scheduleid, start_time, stop_time, schedule_date, task, schedule_end, schedule_start)
|
||||
VALUES (1, 8, null, null, null, 16, '2023-11-15 12:30:00.000', '2023-11-15 14:45:30.500'),
|
||||
(1, 9, '2023-11-16 12:35:00.000', null, null, 17, '2023-11-16 12:30:00.000', '2023-11-16 14:45:30.500'),
|
||||
(1, 10, '2023-11-17 12:35:00.000', '2023-11-17 12:45:00.000', null, 17, '2023-11-16 12:30:00.000', '2023-11-16 14:45:30.500'),
|
||||
(1, 11, null, null, null, 17, '2010-11-16 12:30:00.000', '2010-11-16 14:45:30.500');
|
@ -18,4 +18,6 @@ INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, f
|
||||
INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (14, '2044-03-20', 0, '2022-03-20', 'Task 6', 2, true, 0);
|
||||
INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (15, NULL, 0, NULL, 'Task 15', 2, false, 0);
|
||||
|
||||
INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (16, NULL, 0, NULL, 'Task 15', 9, false, 0);
|
||||
INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (16, NULL, 0, NULL, 'Task 15', 9, false, 0);
|
||||
INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (17, NULL, 0, NULL, 'Task 17', 9, false, 0);
|
||||
INSERT INTO tasks (taskid, deadline, eta, start_date, task_name, taskgroup_id, finished, work_time) VALUES (18, NULL, 0, NULL, 'Task 17', 10, true, 0);
|
@ -12,4 +12,5 @@ INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (6,
|
||||
INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (7, 'Taskgroup 2.2', 5, 1);
|
||||
INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (8, 'Taskgroup 2.1.2', 6, 1);
|
||||
|
||||
INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (9, 'Taskgroup 1', null, 3);
|
||||
INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (9, 'Taskgroup 1', null, 3);
|
||||
INSERT INTO taskgroups (taskgroupid, name, parent_id, taskgroupuser) VALUES (10, 'Taskgroup 2', null, 3);
|
Loading…
Reference in New Issue
Block a user