diff --git a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java index 25da0039b2fdf5a22fdb15e045f159538c92b1a1..899be996f1c0d27fd274c0fd5664b4474bbe658f 100644 --- a/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java +++ b/src/main/java/org/olat/course/nodes/appointments/ui/AppointmentsPeekViewController.java @@ -119,21 +119,10 @@ public class AppointmentsPeekViewController extends BasicController { return null; } - private Optional<Appointment> getNextAppointment(List<Appointment> loadedAppointments) { - List<Appointment> appointments = new ArrayList<>(loadedAppointments.size()); + private Optional<Appointment> getNextAppointment(List<Appointment> appointments) { Date now = new Date(); - for (Appointment appointment: loadedAppointments) { - Date begin = appointment.getStart(); - Date end = appointment.getEnd(); - Date ajustedEnd = new Date(end.getTime()); - if (DateUtils.isSameDate(begin, end) && DateUtils.isSameTime(begin, end)) { - ajustedEnd = DateUtils.setTime(ajustedEnd, 23, 59, 59); - } - if (now.before(ajustedEnd)) { - appointments.add(appointment); - } - } Optional<Appointment> appointment = appointments.stream() + .filter(a -> appointmentsService.isEndAfter(a, now)) .sorted((a1, a2) -> a1.getStart().compareTo(a2.getStart())) .limit(1) .findFirst(); diff --git a/src/main/java/org/olat/modules/appointments/AppointmentsService.java b/src/main/java/org/olat/modules/appointments/AppointmentsService.java index 43337edf99571978647d1f319a40e5470403e41f..3b7c7d3f966950c2a53a55888a7843fdc574498b 100644 --- a/src/main/java/org/olat/modules/appointments/AppointmentsService.java +++ b/src/main/java/org/olat/modules/appointments/AppointmentsService.java @@ -20,6 +20,7 @@ package org.olat.modules.appointments; import java.util.Collection; +import java.util.Date; import java.util.List; import java.util.Map; @@ -101,6 +102,16 @@ public interface AppointmentsService { public void deleteAppointment(Appointment appointment); + /** + * Checks whether the end of the appointment is after the due date. + * It respects full day events. + * + * @param appointment + * @param dueDate + * @return + */ + public boolean isEndAfter(Appointment appointment, Date dueDate); + /** * Gets the key of the topic and the according count of appointments. * diff --git a/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java b/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java index 3489742990b012333f66a5fac7d7959044b7313b..3e554d39e79764922ccdb29e0677917f0b0d7e6b 100644 --- a/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java +++ b/src/main/java/org/olat/modules/appointments/manager/AppointmentsServiceImpl.java @@ -40,6 +40,7 @@ import org.olat.core.commons.services.notifications.NotificationsManager; import org.olat.core.commons.services.notifications.PublisherData; import org.olat.core.commons.services.notifications.SubscriptionContext; import org.olat.core.id.Identity; +import org.olat.core.util.DateUtils; import org.olat.core.util.StringHelper; import org.olat.course.CourseFactory; import org.olat.course.ICourse; @@ -434,6 +435,17 @@ public class AppointmentsServiceImpl implements AppointmentsService { appointmentDao.delete(appointment); } + @Override + public boolean isEndAfter(Appointment appointment, Date dueDate) { + Date begin = appointment.getStart(); + Date end = appointment.getEnd(); + Date ajustedEnd = new Date(end.getTime()); + if (DateUtils.isSameDate(begin, end) && DateUtils.isSameTime(begin, end)) { + ajustedEnd = DateUtils.setTime(ajustedEnd, 23, 59, 59); + } + return ajustedEnd.after(dueDate); + } + @Override public Map<Long, Long> getTopicKeyToAppointmentCount(AppointmentSearchParams params, boolean freeOnly) { return appointmentDao.loadTopicKeyToAppointmentCount(params, freeOnly); diff --git a/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java b/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java index 3758190dff11a9775aa3d246c0f8e06b3fc4358d..719fa9c6a7af41d5de407ed7e917b86f58054bf7 100644 --- a/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java +++ b/src/main/java/org/olat/modules/appointments/ui/TopicsRunCoachController.java @@ -221,7 +221,7 @@ public class TopicsRunCoachController extends BasicController { } else { nextAppointment = appointments.stream() .filter(a -> Appointment.Status.confirmed == a.getStatus()) - .filter(a1 -> now.before(a1.getEnd())) + .filter(a -> appointmentsService.isEndAfter(a, now)) .sorted((a1, a2) -> a1.getStart().compareTo(a2.getStart())) .findFirst(); } diff --git a/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java b/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java index 9b48ca6135646d0fc99a075dfb4d95bf40db8181..4357e20c6827ebf1527f3e0cff3e7bc53e96cbbb 100644 --- a/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java +++ b/src/main/java/org/olat/modules/appointments/ui/TopicsRunController.java @@ -236,7 +236,7 @@ public class TopicsRunController extends BasicController implements Activateable Date now = new Date(); Optional<Appointment> nextAppointment = myTopicParticipations.stream() .map(Participation::getAppointment) - .filter(a1 -> now.before(a1.getEnd())) + .filter(a -> appointmentsService.isEndAfter(a, now)) .sorted((a1, a2) -> a1.getStart().compareTo(a2.getStart())) .findFirst(); Appointment appointment = nextAppointment.isPresent() diff --git a/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java b/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java index 992c455d951182197907d1114e4cd7a5ebd438ae..2a840936e8eaae057215e2b6f27f1e7d5c0266af 100644 --- a/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java +++ b/src/test/java/org/olat/modules/appointments/AppointmentsServiceTest.java @@ -76,6 +76,25 @@ public class AppointmentsServiceTest extends OlatTestCase { organizerDelete); } + @Test + public void shouldCheckEndAfterDueDate() { + Appointment appointment = sut.createUnsavedAppointment(null); + appointment.setStart(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime()); + appointment.setEnd(new GregorianCalendar(2020, 2, 3, 11, 0, 0).getTime()); + assertThat(sut.isEndAfter(appointment, new GregorianCalendar(2020, 2, 3, 12, 0, 0).getTime())).isFalse(); + + appointment = sut.createUnsavedAppointment(null); + appointment.setStart(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime()); + appointment.setEnd(new GregorianCalendar(2020, 2, 3, 14, 0, 0).getTime()); + assertThat(sut.isEndAfter(appointment, new GregorianCalendar(2020, 2, 3, 12, 0, 0).getTime())).isTrue(); + + // full day + appointment = sut.createUnsavedAppointment(null); + appointment.setStart(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime()); + appointment.setEnd(new GregorianCalendar(2020, 2, 3, 10, 0, 0).getTime()); + assertThat(sut.isEndAfter(appointment, new GregorianCalendar(2020, 2, 3, 12, 0, 0).getTime())).isTrue(); + } + @Test public void createParticipationShouldCreateParticiption() { Identity participant1 = JunitTestHelper.createAndPersistIdentityAsRndUser("ap");