From 64224a2db1e7b29f9e13695c142c522d12fd83c5 Mon Sep 17 00:00:00 2001 From: Melina Gutierrez Date: Tue, 12 Nov 2024 20:20:08 -0400 Subject: [PATCH] #45-Registro Semanal de Horas Trabajadas corregir duplicados --- .../primefactorsolutions/model/Actividad.java | 20 ++++---- .../model/HoursWorked.java | 8 +-- .../views/HoursWorkedView.java | 38 ++++++-------- .../views/ReporteView.java | 51 ++++++------------- 4 files changed, 46 insertions(+), 71 deletions(-) diff --git a/src/main/java/com/primefactorsolutions/model/Actividad.java b/src/main/java/com/primefactorsolutions/model/Actividad.java index 7c7df34..55402f4 100644 --- a/src/main/java/com/primefactorsolutions/model/Actividad.java +++ b/src/main/java/com/primefactorsolutions/model/Actividad.java @@ -25,7 +25,7 @@ public class Actividad extends BaseEntity { private String tarea; private double horas; - public Actividad() {} + public Actividad() { } public Actividad(final Builder builder) { this.nombre = builder.nombre; @@ -49,46 +49,46 @@ public class Actividad extends BaseEntity { return nombre; } - public void setLunes(double lunes) { + public void setLunes(final double lunes) { this.lunes = lunes; return; } - public void setMartes(double martes) { + public void setMartes(final double martes) { this.martes = martes; return; } - public void setMiercoles(double miercoles) { + public void setMiercoles(final double miercoles) { this.miercoles = miercoles; return; } - public void setJueves(double jueves) { + public void setJueves(final double jueves) { this.jueves = jueves; return; } - public void setViernes(double viernes) { + public void setViernes(final double viernes) { this.viernes = viernes; return; } - public void setSabado(double sabado) { + public void setSabado(final double sabado) { this.sabado = sabado; return; } - public void setDomingo(double domingo) { + public void setDomingo(final double domingo) { this.domingo = domingo; return; } - public void setTarea(String tarea) { + public void setTarea(final String tarea) { this.tarea = tarea; return; } - public void setHoras(double horas) { + public void setHoras(final double horas) { this.horas = horas; return; } diff --git a/src/main/java/com/primefactorsolutions/model/HoursWorked.java b/src/main/java/com/primefactorsolutions/model/HoursWorked.java index e23e9b0..2b918d3 100644 --- a/src/main/java/com/primefactorsolutions/model/HoursWorked.java +++ b/src/main/java/com/primefactorsolutions/model/HoursWorked.java @@ -27,13 +27,13 @@ public class HoursWorked extends BaseEntity { private LocalDate fecha; - public HoursWorked() {} + public HoursWorked() { } public Actividad getActividad() { return this.actividad; } - public void setActividad(Actividad actividad){ + public void setActividad(final Actividad actividad) { this.actividad = actividad; } @@ -61,7 +61,9 @@ public class HoursWorked extends BaseEntity { this.weekNumber = weekNumber; } - public LocalDate getFecha() { return this.fecha;} + public LocalDate getFecha() { + return this.fecha; + } public double getTotalHours() { return totalHours; diff --git a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java index a17d6de..62ef1cb 100644 --- a/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java +++ b/src/main/java/com/primefactorsolutions/views/HoursWorkedView.java @@ -5,6 +5,7 @@ import com.primefactorsolutions.model.HoursWorked; import com.primefactorsolutions.service.EmployeeService; import com.primefactorsolutions.service.HoursWorkedService; import com.vaadin.flow.component.grid.Grid; +import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.textfield.TextField; @@ -15,13 +16,9 @@ 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 jakarta.persistence.ManyToOne; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Scope; import com.vaadin.flow.component.html.Label; -import org.springframework.web.servlet.HandlerMapping; -import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.vaadin.firitin.components.datepicker.VDatePicker; @@ -36,19 +33,18 @@ import java.util.Locale; @SpringComponent @PermitAll @Scope("prototype") -@PageTitle("Hours Worked") +@PageTitle("Horas Trabajadas") @Route(value = "/hours-worked/me", layout = MainLayout.class) public class HoursWorkedView extends VerticalLayout { - @ManyToOne - private Actividad actividad; - private final List actividades = new ArrayList<>(); private final List actividadesEspecificas = new ArrayList<>(); // Nueva lista para tareas específicas private final Grid grid = new Grid<>(Actividad.class); private final Grid gridActividadesEspecificas = new Grid<>(Actividad.class); - private final ComboBox employeeComboBox = new ComboBox<>("Employee"); + private final ComboBox employeeComboBox = new ComboBox<>("Empleado"); private final ComboBox equipoDropdown = new ComboBox<>("Equipo"); + private VDatePicker fechaPicker = new VDatePicker("Selecciona una fecha"); + private final ComboBox tareasEspecificasDropdown = new ComboBox<>("Tareas Específicas"); private final TextField tareaEspecificaInput = new TextField("Especificar Tarea"); @@ -62,15 +58,11 @@ public class HoursWorkedView extends VerticalLayout { @Autowired private final HoursWorkedService hoursWorkedService; - private final Label fechasLabel = new Label("Selecciona una semana para ver las fechas."); + private final H2 equipoLabel = new H2("Tareas del Cliente/Equipo"); + private final H2 empresaLabel = new H2("Tareas de la Empresa"); private final Label totalCompletadoLabel = new Label(); private final Label horasPendientesLabel = new Label(); - private final Label numeroSemanaLabel = new Label("Número de la Semana: "); - - private VDatePicker fechaPicker = new VDatePicker("Selecciona una fecha"); - - public HoursWorkedView(final EmployeeService employeeService, final HoursWorkedService hoursWorkedService) { this.employeeService = employeeService; this.hoursWorkedService = hoursWorkedService; @@ -149,10 +141,7 @@ public class HoursWorkedView extends VerticalLayout { LocalDate selectedDate = event.getValue(); if (selectedDate != null) { selectedStartOfWeek = getStartOfWeek(selectedDate); - LocalDate endOfWeek = selectedStartOfWeek.plusDays(6); weekNumber = getWeekOfYear(selectedDate); - fechasLabel.setText("Semana del " + selectedStartOfWeek + " al " + endOfWeek); - numeroSemanaLabel.setText("Número de la Semana: " + weekNumber); cargarDatos(); } }); @@ -189,12 +178,14 @@ public class HoursWorkedView extends VerticalLayout { HorizontalLayout buttonsLayout = new HorizontalLayout(actualizarButton, guardarButton, cerrarButton, verMesButton); - VerticalLayout totalesLayout = new VerticalLayout(totalCompletadoLabel, horasPendientesLabel); + VerticalLayout totalesLayout = new VerticalLayout(totalCompletadoLabel, + horasPendientesLabel); totalesLayout.setSpacing(true); totalesLayout.setPadding(true); - add(fechaPicker, fechasLabel, numeroSemanaLabel, filtersLayout, actividadFormLayout, - tareasEspecificasLayout, grid, gridActividadesEspecificas, buttonsLayout, totalesLayout); + add(fechaPicker, filtersLayout, actividadFormLayout, + equipoLabel, grid, empresaLabel, tareasEspecificasLayout, + gridActividadesEspecificas, buttonsLayout, totalesLayout); } private void configurarGrid() { @@ -209,6 +200,7 @@ 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.setItems(actividades); } private void configurarGridActividadesEspecificas() { @@ -294,7 +286,7 @@ public class HoursWorkedView extends VerticalLayout { return new HorizontalLayout(actividadNombre, horasInput, agregarActividadButton); } - private void agregarOActualizarActividad(Actividad nuevaActividad, DayOfWeek dia, double horas) { + private void agregarOActualizarActividad(final Actividad nuevaActividad, final DayOfWeek dia, final double horas) { Actividad actividadExistente = actividades.stream() .filter(a -> a.getNombre().equals(nuevaActividad.getNombre())) .findFirst() @@ -414,7 +406,7 @@ public class HoursWorkedView extends VerticalLayout { private LocalDate getStartOfWeek(final LocalDate date) { WeekFields weekFields = WeekFields.of(Locale.getDefault()); - return date.with(weekFields.dayOfWeek(), DayOfWeek.MONDAY.getValue()); + return date.with(weekFields.dayOfWeek(), DayOfWeek.FRIDAY.getValue()); } private double calcularTotalPorDia(final Actividad actividad) { diff --git a/src/main/java/com/primefactorsolutions/views/ReporteView.java b/src/main/java/com/primefactorsolutions/views/ReporteView.java index 1594cc5..3e10457 100644 --- a/src/main/java/com/primefactorsolutions/views/ReporteView.java +++ b/src/main/java/com/primefactorsolutions/views/ReporteView.java @@ -50,7 +50,6 @@ public class ReporteView extends VerticalLayout { private final Span semanaInfoSpan = new Span(); - // Obtener el año actual private int currentYear = LocalDate.now().getYear(); @@ -76,22 +75,19 @@ public class ReporteView extends VerticalLayout { // Listener para actualizar `semanaInfoSpan` con la selección del usuario en `semanaComboBox` semanaComboBox.addValueChangeListener(event -> { String selectedWeek = event.getValue(); - semanaInfoSpan.setText(selectedWeek != null - ? selectedWeek : "Selecciona una semana"); + semanaInfoSpan.setText(selectedWeek != null ? selectedWeek : "Selecciona una semana"); }); Button reportButton = new Button("Generar Reporte de Horas Trabajadas", event -> generateHoursWorkedReport()); - HorizontalLayout filtersLayout = new HorizontalLayout(equipoComboBox, - semanaComboBox, reportButton); + HorizontalLayout filtersLayout = new HorizontalLayout(equipoComboBox, semanaComboBox, reportButton); add(filtersLayout); // Añadir `headerLayout` al diseño principal para el encabezado dinámico add(headerLayout); updateHeaderLayout(null, null); - grid.addColumn(map -> map.get("ID")).setHeader("ID") - .getElement().getStyle().set("font-weight", "bold"); + grid.addColumn(map -> map.get("ID")).setHeader("ID").getElement().getStyle().set("font-weight", "bold"); grid.addColumn(map -> map.get("Employee ID")).setHeader("Employee ID"); grid.addColumn(map -> map.get("Empleado")).setHeader("Empleado"); grid.addColumn(map -> map.get("Horas Trabajadas")).setHeader("Horas Trabajadas"); @@ -105,8 +101,7 @@ public class ReporteView extends VerticalLayout { int year = LocalDate.now().getYear(); LocalDate startOfYear = LocalDate.of(year, 1, 5); // Suponemos que la semana comienza el 5 de enero. - List semanas = startOfYear.datesUntil(LocalDate - .of(year + 1, 1, 1), + List semanas = startOfYear.datesUntil(LocalDate.of(year + 1, 1, 1), java.time.Period.ofWeeks(1)) .map(date -> { int weekNumber = date.get(WeekFields.of(DayOfWeek.MONDAY, 1) @@ -133,27 +128,23 @@ public class ReporteView extends VerticalLayout { String selectedWeek = semanaComboBox.getValue(); if (selectedEquipo == null || selectedWeek == null) { Notification.show("Por favor, selecciona un equipo y una semana para generar el reporte.", - 3000, - Notification.Position.MIDDLE); + 3000, Notification.Position.MIDDLE); return; } - int weekNumber = Integer.parseInt(selectedWeek.split(" ")[1] - .replace(":", "")); - LocalDate selectedDate = LocalDate.now() - .with(WeekFields.of(DayOfWeek.FRIDAY, 1) - .weekOfWeekBasedYear(), weekNumber); + int weekNumber = Integer.parseInt(selectedWeek.split(" ")[1].replace(":", "")); + LocalDate selectedDate = LocalDate.now().with(WeekFields.of(DayOfWeek.FRIDAY, 1) + .weekOfWeekBasedYear(), weekNumber); updateHeaderLayout(selectedEquipo, selectedDate); List hoursWorkedList = hoursWorkedService.findAll().stream() - .filter(hw -> hw.getEmployee().getTeam().getId() - .equals(selectedEquipo.getId()) && hw.getWeekNumber() == weekNumber) + .filter(hw -> hw.getEmployee().getTeam().getId().equals(selectedEquipo + .getId()) && hw.getWeekNumber() == weekNumber) .collect(Collectors.toList()); if (hoursWorkedList.isEmpty()) { Notification.show("No hay horas trabajadas disponibles para generar el reporte.", - 3000, - Notification.Position.MIDDLE); + 3000, Notification.Position.MIDDLE); return; } @@ -188,8 +179,8 @@ public class ReporteView extends VerticalLayout { String formattedEndDate = endOfWeek.getDayOfMonth() + " de " + endOfWeek.getMonth().getDisplayName(TextStyle.FULL, Locale.getDefault()); - headerLayout.add(new Span("Informe " + String.format("%03d", weekNumber) - + "/" + currentYear) {{ + headerLayout.add(new Span("Informe " + + String.format("%03d", weekNumber) + "/" + currentYear) {{ getStyle().set("font-size", "24px"); getStyle().set("font-weight", "bold"); }}); @@ -213,14 +204,13 @@ public class ReporteView extends VerticalLayout { } } - private void generateExcelDownloadLink(final List> data, - final int weekNumber) { + private void generateExcelDownloadLink(final List> data, final int weekNumber) { try { List headers = List.of("ID", "Employee ID", "Empleado", "Horas Trabajadas", "Horas Pendientes", "Observaciones"); String selectedTeam = equipoComboBox.getValue().getName(); - byte[] excelBytes = reportService.writeAsExcel("hours_worked_report", - headers, data, selectedTeam, weekNumber, currentYear); + byte[] excelBytes = reportService.writeAsExcel( + "hours_worked_report", headers, data, selectedTeam, weekNumber, currentYear); StreamResource excelResource = new StreamResource("hours_worked_report.xlsx", () -> new ByteArrayInputStream(excelBytes)); @@ -241,13 +231,4 @@ public class ReporteView extends VerticalLayout { return date.get(WeekFields.of(Locale.getDefault()).weekOfWeekBasedYear()); } - public int getCurrentYear() { - return currentYear; - } - - // Opcional: Si deseas permitir cambiar el año actual manualmente, agrega un setter - public void setCurrentYear(final int currentYear) { - this.currentYear = currentYear; - } - }