Compare commits

..

No commits in common. "98ed64dfda50e85272411deed7a34cc02afba69a" and "f0c0811f0ddc7c055f693edcbc8317b8136483b3" have entirely different histories.

4 changed files with 83 additions and 121 deletions

View File

@ -6,8 +6,6 @@ import com.primefactorsolutions.repositories.VacationRepository;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List;
@Service @Service
@AllArgsConstructor @AllArgsConstructor
public class VacationService { public class VacationService {
@ -17,7 +15,4 @@ public class VacationService {
return vacationRepository.findByCategory(category); return vacationRepository.findByCategory(category);
} }
public List<Vacation> findVacations() {
return vacationRepository.findAll();
}
} }

View File

@ -3,16 +3,13 @@ package com.primefactorsolutions.views;
import com.primefactorsolutions.model.*; import com.primefactorsolutions.model.*;
import com.primefactorsolutions.service.EmployeeService; import com.primefactorsolutions.service.EmployeeService;
import com.primefactorsolutions.service.TimeOffRequestService; import com.primefactorsolutions.service.TimeOffRequestService;
import com.primefactorsolutions.service.VacationService;
import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.Div;
import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.H3;
import com.vaadin.flow.component.html.Span;
import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.router.BeforeEvent; import com.vaadin.flow.router.BeforeEvent;
import com.vaadin.flow.router.HasUrlParameter; import com.vaadin.flow.router.HasUrlParameter;
import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.PageTitle;
@ -36,7 +33,6 @@ public class RequestEmployeeView extends Div implements HasUrlParameter<String>
private final TimeOffRequestService requestService; private final TimeOffRequestService requestService;
private final EmployeeService employeeService; private final EmployeeService employeeService;
private final VacationService vacationService;
private final Grid<TimeOffRequest> requestGrid = new Grid<>(TimeOffRequest.class); private final Grid<TimeOffRequest> requestGrid = new Grid<>(TimeOffRequest.class);
private List<TimeOffRequest> requests = Collections.emptyList(); private List<TimeOffRequest> requests = Collections.emptyList();
private ComboBox<TimeOffRequestType> categoryFilter; private ComboBox<TimeOffRequestType> categoryFilter;
@ -44,18 +40,15 @@ public class RequestEmployeeView extends Div implements HasUrlParameter<String>
private UUID employeeId; private UUID employeeId;
private TimeOffRequest request; private TimeOffRequest request;
public RequestEmployeeView(final TimeOffRequestService requestService, public RequestEmployeeView(final TimeOffRequestService requestService, final EmployeeService employeeService) {
final EmployeeService employeeService,
final VacationService vacationService) {
this.requestService = requestService; this.requestService = requestService;
this.employeeService = employeeService; this.employeeService = employeeService;
this.vacationService = vacationService;
} }
private void initializeView() { private void initializeView() {
setupFilters(); setupFilters();
setupGrid(); setupGrid();
add(requestGrid, createActionButtons(), createSummaryLayout()); add(requestGrid, createActionButtons());
refreshRequestGrid(null, null); refreshRequestGrid(null, null);
} }
@ -99,34 +92,6 @@ public class RequestEmployeeView extends Div implements HasUrlParameter<String>
}); });
} }
private VerticalLayout createSummaryLayout() {
double totalHoliday = requests.stream()
.filter(this::verificationIsHoliday)
.mapToDouble(TimeOffRequest::getAvailableDays)
.sum();
double totalVacations = requests.stream()
.filter(req -> req.getCategory().toString().startsWith("VACATION"))
.mapToDouble(TimeOffRequest::getAvailableDays)
.sum();
double totalPersonalDays = requests.stream()
.filter(req -> !verificationIsHoliday(req)) // Solo los de tipo OTHER
.mapToDouble(TimeOffRequest::getAvailableDays)
.sum();
double totalAvailableDays = totalHoliday + totalVacations + totalPersonalDays;
return new VerticalLayout(
new Span("TOTAL HOLIDAYS: " + totalHoliday),
new Span("TOTAL VACATIONS: " + totalVacations),
new Span("TOTAL PERSONAL DAYS: " + totalPersonalDays),
new Span("TOTAL GENERAL: " + totalAvailableDays)
);
}
private Boolean verificationIsHoliday(final TimeOffRequest request) {
Vacation vacation = vacationService.findVacationByCategory(request.getCategory());
return vacation.getType() != Vacation.Type.OTHER;
}
private HorizontalLayout createActionButtons() { private HorizontalLayout createActionButtons() {
Button viewButton = new Button("View", event -> { Button viewButton = new Button("View", event -> {
if (request != null) { if (request != null) {

View File

@ -148,8 +148,8 @@ public class RequestRegisterView extends VerticalLayout {
if (category == TimeOffRequestType.HEALTH_PERMIT if (category == TimeOffRequestType.HEALTH_PERMIT
|| category == TimeOffRequestType.VACATION_CURRENT_MANAGEMENT || category == TimeOffRequestType.VACATION_CURRENT_MANAGEMENT
|| category == TimeOffRequestType.VACATION_PREVIOUS_MANAGEMENT) { || category == TimeOffRequestType.VACATION_PREVIOUS_MANAGEMENT) {
return latestRequest.getState() == TimeOffRequestStatus.EXPIRED return latestRequest.getState() == TimeOffRequestStatus.EXPIRED ||
|| (latestRequest.getState() == TimeOffRequestStatus.TAKEN && latestRequest.getDaysBalance() > 0); (latestRequest.getState() == TimeOffRequestStatus.TAKEN && latestRequest.getDaysBalance() > 0);
} else { } else {
return latestRequest.getState() == TimeOffRequestStatus.EXPIRED; return latestRequest.getState() == TimeOffRequestStatus.EXPIRED;
} }
@ -180,8 +180,7 @@ public class RequestRegisterView extends VerticalLayout {
List<TimeOffRequest> requests = requestService.findByEmployeeAndCategory(employeeId, selectedCategory); List<TimeOffRequest> requests = requestService.findByEmployeeAndCategory(employeeId, selectedCategory);
if (vacation != null) { if (vacation != null) {
TimeOffRequest requestWithBalance = requests.stream() TimeOffRequest requestWithBalance = requests.stream()
.filter(request -> request.getDaysBalance() > 0 .filter(request -> request.getDaysBalance() > 0 && request.getState() != TimeOffRequestStatus.EXPIRED)
&& request.getState() != TimeOffRequestStatus.EXPIRED)
.max(Comparator.comparing(TimeOffRequest::getStartDate)) .max(Comparator.comparing(TimeOffRequest::getStartDate))
.orElse(null); .orElse(null);
if (requestWithBalance != null) { if (requestWithBalance != null) {
@ -215,8 +214,7 @@ public class RequestRegisterView extends VerticalLayout {
endDate = null; endDate = null;
UUID employeeId = employee.getId(); UUID employeeId = employee.getId();
List<TimeOffRequest> previousRequests List<TimeOffRequest> previousRequests = requestService.findByEmployeeAndCategory(employeeId, vacation.getCategory());
= requestService.findByEmployeeAndCategory(employeeId, vacation.getCategory());
int startYear; int startYear;
if (previousRequests.isEmpty()) { if (previousRequests.isEmpty()) {
@ -238,17 +236,11 @@ public class RequestRegisterView extends VerticalLayout {
} }
if (vacation.getMonthOfYear() != null && vacation.getDayOfMonth() != null) { if (vacation.getMonthOfYear() != null && vacation.getDayOfMonth() != null) {
startDate = LocalDate.of( startDate = LocalDate.of(startYear, vacation.getMonthOfYear().intValue(), vacation.getDayOfMonth().intValue());
startYear,
vacation.getMonthOfYear().intValue(),
vacation.getDayOfMonth().intValue());
endDate = startDate.plusDays(vacation.getExpiration().intValue() - 1); endDate = startDate.plusDays(vacation.getExpiration().intValue() - 1);
} else { } else {
if (vacation.getCategory() == TimeOffRequestType.BIRTHDAY && employee.getBirthday() != null) { if (vacation.getCategory() == TimeOffRequestType.BIRTHDAY && employee.getBirthday() != null) {
startDate = LocalDate.of( startDate = LocalDate.of(startYear, employee.getBirthday().getMonth(), employee.getBirthday().getDayOfMonth());
startYear,
employee.getBirthday().getMonth(),
employee.getBirthday().getDayOfMonth());
endDate = startDate.plusDays(vacation.getExpiration().intValue() - 1); endDate = startDate.plusDays(vacation.getExpiration().intValue() - 1);
} else if (vacation.getCategory() == TimeOffRequestType.HEALTH_PERMIT) { } else if (vacation.getCategory() == TimeOffRequestType.HEALTH_PERMIT) {
startDate = LocalDate.now(); startDate = LocalDate.now();

View File

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