#45-Registro Semanal de Horas Trabajadas corregir duplicados #70
@ -15,22 +15,21 @@ import java.util.UUID;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@EqualsAndHashCode(callSuper = true)
|
@EqualsAndHashCode(callSuper = true)
|
||||||
public class HoursWorked extends BaseEntity {
|
public class HoursWorked extends BaseEntity {
|
||||||
@Id
|
|
||||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
|
||||||
private UUID id;
|
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "employee_id", nullable = false)
|
@JoinColumn(name = "employee_id", nullable = true)
|
||||||
private Employee employee;
|
private Employee employee;
|
||||||
|
|
||||||
@ManyToOne
|
@ManyToOne
|
||||||
@JoinColumn(name = "team_id", nullable = false)
|
@JoinColumn(name = "team_id", nullable = true)
|
||||||
private Team team;
|
private Team team;
|
||||||
|
|
||||||
private int weekNumber;
|
private int weekNumber;
|
||||||
private LocalDate date;
|
private LocalDate date;
|
||||||
private String actividad;
|
private String actividad;
|
||||||
|
private String tareasEspecificas;
|
||||||
private double hours;
|
private double hours;
|
||||||
|
private double horasTareasEspecificas;
|
||||||
|
private double horaspendientes;
|
||||||
private double totalHours;
|
private double totalHours;
|
||||||
|
|
||||||
public Employee getEmployee() {
|
public Employee getEmployee() {
|
||||||
@ -88,5 +87,21 @@ public class HoursWorked extends BaseEntity {
|
|||||||
public void setTeam(Team team) {
|
public void setTeam(Team team) {
|
||||||
this.team = team;
|
this.team = team;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTareasEspecificas() {
|
||||||
|
return tareasEspecificas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTareasEspecificas(String tareasEspecificas) {
|
||||||
|
this.tareasEspecificas = tareasEspecificas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getHorasTareasEspecificas() {
|
||||||
|
return horasTareasEspecificas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHorasTareasEspecificas(double horasTareasEspecificas) {
|
||||||
|
this.tareasEspecificas = tareasEspecificas;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,13 +72,8 @@ public class HoursWorkedService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public HoursWorked getHoursWorked(final UUID id) {
|
public HoursWorked getHoursWorked(final UUID id) {
|
||||||
Optional<HoursWorked> registro = hoursWorkedRepository.findById(id);
|
final Optional<HoursWorked> hoursWorked = hoursWorkedRepository.findById(id);
|
||||||
HoursWorked hw = registro.orElse(null);
|
return hoursWorked.get();
|
||||||
if (hw == null) {
|
|
||||||
System.out.println("No se encontró el registro de horas trabajadas");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
return hw;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -1,11 +1,19 @@
|
|||||||
package com.primefactorsolutions.views;
|
package com.primefactorsolutions.views;
|
||||||
|
|
||||||
import com.primefactorsolutions.model.HoursWorked;
|
import com.primefactorsolutions.model.Employee;
|
||||||
|
import com.primefactorsolutions.model.Team;
|
||||||
|
import com.primefactorsolutions.model.TimeOffRequest;
|
||||||
|
import com.primefactorsolutions.model.TimeOffRequestStatus;
|
||||||
|
import com.primefactorsolutions.service.EmployeeService;
|
||||||
import com.primefactorsolutions.service.HoursWorkedService;
|
import com.primefactorsolutions.service.HoursWorkedService;
|
||||||
|
import com.primefactorsolutions.service.TeamService;
|
||||||
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.grid.GridSortOrder;
|
import com.vaadin.flow.component.grid.GridSortOrder;
|
||||||
import com.vaadin.flow.component.html.H2;
|
import com.vaadin.flow.component.html.H2;
|
||||||
import com.vaadin.flow.component.html.Main;
|
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.data.provider.SortDirection;
|
import com.vaadin.flow.data.provider.SortDirection;
|
||||||
import com.vaadin.flow.router.PageTitle;
|
import com.vaadin.flow.router.PageTitle;
|
||||||
import com.vaadin.flow.router.Route;
|
import com.vaadin.flow.router.Route;
|
||||||
@ -14,40 +22,125 @@ import jakarta.annotation.security.PermitAll;
|
|||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
import org.vaadin.firitin.components.grid.PagingGrid;
|
import org.vaadin.firitin.components.grid.PagingGrid;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.*;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@SpringComponent
|
@SpringComponent
|
||||||
@PermitAll
|
@PermitAll
|
||||||
@Scope("prototype")
|
@Scope("prototype")
|
||||||
@PageTitle("HoursWorkedList")
|
@PageTitle("Registro de Horas Trabajadas")
|
||||||
@Route(value = "/hours-worked-list", layout = MainLayout.class)
|
@Route(value = "/hours-worked-list", layout = MainLayout.class)
|
||||||
|
|
||||||
public class HoursWorkedListView extends Main {
|
public class HoursWorkedListView extends Main {
|
||||||
|
|
||||||
private final HoursWorkedService hoursWorkedService;
|
private final HoursWorkedService hoursWorkedService;
|
||||||
private final PagingGrid<HoursWorked> table = new PagingGrid<>(HoursWorked.class);
|
private final EmployeeService employeeService;
|
||||||
|
private final TeamService teamService;
|
||||||
|
private final PagingGrid<Employee> hoursWorkedGrid = new PagingGrid<>();
|
||||||
|
private final PagingGrid<Employee> table = new PagingGrid<>(Employee.class);
|
||||||
|
private List<Employee> employees = Collections.emptyList();
|
||||||
|
private ComboBox<Employee> employeeFilter;
|
||||||
|
private ComboBox<Team> teamFilter;
|
||||||
|
private UUID selectedEmployeeId;
|
||||||
|
|
||||||
public HoursWorkedListView (final HoursWorkedService hoursWorkedService) {
|
|
||||||
|
public HoursWorkedListView(final HoursWorkedService hoursWorkedService,
|
||||||
|
final EmployeeService employeeService,
|
||||||
|
final TeamService teamService) {
|
||||||
this.hoursWorkedService = hoursWorkedService;
|
this.hoursWorkedService = hoursWorkedService;
|
||||||
setupView();
|
this.employeeService = employeeService;
|
||||||
refreshGrid();
|
this.teamService = teamService;
|
||||||
|
this.employees = employeeService.findAllEmployees();
|
||||||
|
|
||||||
|
initializeView();
|
||||||
|
refreshGridListHoursWorked(null, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setupView() {
|
private void refreshGridListHoursWorked(final Employee employee,
|
||||||
add(new H2("Lista de Horas trabajadas"));
|
final Team team) {
|
||||||
configureTable();
|
hoursWorkedGrid.setPagingDataProvider((page, pageSize) -> {
|
||||||
add(createAddHoursWorkedButton());
|
int start = (int) (page * hoursWorkedGrid.getPageSize());
|
||||||
add(table);
|
return fetchFilteredEmployees(start, pageSize, employee, team);
|
||||||
|
});
|
||||||
|
hoursWorkedGrid.getDataProvider().refreshAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureTable() {
|
private List<Employee> fetchFilteredEmployees(final int start,
|
||||||
table.setColumns("Actividad", "Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo");
|
final int pageSize,
|
||||||
addEditButtonColumn("View", this::navigateToHoursWorkedView);
|
final Employee employee,
|
||||||
addEditButtonColumn("Edit", this::navigateToEditView);
|
final Team team) {
|
||||||
setupPagingGrid();
|
List<Employee> filteredEmployees = employeeService.findAllEmployees();
|
||||||
|
|
||||||
|
if (employee != null && !"TODOS".equals(employee.getFirstName())) {
|
||||||
|
filteredEmployees = filteredEmployees.stream()
|
||||||
|
.filter(emp -> emp.getId().equals(employee.getId()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addEditButtonColumn( final String label, final ButtonClickHandler handler) {
|
if (team != null && !"TODOS".equals(team.getName())) {
|
||||||
table.addComponentColumn(hoursWorked -> createButton(label, () -> handler.handle(hoursWorked)));
|
filteredEmployees = filteredEmployees.stream()
|
||||||
|
.filter(emp -> emp.getTeam() != null && emp.getTeam().getId().equals(team.getId()))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
}
|
||||||
|
|
||||||
|
int end = Math.min(start + pageSize, filteredEmployees.size());
|
||||||
|
return filteredEmployees.subList(start, end);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeView() {
|
||||||
|
setupFilters();
|
||||||
|
add(createAddHoursWorked());
|
||||||
|
setupListHoursWorkedGrid();
|
||||||
|
add(hoursWorkedGrid);
|
||||||
|
add(createActionButtons());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupFilters() {
|
||||||
|
add(createEmployeeFilter());
|
||||||
|
add(createTeamFilter());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setupListHoursWorkedGrid() {
|
||||||
|
hoursWorkedGrid.addColumn(this::getEmployeeFullName).setHeader("Empleado");
|
||||||
|
hoursWorkedGrid.addColumn(this::getTeamName).setHeader("Equipo");
|
||||||
|
|
||||||
|
hoursWorkedGrid.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM);
|
||||||
|
hoursWorkedGrid.setPageSize(5);
|
||||||
|
hoursWorkedGrid.asSingleSelect().addValueChangeListener(event -> {
|
||||||
|
Employee selectedRequest = event.getValue();
|
||||||
|
if (selectedRequest != null) {
|
||||||
|
selectedEmployeeId = selectedRequest.getId();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTeamName(final Employee employee) {
|
||||||
|
Team team = employee.getTeam();
|
||||||
|
return team != null ? team.getName() : "Sin asignar";
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getTeamLabel(final Team team) {
|
||||||
|
return "TODOS".equals(team.getName()) ? "TODOS" : team.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private HorizontalLayout createActionButtons() {
|
||||||
|
Button viewButton = new Button("Ver", event -> {
|
||||||
|
if (selectedEmployeeId != null) {
|
||||||
|
navigateToHoursWorkedView(selectedEmployeeId);
|
||||||
|
} else {
|
||||||
|
Notification.show("Seleccione una solicitud.", 3000, Notification.Position.MIDDLE);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
Button closeButton = new Button("Salir", event -> navigateToListView());
|
||||||
|
return new HorizontalLayout(viewButton, closeButton);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void navigateToListView() {
|
||||||
|
getUI().ifPresent(ui -> ui.navigate(MainView.class));
|
||||||
|
}
|
||||||
|
|
||||||
|
private void navigateToHoursWorkedView(final UUID idEmployee) {
|
||||||
|
getUI().ifPresent(ui -> ui.navigate("hours-worked-list/" + idEmployee.toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private Button createButton(final String label, final Runnable onClickAction) {
|
private Button createButton(final String label, final Runnable onClickAction) {
|
||||||
@ -56,46 +149,66 @@ public class HoursWorkedListView extends Main {
|
|||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Button createAddHoursWorkedButton() { return createButton("Crear Actividad", this::navigateToAddHoursWorkedView);}
|
private Button createAddHoursWorked() {
|
||||||
|
return createButton("Agregar Actividad", this::navigateToHours);
|
||||||
private void navigateToEditView(final HoursWorked hoursWorked) {
|
|
||||||
getUI().ifPresent(ui -> ui.navigate(HoursWorkedView.class, hoursWorked.getId().toString() + "/edit"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void navigateToHoursWorkedView(final HoursWorked hoursWorked) {
|
private void navigateToHours() { getUI().ifPresent(ui -> ui.navigate(HoursWorkedView.class, "new"));}
|
||||||
getUI().ifPresent(ui -> ui.navigate(HoursWorkedView.class, hoursWorked.getId().toString() + "/view"));
|
|
||||||
|
private ComboBox<Employee> createEmployeeFilter() {
|
||||||
|
employeeFilter = new ComboBox<>("Empleado");
|
||||||
|
List<Employee> employees = new ArrayList<>(employeeService.findAllEmployees());
|
||||||
|
employees.addFirst(createAllEmployeesOption());
|
||||||
|
employeeFilter.setItems(employees);
|
||||||
|
employeeFilter.setItemLabelGenerator(this::getEmployeeFullName);
|
||||||
|
employeeFilter.setValue(employees.getFirst());
|
||||||
|
employeeFilter.addValueChangeListener(event ->
|
||||||
|
refreshGridListHoursWorked(
|
||||||
|
event.getValue(),
|
||||||
|
teamFilter.getValue()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return employeeFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEmployeeFullName(final Employee employee) {
|
||||||
|
return "TODOS".equals(employee.getFirstName())
|
||||||
|
? "TODOS" : employee.getFirstName() + " " + employee.getLastName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private ComboBox<Team> createTeamFilter() {
|
||||||
|
teamFilter = new ComboBox<>("Equipo");
|
||||||
|
List<Team> teams = new ArrayList<>(teamService.findAllTeams());
|
||||||
|
teams.addFirst(createAllTeamsOption());
|
||||||
|
teamFilter.setItems(teams);
|
||||||
|
teamFilter.setItemLabelGenerator(this::getTeamLabel);
|
||||||
|
teamFilter.setValue(teams.getFirst());
|
||||||
|
teamFilter.addValueChangeListener(event ->
|
||||||
|
refreshGridListHoursWorked(
|
||||||
|
employeeFilter.getValue(),
|
||||||
|
event.getValue()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
return teamFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 navigateToAddHoursWorkedView() { getUI().ifPresent(ui -> ui.navigate(HoursWorkedView.class, "new"));}
|
|
||||||
|
|
||||||
private void setupPagingGrid() {
|
private void setupPagingGrid() {
|
||||||
table.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM);
|
table.setPaginationBarMode(PagingGrid.PaginationBarMode.BOTTOM);
|
||||||
table.setPageSize(5);
|
table.setPageSize(5);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void refreshGrid() {
|
|
||||||
table.setPagingDataProvider((page, pageSize) -> fetchHoursWorkeds((int) page, pageSize));
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<HoursWorked> fetchHoursWorkeds(final int page, final int pageSize) {
|
|
||||||
int start = page * pageSize;
|
|
||||||
if (hasSortOrder()) {
|
|
||||||
return fetchSortedHoursWorkeds(start, pageSize);
|
|
||||||
}
|
|
||||||
return hoursWorkedService.findHoursWorkeds(start, pageSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean hasSortOrder() { return !table.getSortOrder().isEmpty(); }
|
|
||||||
|
|
||||||
private List<HoursWorked> fetchSortedHoursWorkeds(final int start, final int pageSize) {
|
|
||||||
GridSortOrder<HoursWorked> sortOrder = table.getSortOrder().getFirst();
|
|
||||||
return hoursWorkedService.findHoursWorkeds(start, pageSize,
|
|
||||||
sortOrder.getSorted().getKey(),
|
|
||||||
sortOrder.getDirection() == SortDirection.ASCENDING);
|
|
||||||
}
|
|
||||||
|
|
||||||
@FunctionalInterface
|
|
||||||
private interface ButtonClickHandler {
|
|
||||||
void handle(HoursWorked hoursWorked);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -5,10 +5,9 @@ import com.primefactorsolutions.model.Team;
|
|||||||
import com.primefactorsolutions.service.EmployeeService;
|
import com.primefactorsolutions.service.EmployeeService;
|
||||||
import com.primefactorsolutions.service.HoursWorkedService;
|
import com.primefactorsolutions.service.HoursWorkedService;
|
||||||
import com.primefactorsolutions.service.TeamService;
|
import com.primefactorsolutions.service.TeamService;
|
||||||
import com.primefactorsolutions.service.TimeOffRequestService;
|
|
||||||
import com.vaadin.flow.component.Component;
|
import com.vaadin.flow.component.Component;
|
||||||
import com.vaadin.flow.component.datepicker.DatePicker;
|
import com.vaadin.flow.component.html.H2;
|
||||||
import com.vaadin.flow.component.html.H3;
|
import com.vaadin.flow.component.html.Label;
|
||||||
import com.vaadin.flow.component.notification.Notification;
|
import com.vaadin.flow.component.notification.Notification;
|
||||||
import com.vaadin.flow.component.textfield.TextField;
|
import com.vaadin.flow.component.textfield.TextField;
|
||||||
import com.vaadin.flow.component.button.Button;
|
import com.vaadin.flow.component.button.Button;
|
||||||
@ -17,9 +16,12 @@ import com.vaadin.flow.router.*;
|
|||||||
import com.vaadin.flow.spring.annotation.SpringComponent;
|
import com.vaadin.flow.spring.annotation.SpringComponent;
|
||||||
import jakarta.annotation.security.PermitAll;
|
import jakarta.annotation.security.PermitAll;
|
||||||
import org.springframework.context.annotation.Scope;
|
import org.springframework.context.annotation.Scope;
|
||||||
|
import org.vaadin.firitin.components.datepicker.VDatePicker;
|
||||||
import org.vaadin.firitin.form.BeanValidationForm;
|
import org.vaadin.firitin.form.BeanValidationForm;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.time.LocalDate;
|
||||||
|
import java.time.YearMonth;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -27,33 +29,42 @@ import java.util.UUID;
|
|||||||
@PermitAll
|
@PermitAll
|
||||||
@Scope("prototype")
|
@Scope("prototype")
|
||||||
@PageTitle("Horas Trabajadas")
|
@PageTitle("Horas Trabajadas")
|
||||||
@Route(value = "/timesheets/listhw/:hours-worked?/me", layout = MainLayout.class)
|
@Route(value = "/hours-worked-list/:hours-workedId?/:action?", layout = MainLayout.class)
|
||||||
public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements HasUrlParameter<String> {
|
public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements HasUrlParameter<String> {
|
||||||
private final DatePicker dateField = new DatePicker("Fecha");
|
private final VDatePicker dateField = new VDatePicker("Fecha");
|
||||||
private final ComboBox<Team> teamField = new ComboBox<>("Equipo");
|
private final ComboBox<Team> teamField = new ComboBox<>("Equipo");
|
||||||
private final ComboBox<Employee> employeeField = new ComboBox<>("Empleado");
|
private ComboBox<Employee> employeeField;
|
||||||
|
private final ComboBox<String> tareasEspecificasDropdown = new ComboBox<>("Tarea Específica");
|
||||||
|
private final TextField tareaEspecificaInput = new TextField("Otra Tarea Específica");
|
||||||
|
private final TextField horasTareaEspecificaField = new TextField("Horas Tarea Específica");
|
||||||
private final TextField activityField = new TextField("Actividad");
|
private final TextField activityField = new TextField("Actividad");
|
||||||
private final TextField hoursField = new TextField("Horas");
|
private final TextField hoursField = new TextField("Horas");
|
||||||
|
|
||||||
|
private final H2 equipoLabel = new H2("Tareas del Cliente/Equipo");
|
||||||
|
private final H2 empresaLabel = new H2("Tareas de la Empresa");
|
||||||
|
private final Label totalCompletadoLabel = new Label();
|
||||||
|
|
||||||
private final HoursWorkedService hoursWorkedService;
|
private final HoursWorkedService hoursWorkedService;
|
||||||
private final EmployeeService employeeService;
|
private final EmployeeService employeeService;
|
||||||
private final TeamService teamService;
|
private final TeamService teamService;
|
||||||
private HoursWorked request;
|
private HoursWorked hoursWorked;
|
||||||
private Employee employee;
|
private Employee employee;
|
||||||
|
|
||||||
private Button saveButton;
|
private Button saveButton;
|
||||||
|
|
||||||
public HoursWorkedView(HoursWorkedService hoursWorkedService,
|
public HoursWorkedView(HoursWorkedService hoursWorkedService,
|
||||||
EmployeeService employeeService,
|
EmployeeService employeeService,
|
||||||
TeamService teamService, TimeOffRequestService timeOffRequestService) {
|
TeamService teamService) {
|
||||||
super(HoursWorked.class);
|
super(HoursWorked.class);
|
||||||
this.hoursWorkedService = hoursWorkedService;
|
this.hoursWorkedService = hoursWorkedService;
|
||||||
this.employeeService = employeeService;
|
this.employeeService = employeeService;
|
||||||
this.teamService = teamService;
|
this.teamService = teamService;
|
||||||
|
|
||||||
// Initialize combo boxes
|
initializeDateField();
|
||||||
initializeTeamField();
|
initializeTeamField();
|
||||||
initializeEmployeeField();
|
initializeEmployeeField();
|
||||||
|
configureTareasEspecificas();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -71,7 +82,6 @@ public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements
|
|||||||
if ("edit".equals(action) && !s.isEmpty()) {
|
if ("edit".equals(action) && !s.isEmpty()) {
|
||||||
saveButton.setVisible(true);
|
saveButton.setVisible(true);
|
||||||
} else if ("view".equals(action) && !s.isEmpty()) {
|
} else if ("view".equals(action) && !s.isEmpty()) {
|
||||||
|
|
||||||
saveButton.setVisible(false);
|
saveButton.setVisible(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -83,12 +93,35 @@ public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements
|
|||||||
dateField,
|
dateField,
|
||||||
teamField,
|
teamField,
|
||||||
employeeField,
|
employeeField,
|
||||||
|
equipoLabel,
|
||||||
activityField,
|
activityField,
|
||||||
hoursField,
|
hoursField,
|
||||||
|
empresaLabel,
|
||||||
|
tareasEspecificasDropdown,
|
||||||
|
tareaEspecificaInput,
|
||||||
|
horasTareaEspecificaField,
|
||||||
createCloseButton()
|
createCloseButton()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void configureTareasEspecificas() {
|
||||||
|
tareasEspecificasDropdown.setItems("Entrevistas", "Reuniones", "Colaboraciones", "Aprendizajes", "Proyectos PFS", "Otros");
|
||||||
|
tareasEspecificasDropdown.setPlaceholder("Selecciona una tarea...");
|
||||||
|
|
||||||
|
tareasEspecificasDropdown.addValueChangeListener(event -> {
|
||||||
|
String selected = event.getValue();
|
||||||
|
boolean isOtros = "Otros".equals(selected);
|
||||||
|
tareaEspecificaInput.setVisible(isOtros);
|
||||||
|
horasTareaEspecificaField.setVisible(true);
|
||||||
|
if (!isOtros) {
|
||||||
|
tareaEspecificaInput.clear();
|
||||||
|
horasTareaEspecificaField.clear();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
tareaEspecificaInput.setVisible(false);
|
||||||
|
horasTareaEspecificaField.setVisible(false);
|
||||||
|
}
|
||||||
|
|
||||||
protected Button createSaveButton() {
|
protected Button createSaveButton() {
|
||||||
saveButton = new Button("Guardar");
|
saveButton = new Button("Guardar");
|
||||||
saveButton.addClickListener(event -> saveHoursWorked());
|
saveButton.addClickListener(event -> saveHoursWorked());
|
||||||
@ -102,23 +135,53 @@ public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void initializeTeamField() {
|
private void initializeTeamField() {
|
||||||
|
List<Team> teams = new ArrayList<>(teamService.findAllTeams());
|
||||||
teamField.setItems(teamService.findAllTeams());
|
teamField.setItems(teamService.findAllTeams());
|
||||||
teamField.setItemLabelGenerator(Team::getName);
|
teamField.setItemLabelGenerator(Team::getName);
|
||||||
|
teamField.setValue(teams.getFirst());
|
||||||
teamField.addValueChangeListener(event -> {
|
teamField.addValueChangeListener(event -> {
|
||||||
teamField.getValue();
|
if (teams != null) {
|
||||||
});
|
employeeField.getValue();
|
||||||
|
event.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initializeEmployeeField() {
|
private ComboBox<Employee> initializeEmployeeField() {
|
||||||
employeeField.setItems(employeeService.findAllEmployees());
|
employeeField = new ComboBox<>("Empleado");
|
||||||
employeeField.setItemLabelGenerator(employee -> employee.getFirstName() + " " + employee.getLastName());
|
List<Employee> employees = new ArrayList<>(employeeService.findAllEmployees());
|
||||||
|
employeeField.setItems(employees);
|
||||||
|
employeeField.setItemLabelGenerator(this::getEmployeeFullName);
|
||||||
|
employeeField.setValue(employees.getFirst());
|
||||||
|
return employeeField;
|
||||||
|
}
|
||||||
|
|
||||||
|
private String getEmployeeFullName(final Employee employee) {
|
||||||
|
return "TODOS".equals(employee.getFirstName())
|
||||||
|
? "TODOS" : employee.getFirstName() + " " + employee.getLastName();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void initializeDateField() {
|
||||||
|
LocalDate today = LocalDate.now();
|
||||||
|
YearMonth currentMonth = YearMonth.of(today.getYear(), today.getMonth());
|
||||||
|
|
||||||
|
LocalDate startOfMonth = currentMonth.atDay(1);
|
||||||
|
|
||||||
|
LocalDate maxSelectableDate = today;
|
||||||
|
|
||||||
|
dateField.setMin(startOfMonth);
|
||||||
|
dateField.setMax(maxSelectableDate);
|
||||||
|
dateField.setValue(today);
|
||||||
|
|
||||||
|
dateField.setLabel("Fecha");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void saveHoursWorked() {
|
private void saveHoursWorked() {
|
||||||
if (isFormValid()) {
|
if (isFormValid()) {
|
||||||
HoursWorked hoursWorked = getEntity();
|
HoursWorked hoursWorked = getEntity();
|
||||||
setFieldValues(hoursWorked);
|
setFieldValues(hoursWorked);
|
||||||
hoursWorkedService.saveHoursWorked(hoursWorked);
|
hoursWorkedService.save(hoursWorked);
|
||||||
Notification.show("Horas trabajadas guardadas correctamente.");
|
Notification.show("Horas trabajadas guardadas correctamente.");
|
||||||
closeForm();
|
closeForm();
|
||||||
}
|
}
|
||||||
@ -129,11 +192,26 @@ public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements
|
|||||||
hoursWorked.setTeam(teamField.getValue());
|
hoursWorked.setTeam(teamField.getValue());
|
||||||
hoursWorked.setEmployee(employeeField.getValue());
|
hoursWorked.setEmployee(employeeField.getValue());
|
||||||
hoursWorked.setActividad(activityField.getValue());
|
hoursWorked.setActividad(activityField.getValue());
|
||||||
//hoursWorked.setHours(hoursField.;
|
try {
|
||||||
|
double hours = Double.parseDouble(hoursField.getValue());
|
||||||
|
hoursWorked.setHours(hours);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
Notification.show("Por favor, ingrese un número válido para las horas.");
|
||||||
|
}
|
||||||
|
if ("Otros".equals(tareasEspecificasDropdown.getValue())) {
|
||||||
|
// Maneja horas y actividad específica adicional
|
||||||
|
hoursWorked.setTareasEspecificas(tareaEspecificaInput.getValue());
|
||||||
|
try {
|
||||||
|
double horasEspecifica = Double.parseDouble(horasTareaEspecificaField.getValue());
|
||||||
|
hoursWorked.setHorasTareasEspecificas(horasEspecifica);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
Notification.show("Por favor, ingrese un número válido para las horas de la tarea específica.");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void closeForm() {
|
private void closeForm() {
|
||||||
getUI().ifPresent(ui -> ui.navigate("hours-workedId"));
|
getUI().ifPresent(ui -> ui.navigate("hours-worked-list/" + hoursWorked.getId().toString()));
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isFormValid() {
|
private boolean isFormValid() {
|
||||||
@ -141,12 +219,13 @@ public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements
|
|||||||
teamField.getValue() != null &&
|
teamField.getValue() != null &&
|
||||||
employeeField.getValue() != null &&
|
employeeField.getValue() != null &&
|
||||||
!activityField.isEmpty();
|
!activityField.isEmpty();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void configureViewOrEditAction(String action) {
|
private void configureViewOrEditAction(String action) {
|
||||||
if ("edit".equals(action) && request != null) {
|
if ("edit".equals(action) && hoursWorked != null) {
|
||||||
setFieldsReadOnly(false);
|
setFieldsReadOnly(false);
|
||||||
} else if ("view".equals(action) && request != null) {
|
} else if ("view".equals(action) && hoursWorked != null) {
|
||||||
setFieldsReadOnly(true);
|
setFieldsReadOnly(true);
|
||||||
saveButton.setEnabled(false);
|
saveButton.setEnabled(false);
|
||||||
}
|
}
|
||||||
@ -159,6 +238,5 @@ public class HoursWorkedView extends BeanValidationForm<HoursWorked> implements
|
|||||||
activityField.setReadOnly(readOnly);
|
activityField.setReadOnly(readOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
private H3 createEmployeeHeader() {
|
|
||||||
return new H3("Empleado: " + (employee != null ? employee.getFirstName() + " " + employee.getLastName() : ""));}
|
|
||||||
}
|
}
|
@ -150,7 +150,7 @@ public class MainLayout extends AppLayout {
|
|||||||
LineAwesomeIcon.LIST_ALT.create()));
|
LineAwesomeIcon.LIST_ALT.create()));
|
||||||
SideNavItem timesheet = new SideNavItem("My Timesheet", TimesheetView.class,
|
SideNavItem timesheet = new SideNavItem("My Timesheet", TimesheetView.class,
|
||||||
LineAwesomeIcon.HOURGLASS_START_SOLID.create());
|
LineAwesomeIcon.HOURGLASS_START_SOLID.create());
|
||||||
timesheet.addItem(new SideNavItem("Hours Worked List View", HoursWorkedListView.class,
|
timesheet.addItem(new SideNavItem("Registro de Horas Trabajadas", HoursWorkedListView.class,
|
||||||
LineAwesomeIcon.ID_CARD_SOLID.create()));
|
LineAwesomeIcon.ID_CARD_SOLID.create()));
|
||||||
timesheet.addItem(new SideNavItem("Reporte Horas Trabajadas", ReporteView.class,
|
timesheet.addItem(new SideNavItem("Reporte Horas Trabajadas", ReporteView.class,
|
||||||
LineAwesomeIcon.ID_CARD_SOLID.create()));
|
LineAwesomeIcon.ID_CARD_SOLID.create()));
|
||||||
|
@ -90,3 +90,6 @@ insert into time_off_request (id, version, employee_id, category, state, availab
|
|||||||
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);
|
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)
|
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', 'LUNES_CARNAVAL', 'APROBADO', 1, '2024-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);
|
||||||
|
|
||||||
|
INSERT INTO HOURS_WORKED (ID, VERSION, ACTIVIDAD, DATE, HORAS_TAREAS_ESPECIFICAS, HORASPENDIENTES, HOURS, TAREAS_ESPECIFICAS, TOTAL_HOURS, WEEK_NUMBER, EMPLOYEE_ID, TEAM_ID)
|
||||||
|
VALUES ('6d6b3a71-9b11-4526-8335-b089627a8cd6', 0, 'Scrum Meeting', '2024-11-15', 0.0, 0.0, 2.0, NULL, 0.0, 0, '5c6f11fe-c341-4be7-a9a6-bba0081ad7c6', 'b0e8f394-78c1-4d8a-9c57-dc6e8b36a5fa');
|
||||||
|
Loading…
Reference in New Issue
Block a user