From 3e57c50378e055b0e4d820a59d3aca9839b84a1b Mon Sep 17 00:00:00 2001 From: Melina Gutierrez Date: Mon, 14 Oct 2024 12:56:02 -0400 Subject: [PATCH 1/4] #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 From b5396ae373fa3dfa94fdcc400ccdf5cf5409b9fb Mon Sep 17 00:00:00 2001 From: Melina Gutierrez Date: Tue, 15 Oct 2024 10:11:14 -0400 Subject: [PATCH 2/4] #46 Perfil de Empleado - Registro Semanal de Horas trabajadas con el numero de semanas --- .../views/HoursWorkedView.java | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java index 9c172b5..5d5491e 100644 --- a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java @@ -18,15 +18,16 @@ 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 com.vaadin.flow.component.html.Label; + 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; +import java.util.stream.IntStream; @SpringComponent @PermitAll @@ -42,21 +43,28 @@ public class HoursWorkedView extends VerticalLayout { @Autowired private EmployeeService employeeService; + private final Label fechasLabel = new Label("Selecciona una semana para ver las fechas."); + public HoursWorkedView() { 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)); + ComboBox semanaComboBox = new ComboBox<>("Selecciona una semana"); + semanaComboBox.setItems(getWeeksOfYear()); + semanaComboBox.addValueChangeListener(event -> { + String selectedWeek = event.getValue(); + if (selectedWeek != null) { + int weekNumber = Integer.parseInt(selectedWeek.split(" ")[1]); + selectedStartOfWeek = getStartOfWeek(weekNumber); + + LocalDate endOfWeek = selectedStartOfWeek.plusDays(6); + fechasLabel.setText(("Semana del " + selectedStartOfWeek + " al " + endOfWeek)); + mostrarActividadesDeLaSemana(); } }); - datePicker.setWidth("250px"); + semanaComboBox.setWidth("250px"); ComboBox equipoDropdown = new ComboBox<>("Equipo"); equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); @@ -130,15 +138,29 @@ public class HoursWorkedView extends VerticalLayout { HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, cerrarButton); - add(datePicker, filtersLayout, grid, actividadFormLayout, buttonsLayout); + add(semanaComboBox, fechasLabel, filtersLayout, grid, actividadFormLayout, buttonsLayout); add(totalsGrid); configurarTablaTotales(); } + private List getWeeksOfYear() { + return IntStream.rangeClosed(1, 52) + .mapToObj(week -> "Semana " + week) + .toList(); + } + + private LocalDate getStartOfWeek(int weekNumber) { + WeekFields weekFields = WeekFields.of(Locale.getDefault()); + return LocalDate.now() + .with(weekFields.weekOfYear(), weekNumber) + .with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()); + } + private void mostrarActividadesDeLaSemana() { if (selectedStartOfWeek != null) { - Notification.show("Mostrando actividades de la semana del " + selectedStartOfWeek + " al " + selectedStartOfWeek.plusDays(6)); + Notification.show("Mostrando actividades de la semana del " + + selectedStartOfWeek + " al " + selectedStartOfWeek.plusDays(6)); } } From b4826f172056b1516355173624061d7bc4dcdf7f Mon Sep 17 00:00:00 2001 From: Melina Gutierrez Date: Wed, 16 Oct 2024 15:08:08 -0400 Subject: [PATCH 3/4] #46 Perfil de Empleado - Registro Semanal de Horas trabajadas con el numero de semanas pero sin la bd --- .../model/HoursWorked.java | 61 ++++++ .../views/HoursWorkedView.java | 184 ++++++++++-------- 2 files changed, 165 insertions(+), 80 deletions(-) create mode 100644 src/main/java/com/primefactorsolutions/model/HoursWorked.java diff --git a/src/main/java/com/primefactorsolutions/model/HoursWorked.java b/src/main/java/com/primefactorsolutions/model/HoursWorked.java new file mode 100644 index 0000000..a2ddc8b --- /dev/null +++ b/src/main/java/com/primefactorsolutions/model/HoursWorked.java @@ -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; + } +} diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java index 5d5491e..2c3461c 100644 --- a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java @@ -1,8 +1,6 @@ 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; @@ -11,7 +9,6 @@ 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.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; @@ -27,7 +24,6 @@ import java.time.temporal.WeekFields; import java.util.ArrayList; import java.util.List; import java.util.Locale; -import java.util.stream.IntStream; @SpringComponent @PermitAll @@ -35,49 +31,79 @@ import java.util.stream.IntStream; @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 final List actividades = new ArrayList<>(); + private final Grid grid = new Grid<>(Actividad.class); + private final Grid totalsGrid = new Grid<>(Actividad.class); + private final ComboBox employeeComboBox = new ComboBox<>("Employee"); private LocalDate selectedStartOfWeek; @Autowired - private EmployeeService employeeService; + private final EmployeeService employeeService; private final Label fechasLabel = new Label("Selecciona una semana para ver las fechas."); - public HoursWorkedView() { - actividades = new ArrayList<>(); - grid = new Grid<>(Actividad.class, false); - totalsGrid = new Grid<>(Actividad.class, false); + @Autowired + public HoursWorkedView(final EmployeeService employeeService) { + this.employeeService = employeeService; + configurarVista(); + } - ComboBox semanaComboBox = new ComboBox<>("Selecciona una semana"); - semanaComboBox.setItems(getWeeksOfYear()); - semanaComboBox.addValueChangeListener(event -> { - String selectedWeek = event.getValue(); - if (selectedWeek != null) { - int weekNumber = Integer.parseInt(selectedWeek.split(" ")[1]); - selectedStartOfWeek = getStartOfWeek(weekNumber); + private void setEmployeeComboBoxProperties() { + employeeComboBox.setWidth("250px"); + employeeComboBox.setPlaceholder("Buscar empleado..."); + employeeComboBox.setItems(employeeService.findAllEmployees()); + employeeComboBox.setItemLabelGenerator(employee -> employee.getFirstName() + " " + employee.getLastName()); - LocalDate endOfWeek = selectedStartOfWeek.plusDays(6); - fechasLabel.setText(("Semana del " + selectedStartOfWeek + " al " + endOfWeek)); + employeeComboBox.setAllowCustomValue(false); + 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 equipoDropdown = new ComboBox<>("Equipo"); equipoDropdown.setItems("Equipo 1", "Equipo 2", "Equipo 3"); equipoDropdown.setWidth("250px"); - TextField empleadoSearch = new TextField("Empleado (Search)"); - empleadoSearch.setWidth("250px"); - empleadoSearch.addValueChangeListener(event -> { - }); + setEmployeeComboBoxProperties(); - HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, empleadoSearch); + HorizontalLayout filtersLayout = new HorizontalLayout(equipoDropdown, employeeComboBox); 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::getLunes).setHeader("Lunes"); 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::getDomingo).setHeader("Domingo"); grid.addColumn(this::calcularTotalPorDia).setHeader("Total Día").setKey("totalDia"); - grid.setWidth("100%"); + } + private HorizontalLayout configurarFormularioActividades() { TextField actividadNombre = new TextField("Actividad"); TextField lunesHoras = new TextField("Lunes"); TextField martesHoras = new TextField("Martes"); @@ -100,78 +127,75 @@ public class HoursWorkedView extends VerticalLayout { 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) + .nombre(actividadNombre.getValue()) + .lunes(Double.parseDouble(lunesHoras.getValue())) + .martes(Double.parseDouble(martesHoras.getValue())) + .miercoles(Double.parseDouble(miercolesHoras.getValue())) + .jueves(Double.parseDouble(juevesHoras.getValue())) + .viernes(Double.parseDouble(viernesHoras.getValue())) + .sabado(Double.parseDouble(sabadoHoras.getValue())) + .domingo(Double.parseDouble(domingoHoras.getValue())) .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(semanaComboBox, fechasLabel, filtersLayout, grid, actividadFormLayout, buttonsLayout); - add(totalsGrid); - - configurarTablaTotales(); + return new HorizontalLayout( + actividadNombre, lunesHoras, martesHoras, miercolesHoras, + juevesHoras, viernesHoras, sabadoHoras, domingoHoras, agregarActividadButton); } - private List getWeeksOfYear() { - return IntStream.rangeClosed(1, 52) - .mapToObj(week -> "Semana " + week) - .toList(); - } - - private LocalDate getStartOfWeek(int weekNumber) { + private LocalDate getStartOfWeek(final LocalDate date) { WeekFields weekFields = WeekFields.of(Locale.getDefault()); - return LocalDate.now() - .with(weekFields.weekOfYear(), weekNumber) - .with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()); + return date.with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()); } - 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 double calcularTotalPorDia(final Actividad actividad) { + return actividad.getLunes() + actividad.getMartes() + actividad.getMiercoles() + + actividad.getJueves() + actividad.getViernes() + actividad.getSabado() + actividad.getDomingo(); } private void configurarTablaTotales() { + totalsGrid.removeAllColumns(); 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 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() { From b19496ca1563c947f536a725625c26e81bd04c25 Mon Sep 17 00:00:00 2001 From: Melina Gutierrez Date: Wed, 16 Oct 2024 15:26:31 -0400 Subject: [PATCH 4/4] #46 Perfil de Empleado - Registro Mensual --- .../views/HoursWorkedMonthView.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java new file mode 100644 index 0000000..a4e575f --- /dev/null +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedMonthView.java @@ -0,0 +1,78 @@ +package com.primefactorsolutions.views; + + +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.html.H2; +import com.vaadin.flow.component.html.Label; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.TextField; +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.context.annotation.Scope; + +import java.util.List; + +@SpringComponent +@PermitAll +@Scope("prototype") +@PageTitle("Hours Worked Month") +@Route(value = "/hours-worked-month/me", layout = MainLayout.class) +public class HoursWorkedMonthView extends VerticalLayout { + + private final Grid grid; + private final ComboBox equipoComboBox; + private final TextField empleadoSearch; + private final Button actualizarButton; + private final Button guardarButton; + private final Button cerrarButton; + + public HoursWorkedMonthView() { + add(new H2("Registro de Horas Trabajadas")); + + Label mesLabel = new Label("SEPTIEMBRE 2024, MES 9"); + add(mesLabel); + + equipoComboBox = new ComboBox<>("Equipo"); + equipoComboBox.setItems(getEquipos()); + add(equipoComboBox); + + empleadoSearch = new TextField("Empleado (Search):"); + add(empleadoSearch); + + grid = new Grid<>(HoursWorkedView.Actividad.class); + grid.setItems(getActividades()); + grid.setColumns("lunes", "martes", "miercoles", "jueves", "viernes", "sabado", "domingo", "totalSem"); + add(grid); + + actualizarButton = new Button("Actualizar", e -> actualizar()); + guardarButton = new Button("Guardar", e -> guardar()); + cerrarButton = new Button("Cerrar", e -> cerrar()); + + add(actualizarButton, guardarButton, cerrarButton); + } + + private List getEquipos() { + return List.of("Equipo A", "Equipo B", "Equipo C"); + } + + private List getActividades() { + return List.of( + new HoursWorkedView.Actividad(1, 7, 8, 8, 8, 8, 1, 40), + new HoursWorkedView.Actividad(2, 1, 7, 8, 8, 8, 1, 40) + ); + } + + private void actualizar() { + grid.setItems(getActividades()); + } + + private void guardar() { + } + + private void cerrar() { + } +} \ No newline at end of file