diff --git a/src/main/java/com/primefactorsolutions/service/VacationService.java b/src/main/java/com/primefactorsolutions/service/VacationService.java index 15db4b0..084c610 100644 --- a/src/main/java/com/primefactorsolutions/service/VacationService.java +++ b/src/main/java/com/primefactorsolutions/service/VacationService.java @@ -6,6 +6,8 @@ import com.primefactorsolutions.repositories.VacationRepository; import lombok.AllArgsConstructor; import org.springframework.stereotype.Service; +import java.util.List; + @Service @AllArgsConstructor public class VacationService { @@ -15,4 +17,7 @@ public class VacationService { return vacationRepository.findByCategory(category); } + public List findVacations() { + return vacationRepository.findAll(); + } } diff --git a/src/main/java/com/primefactorsolutions/views/RequestsListView.java b/src/main/java/com/primefactorsolutions/views/RequestsListView.java index d5c9136..fe61116 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestsListView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestsListView.java @@ -4,6 +4,7 @@ import com.primefactorsolutions.model.*; import com.primefactorsolutions.service.EmployeeService; import com.primefactorsolutions.service.TeamService; import com.primefactorsolutions.service.TimeOffRequestService; +import com.primefactorsolutions.service.VacationService; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.html.Main; @@ -29,7 +30,8 @@ public class RequestsListView extends Main { private final TimeOffRequestService requestService; private final EmployeeService employeeService; private final TeamService teamService; - private final PagingGrid requestGrid = new PagingGrid<>(); + private final VacationService vacationService; + private final PagingGrid requestGrid = new PagingGrid<>(); private List employees = Collections.emptyList(); private ComboBox employeeFilter; @@ -41,10 +43,12 @@ public class RequestsListView extends Main { public RequestsListView(final TimeOffRequestService requestService, final EmployeeService employeeService, - final TeamService teamService) { + final TeamService teamService, + final VacationService vacationService) { this.requestService = requestService; this.employeeService = employeeService; this.teamService = teamService; + this.vacationService = vacationService; this.employees = employeeService.findAllEmployees(); initializeView(); refreshGeneralRequestGrid(null, null, null, null); @@ -60,7 +64,6 @@ public class RequestsListView extends Main { private void setupFilters() { add(createEmployeeFilter()); add(createTeamFilter()); - add(createCategoryFilter()); add(createStateFilter()); } @@ -68,16 +71,14 @@ public class RequestsListView extends Main { requestGrid.addColumn(this::getEmployeeFullName).setHeader("Employee"); requestGrid.addColumn(this::getTeamName).setHeader("Team"); requestGrid.addColumn(this::getEmployeeStatus).setHeader("Employee State"); - requestGrid.addColumn(this::getCategory).setHeader("Category"); - requestGrid.addColumn(this::getState).setHeader("Request Status"); - requestGrid.addColumn(this::getDaysBalance).setHeader("Balance"); + requestGrid.addColumn(this::getGeneralTotal).setHeader("General Total"); requestGrid.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM); requestGrid.setPageSize(5); requestGrid.asSingleSelect().addValueChangeListener(event -> { - TimeOffRequest selectedRequest = event.getValue(); + Employee selectedRequest = event.getValue(); if (selectedRequest != null) { - selectedEmployeeId = selectedRequest.getEmployee().getId(); + selectedEmployeeId = selectedRequest.getId(); } }); } @@ -100,63 +101,50 @@ public class RequestsListView extends Main { final Status state) { requestGrid.setPagingDataProvider((page, pageSize) -> { int start = (int) (page * requestGrid.getPageSize()); - return fetchFilteredEmployees(start, pageSize, employee, team, category, state); + return fetchFilteredEmployees(start, pageSize, employee, team, state); }); requestGrid.getDataProvider().refreshAll(); } - private List fetchFilteredEmployees(final int start, - final int pageSize, - final Employee employee, - final Team team, - final TimeOffRequestType category, - final Status employeeState) { - List filteredRequests = requestService.findAllTimeOffRequests(); + private List fetchFilteredEmployees(final int start, + final int pageSize, + final Employee employee, + final Team team, + final Status employeeState) { + List filteredEmployees = employeeService.findAllEmployees(); if (employee != null && !"ALL".equals(employee.getFirstName())) { - filteredRequests = filteredRequests.stream() - .filter(emp -> emp.getEmployee().getId().equals(employee.getId())) + filteredEmployees = filteredEmployees.stream() + .filter(emp -> emp.getId().equals(employee.getId())) .collect(Collectors.toList()); } if (team != null && !"ALL".equals(team.getName())) { - filteredRequests = filteredRequests.stream() - .filter(emp -> { - Team empTeam = emp.getEmployee().getTeam(); - return empTeam != null && empTeam.getId().equals(team.getId()); - }) - .collect(Collectors.toList()); - } - - if (category != null && category != TimeOffRequestType.values()[0]) { - filteredRequests = filteredRequests.stream() - .filter(emp -> emp.getCategory().equals(category)) + filteredEmployees = filteredEmployees.stream() + .filter(emp -> emp.getTeam() != null && emp.getTeam().getId().equals(team.getId())) .collect(Collectors.toList()); } if (employeeState != null && employeeState != Status.ALL) { - filteredRequests = filteredRequests.stream() - .filter(emp -> employeeState == Status.IDLE - ? emp.getState().equals(TimeOffRequestStatus.IN_USE) - : !emp.getState().equals(TimeOffRequestStatus.IN_USE)) + filteredEmployees = filteredEmployees.stream() + .filter(emp -> { + Optional request = requestService + .findByEmployeeAndState(emp.getId(), TimeOffRequestStatus.TAKEN); + return employeeState == Status.IDLE ? request.isPresent() : request.isEmpty(); + }) .collect(Collectors.toList()); } - int end = Math.min(start + pageSize, filteredRequests.size()); - return filteredRequests.subList(start, end); + int end = Math.min(start + pageSize, filteredEmployees.size()); + return filteredEmployees.subList(start, end); } - private String getEmployeeFullName(final TimeOffRequest request) { - Employee employee = request.getEmployee(); - return getEmployeeFullNameLabel(employee); - } - - private String getEmployeeFullNameLabel(final Employee employee) { + private String getEmployeeFullName(final Employee employee) { return "ALL".equals(employee.getFirstName()) ? "ALL" : employee.getFirstName() + " " + employee.getLastName(); } - private String getTeamName(final TimeOffRequest request) { - Team team = request.getEmployee().getTeam(); + private String getTeamName(final Employee employee) { + Team team = employee.getTeam(); return team != null ? team.getName() : "Unassigned"; } @@ -164,21 +152,38 @@ public class RequestsListView extends Main { return "ALL".equals(team.getName()) ? "ALL" : team.getName(); } - - private String getEmployeeStatus(final TimeOffRequest request) { - return request.getState() == TimeOffRequestStatus.IN_USE ? "IDLE" : "ACTIVE"; + private String getEmployeeStatus(final Employee employee) { + Optional activeRequest = requestService + .findByEmployeeAndState(employee.getId(), TimeOffRequestStatus.TAKEN); + return activeRequest.isPresent() ? "IDLE" : "ACTIVE"; } - private String getCategory(final TimeOffRequest request) { - return request.getCategory().toString(); - } - - private String getState(final TimeOffRequest request) { - return request.getState().toString(); - } - - private String getDaysBalance(final TimeOffRequest request) { - return request.getDaysBalance().toString(); + private String getGeneralTotal(final Employee employee) { + List employeeRequests = requestService.findRequestsByEmployeeId(employee.getId()); + List vacations = vacationService.findVacations(); + double totalUtilized = employeeRequests.stream() + .filter(Objects::nonNull) + .mapToDouble(request -> { + Double daysBalance = request.getAvailableDays(); + return daysBalance != null ? daysBalance : 0.0; + }) + .sum(); + double totalUnused = employeeRequests.stream() + .filter(Objects::nonNull) + .mapToDouble(request -> { + Double daysBalance = request.getDaysBalance(); + return daysBalance != null ? daysBalance : 0.0; + }) + .sum(); + double totalAvailable = vacations.stream() + .filter(Objects::nonNull) + .mapToDouble(request -> { + Double daysBalance = request.getDuration(); + return daysBalance != null ? daysBalance : 0.0; + }) + .sum(); + double generalTotal = (totalAvailable - totalUtilized) + totalUnused; + return String.valueOf(generalTotal); } private ComboBox createEmployeeFilter() { @@ -186,7 +191,7 @@ public class RequestsListView extends Main { List employees = new ArrayList<>(employeeService.findAllEmployees()); employees.addFirst(createAllEmployeesOption()); employeeFilter.setItems(employees); - employeeFilter.setItemLabelGenerator(this::getEmployeeFullNameLabel); + employeeFilter.setItemLabelGenerator(this::getEmployeeFullName); employeeFilter.setValue(employees.getFirst()); employeeFilter.addValueChangeListener(event -> refreshGeneralRequestGrid( @@ -217,21 +222,6 @@ public class RequestsListView extends Main { return teamFilter; } - private ComboBox createCategoryFilter() { - categoryFilter = new ComboBox<>("Category"); - categoryFilter.setItems(TimeOffRequestType.values()); - categoryFilter.setValue(TimeOffRequestType.values()[0]); - categoryFilter.addValueChangeListener(event -> - refreshGeneralRequestGrid( - employeeFilter.getValue(), - teamFilter.getValue(), - event.getValue(), - stateFilter.getValue() - ) - ); - return categoryFilter; - } - private ComboBox createStateFilter() { stateFilter = new ComboBox<>("Employee State"); stateFilter.setItems(Status.values());