package org.synyx.urlaubsverwaltung.dev;
import org.joda.time.DateMidnight;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.stereotype.Component;
import org.synyx.urlaubsverwaltung.core.application.domain.Application;
import org.synyx.urlaubsverwaltung.core.application.domain.VacationCategory;
import org.synyx.urlaubsverwaltung.core.application.domain.VacationType;
import org.synyx.urlaubsverwaltung.core.application.service.ApplicationInteractionService;
import org.synyx.urlaubsverwaltung.core.period.DayLength;
import org.synyx.urlaubsverwaltung.core.person.Person;
import java.math.BigDecimal;
import java.util.Optional;
/**
* Provides sick note test data.
*
* @author Aljona Murygina - murygina@synyx.de
*/
@Component
@ConditionalOnProperty("testdata.create")
class ApplicationForLeaveDataProvider {
private final ApplicationInteractionService applicationInteractionService;
private final DurationChecker durationChecker;
@Autowired
ApplicationForLeaveDataProvider(ApplicationInteractionService applicationInteractionService,
DurationChecker durationChecker) {
this.applicationInteractionService = applicationInteractionService;
this.durationChecker = durationChecker;
}
Application createWaitingApplication(Person person, VacationType vacationType, DayLength dayLength,
DateMidnight startDate, DateMidnight endDate) {
Application application = null;
if (durationChecker.startAndEndDatesAreInCurrentYear(startDate, endDate)
&& durationChecker.durationIsGreaterThanZero(startDate, endDate, person)) {
application = new Application();
application.setPerson(person);
application.setStartDate(startDate);
application.setEndDate(endDate);
application.setVacationType(vacationType);
application.setDayLength(dayLength);
application.setReason(
"Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt"
+ "ut labore et dolore magna aliquyam erat, sed diam voluptua."
+ "At vero eos et accusam et justo duo dolores");
if (vacationType.getCategory().equals(VacationCategory.OVERTIME)) {
switch (dayLength) {
case FULL:
application.setHours(new BigDecimal("8"));
break;
default:
application.setHours(new BigDecimal("4"));
break;
}
}
applicationInteractionService.apply(application, person, Optional.of("Ich hätte gerne Urlaub"));
}
return application;
}
Application createPremilinaryAllowedApplication(Person person, Person headOf, VacationType vacationType,
DayLength dayLength, DateMidnight startDate, DateMidnight endDate) {
Application application = createWaitingApplication(person, vacationType, dayLength, startDate, endDate);
application.setTwoStageApproval(true);
application = applicationInteractionService.allow(application, headOf, Optional.of("Erst mal OK"));
return application;
}
Application createAllowedApplication(Person person, Person boss, VacationType vacationType, DayLength dayLength,
DateMidnight startDate, DateMidnight endDate) {
Application application = createWaitingApplication(person, vacationType, dayLength, startDate, endDate);
if (application != null) {
applicationInteractionService.allow(application, boss, Optional.of("Ist in Ordnung"));
}
return application;
}
Application createRejectedApplication(Person person, Person boss, VacationType vacationType, DayLength dayLength,
DateMidnight startDate, DateMidnight endDate) {
Application application = createWaitingApplication(person, vacationType, dayLength, startDate, endDate);
if (application != null) {
applicationInteractionService.reject(application, boss,
Optional.of("Aus organisatorischen Gründen leider nicht möglich"));
}
return application;
}
Application createCancelledApplication(Person person, Person office, VacationType vacationType, DayLength dayLength,
DateMidnight startDate, DateMidnight endDate) {
Application application = createAllowedApplication(person, office, vacationType, dayLength, startDate, endDate);
if (application != null) {
applicationInteractionService.cancel(application, office,
Optional.of("Urlaub wurde nicht genommen, daher storniert"));
}
return application;
}
}