From 3e57c50378e055b0e4d820a59d3aca9839b84a1b Mon Sep 17 00:00:00 2001 From: Melina Gutierrez Date: Mon, 14 Oct 2024 12:56:02 -0400 Subject: [PATCH] #46 Perfil de Empleado - Registro Semanal de Horas trabajadas --- .../views/HoursWorkedView.java | 170 ++++++++++++++---- 1 file changed, 131 insertions(+), 39 deletions(-) diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java index faa4208..9c172b5 100644 --- a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java @@ -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 actividades; + private final Grid grid; + private final Grid 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 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 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 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 { @@ -194,4 +286,4 @@ public class HoursWorkedView extends VerticalLayout { return domingo; } } -} +} \ No newline at end of file