#46 Perfil de Empleado - Registro Semanal de Horas trabajadas
This commit is contained in:
parent
2a59bc4e7e
commit
3e57c50378
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user