diff --git a/src/main/java/com/primefactorsolutions/model/TimeOffRequestStatus.java b/src/main/java/com/primefactorsolutions/model/TimeOffRequestStatus.java index e549c4e..ac6f552 100644 --- a/src/main/java/com/primefactorsolutions/model/TimeOffRequestStatus.java +++ b/src/main/java/com/primefactorsolutions/model/TimeOffRequestStatus.java @@ -1,15 +1,15 @@ package com.primefactorsolutions.model; public enum TimeOffRequestStatus { - ALL, - TAKEN, - REQUESTED, - APPROVED, - IN_USE, - UNDER_REVIEW, - PENDING, - REJECTED, - COMPLETED, - CANCELLED, - EXPIRED + TODOS, + TOMADO, + SOLICITADO, + APROBADO, + EN_USO, + EN_REVISION, + PENDIENTE, + RECHAZADO, + COMPLETADO, + CANCELADO, + VENCIDO } diff --git a/src/main/java/com/primefactorsolutions/model/TimeOffRequestType.java b/src/main/java/com/primefactorsolutions/model/TimeOffRequestType.java index 32277b8..0b9d245 100644 --- a/src/main/java/com/primefactorsolutions/model/TimeOffRequestType.java +++ b/src/main/java/com/primefactorsolutions/model/TimeOffRequestType.java @@ -1,29 +1,29 @@ package com.primefactorsolutions.model; public enum TimeOffRequestType { - ALL, - NEW_YEAR, - MONDAY_CARNIVAL, - TUESDAY_CARNIVAL, - GOOD_FRIDAY, - LABOR_DAY, - INDEPENDENCE_DAY, - CHRISTMAS, - PRURINATIONAL_STATE_DAY, + TODOS, + AÑO_NUEVO, + LUNES_CARNAVAL, + MARTES_CARNAVAL, + VIERNES_SANTO, + DIA_DEL_TRABAJADOR, + DIA_DE_LA_INDEPENDENCIA, + NAVIDAD, + DIA_DEL_ESTADO_PLURINACIONAL, CORPUS_CHRISTI, - ANDEAN_NEW_YEAR, - DEPARTMENTAL_ANNIVERSARY, - ALL_SOULS_DAY, + AÑO_NUEVO_ANDINO, + ANIVERSARIO_DEPARTAMENTAL, + DIA_DE_TODOS_LOS_DIFUNTOS, - BIRTHDAY, - MATERNITY, - PATERNITY, - MARRIAGE, - FATHERS_DAY, - MOTHERS_DAY, - INTERNATIONAL_WOMENS_DAY, - NATIONAL_WOMENS_DAY, - HEALTH_PERMIT, - VACATION_CURRENT_MANAGEMENT, - VACATION_PREVIOUS_MANAGEMENT, + CUMPLEAÑOS, + MATERNIDAD, + PATERNIDAD, + MATRIMONIO, + DIA_DEL_PADRE, + DIA_DE_LA_MADRE, + DIA_DE_LA_MUJER_INTERNACIONAL, + DIA_DE_LA_MUJER_NACIONAL, + PERMISOS_DE_SALUD, + VACACION_GESTION_ACTUAL, + VACACION_GESTION_ANTERIOR, } diff --git a/src/main/java/com/primefactorsolutions/repositories/TimeOffRequestRepository.java b/src/main/java/com/primefactorsolutions/repositories/TimeOffRequestRepository.java index 1485fa0..f58ae50 100644 --- a/src/main/java/com/primefactorsolutions/repositories/TimeOffRequestRepository.java +++ b/src/main/java/com/primefactorsolutions/repositories/TimeOffRequestRepository.java @@ -13,4 +13,5 @@ public interface TimeOffRequestRepository extends JpaRepository findByEmployeeId(UUID idEmployee); Optional findByEmployeeIdAndState(UUID employeeId, TimeOffRequestStatus state); List findByEmployeeIdAndCategory(UUID employeeId, TimeOffRequestType category); + List findByState(TimeOffRequestStatus state); } diff --git a/src/main/java/com/primefactorsolutions/service/TimeOffRequestService.java b/src/main/java/com/primefactorsolutions/service/TimeOffRequestService.java index c5eba83..65651a8 100644 --- a/src/main/java/com/primefactorsolutions/service/TimeOffRequestService.java +++ b/src/main/java/com/primefactorsolutions/service/TimeOffRequestService.java @@ -18,6 +18,10 @@ public class TimeOffRequestService { timeOffRequestRepository.save(newTimeOffRequest); } + public void saveAll(final List requests) { + timeOffRequestRepository.saveAll(requests); + } + public void deleteTimeOffRequest(final UUID id) { timeOffRequestRepository.deleteById(id); } @@ -31,6 +35,10 @@ public class TimeOffRequestService { return timeOffRequest.orElse(null); } + public List findRequestsByState(final TimeOffRequestStatus state) { + return timeOffRequestRepository.findByState(state); + } + public List findRequestsByEmployeeId(final UUID idEmployee) { return timeOffRequestRepository.findByEmployeeId(idEmployee); } diff --git a/src/main/java/com/primefactorsolutions/views/MainLayout.java b/src/main/java/com/primefactorsolutions/views/MainLayout.java index b5602f5..d7e59b6 100644 --- a/src/main/java/com/primefactorsolutions/views/MainLayout.java +++ b/src/main/java/com/primefactorsolutions/views/MainLayout.java @@ -143,9 +143,11 @@ public class MainLayout extends AppLayout { SideNavItem timeOff = new SideNavItem("My Time-off", TimeoffView.class, LineAwesomeIcon.PLANE_DEPARTURE_SOLID.create()); timeOff.addItem(new SideNavItem("Vacations", RequestsListView.class, - LineAwesomeIcon.SUN.create())); + LineAwesomeIcon.UMBRELLA_BEACH_SOLID.create())); timeOff.addItem(new SideNavItem("Add Vacation", RequestRegisterView.class, - LineAwesomeIcon.SUN.create())); + LineAwesomeIcon.CALENDAR_PLUS.create())); + timeOff.addItem(new SideNavItem("Pending Requests", PendingRequestsListView.class, + LineAwesomeIcon.LIST_ALT.create())); SideNavItem timesheet = new SideNavItem("My Timesheet", TimesheetView.class, LineAwesomeIcon.HOURGLASS_START_SOLID.create()); timesheet.addItem(new SideNavItem("Hours Worked", HoursWorkedView.class, diff --git a/src/main/java/com/primefactorsolutions/views/MainView.java b/src/main/java/com/primefactorsolutions/views/MainView.java index 8b26aa6..bc3239d 100644 --- a/src/main/java/com/primefactorsolutions/views/MainView.java +++ b/src/main/java/com/primefactorsolutions/views/MainView.java @@ -1,16 +1,50 @@ package com.primefactorsolutions.views; +import com.primefactorsolutions.model.TimeOffRequest; +import com.primefactorsolutions.model.TimeOffRequestStatus; +import com.primefactorsolutions.service.TimeOffRequestService; import com.vaadin.flow.component.Text; import com.vaadin.flow.component.html.Main; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import jakarta.annotation.security.PermitAll; +import java.time.LocalDate; +import java.util.List; + @PageTitle("Home") @Route(value = "", layout = MainLayout.class) @PermitAll public class MainView extends Main { - public MainView() { - add(new Text("welcome")); + + private final TimeOffRequestService requestService; + + public MainView(final TimeOffRequestService requestService) { + this.requestService = requestService; + add(new Text("Welcome")); + updateRequestStatuses(); + } + + private void updateRequestStatuses() { + List requests = requestService.findAllTimeOffRequests(); + LocalDate now = LocalDate.now(); + + for (TimeOffRequest request : requests) { + if (request.getState() == TimeOffRequestStatus.APROBADO) { + LocalDate expirationDate = request.getExpiration(); + LocalDate startDate = request.getStartDate(); + LocalDate endDate = request.getEndDate(); + + if (now.isAfter(expirationDate)) { + request.setState(TimeOffRequestStatus.VENCIDO); + } else if (now.isAfter(endDate) && now.isBefore(expirationDate)) { + request.setState(TimeOffRequestStatus.TOMADO); + } else if (now.isEqual(startDate) || now.isAfter(startDate) && now.isBefore(endDate)) { + request.setState(TimeOffRequestStatus.EN_USO); + } + } + } + + requestService.saveAll(requests); } } diff --git a/src/main/java/com/primefactorsolutions/views/PendingRequestsListView.java b/src/main/java/com/primefactorsolutions/views/PendingRequestsListView.java new file mode 100644 index 0000000..1ef9f4e --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/PendingRequestsListView.java @@ -0,0 +1,227 @@ +package com.primefactorsolutions.views; + +import com.primefactorsolutions.model.*; +import com.primefactorsolutions.service.EmployeeService; +import com.primefactorsolutions.service.TeamService; +import com.primefactorsolutions.service.TimeOffRequestService; +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.html.Main; +import com.vaadin.flow.component.notification.Notification; +import com.vaadin.flow.component.orderedlayout.HorizontalLayout; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.spring.annotation.SpringComponent; +import jakarta.annotation.security.PermitAll; +import org.springframework.context.annotation.Scope; +import org.vaadin.firitin.components.grid.PagingGrid; + +import java.util.*; +import java.util.stream.Collectors; + +@SpringComponent +@Scope("prototype") +@PageTitle("PendingRequests") +@Route(value = "/pending-requests", layout = MainLayout.class) +@PermitAll +public class PendingRequestsListView extends Main { + + private final TimeOffRequestService requestService; + private final EmployeeService employeeService; + private final TeamService teamService; + private final PagingGrid pendingRequestsGrid = new PagingGrid<>(); + + private List employees = Collections.emptyList(); + private ComboBox employeeFilter; + private ComboBox teamFilter; + private ComboBox categoryFilter; + private UUID selectedRequestId; + + + public PendingRequestsListView(final TimeOffRequestService requestService, + final EmployeeService employeeService, + final TeamService teamService) { + this.requestService = requestService; + this.employeeService = employeeService; + this.teamService = teamService; + this.employees = employeeService.findAllEmployees(); + initializeView(); + refreshGeneralPendingRequestsGrid(null, null, null); + } + + private void initializeView() { + setupFilters(); + setupPendingRequestsGrid(); + add(pendingRequestsGrid); + add(createActionButtons()); + } + + private void setupFilters() { + add(createEmployeeFilter()); + add(createTeamFilter()); + add(createCategoryFilter()); + } + + private void setupPendingRequestsGrid() { + pendingRequestsGrid.addColumn(this::getEmployeeFullName).setHeader("Empleado"); + pendingRequestsGrid.addColumn(this::getTeamName).setHeader("Equipo"); + pendingRequestsGrid.addColumn(this::getCategory).setHeader("Categoría"); + + pendingRequestsGrid.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM); + pendingRequestsGrid.setPageSize(5); + pendingRequestsGrid.asSingleSelect().addValueChangeListener(event -> { + TimeOffRequest selectedRequest = event.getValue(); + if (selectedRequest != null) { + selectedRequestId = selectedRequest.getId(); + } + }); + } + + private HorizontalLayout createActionButtons() { + Button approveButton = createActionButton("Aprobar", TimeOffRequestStatus.APROBADO); + Button rejectButton = createActionButton("Rechazar", TimeOffRequestStatus.RECHAZADO); + Button closeButton = new Button("Salir", event -> navigateToMainView()); + return new HorizontalLayout(approveButton, rejectButton, closeButton); + } + + private Button createActionButton(final String caption, final TimeOffRequestStatus status) { + return new Button(caption, event -> { + if (selectedRequestId != null) { + TimeOffRequest request = requestService.findTimeOffRequest(selectedRequestId); + request.setState(status); + requestService.saveTimeOffRequest(request); + refreshGeneralPendingRequestsGrid(null, null, null); + } else { + Notification.show("Seleccione una solicitud.", 3000, Notification.Position.MIDDLE); + } + }); + } + + private void refreshGeneralPendingRequestsGrid(final Employee employee, + final Team team, + final TimeOffRequestType category) { + pendingRequestsGrid.setPagingDataProvider((page, pageSize) -> { + int start = (int) (page * pendingRequestsGrid.getPageSize()); + return fetchFilteredPendingRequests(start, pageSize, employee, team, category); + }); + pendingRequestsGrid.getDataProvider().refreshAll(); + } + + private List fetchFilteredPendingRequests(final int start, + final int pageSize, + final Employee employee, + final Team team, + final TimeOffRequestType category) { + List filteredPendingRequests + = requestService.findRequestsByState(TimeOffRequestStatus.PENDIENTE); + + if (employee != null && !"TODOS".equals(employee.getFirstName())) { + filteredPendingRequests = filteredPendingRequests.stream() + .filter(emp -> emp.getEmployee().getId().equals(employee.getId())) + .collect(Collectors.toList()); + } + + if (team != null && !"TODOS".equals(team.getName())) { + filteredPendingRequests = filteredPendingRequests.stream() + .filter(emp -> emp.getEmployee().getTeam() != null + && emp.getEmployee().getTeam().getId().equals(team.getId())) + .collect(Collectors.toList()); + } + + if (category != null && category != TimeOffRequestType.TODOS) { + filteredPendingRequests = filteredPendingRequests.stream() + .filter(emp -> emp.getCategory().equals(category)) + .collect(Collectors.toList()); + } + + int end = Math.min(start + pageSize, filteredPendingRequests.size()); + return filteredPendingRequests.subList(start, end); + } + + private String getEmployeeFullName(final TimeOffRequest request) { + Employee employee = request.getEmployee(); + return getEmployeeFullNameLabel(employee); + } + + private String getEmployeeFullNameLabel(final Employee employee) { + return "TODOS".equals(employee.getFirstName()) + ? "TODOS" : employee.getFirstName() + " " + employee.getLastName(); + } + + private String getTeamName(final TimeOffRequest request) { + Team team = request.getEmployee().getTeam(); + return team != null ? team.getName() : "Sin asignar"; + } + + private String getTeamLabel(final Team team) { + return "TODOS".equals(team.getName()) ? "TODOS" : team.getName(); + } + + private String getCategory(final TimeOffRequest request) { + return String.valueOf(request.getCategory()); + } + + private ComboBox createEmployeeFilter() { + employeeFilter = new ComboBox<>("Empleado"); + List employees = new ArrayList<>(employeeService.findAllEmployees()); + employees.addFirst(createAllEmployeesOption()); + employeeFilter.setItems(employees); + employeeFilter.setItemLabelGenerator(this::getEmployeeFullNameLabel); + employeeFilter.setValue(employees.getFirst()); + employeeFilter.addValueChangeListener(event -> + refreshGeneralPendingRequestsGrid( + event.getValue(), + teamFilter.getValue(), + categoryFilter.getValue() + ) + ); + return employeeFilter; + } + + private ComboBox createTeamFilter() { + teamFilter = new ComboBox<>("Equipo"); + List teams = new ArrayList<>(teamService.findAllTeams()); + teams.addFirst(createAllTeamsOption()); + teamFilter.setItems(teams); + teamFilter.setItemLabelGenerator(this::getTeamLabel); + teamFilter.setValue(teams.getFirst()); + teamFilter.addValueChangeListener(event -> + refreshGeneralPendingRequestsGrid( + employeeFilter.getValue(), + event.getValue(), + categoryFilter.getValue() + ) + ); + return teamFilter; + } + + private ComboBox createCategoryFilter() { + categoryFilter = new ComboBox<>("Categoría"); + categoryFilter.setItems(TimeOffRequestType.values()); + categoryFilter.setValue(TimeOffRequestType.values()[0]); + categoryFilter.addValueChangeListener(event -> + refreshGeneralPendingRequestsGrid( + employeeFilter.getValue(), + teamFilter.getValue(), + event.getValue() + ) + ); + return categoryFilter; + } + + private Employee createAllEmployeesOption() { + Employee allEmployeesOption = new Employee(); + allEmployeesOption.setFirstName("TODOS"); + return allEmployeesOption; + } + + private Team createAllTeamsOption() { + Team allTeamsOption = new Team(); + allTeamsOption.setName("TODOS"); + return allTeamsOption; + } + + private void navigateToMainView() { + getUI().ifPresent(ui -> ui.navigate(MainView.class)); + } +} \ No newline at end of file diff --git a/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java b/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java index 26872a7..f2e0088 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestEmployeeView.java @@ -21,7 +21,6 @@ import com.vaadin.flow.spring.annotation.SpringComponent; import jakarta.annotation.security.PermitAll; import org.springframework.context.annotation.Scope; -import java.time.LocalDate; import java.util.Collections; import java.util.List; import java.util.UUID; @@ -87,9 +86,7 @@ public class RequestEmployeeView extends Div implements HasUrlParameter "state", "startDate", "endDate", - "daysToBeTake", - "daysBalance" - ); + "daysToBeTake"); requestGrid.setAllRowsVisible(true); requestGrid.asSingleSelect().addValueChangeListener(event -> { TimeOffRequest selectedRequest = event.getValue(); @@ -109,9 +106,11 @@ public class RequestEmployeeView extends Div implements HasUrlParameter .mapToDouble(TimeOffRequest::getAvailableDays) .sum(); double totalPersonalDays = requests.stream() - .filter(req -> !verificationIsHoliday(req)) // Solo los de tipo OTHER + .filter(req -> !verificationIsHoliday(req)) + .filter(req -> !req.getCategory().name().startsWith("VACATION")) .mapToDouble(TimeOffRequest::getAvailableDays) .sum(); + double totalAvailableDays = totalHoliday + totalVacations + totalPersonalDays; return new VerticalLayout( @@ -166,11 +165,6 @@ public class RequestEmployeeView extends Div implements HasUrlParameter List filteredRequests = allFiltersAreNull(category, state) ? requestService.findRequestsByEmployeeId(employeeId) : fetchFilteredTimeOffRequests(category, state); - for (TimeOffRequest request : filteredRequests) { - if (request.getExpiration().isBefore(LocalDate.now())) { - request.setState(TimeOffRequestStatus.EXPIRED); - } - } for (TimeOffRequest request : filteredRequests) { requestService.saveTimeOffRequest(request); } diff --git a/src/main/java/com/primefactorsolutions/views/RequestRegisterView.java b/src/main/java/com/primefactorsolutions/views/RequestRegisterView.java index a3b1f54..b01ed9b 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestRegisterView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestRegisterView.java @@ -32,13 +32,13 @@ import java.util.UUID; @Route(value = "/requests/new", layout = MainLayout.class) public class RequestRegisterView extends VerticalLayout { - private final ComboBox employeeComboBox = new ComboBox<>("Employee"); - private final ComboBox categoryComboBox = new ComboBox<>("Category"); - private final NumberField availableDaysField = new NumberField("Available Days"); - private final DatePicker startDatePicker = new DatePicker("Start Date"); - private final DatePicker endDatePicker = new DatePicker("End Date"); - private final NumberField daysToBeTakenField = new NumberField("Days To Be Taken"); - private final NumberField balanceDaysField = new NumberField("Balance Days"); + private final ComboBox employeeComboBox = new ComboBox<>("Empleado"); + private final ComboBox categoryComboBox = new ComboBox<>("Categoría"); + private final NumberField availableDaysField = new NumberField("Días disponibles"); + private final DatePicker startDatePicker = new DatePicker("Fecha de inicio"); + private final DatePicker endDatePicker = new DatePicker("Fecha final"); + private final NumberField daysToBeTakenField = new NumberField("Días a tomar"); + private final NumberField balanceDaysField = new NumberField("Días de saldo"); private final TimeOffRequestService requestService; private final EmployeeService employeeService; @@ -59,11 +59,24 @@ public class RequestRegisterView extends VerticalLayout { this.employeeService = employeeService; this.vacationService = vacationService; this.binder = new Binder<>(TimeOffRequest.class); + initializeView(); + } + private void initializeView() { configureFormFields(); configureButtons(); configureBinder(); setupFormLayout(); + configureInitialFieldStates(); + } + + private void configureInitialFieldStates() { + categoryComboBox.setEnabled(false); + startDatePicker.setEnabled(false); + endDatePicker.setEnabled(false); + availableDaysField.setReadOnly(true); + daysToBeTakenField.setReadOnly(true); + balanceDaysField.setReadOnly(true); } private void configureFormFields() { @@ -71,66 +84,75 @@ public class RequestRegisterView extends VerticalLayout { employeeComboBox.setItemLabelGenerator(emp -> emp.getFirstName() + " " + emp.getLastName()); employeeComboBox.addValueChangeListener(event -> { employee = event.getValue(); - handleEmployeeSelection(employee); + System.out.println("Clearing form..." + employee); + + handleEmployeeSelection(event.getValue()); + }); + categoryComboBox.addValueChangeListener(event -> { + onCategoryChange(event.getValue()); + handleCategorySelection(event.getValue()); }); - categoryComboBox.setEnabled(false); - startDatePicker.setEnabled(false); - endDatePicker.setEnabled(false); - categoryComboBox.addValueChangeListener(event -> handleCategorySelection(event.getValue())); startDatePicker.addValueChangeListener(event -> updateDatePickerMinValues()); endDatePicker.addValueChangeListener(event -> calculateDays()); - availableDaysField.setReadOnly(true); - daysToBeTakenField.setReadOnly(true); - balanceDaysField.setReadOnly(true); } private void configureBinder() { binder.forField(employeeComboBox) - .asRequired("Employee is required") .bind(TimeOffRequest::getEmployee, TimeOffRequest::setEmployee); - binder.forField(categoryComboBox) - .asRequired("Category is required") .bind(TimeOffRequest::getCategory, TimeOffRequest::setCategory); - binder.forField(availableDaysField) .bind(TimeOffRequest::getAvailableDays, TimeOffRequest::setAvailableDays); - binder.forField(startDatePicker) - .asRequired("Start date is required") .bind(TimeOffRequest::getStartDate, TimeOffRequest::setStartDate); - binder.forField(endDatePicker) - .asRequired("End date is required") .bind(TimeOffRequest::getEndDate, TimeOffRequest::setEndDate); - binder.forField(daysToBeTakenField) .bind(TimeOffRequest::getDaysToBeTake, TimeOffRequest::setDaysToBeTake); - binder.forField(balanceDaysField) .bind(TimeOffRequest::getDaysBalance, TimeOffRequest::setDaysBalance); - binder.setBean(new TimeOffRequest()); } private void handleEmployeeSelection(final Employee selectedEmployee) { - clearForm(); if (selectedEmployee != null) { + categoryComboBox.clear(); + availableDaysField.clear(); + startDatePicker.clear(); + endDatePicker.clear(); + daysToBeTakenField.clear(); + balanceDaysField.clear(); categoryComboBox.setEnabled(true); + startDatePicker.setEnabled(false); + endDatePicker.setEnabled(false); filterCategories(selectedEmployee); } } private void filterCategories(final Employee employee) { + categoryComboBox.clear(); List employeeRequests = requestService.findRequestsByEmployeeId(employee.getId()); List allCategories = Arrays.asList(TimeOffRequestType.values()); List availableCategories = allCategories.stream() .filter(category -> isCategoryAvailable(employeeRequests, category)) .filter(category -> isCategoryAllowedByGender(category, employee.getGender())) + .filter(category -> category != TimeOffRequestType.VACACION_GESTION_ANTERIOR + && category != TimeOffRequestType.TODOS) .toList(); + categoryComboBox.setItems(availableCategories); } + private void onCategoryChange(final TimeOffRequestType selectedCategory) { + if (selectedCategory == TimeOffRequestType.VACACION_GESTION_ACTUAL) { + startDatePicker.setEnabled(true); + endDatePicker.setEnabled(true); + } else { + startDatePicker.setEnabled(true); + endDatePicker.setEnabled(false); + } + } + private boolean isCategoryAvailable(final List employeeRequests, final TimeOffRequestType category) { List requestsByCategory = employeeRequests.stream() @@ -145,32 +167,31 @@ public class RequestRegisterView extends VerticalLayout { .max(Comparator.comparing(TimeOffRequest::getStartDate)) .orElse(null); - if (category == TimeOffRequestType.HEALTH_PERMIT - || category == TimeOffRequestType.VACATION_CURRENT_MANAGEMENT - || category == TimeOffRequestType.VACATION_PREVIOUS_MANAGEMENT) { - return latestRequest.getState() == TimeOffRequestStatus.EXPIRED - || (latestRequest.getState() == TimeOffRequestStatus.TAKEN && latestRequest.getDaysBalance() > 0); + if (category == TimeOffRequestType.PERMISOS_DE_SALUD + || category == TimeOffRequestType.VACACION_GESTION_ACTUAL + || category == TimeOffRequestType.VACACION_GESTION_ANTERIOR) { + return latestRequest.getState() == TimeOffRequestStatus.VENCIDO + || (latestRequest.getState() == TimeOffRequestStatus.TOMADO && latestRequest.getDaysBalance() > 0); } else { - return latestRequest.getState() == TimeOffRequestStatus.EXPIRED; + return latestRequest.getState() == TimeOffRequestStatus.VENCIDO; } } private boolean isCategoryAllowedByGender(final TimeOffRequestType category, final Employee.Gender gender) { if (gender == Employee.Gender.MALE) { - return category != TimeOffRequestType.MATERNITY - && category != TimeOffRequestType.MOTHERS_DAY - && category != TimeOffRequestType.INTERNATIONAL_WOMENS_DAY - && category != TimeOffRequestType.NATIONAL_WOMENS_DAY; + return category != TimeOffRequestType.MATERNIDAD + && category != TimeOffRequestType.DIA_DE_LA_MADRE + && category != TimeOffRequestType.DIA_DE_LA_MUJER_INTERNACIONAL + && category != TimeOffRequestType.DIA_DE_LA_MUJER_NACIONAL; } else { - return category != TimeOffRequestType.FATHERS_DAY - && category != TimeOffRequestType.PATERNITY; + return category != TimeOffRequestType.DIA_DEL_PADRE + && category != TimeOffRequestType.PATERNIDAD; } } private void handleCategorySelection(final TimeOffRequestType selectedCategory) { if (selectedCategory != null) { updateAvailableDays(selectedCategory); - startDatePicker.setEnabled(true); } } @@ -181,16 +202,16 @@ public class RequestRegisterView extends VerticalLayout { if (vacation != null) { TimeOffRequest requestWithBalance = requests.stream() .filter(request -> request.getDaysBalance() > 0 - && request.getState() != TimeOffRequestStatus.EXPIRED) + && request.getState() != TimeOffRequestStatus.VENCIDO) .max(Comparator.comparing(TimeOffRequest::getStartDate)) .orElse(null); if (requestWithBalance != null) { - if (requestWithBalance.getState() == TimeOffRequestStatus.TAKEN) { + if (requestWithBalance.getState() == TimeOffRequestStatus.TOMADO) { availableDaysField.setValue(requestWithBalance.getDaysBalance()); - } else if (requestWithBalance.getState() == TimeOffRequestStatus.EXPIRED) { + } else if (requestWithBalance.getState() == TimeOffRequestStatus.VENCIDO) { availableDaysField.setValue(vacation.getDuration()); } - } else if (vacation.getCategory() == TimeOffRequestType.VACATION_CURRENT_MANAGEMENT) { + } else if (vacation.getCategory() == TimeOffRequestType.VACACION_GESTION_ACTUAL) { LocalDate dateOfEntry = employeeComboBox.getValue().getDateOfEntry(); LocalDate currentDate = LocalDate.now(); long yearsOfService = ChronoUnit.YEARS.between(dateOfEntry, currentDate); @@ -218,70 +239,83 @@ public class RequestRegisterView extends VerticalLayout { List previousRequests = requestService.findByEmployeeAndCategory(employeeId, vacation.getCategory()); - int startYear; - if (previousRequests.isEmpty()) { - startYear = LocalDate.now().getYear(); - } else { - int lastRequestYear = previousRequests.stream() - .max(Comparator.comparing(TimeOffRequest::getStartDate)) - .map(request -> request.getStartDate().getYear()) - .orElse(LocalDate.now().getYear()); + int startYear = calculateStartYear(previousRequests); - int proposedYear = lastRequestYear + 1; - int currentYear = LocalDate.now().getYear(); + startDate = determineStartDate(vacation, startYear); - if (proposedYear < currentYear) { - startYear = currentYear; - } else { - startYear = proposedYear; - } + if (startDate.isBefore(LocalDate.now())) { + startDate = determineStartDate(vacation, startYear + 1); } - if (vacation.getMonthOfYear() != null && vacation.getDayOfMonth() != null) { - startDate = LocalDate.of( - startYear, - vacation.getMonthOfYear().intValue(), - vacation.getDayOfMonth().intValue()); + if (startDate != null) { endDate = startDate.plusDays(vacation.getExpiration().intValue() - 1); } else { - if (vacation.getCategory() == TimeOffRequestType.BIRTHDAY && employee.getBirthday() != null) { - startDate = LocalDate.of( - startYear, - employee.getBirthday().getMonth(), - employee.getBirthday().getDayOfMonth()); - endDate = startDate.plusDays(vacation.getExpiration().intValue() - 1); - } else if (vacation.getCategory() == TimeOffRequestType.HEALTH_PERMIT) { - startDate = LocalDate.now(); - endDate = LocalDate.of(startYear, 12, 31); - } else { - startDate = LocalDate.now(); - } + startDate = LocalDate.now(); } + + setPickerValues(vacation, startDate); + setPickerLimits(startDate, endDate); + } + + private int calculateStartYear(final List previousRequests) { + if (previousRequests.isEmpty()) { + return LocalDate.now().getYear(); + } + + int lastRequestYear = previousRequests.stream() + .max(Comparator.comparing(TimeOffRequest::getStartDate)) + .map(request -> request.getStartDate().getYear()) + .orElse(LocalDate.now().getYear()); + + int currentYear = LocalDate.now().getYear(); + return Math.max(lastRequestYear + 1, currentYear); + } + + private LocalDate determineStartDate(final Vacation vacation, final int startYear) { + if (vacation.getMonthOfYear() != null && vacation.getDayOfMonth() != null) { + return LocalDate.of(startYear, vacation.getMonthOfYear().intValue(), vacation.getDayOfMonth().intValue()); + } + + if (vacation.getCategory() == TimeOffRequestType.CUMPLEAÑOS && employee.getBirthday() != null) { + return LocalDate.of(startYear, employee.getBirthday().getMonth(), employee.getBirthday().getDayOfMonth()); + } + + if (vacation.getCategory() == TimeOffRequestType.PERMISOS_DE_SALUD) { + return LocalDate.now(); + } + + return LocalDate.now(); + } + + private void setPickerValues(final Vacation vacation, final LocalDate startDate) { startDatePicker.setValue(startDate); if ((vacation.getDuration() != null && vacation.getDuration() == 0.5) - || vacation.getCategory() == TimeOffRequestType.HEALTH_PERMIT) { + || vacation.getCategory() == TimeOffRequestType.PERMISOS_DE_SALUD) { endDatePicker.setValue(startDate); } else { int durationDays = (vacation.getDuration() != null ? vacation.getDuration().intValue() - 1 : 0); endDatePicker.setValue(startDate.plusDays(durationDays)); } + } + private void setPickerLimits(final LocalDate startDate, final LocalDate endDate) { startDatePicker.setMin(startDate); startDatePicker.setMax(endDate); endDatePicker.setMin(startDate); endDatePicker.setMax(endDate); } - private void updateDatePickerMinValues() { LocalDate startDate = startDatePicker.getValue(); - if (vacation.getDuration() == 0.5) { - endDatePicker.setValue(startDate.plusDays(0)); - } else { - endDatePicker.setValue(startDate.plusDays(vacation.getDuration().intValue() - 1)); + if (availableDaysField.getValue() != null) { + if (availableDaysField.getValue() == 0.5) { + endDatePicker.setValue(startDate.plusDays(0)); + } else { + endDatePicker.setValue(startDate.plusDays(availableDaysField.getValue().intValue() - 1)); + } + calculateDays(); } - calculateDays(); } private void calculateDays() { @@ -289,26 +323,53 @@ public class RequestRegisterView extends VerticalLayout { LocalDate endDate = endDatePicker.getValue(); Double availableDays = availableDaysField.getValue(); - if (startDate != null && endDate != null) { - double daysToBeTaken = java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate) + 1; - if (vacation.getCategory() == TimeOffRequestType.HEALTH_PERMIT || vacation.getDuration() == 0.5) { - daysToBeTakenField.setValue(0.5); - } else { - daysToBeTakenField.setValue(daysToBeTaken); - } - double balanceDays = availableDays - daysToBeTakenField.getValue(); + if (areDatesValid(startDate, endDate)) { + double daysToBeTaken = calculateDaysBetween(startDate, endDate); + setDaysToBeTakenField(daysToBeTaken); + + double balanceDays = calculateBalanceDays(availableDays, daysToBeTakenField.getValue()); balanceDaysField.setValue(balanceDays); + + if (balanceDays < 0) { + clearFields(); + } } } + private boolean areDatesValid(final LocalDate startDate, final LocalDate endDate) { + return startDate != null && endDate != null; + } + + private double calculateDaysBetween(final LocalDate startDate, final LocalDate endDate) { + return java.time.temporal.ChronoUnit.DAYS.between(startDate, endDate) + 1; + } + + private void setDaysToBeTakenField(final double daysToBeTaken) { + if (vacation.getCategory() == TimeOffRequestType.PERMISOS_DE_SALUD) { + daysToBeTakenField.setValue(0.5); + } else { + daysToBeTakenField.setValue(daysToBeTaken); + } + } + + private double calculateBalanceDays(final double availableDays, final double daysToBeTaken) { + return availableDays - daysToBeTaken; + } + + private void clearFields() { + daysToBeTakenField.clear(); + balanceDaysField.clear(); + endDatePicker.clear(); + } + private void configureButtons() { - saveButton = new Button("Save", event -> saveRequest()); - closeButton = new Button("Close", event -> closeForm()); + saveButton = new Button("Guardar", event -> saveRequest()); + closeButton = new Button("Salir", event -> closeForm()); } private void setupFormLayout() { add( - new H3("Add Vacation Request"), + new H3("Añadir solicitud de vacaciones"), employeeComboBox, categoryComboBox, availableDaysField, @@ -321,59 +382,54 @@ public class RequestRegisterView extends VerticalLayout { } private void saveRequest() { - if (binder.validate().isOk()) { - TimeOffRequest request = binder.getBean(); - request.setStartDate(startDatePicker.getValue()); - request.setAvailableDays(availableDaysField.getValue()); - if (endDate == null) { - request.setExpiration(endDatePicker.getValue()); - } else { - request.setExpiration(endDate); - } - request.setState(TimeOffRequestStatus.REQUESTED); + if (!binder.validate().isOk()) { + Notification.show("Rellene correctamente todos los campos obligatorios."); + return; + } - List existingRequests = - requestService.findByEmployeeAndCategory(employee.getId(), request.getCategory()); + if (!validateForm()) { + Notification.show("Por favor, complete los campos antes de guardar"); + return; + } - int maxRequests = request.getCategory() == TimeOffRequestType.HEALTH_PERMIT ? 4 : 2; + TimeOffRequest request = prepareRequest(); + handleExistingRequests(request); + requestService.saveTimeOffRequest(request); - if (existingRequests.size() >= maxRequests) { - existingRequests.stream() - .min(Comparator.comparing(TimeOffRequest::getStartDate)) - .ifPresent(oldestRequest -> requestService.deleteTimeOffRequest(oldestRequest.getId())); - } + Notification.show("Solicitud guardada correctamente."); + closeForm(); + } - requestService.saveTimeOffRequest(request); - Notification.show("Request saved successfully."); - closeForm(); - } else { - Notification.show("Please fill all required fields correctly."); + private TimeOffRequest prepareRequest() { + TimeOffRequest request = binder.getBean(); + request.setStartDate(startDatePicker.getValue()); + request.setAvailableDays(availableDaysField.getValue()); + request.setExpiration(endDate != null ? endDate : endDatePicker.getValue()); + request.setState(TimeOffRequestStatus.PENDIENTE); + return request; + } + + private void handleExistingRequests(final TimeOffRequest request) { + List existingRequests = + requestService.findByEmployeeAndCategory(employee.getId(), request.getCategory()); + + int maxRequests = request.getCategory() == TimeOffRequestType.PERMISOS_DE_SALUD ? 4 : 2; + + if (existingRequests.size() >= maxRequests) { + existingRequests.stream() + .min(Comparator.comparing(TimeOffRequest::getStartDate)) + .ifPresent(oldestRequest -> requestService.deleteTimeOffRequest(oldestRequest.getId())); } } - private void updateBalanceForCategory(final TimeOffRequest newRequest) { - List requests = requestService.findByEmployeeAndCategory( - newRequest.getEmployee().getId(), newRequest.getCategory()); - - if (vacation.getCategory() == TimeOffRequestType.HEALTH_PERMIT - && vacation.getCategory() == TimeOffRequestType.VACATION_CURRENT_MANAGEMENT) { - for (TimeOffRequest request : requests) { - double newBalance = request.getDaysBalance() - newRequest.getDaysToBeTake(); - request.setDaysBalance(newBalance); - requestService.saveTimeOffRequest(request); - } - } + private boolean validateForm() { + return employeeComboBox.getValue() != null + && categoryComboBox.getValue() != null + && startDatePicker.getValue() != null + && endDatePicker.getValue() != null; } private void closeForm() { getUI().ifPresent(ui -> ui.navigate(RequestsListView.class)); } - - private void clearForm() { - availableDaysField.clear(); - startDatePicker.clear(); - endDatePicker.clear(); - daysToBeTakenField.clear(); - balanceDaysField.clear(); - } } diff --git a/src/main/java/com/primefactorsolutions/views/RequestsListView.java b/src/main/java/com/primefactorsolutions/views/RequestsListView.java index 43edf84..8b6465c 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestsListView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestsListView.java @@ -17,6 +17,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.*; import java.util.stream.Collectors; @@ -68,10 +70,10 @@ public class RequestsListView extends Main { } private void setupRequestGrid() { - requestGrid.addColumn(this::getEmployeeFullName).setHeader("Employee"); - requestGrid.addColumn(this::getTeamName).setHeader("Team"); - requestGrid.addColumn(this::getEmployeeStatus).setHeader("Employee State"); - requestGrid.addColumn(this::getGeneralTotal).setHeader("General Total"); + requestGrid.addColumn(this::getEmployeeFullName).setHeader("Empleado"); + requestGrid.addColumn(this::getTeamName).setHeader("Equipo"); + requestGrid.addColumn(this::getEmployeeStatus).setHeader("Estado del empleado"); + requestGrid.addColumn(this::getGeneralTotal).setHeader("Total general"); requestGrid.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM); requestGrid.setPageSize(5); @@ -84,14 +86,14 @@ public class RequestsListView extends Main { } private HorizontalLayout createActionButtons() { - Button viewButton = new Button("View", event -> { + Button viewButton = new Button("Ver", event -> { if (selectedEmployeeId != null) { navigateToTimeOffRequestView(selectedEmployeeId); } else { - Notification.show("Please select a request to view.", 3000, Notification.Position.MIDDLE); + Notification.show("Seleccione una solicitud para verla.", 3000, Notification.Position.MIDDLE); } }); - Button closeButton = new Button("Close", event -> navigateToMainView()); + Button closeButton = new Button("Salir", event -> navigateToMainView()); return new HorizontalLayout(viewButton, closeButton); } @@ -112,24 +114,24 @@ public class RequestsListView extends Main { final Status state) { List filteredEmployees = employeeService.findAllEmployees(); - if (employee != null && !"ALL".equals(employee.getFirstName())) { + if (employee != null && !"TODOS".equals(employee.getFirstName())) { filteredEmployees = filteredEmployees.stream() .filter(emp -> emp.getId().equals(employee.getId())) .collect(Collectors.toList()); } - if (team != null && !"ALL".equals(team.getName())) { + if (team != null && !"TODOS".equals(team.getName())) { filteredEmployees = filteredEmployees.stream() .filter(emp -> emp.getTeam() != null && emp.getTeam().getId().equals(team.getId())) .collect(Collectors.toList()); } - if (state != null && state != Status.ALL) { + if (state != null && state != Status.TODOS) { filteredEmployees = filteredEmployees.stream() .filter(emp -> { Optional request = requestService - .findByEmployeeAndState(emp.getId(), TimeOffRequestStatus.TAKEN); - return state == Status.IDLE ? request.isPresent() : request.isEmpty(); + .findByEmployeeAndState(emp.getId(), TimeOffRequestStatus.EN_USO); + return state == Status.EN_DESCANSO ? request.isPresent() : request.isEmpty(); }) .collect(Collectors.toList()); } @@ -139,54 +141,116 @@ public class RequestsListView extends Main { } private String getEmployeeFullName(final Employee employee) { - return "ALL".equals(employee.getFirstName()) ? "ALL" : employee.getFirstName() + " " + employee.getLastName(); + return "TODOS".equals(employee.getFirstName()) + ? "TODOS" : employee.getFirstName() + " " + employee.getLastName(); } private String getTeamName(final Employee employee) { Team team = employee.getTeam(); - return team != null ? team.getName() : "Unassigned"; + return team != null ? team.getName() : "Sin asignar"; } private String getTeamLabel(final Team team) { - return "ALL".equals(team.getName()) ? "ALL" : team.getName(); + return "TODOS".equals(team.getName()) ? "TODOS" : team.getName(); } private String getEmployeeStatus(final Employee employee) { Optional activeRequest = requestService - .findByEmployeeAndState(employee.getId(), TimeOffRequestStatus.TAKEN); - return activeRequest.isPresent() ? "IDLE" : "ACTIVE"; + .findByEmployeeAndState(employee.getId(), TimeOffRequestStatus.EN_USO); + return activeRequest.isPresent() ? "EN_DESCANSO" : "ACTIVO"; } 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; + double totalUtilized = calculateTotalUtilized(employeeRequests); + double totalAvailable = calculateTotalAvailable(vacations, employeeRequests, employee); + double generalTotal = totalAvailable - totalUtilized; return String.valueOf(generalTotal); } + private Set getExcludedCategories() { + return Set.of( + TimeOffRequestType.MATERNIDAD, + TimeOffRequestType.PATERNIDAD, + TimeOffRequestType.MATRIMONIO, + TimeOffRequestType.DIA_DEL_PADRE, + TimeOffRequestType.DIA_DE_LA_MADRE + ); + } + + private Set getGenderSpecificExclusions() { + return Set.of( + TimeOffRequestType.DIA_DE_LA_MUJER_INTERNACIONAL, + TimeOffRequestType.DIA_DE_LA_MUJER_NACIONAL + ); + } + + private double calculateTotalUtilized(final List employeeRequests) { + return employeeRequests.stream() + .filter(Objects::nonNull) + .mapToDouble(request -> request.getDaysToBeTake() != null ? request.getDaysToBeTake() : 0.0) + .sum(); + } + + 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() + .filter(Objects::nonNull) + .filter(vacation -> shouldIncludeVacation( + vacation, + excludedCategories, + genderSpecificExclusions, + employee, employeeRequestCategories + )) + .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; + } + if (yearsOfService <= 5) { + return 15; + } + if (yearsOfService <= 10) { + return 20; + } + return 30; + } + + private boolean shouldIncludeVacation(final Vacation vacation, + final Set excludedCategories, + final Set genderSpecificExclusions, + final Employee employee, + final Set employeeRequestCategories) { + if (excludedCategories.contains(vacation.getCategory()) + && !employeeRequestCategories.contains(vacation.getCategory())) { + return false; + } + if (!isFemale(employee) && genderSpecificExclusions.contains(vacation.getCategory())) { + return false; + } + return true; + } + + private boolean isFemale(final Employee employee) { + return employee.getGender() == Employee.Gender.FEMALE; + } + private ComboBox createEmployeeFilter() { - employeeFilter = new ComboBox<>("Employee"); + employeeFilter = new ComboBox<>("Empleado"); List employees = new ArrayList<>(employeeService.findAllEmployees()); employees.addFirst(createAllEmployeesOption()); employeeFilter.setItems(employees); @@ -203,7 +267,7 @@ public class RequestsListView extends Main { } private ComboBox createTeamFilter() { - teamFilter = new ComboBox<>("Team"); + teamFilter = new ComboBox<>("Equipo"); List teams = new ArrayList<>(teamService.findAllTeams()); teams.addFirst(createAllTeamsOption()); teamFilter.setItems(teams); @@ -220,7 +284,7 @@ public class RequestsListView extends Main { } private ComboBox createStateFilter() { - stateFilter = new ComboBox<>("Employee State"); + stateFilter = new ComboBox<>("Estado del empleado"); stateFilter.setItems(Status.values()); stateFilter.setValue(Status.values()[0]); stateFilter.addValueChangeListener(event -> @@ -234,20 +298,20 @@ public class RequestsListView extends Main { } private enum Status { - ALL, - IDLE, - ACTIVE + TODOS, + EN_DESCANSO, + ACTIVO } private Employee createAllEmployeesOption() { Employee allEmployeesOption = new Employee(); - allEmployeesOption.setFirstName("ALL"); + allEmployeesOption.setFirstName("TODOS"); return allEmployeesOption; } private Team createAllTeamsOption() { Team allTeamsOption = new Team(); - allTeamsOption.setName("ALL"); + allTeamsOption.setName("TODOS"); return allTeamsOption; } diff --git a/src/main/resources/data.sql b/src/main/resources/data.sql index 763b158..17e4980 100644 --- a/src/main/resources/data.sql +++ b/src/main/resources/data.sql @@ -16,33 +16,33 @@ INSERT INTO team (id, version, name) VALUES ('c3a8a7b1-f2d9-48c0-86ea-f215c2e6b3 INSERT INTO team (id, version, name) VALUES ('8f6b61e7-efb2-4de7-b8ed-7438c9d8babe', 1, 'GHI'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('123e4567-e89b-12d3-a456-426614174000', 1, 'NEW_YEAR', 1, 1, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('223e4567-e89b-12d3-a456-426614174001', 1, 'MONDAY_CARNIVAL', 2, 12, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('323e4567-e89b-12d3-a456-426614174002', 1, 'TUESDAY_CARNIVAL', 2, 13, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('423e4567-e89b-12d3-a456-426614174003', 1, 'GOOD_FRIDAY', 3, 29, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('523e4567-e89b-12d3-a456-426614174004', 1, 'LABOR_DAY', 5, 1, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('623e4567-e89b-12d3-a456-426614174005', 1, 'INDEPENDENCE_DAY', 8, 6, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('723e4567-e89b-12d3-a456-426614174006', 1, 'CHRISTMAS', 12, 25, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('123e4567-e89b-12d3-a456-426614174000', 1, 'AÑO_NUEVO', 1, 1, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('223e4567-e89b-12d3-a456-426614174001', 1, 'LUNES_CARNAVAL', 2, 12, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('323e4567-e89b-12d3-a456-426614174002', 1, 'MARTES_CARNAVAL', 2, 13, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('423e4567-e89b-12d3-a456-426614174003', 1, 'VIERNES_SANTO', 3, 29, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('523e4567-e89b-12d3-a456-426614174004', 1, 'DIA_DEL_TRABAJADOR', 5, 1, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('623e4567-e89b-12d3-a456-426614174005', 1, 'DIA_DE_LA_INDEPENDENCIA', 8, 6, 1, 1, 'FIXED'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('723e4567-e89b-12d3-a456-426614174006', 1, 'NAVIDAD', 12, 25, 1, 1, 'FIXED'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('823e4567-e89b-12d3-a456-426614174007', 1, 'PRURINATIONAL_STATE_DAY', 1, 21, 1, 30, 'MOVABLE'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('823e4567-e89b-12d3-a456-426614174007', 1, 'DIA_DEL_ESTADO_PLURINACIONAL', 1, 21, 1, 30, 'MOVABLE'); INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('923e4567-e89b-12d3-a456-426614174008', 1, 'CORPUS_CHRISTI', 5, 30, 1, 30, 'MOVABLE'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('a23e4567-e89b-12d3-a456-426614174009', 1, 'ANDEAN_NEW_YEAR', 6, 21, 1, 30, 'MOVABLE'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('b23e4567-e89b-12d3-a456-42661417400a', 1, 'DEPARTMENTAL_ANNIVERSARY', 9, 14, 1, 30, 'MOVABLE'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400b', 1, 'ALL_SOULS_DAY', 11, 2, 1, 30, 'MOVABLE'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('a23e4567-e89b-12d3-a456-426614174009', 1, 'AÑO_NUEVO_ANDINO', 6, 21, 1, 30, 'MOVABLE'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('b23e4567-e89b-12d3-a456-42661417400a', 1, 'ANIVERSARIO_DEPARTAMENTAL', 9, 14, 1, 30, 'MOVABLE'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400b', 1, 'DIA_DE_TODOS_LOS_DIFUNTOS', 11, 2, 1, 30, 'MOVABLE'); -INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400c', 1, 'BIRTHDAY', 0.5, 365, 'OTHER'); -INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400d', 1, 'MATERNITY', 90, 90, 'OTHER'); -INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400e', 1, 'PATERNITY', 3, 3, 'OTHER'); -INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400f', 1, 'MARRIAGE', 3, 3, 'OTHER'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401a', 1, 'FATHERS_DAY', 3, 19, 0.5, 30, 'OTHER'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401b', 1, 'MOTHERS_DAY', 5, 27, 0.5, 30, 'OTHER'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401c', 1, 'INTERNATIONAL_WOMENS_DAY', 3, 8, 0.5, 30, 'OTHER'); -INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401d', 1, 'NATIONAL_WOMENS_DAY', 10, 11, 0.5, 30, 'OTHER'); -INSERT INTO vacation (id, version, category, duration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401e', 1, 'HEALTH_PERMIT', 2, 'OTHER'); -INSERT INTO vacation (id, version, category, expiration, type) VALUES ('490e5fbe-895b-42f8-b914-95437f7b39c0', 1, 'VACATION_CURRENT_MANAGEMENT', 730, 'OTHER'); -INSERT INTO vacation (id, version, category, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-4266141740ff', 1, 'VACATION_PREVIOUS_MANAGEMENT', 730, 'OTHER'); +INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400c', 1, 'CUMPLEAÑOS', 0.5, 365, 'OTHER'); +INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400d', 1, 'MATERNIDAD', 90, 90, 'OTHER'); +INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400e', 1, 'PATERNIDAD', 3, 3, 'OTHER'); +INSERT INTO vacation (id, version, category, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417400f', 1, 'MATRIMONIO', 3, 3, 'OTHER'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401a', 1, 'DIA_DEL_PADRE', 3, 19, 0.5, 30, 'OTHER'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401b', 1, 'DIA_DE_LA_MADRE', 5, 27, 0.5, 30, 'OTHER'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401c', 1, 'DIA_DE_LA_MUJER_INTERNACIONAL', 3, 8, 0.5, 30, 'OTHER'); +INSERT INTO vacation (id, version, category, month_of_year, day_of_month, duration, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401d', 1, 'DIA_DE_LA_MUJER_NACIONAL', 10, 11, 0.5, 30, 'OTHER'); +INSERT INTO vacation (id, version, category, duration, type) VALUES ('c23e4567-e89b-12d3-a456-42661417401e', 1, 'PERMISOS_DE_SALUD', 2, 'OTHER'); +INSERT INTO vacation (id, version, category, expiration, type) VALUES ('490e5fbe-895b-42f8-b914-95437f7b39c0', 1, 'VACACION_GESTION_ACTUAL', 730, 'OTHER'); +INSERT INTO vacation (id, version, category, expiration, type) VALUES ('c23e4567-e89b-12d3-a456-4266141740ff', 1, 'VACACION_GESTION_ANTERIOR', 730, 'OTHER'); insert into employee (id, version, username, first_name, last_name, status, team_id, gender, birthday, date_of_entry) values ('5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 1, 'bob', 'Bob', 'Test', 'ACTIVE','b0e8f394-78c1-4d8a-9c57-dc6e8b36a5fa', 'MALE', '2024-02-20', '2013-10-22'); @@ -66,25 +66,25 @@ insert into employee (id, version, username, first_name, last_name, status, team insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('9d6f12ba-e341-4e7a-b8a6-cab0982bd8c1', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'PATERNITY', 'TAKEN', 3, '2024-10-03', '2024-10-01', '2024-10-03', 3, 0); +values ('9d6f12ba-e341-4e7a-b8a6-cab0982bd8c1', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'PATERNIDAD', 'VENCIDO', 3, '2024-10-03', '2024-10-01', '2024-10-03', 3, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('9a6f12ba-e111-4e7a-b8a6-caa0982bd8a1', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'NEW_YEAR', 'EXPIRED', 1, '2024-01-01', '2024-01-01', '2024-01-01', 1, 0); +values ('9a6f12ba-e111-4e7a-b8a6-caa0982bd8a1', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'AÑO_NUEVO', 'VENCIDO', 1, '2024-01-01', '2024-01-01', '2024-01-01', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('9b6f12ba-e222-4e7a-b8a6-caa0982bd8b2', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'MONDAY_CARNIVAL', 'APPROVED', 1, '2025-02-12', '2025-02-12', '2025-02-12', 1, 0); +values ('9b6f12ba-e222-4e7a-b8a6-caa0982bd8b2', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'LUNES_CARNAVAL', 'APROBADO', 1, '2025-02-12', '2025-02-12', '2025-02-12', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('9c6f12ba-e333-4e7a-b8a6-caa0982bd8c3', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'TUESDAY_CARNIVAL', 'UNDER_REVIEW', 1, '2025-02-13', '2025-02-13', '2025-02-13', 1, 0); +values ('9c6f12ba-e333-4e7a-b8a6-caa0982bd8c3', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'MARTES_CARNAVAL', 'EN_REVISION', 1, '2025-02-13', '2025-02-13', '2025-02-13', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('9d6f12ba-e444-4e7a-b8a6-caa0982bd8d4', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'GOOD_FRIDAY', 'COMPLETED', 1, '2024-03-29', '2024-03-29', '2024-03-29', 1, 0); +values ('9d6f12ba-e444-4e7a-b8a6-caa0982bd8d4', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'VIERNES_SANTO', 'APROBADO', 1, '2024-03-29', '2024-03-29', '2024-03-29', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('9e6f12ba-e555-4e7a-b8a6-caa0982bd8e5', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'VACATION_CURRENT_MANAGEMENT', 'APPROVED', 30, '2026-11-01', '2024-11-01', '2024-11-30', 30, 0); +values ('9e6f12ba-e555-4e7a-b8a6-caa0982bd8e5', 1, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'VACACION_GESTION_ACTUAL', 'APROBADO', 30, '2026-11-01', '2024-11-01', '2024-11-30', 30, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('8c653f2a-f9a3-4d67-b3b6-12ad98fe0983', 1, 'f6ab3c6d-7078-45f6-9b22-4e37637bfec6', 'LABOR_DAY', 'REQUESTED', 1, '2025-05-01', '2024-05-01', '2024-05-01', 1, 0); +values ('8c653f2a-f9a3-4d67-b3b6-12ad98fe0983', 1, 'f6ab3c6d-7078-45f6-9b22-4e37637bfec6', 'DIA_DEL_TRABAJADOR', 'APROBADO', 1, '2024-05-01', '2024-05-01', '2024-05-01', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('fb9d9d75-b2ab-4ea4-b8b3-0a8f89e5c123', 1, '2e2293b1-3f9a-4f3d-abc8-32639b0a5e15', 'INDEPENDENCE_DAY', 'IN_USE', 1, '2025-08-06', '2024-08-06', '2024-08-06', 1, 0); +values ('fb9d9d75-b2ab-4ea4-b8b3-0a8f89e5c123', 1, '2e2293b1-3f9a-4f3d-abc8-32639b0a5e15', 'DIA_DE_LA_INDEPENDENCIA', 'APROBADO', 1, '2024-08-06', '2024-08-06', '2024-08-06', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('6fdc47a8-127b-41c4-8d12-7fc12098ab12', 1, 'b2436b82-7b9f-4f0d-9463-f2c3173a45c3', 'ALL_SOULS_DAY', 'PENDING', 1, '2025-12-01', '2025-11-02', '2025-11-02', 1, 0); +values ('6fdc47a8-127b-41c4-8d12-7fc12098ab12', 1, 'b2436b82-7b9f-4f0d-9463-f2c3173a45c3', 'DIA_DE_TODOS_LOS_DIFUNTOS', 'PENDIENTE', 1, '2025-12-01', '2025-11-02', '2025-11-02', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('12ec8b74-983d-4a17-b67e-134f45ae904c', 1, '5c1a7b82-832d-4f24-8377-54b77b91b6a8', 'NEW_YEAR', 'PENDING', 1, '2025-01-01', '2025-01-01', '2025-01-01', 1, 0); +values ('12ec8b74-983d-4a17-b67e-134f45ae904c', 1, '5c1a7b82-832d-4f24-8377-54b77b91b6a8', 'AÑO_NUEVO', 'PENDIENTE', 1, '2025-01-01', '2025-01-01', '2025-01-01', 1, 0); insert into time_off_request (id, version, employee_id, category, state, available_days, expiration, start_date, end_date, days_to_be_take, days_balance) -values ('89bc4b2a-943f-487c-a9f3-bacf78145e67', 1, 'cba3efb7-32bc-44be-9fdc-fc5e4f211254', 'MONDAY_CARNIVAL', 'APPROVED', 1, '2025-02-12', '2024-02-12', '2024-02-12', 1, 0); +values ('89bc4b2a-943f-487c-a9f3-bacf78145e67', 1, 'cba3efb7-32bc-44be-9fdc-fc5e4f211254', 'LUNES_CARNAVAL', 'APROBADO', 1, '2024-02-12', '2024-02-12', '2024-02-12', 1, 0);