package org.synyx.urlaubsverwaltung.restapi.availability; import org.joda.time.DateMidnight; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.synyx.urlaubsverwaltung.core.application.domain.Application; import org.synyx.urlaubsverwaltung.core.application.domain.ApplicationStatus; import org.synyx.urlaubsverwaltung.core.application.service.ApplicationService; import org.synyx.urlaubsverwaltung.core.person.Person; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; /** * @author Timo Eifler - eifler@synyx.de */ @Service class VacationAbsenceProvider extends AbstractTimedAbsenceProvider { private ApplicationService applicationService; @Autowired VacationAbsenceProvider(ApplicationService applicationService) { super(null); this.applicationService = applicationService; } @Override TimedAbsenceSpans addAbsence(TimedAbsenceSpans knownAbsences, Person person, DateMidnight date) { Optional<TimedAbsence> vacationAbsence = checkForVacation(date, person); if (vacationAbsence.isPresent()) { List<TimedAbsence> knownAbsencesList = knownAbsences.getAbsencesList(); knownAbsencesList.add(vacationAbsence.get()); return new TimedAbsenceSpans(knownAbsencesList); } return knownAbsences; } @Override boolean isLastPriorityProvider() { return true; } private Optional<TimedAbsence> checkForVacation(DateMidnight date, Person person) { List<Application> applications = applicationService.getApplicationsForACertainPeriodAndPerson(date, date, person) .stream() .filter(application -> application.hasStatus(ApplicationStatus.WAITING) || application.hasStatus(ApplicationStatus.TEMPORARY_ALLOWED) || application.hasStatus(ApplicationStatus.ALLOWED)) .collect(Collectors.toList()); if (applications.isEmpty()) { return Optional.empty(); } Application application = applications.get(0); return Optional.of(new TimedAbsence(application.getDayLength(), TimedAbsence.Type.VACATION)); } }