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.period.DayLength; import org.synyx.urlaubsverwaltung.core.person.Person; import org.synyx.urlaubsverwaltung.core.settings.FederalState; import org.synyx.urlaubsverwaltung.core.workingtime.PublicHolidaysService; import org.synyx.urlaubsverwaltung.core.workingtime.WorkingTimeService; import java.math.BigDecimal; import java.util.List; import java.util.Optional; /** * @author Timo Eifler - eifler@synyx.de */ @Service class HolidayAbsenceProvider extends AbstractTimedAbsenceProvider { private final PublicHolidaysService publicHolidaysService; private WorkingTimeService workingTimeService; @Autowired HolidayAbsenceProvider(SickDayAbsenceProvider nextPriorityProvider, PublicHolidaysService publicHolidaysService, WorkingTimeService workingTimeService) { super(nextPriorityProvider); this.publicHolidaysService = publicHolidaysService; this.workingTimeService = workingTimeService; } @Override TimedAbsenceSpans addAbsence(TimedAbsenceSpans knownAbsences, Person person, DateMidnight date) { Optional<TimedAbsence> holidayAbsence = checkForHolidays(date, person); if (holidayAbsence.isPresent()) { List<TimedAbsence> knownAbsencesList = knownAbsences.getAbsencesList(); knownAbsencesList.add(holidayAbsence.get()); return new TimedAbsenceSpans(knownAbsencesList); } return knownAbsences; } @Override boolean isLastPriorityProvider() { return false; } private Optional<TimedAbsence> checkForHolidays(DateMidnight currentDay, Person person) { BigDecimal expectedWorkingDuration = publicHolidaysService.getWorkingDurationOfDate(currentDay, getFederalState(currentDay, person)); boolean fullDayHoliday = expectedWorkingDuration.compareTo(DayLength.ZERO.getDuration()) == 0; boolean halfDayHoliday = expectedWorkingDuration.compareTo(DayLength.NOON.getDuration()) == 0; TimedAbsence absence = null; if (fullDayHoliday) { absence = new TimedAbsence(DayLength.FULL, TimedAbsence.Type.HOLIDAY); } else if (halfDayHoliday) { absence = new TimedAbsence(DayLength.NOON, TimedAbsence.Type.HOLIDAY); } return Optional.ofNullable(absence); } private FederalState getFederalState(DateMidnight date, Person person) { return workingTimeService.getFederalStateForPerson(person, date); } }