#46 Perfil de Empleado - Registro Semanal de Horas trabajadas con el numero de semanas pero sin la bd

This commit is contained in:
Melina Gutierrez 2024-10-16 15:08:08 -04:00
parent b5396ae373
commit b4826f1720
2 changed files with 165 additions and 80 deletions

View File

@ -0,0 +1,61 @@
package com.primefactorsolutions.model;
import jakarta.persistence.*;
import jakarta.validation.constraints.AssertTrue;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import java.time.LocalDate;
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@EqualsAndHashCode(callSuper = true)
public class HoursWorked extends BaseEntity {
@ManyToOne
@JoinColumn(name = "employee_id", nullable = false)
private Employee employee;
private LocalDate workDate;
private int regularHours;
private int overtimeHours;
private int weekendHours;
private int holidayHours;
@Enumerated(EnumType.STRING)
private WorkType workType;
@Enumerated(EnumType.STRING)
private ApprovalStatus approvalStatus;
@Column(columnDefinition = "TEXT")
private String notes;
public enum WorkType {
ONSITE, REMOTE, HYBRID
}
public enum ApprovalStatus {
PENDING, APPROVED, REJECTED
}
@AssertTrue(message = "Las horas no pueden ser negativas")
public boolean areHoursValid() {
return regularHours >= 0 && overtimeHours >= 0 &&
weekendHours >= 0 && holidayHours >= 0;
}
@AssertTrue(message = "La suma de horas no puede superar 24 en un día")
public boolean isTotalHoursValid() {
int totalHours = regularHours + overtimeHours + weekendHours + holidayHours;
return totalHours <= 24;
}
}

View File

@ -1,8 +1,6 @@
package com.primefactorsolutions.views; package com.primefactorsolutions.views;
import com.primefactorsolutions.model.Employee; import com.primefactorsolutions.model.Employee;
import com.primefactorsolutions.service.EmployeeService; import com.primefactorsolutions.service.EmployeeService;
import com.vaadin.flow.component.HasValue;
import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.notification.Notification;
@ -11,7 +9,6 @@ import com.vaadin.flow.component.textfield.TextField;
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.orderedlayout.VerticalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.html.H2;
import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route; import com.vaadin.flow.router.Route;
import com.vaadin.flow.spring.annotation.SpringComponent; import com.vaadin.flow.spring.annotation.SpringComponent;
@ -27,7 +24,6 @@ import java.time.temporal.WeekFields;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.stream.IntStream;
@SpringComponent @SpringComponent
@PermitAll @PermitAll
@ -35,49 +31,79 @@ import java.util.stream.IntStream;
@PageTitle("Hours Worked") @PageTitle("Hours Worked")
@Route(value = "/hours-worked/me", layout = MainLayout.class) @Route(value = "/hours-worked/me", layout = MainLayout.class)
public class HoursWorkedView extends VerticalLayout { public class HoursWorkedView extends VerticalLayout {
private final List<Actividad> actividades; private final List<Actividad> actividades = new ArrayList<>();
private final Grid<Actividad> grid; private final Grid<Actividad> grid = new Grid<>(Actividad.class);
private final Grid<Actividad> totalsGrid; private final Grid<Actividad> totalsGrid = new Grid<>(Actividad.class);
private final ComboBox<Employee> employeeComboBox = new ComboBox<>("Employee");
private LocalDate selectedStartOfWeek; private LocalDate selectedStartOfWeek;
@Autowired @Autowired
private EmployeeService employeeService; private final EmployeeService employeeService;
private final Label fechasLabel = new Label("Selecciona una semana para ver las fechas."); private final Label fechasLabel = new Label("Selecciona una semana para ver las fechas.");
public HoursWorkedView() { @Autowired
actividades = new ArrayList<>(); public HoursWorkedView(final EmployeeService employeeService) {
grid = new Grid<>(Actividad.class, false); this.employeeService = employeeService;
totalsGrid = new Grid<>(Actividad.class, false); configurarVista();
}
ComboBox<String> semanaComboBox = new ComboBox<>("Selecciona una semana"); private void setEmployeeComboBoxProperties() {
semanaComboBox.setItems(getWeeksOfYear()); employeeComboBox.setWidth("250px");
semanaComboBox.addValueChangeListener(event -> { employeeComboBox.setPlaceholder("Buscar empleado...");
String selectedWeek = event.getValue(); employeeComboBox.setItems(employeeService.findAllEmployees());
if (selectedWeek != null) { employeeComboBox.setItemLabelGenerator(employee -> employee.getFirstName() + " " + employee.getLastName());
int weekNumber = Integer.parseInt(selectedWeek.split(" ")[1]);
selectedStartOfWeek = getStartOfWeek(weekNumber);
LocalDate endOfWeek = selectedStartOfWeek.plusDays(6); employeeComboBox.setAllowCustomValue(false);
fechasLabel.setText(("Semana del " + selectedStartOfWeek + " al " + endOfWeek)); employeeComboBox.addCustomValueSetListener(event ->
Notification.show("Selecciona un empleado válido de la lista.")
);
mostrarActividadesDeLaSemana(); employeeComboBox.addValueChangeListener(event -> {
Employee selectedEmployee = event.getValue();
if (selectedEmployee != null) {
Notification.show("Empleado seleccionado: " +
selectedEmployee.getFirstName() + " " + selectedEmployee.getLastName());
}
});
}
private void configurarVista() {
DatePicker fechaPicker = new DatePicker("Selecciona una fecha");
fechaPicker.addValueChangeListener(event -> {
LocalDate selectedDate = event.getValue();
if (selectedDate != null) {
selectedStartOfWeek = getStartOfWeek(selectedDate);
LocalDate endOfWeek = selectedStartOfWeek.plusDays(6);
fechasLabel.setText("Semana del " + selectedStartOfWeek + " al " + endOfWeek);
} }
}); });
semanaComboBox.setWidth("250px");
ComboBox<String> equipoDropdown = new ComboBox<>("Equipo"); ComboBox<String> equipoDropdown = new ComboBox<>("Equipo");
equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3");
equipoDropdown.setWidth("250px"); equipoDropdown.setWidth("250px");
TextField empleadoSearch = new TextField("Empleado (Search)"); setEmployeeComboBoxProperties();
empleadoSearch.setWidth("250px");
empleadoSearch.addValueChangeListener(event -> {
});
HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, empleadoSearch); HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, employeeComboBox);
filtersLayout.setSpacing(true); filtersLayout.setSpacing(true);
configurarGrid();
HorizontalLayout actividadFormLayout = configurarFormularioActividades();
Button actualizarButton = new Button("Actualizar Totales", event -> actualizarTotales());
Button guardarButton = new Button("Guardar");
Button cerrarButton = new Button("Cerrar");
HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, cerrarButton);
add(fechaPicker, fechasLabel, filtersLayout, grid, actividadFormLayout, buttonsLayout, totalsGrid);
configurarTablaTotales();
}
private void configurarGrid() {
grid.removeAllColumns();
grid.setItems(actividades);
grid.addColumn(Actividad::getNombre).setHeader("Actividad"); grid.addColumn(Actividad::getNombre).setHeader("Actividad");
grid.addColumn(Actividad::getLunes).setHeader("Lunes"); grid.addColumn(Actividad::getLunes).setHeader("Lunes");
grid.addColumn(Actividad::getMartes).setHeader("Martes"); grid.addColumn(Actividad::getMartes).setHeader("Martes");
@ -87,8 +113,9 @@ public class HoursWorkedView extends VerticalLayout {
grid.addColumn(Actividad::getSabado).setHeader("Sábado"); grid.addColumn(Actividad::getSabado).setHeader("Sábado");
grid.addColumn(Actividad::getDomingo).setHeader("Domingo"); grid.addColumn(Actividad::getDomingo).setHeader("Domingo");
grid.addColumn(this::calcularTotalPorDia).setHeader("Total Día").setKey("totalDia"); grid.addColumn(this::calcularTotalPorDia).setHeader("Total Día").setKey("totalDia");
grid.setWidth("100%"); }
private HorizontalLayout configurarFormularioActividades() {
TextField actividadNombre = new TextField("Actividad"); TextField actividadNombre = new TextField("Actividad");
TextField lunesHoras = new TextField("Lunes"); TextField lunesHoras = new TextField("Lunes");
TextField martesHoras = new TextField("Martes"); TextField martesHoras = new TextField("Martes");
@ -100,78 +127,75 @@ public class HoursWorkedView extends VerticalLayout {
Button agregarActividadButton = new Button("Agregar Actividad", e -> { Button agregarActividadButton = new Button("Agregar Actividad", e -> {
try { try {
String nombre = actividadNombre.getValue();
double lunes = Double.parseDouble(lunesHoras.getValue());
double martes = Double.parseDouble(martesHoras.getValue());
double miercoles = Double.parseDouble(miercolesHoras.getValue());
double jueves = Double.parseDouble(juevesHoras.getValue());
double viernes = Double.parseDouble(viernesHoras.getValue());
double sabado = Double.parseDouble(sabadoHoras.getValue());
double domingo = Double.parseDouble(domingoHoras.getValue());
Actividad nuevaActividad = new Actividad.Builder() Actividad nuevaActividad = new Actividad.Builder()
.nombre(nombre) .nombre(actividadNombre.getValue())
.lunes(lunes) .lunes(Double.parseDouble(lunesHoras.getValue()))
.martes(martes) .martes(Double.parseDouble(martesHoras.getValue()))
.miercoles(miercoles) .miercoles(Double.parseDouble(miercolesHoras.getValue()))
.jueves(jueves) .jueves(Double.parseDouble(juevesHoras.getValue()))
.viernes(viernes) .viernes(Double.parseDouble(viernesHoras.getValue()))
.sabado(sabado) .sabado(Double.parseDouble(sabadoHoras.getValue()))
.domingo(domingo) .domingo(Double.parseDouble(domingoHoras.getValue()))
.build(); .build();
actividades.add(nuevaActividad); actividades.add(nuevaActividad);
grid.setItems(actividades); grid.setItems(actividades);
actualizarTotales(); actualizarTotales();
Notification.show("Actividad agregada correctamente"); Notification.show("Actividad agregada correctamente");
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
Notification.show("Error: Por favor ingresa números válidos para las horas."); Notification.show("Error: Por favor ingresa números válidos para las horas.");
} }
}); });
HorizontalLayout actividadFormLayout = new HorizontalLayout(actividadNombre, lunesHoras, martesHoras, miercolesHoras, juevesHoras, viernesHoras, sabadoHoras, domingoHoras, agregarActividadButton); return new HorizontalLayout(
actividadNombre, lunesHoras, martesHoras, miercolesHoras,
Button actualizarButton = new Button("Actualizar Totales", event -> actualizarTotales()); juevesHoras, viernesHoras, sabadoHoras, domingoHoras, agregarActividadButton);
Button guardarButton = new Button("Guardar");
Button cerrarButton = new Button("Cerrar");
HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, cerrarButton);
add(semanaComboBox, fechasLabel, filtersLayout, grid, actividadFormLayout, buttonsLayout);
add(totalsGrid);
configurarTablaTotales();
} }
private List<String> getWeeksOfYear() { private LocalDate getStartOfWeek(final LocalDate date) {
return IntStream.rangeClosed(1, 52)
.mapToObj(week -> "Semana " + week)
.toList();
}
private LocalDate getStartOfWeek(int weekNumber) {
WeekFields weekFields = WeekFields.of(Locale.getDefault()); WeekFields weekFields = WeekFields.of(Locale.getDefault());
return LocalDate.now() return date.with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
.with(weekFields.weekOfYear(), weekNumber)
.with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue());
} }
private void mostrarActividadesDeLaSemana() { private double calcularTotalPorDia(final Actividad actividad) {
if (selectedStartOfWeek != null) { return actividad.getLunes() + actividad.getMartes() + actividad.getMiercoles()
Notification.show("Mostrando actividades de la semana del " + + actividad.getJueves() + actividad.getViernes() + actividad.getSabado() + actividad.getDomingo();
selectedStartOfWeek + " al " + selectedStartOfWeek.plusDays(6));
}
}
private double calcularTotalPorDia(Actividad actividad) {
return actividad.getLunes() + actividad.getMartes() + actividad.getMiercoles() +
actividad.getJueves() + actividad.getViernes() + actividad.getSabado() + actividad.getDomingo();
} }
private void configurarTablaTotales() { private void configurarTablaTotales() {
totalsGrid.removeAllColumns();
totalsGrid.addColumn(Actividad::getNombre).setHeader("Descripción"); totalsGrid.addColumn(Actividad::getNombre).setHeader("Descripción");
totalsGrid.addColumn(Actividad::getLunes).setHeader("Total"); totalsGrid.addColumn(Actividad::getLunes).setHeader("Lunes");
totalsGrid.addColumn(Actividad::getMartes).setHeader("Martes");
totalsGrid.addColumn(Actividad::getMiercoles).setHeader("Miércoles");
totalsGrid.addColumn(Actividad::getJueves).setHeader("Jueves");
totalsGrid.addColumn(Actividad::getViernes).setHeader("Viernes");
totalsGrid.addColumn(Actividad::getSabado).setHeader("Sábado");
totalsGrid.addColumn(Actividad::getDomingo).setHeader("Domingo");
totalsGrid.addColumn(this::calcularTotalPorSemana).setHeader("Total");
totalsGrid.setItems(calcularTotales());
}
private double calcularTotalPorSemana(final Actividad actividad) {
return actividad.getLunes() + actividad.getMartes() + actividad.getMiercoles()
+ actividad.getJueves() + actividad.getViernes() + actividad.getSabado()
+ actividad.getDomingo();
}
private List<Actividad> calcularTotales() {
Actividad totalActividad = new Actividad.Builder()
.nombre("Total Semanal")
.lunes(actividades.stream().mapToDouble(Actividad::getLunes).sum())
.martes(actividades.stream().mapToDouble(Actividad::getMartes).sum())
.miercoles(actividades.stream().mapToDouble(Actividad::getMiercoles).sum())
.jueves(actividades.stream().mapToDouble(Actividad::getJueves).sum())
.viernes(actividades.stream().mapToDouble(Actividad::getViernes).sum())
.sabado(actividades.stream().mapToDouble(Actividad::getSabado).sum())
.domingo(actividades.stream().mapToDouble(Actividad::getDomingo).sum())
.build();
return List.of(totalActividad);
} }
private void actualizarTotales() { private void actualizarTotales() {