#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; 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.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.orderedlayout.HorizontalLayout;
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;
import com.vaadin.flow.component.combobox.ComboBox; 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.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.html.H2; 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;
import jakarta.annotation.security.PermitAll; import jakarta.annotation.security.PermitAll;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import java.time.DayOfWeek;
import java.time.LocalDate; 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 @SpringComponent
@PermitAll @PermitAll
@ -21,20 +34,42 @@ import java.time.LocalDate;
@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 Grid<Actividad> grid;
private final Grid<Actividad> totalsGrid;
private LocalDate selectedStartOfWeek;
@Autowired
private EmployeeService employeeService;
public HoursWorkedView() { 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 datePicker = new DatePicker("Selecciona una fecha");
datePicker.setValue(LocalDate.now()); 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"); 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)"); TextField empleadoSearch = new TextField("Empleado (Search)");
empleadoSearch.setWidth("250px");
empleadoSearch.addValueChangeListener(event -> {
});
HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, empleadoSearch); 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::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");
@ -43,47 +78,104 @@ public class HoursWorkedView extends VerticalLayout {
grid.addColumn(Actividad::getViernes).setHeader("Viernes"); grid.addColumn(Actividad::getViernes).setHeader("Viernes");
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.setWidth("100%");
grid.setItems( TextField actividadNombre = new TextField("Actividad");
new Actividad.Builder() TextField lunesHoras = new TextField("Lunes");
.nombre("Actividad 1") TextField martesHoras = new TextField("Martes");
.lunes(3) TextField miercolesHoras = new TextField("Miércoles");
.martes(3) TextField juevesHoras = new TextField("Jueves");
.miercoles(3) TextField viernesHoras = new TextField("Viernes");
.jueves(3) TextField sabadoHoras = new TextField("Sábado");
.viernes(3) TextField domingoHoras = new TextField("Domingo");
.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()
);
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 guardarButton = new Button("Guardar");
Button cerrarButton = new Button("Cerrar"); Button cerrarButton = new Button("Cerrar");
HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, cerrarButton); 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 { public static final class Actividad {
@ -194,4 +286,4 @@ public class HoursWorkedView extends VerticalLayout {
return domingo; return domingo;
} }
} }
} }