diff --git a/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java b/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java index d72bf12..526aa37 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java @@ -21,6 +21,8 @@ import jakarta.annotation.security.PermitAll; import org.springframework.context.annotation.Scope; import org.vaadin.firitin.components.grid.PagingGrid; +import java.time.LocalDate; +import java.time.Period; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -109,10 +111,7 @@ public class RequestEmployeeView extends Div implements HasUrlParameter .filter(this::verificationIsHoliday) .mapToDouble(TimeOffRequest::getAvailableDays) .sum(); - double totalVacations = requests.stream() - .filter(req -> req.getCategory().toString().startsWith("VACACION")) - .mapToDouble(TimeOffRequest::getAvailableDays) - .sum(); + double totalVacations = calculateVacationDays(employeeService.getEmployee(employeeId)); double totalPersonalDays = requests.stream() .filter(req -> !verificationIsHoliday(req)) .filter(req -> !req.getCategory().name().startsWith("VACACION")) @@ -129,6 +128,45 @@ public class RequestEmployeeView extends Div implements HasUrlParameter ); } + private double calculateVacationDays(final Employee employee) { + if (employee.getDateOfEntry() != null) { + LocalDate entryDate = employee.getDateOfEntry(); + LocalDate today = LocalDate.now(); + + boolean hasAnniversaryPassed = entryDate.getMonthValue() < today.getMonthValue() + || (entryDate.getMonthValue() == today.getMonthValue() && entryDate.getDayOfMonth() <= today.getDayOfMonth()); + + LocalDate previousVacationYearDate, currentVacationYearDate; + + if (hasAnniversaryPassed) { + previousVacationYearDate = LocalDate.of(today.getYear() - 1, entryDate.getMonth(), entryDate.getDayOfMonth()); + currentVacationYearDate = LocalDate.of(today.getYear(), entryDate.getMonth(), entryDate.getDayOfMonth()); + } else { + previousVacationYearDate = LocalDate.of(today.getYear() - 2, entryDate.getMonth(), entryDate.getDayOfMonth()); + currentVacationYearDate = LocalDate.of(today.getYear() - 1, entryDate.getMonth(), entryDate.getDayOfMonth()); + } + + return calculateVacationDaysSinceEntry(entryDate, previousVacationYearDate) + + calculateVacationDaysSinceEntry(entryDate, currentVacationYearDate); + } else { + return 0.0; + } + } + + private double calculateVacationDaysSinceEntry(final LocalDate dateOfEntry, final LocalDate date) { + int yearsOfService = dateOfEntry != null ? Period.between(dateOfEntry, date).getYears() : 0; + if (yearsOfService > 10) { + return 30; + } + if (yearsOfService > 5) { + return 20; + } + if (yearsOfService > 1) { + return 15; + } + return 0; + } + private Boolean verificationIsHoliday(final TimeOffRequest request) { Vacation vacation = vacationService.findVacationByCategory(request.getCategory()); return vacation.getType() != Vacation.Type.OTHER; diff --git a/src/main/java/com/primefactorsolutions/views/RequestsListView.java b/src/main/java/com/primefactorsolutions/views/RequestsListView.java index 1f69ed8..c238ca4 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestsListView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestsListView.java @@ -164,8 +164,10 @@ public class RequestsListView extends Main { List employeeRequests = requestService.findRequestsByEmployeeId(employee.getId()); List vacations = vacationService.findVacations(); double totalUtilized = calculateTotalUtilized(employeeRequests); + double totalVacations = calculateVacationDays(employee); double totalAvailable = calculateTotalAvailable(vacations, employeeRequests, employee); - double generalTotal = totalAvailable - totalUtilized; + + double generalTotal = totalAvailable + totalVacations - totalUtilized; return String.valueOf(generalTotal); } @@ -195,16 +197,40 @@ public class RequestsListView extends Main { .sum(); } + private double calculateVacationDays(final Employee employee) { + if (employee.getDateOfEntry() != null) { + LocalDate entryDate = employee.getDateOfEntry(); + LocalDate today = LocalDate.now(); + + boolean hasAnniversaryPassed = entryDate.getMonthValue() < today.getMonthValue() + || (entryDate.getMonthValue() == today.getMonthValue() && entryDate.getDayOfMonth() <= today.getDayOfMonth()); + + LocalDate previousVacationYearDate, currentVacationYearDate; + + if (hasAnniversaryPassed) { + previousVacationYearDate = LocalDate.of(today.getYear() - 1, entryDate.getMonth(), entryDate.getDayOfMonth()); + currentVacationYearDate = LocalDate.of(today.getYear(), entryDate.getMonth(), entryDate.getDayOfMonth()); + } else { + previousVacationYearDate = LocalDate.of(today.getYear() - 2, entryDate.getMonth(), entryDate.getDayOfMonth()); + currentVacationYearDate = LocalDate.of(today.getYear() - 1, entryDate.getMonth(), entryDate.getDayOfMonth()); + } + + return calculateVacationDaysSinceEntry(entryDate, previousVacationYearDate) + + calculateVacationDaysSinceEntry(entryDate, currentVacationYearDate); + } else { + return 0.0; + } + } + private double calculateTotalAvailable(final List vacations, final List employeeRequests, final Employee employee) { - double vacationDays = calculateVacationDaysBasedOnService(employee.getDateOfEntry()); Set excludedCategories = getExcludedCategories(); Set genderSpecificExclusions = getGenderSpecificExclusions(); Set employeeRequestCategories = employeeRequests.stream() .map(TimeOffRequest::getCategory) .collect(Collectors.toSet()); - double availableVacationDays = vacations.stream() + return vacations.stream() .filter(Objects::nonNull) .filter(vacation -> shouldIncludeVacation( vacation, @@ -214,22 +240,20 @@ public class RequestsListView extends Main { )) .mapToDouble(vacation -> vacation.getDuration() != null ? vacation.getDuration() : 0.0) .sum(); - - return vacationDays + availableVacationDays; } - private double calculateVacationDaysBasedOnService(final LocalDate dateOfEntry) { - int yearsOfService = dateOfEntry != null ? Period.between(dateOfEntry, LocalDate.now()).getYears() : 0; - if (yearsOfService < 1) { - return 0; + private double calculateVacationDaysSinceEntry(final LocalDate dateOfEntry, final LocalDate date) { + int yearsOfService = dateOfEntry != null ? Period.between(dateOfEntry, date).getYears() : 0; + if (yearsOfService > 10) { + return 30; } - if (yearsOfService <= 5) { - return 15; - } - if (yearsOfService <= 10) { + if (yearsOfService > 5) { return 20; } - return 30; + if (yearsOfService > 1) { + return 15; + } + return 0; } private boolean shouldIncludeVacation(final Vacation vacation,