#46 Perfil de Empleado - Registro Semanal de Horas trabajadas

This commit is contained in:
Melina Gutierrez 2024-10-14 12:56:02 -04:00
parent 2a59bc4e7e
commit 3e57c50378

View File

@ -1,19 +1,32 @@
package com.primefactorsolutions.views;
import com.primefactorsolutions.model.Employee;
import com.primefactorsolutions.service.EmployeeService;
import com.vaadin.flow.component.HasValue;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.combobox.ComboBox;
import com.vaadin.flow.component.grid.Grid;
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.Route;
import com.vaadin.flow.spring.annotation.SpringComponent;
import jakarta.annotation.security.PermitAll;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
@SpringComponent
@PermitAll
@ -21,20 +34,42 @@ import java.time.LocalDate;
@PageTitle("Hours Worked")
@Route(value = "/hours-worked/me", layout = MainLayout.class)
public class HoursWorkedView extends VerticalLayout {
private final List<Actividad> actividades;
private final Grid<Actividad> grid;
private final Grid<Actividad> totalsGrid;
private LocalDate selectedStartOfWeek;
@Autowired
private EmployeeService employeeService;
public HoursWorkedView() {
H2 title = new H2("Registro de Horas Trabajadas");
actividades = new ArrayList<>();
grid = new Grid<>(Actividad.class, false);
totalsGrid = new Grid<>(Actividad.class, false);
DatePicker datePicker = new DatePicker("Selecciona una fecha");
datePicker.setValue(LocalDate.now());
datePicker.addValueChangeListener(event -> {
LocalDate selectedDate = event.getValue();
if (selectedDate != null) {
selectedStartOfWeek = selectedDate.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY));
mostrarActividadesDeLaSemana();
}
});
datePicker.setWidth("250px");
ComboBox<String> equipoDropdown = new ComboBox<>("Equipo");
equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); // Ejemplo de datos
equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3");
equipoDropdown.setWidth("250px");
TextField empleadoSearch = new TextField("Empleado (Search)");
empleadoSearch.setWidth("250px");
empleadoSearch.addValueChangeListener(event -> {
});
HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, empleadoSearch);
filtersLayout.setSpacing(true);
Grid<Actividad> grid = new Grid<>(Actividad.class, false);
grid.addColumn(Actividad::getNombre).setHeader("Actividad");
grid.addColumn(Actividad::getLunes).setHeader("Lunes");
grid.addColumn(Actividad::getMartes).setHeader("Martes");
@ -43,47 +78,104 @@ public class HoursWorkedView extends VerticalLayout {
grid.addColumn(Actividad::getViernes).setHeader("Viernes");
grid.addColumn(Actividad::getSabado).setHeader("Sábado");
grid.addColumn(Actividad::getDomingo).setHeader("Domingo");
grid.addColumn(this::calcularTotalPorDia).setHeader("Total Día").setKey("totalDia");
grid.setWidth("100%");
grid.setItems(
new Actividad.Builder()
.nombre("Actividad 1")
.lunes(3)
.martes(3)
.miercoles(3)
.jueves(3)
.viernes(3)
.sabado(1)
.domingo(2)
.build(),
new Actividad.Builder()
.nombre("Actividad 2")
.lunes(2)
.martes(2)
.miercoles(2)
.jueves(2)
.viernes(2)
.sabado(0)
.domingo(1)
.build(),
new Actividad.Builder()
.nombre("Meeting 1")
.lunes(0)
.martes(0.5)
.miercoles(0.5)
.jueves(0)
.viernes(0)
.sabado(0.5)
.domingo(0)
.build()
);
TextField actividadNombre = new TextField("Actividad");
TextField lunesHoras = new TextField("Lunes");
TextField martesHoras = new TextField("Martes");
TextField miercolesHoras = new TextField("Miércoles");
TextField juevesHoras = new TextField("Jueves");
TextField viernesHoras = new TextField("Viernes");
TextField sabadoHoras = new TextField("Sábado");
TextField domingoHoras = new TextField("Domingo");
Button actualizarButton = new Button("Actualizar");
Button agregarActividadButton = new Button("Agregar Actividad", e -> {
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()
.nombre(nombre)
.lunes(lunes)
.martes(martes)
.miercoles(miercoles)
.jueves(jueves)
.viernes(viernes)
.sabado(sabado)
.domingo(domingo)
.build();
actividades.add(nuevaActividad);
grid.setItems(actividades);
actualizarTotales();
Notification.show("Actividad agregada correctamente");
} catch (NumberFormatException ex) {
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);
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(title, datePicker, filtersLayout, grid, buttonsLayout);
add(datePicker, filtersLayout, grid, actividadFormLayout, buttonsLayout);
add(totalsGrid);
configurarTablaTotales();
}
private void mostrarActividadesDeLaSemana() {
if (selectedStartOfWeek != null) {
Notification.show("Mostrando actividades de la semana del " + 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() {
totalsGrid.addColumn(Actividad::getNombre).setHeader("Descripción");
totalsGrid.addColumn(Actividad::getLunes).setHeader("Total");
}
private void actualizarTotales() {
double totalLunes = actividades.stream().mapToDouble(Actividad::getLunes).sum();
double totalMartes = actividades.stream().mapToDouble(Actividad::getMartes).sum();
double totalMiercoles = actividades.stream().mapToDouble(Actividad::getMiercoles).sum();
double totalJueves = actividades.stream().mapToDouble(Actividad::getJueves).sum();
double totalViernes = actividades.stream().mapToDouble(Actividad::getViernes).sum();
double totalSabado = actividades.stream().mapToDouble(Actividad::getSabado).sum();
double totalDomingo = actividades.stream().mapToDouble(Actividad::getDomingo).sum();
double totalSemanaCompletada = totalLunes + totalMartes + totalMiercoles + totalJueves + totalViernes + totalSabado + totalDomingo;
double horasPendientes = 40 - totalSemanaCompletada;
List<Actividad> totales = new ArrayList<>();
totales.add(new Actividad.Builder()
.nombre("Total Hrs/Semana Completadas")
.lunes(totalSemanaCompletada)
.build());
totales.add(new Actividad.Builder()
.nombre("Total Hrs/Semana Pendientes")
.lunes(horasPendientes)
.build());
totalsGrid.setItems(totales);
}
public static final class Actividad {