#45-Registro Semanal de Horas Trabajadas corregir duplicados #70

Closed
melina.gutierrez wants to merge 12 commits from hoursworked into main
4 changed files with 152 additions and 13 deletions
Showing only changes of commit dee4bcaf3b - Show all commits

View File

@ -1,6 +1,19 @@
package com.primefactorsolutions.model; package com.primefactorsolutions.model;
public final class Actividad { import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import java.util.UUID;
@Entity
public class Actividad extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.UUID)
private UUID id;
private String nombre; private String nombre;
private double lunes; private double lunes;
private double martes; private double martes;
@ -12,6 +25,8 @@ public final class Actividad {
private String tarea; private String tarea;
private double horas; private double horas;
public Actividad() {}
public Actividad(final Builder builder) { public Actividad(final Builder builder) {
this.nombre = builder.nombre; this.nombre = builder.nombre;
this.lunes = builder.lunes; this.lunes = builder.lunes;
@ -25,10 +40,59 @@ public final class Actividad {
this.horas = builder.horas; this.horas = builder.horas;
} }
public String setNombre(final String nombre) {
this.nombre = nombre;
return nombre;
}
public String getNombre() { public String getNombre() {
return nombre; return nombre;
} }
public void setLunes(double lunes) {
this.lunes = lunes;
return;
}
public void setMartes(double martes) {
this.martes = martes;
return;
}
public void setMiercoles(double miercoles) {
this.miercoles = miercoles;
return;
}
public void setJueves(double jueves) {
this.jueves = jueves;
return;
}
public void setViernes(double viernes) {
this.viernes = viernes;
return;
}
public void setSabado(double sabado) {
this.sabado = sabado;
return;
}
public void setDomingo(double domingo) {
this.domingo = domingo;
return;
}
public void setTarea(String tarea) {
this.tarea = tarea;
return;
}
public void setHoras(double horas) {
this.horas = horas;
return;
}
public double getLunes() { public double getLunes() {
return lunes; return lunes;
} }

View File

@ -6,6 +6,7 @@ import jakarta.persistence.GenerationType;
import jakarta.persistence.Id; import jakarta.persistence.Id;
import jakarta.persistence.ManyToOne; import jakarta.persistence.ManyToOne;
import java.time.LocalDate;
import java.util.UUID; import java.util.UUID;
@Entity @Entity
@ -17,11 +18,25 @@ public class HoursWorked extends BaseEntity {
@ManyToOne @ManyToOne
private Employee employee; private Employee employee;
@ManyToOne
private Actividad actividad;
private int weekNumber; private int weekNumber;
private double totalHours; private double totalHours;
private LocalDate fecha;
public HoursWorked() {} public HoursWorked() {}
public Actividad getActividad() {
return this.actividad;
}
public void setActividad(Actividad actividad){
this.actividad = actividad;
}
public UUID getId() { public UUID getId() {
return id; return id;
} }
@ -46,6 +61,8 @@ public class HoursWorked extends BaseEntity {
this.weekNumber = weekNumber; this.weekNumber = weekNumber;
} }
public LocalDate getFecha() { return this.fecha;}
public double getTotalHours() { public double getTotalHours() {
return totalHours; return totalHours;
} }

View File

@ -8,7 +8,5 @@ import java.util.List;
@Repository @Repository
public interface HoursWorkedRepository extends JpaRepository<HoursWorked, Long> { public interface HoursWorkedRepository extends JpaRepository<HoursWorked, Long> {
// Puedes definir consultas personalizadas aquí si es necesario.
List<HoursWorked> findByWeekNumber(int weekNumber); List<HoursWorked> findByWeekNumber(int weekNumber);
} }

View File

@ -4,7 +4,6 @@ import com.primefactorsolutions.model.Employee;
import com.primefactorsolutions.model.HoursWorked; import com.primefactorsolutions.model.HoursWorked;
import com.primefactorsolutions.service.EmployeeService; import com.primefactorsolutions.service.EmployeeService;
import com.primefactorsolutions.service.HoursWorkedService; import com.primefactorsolutions.service.HoursWorkedService;
import com.vaadin.flow.component.datepicker.DatePicker;
import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.notification.Notification;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
@ -16,12 +15,14 @@ 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 jakarta.persistence.ManyToOne;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
import com.vaadin.flow.component.html.Label; import com.vaadin.flow.component.html.Label;
import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.vaadin.firitin.components.datepicker.VDatePicker;
import java.time.DayOfWeek; import java.time.DayOfWeek;
@ -38,6 +39,9 @@ import java.util.Locale;
@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 {
@ManyToOne
private Actividad actividad;
private final List<Actividad> actividades = new ArrayList<>(); private final List<Actividad> actividades = new ArrayList<>();
private final List<Actividad> actividadesEspecificas = new ArrayList<>(); // Nueva lista para tareas específicas private final List<Actividad> actividadesEspecificas = new ArrayList<>(); // Nueva lista para tareas específicas
private final Grid<Actividad> grid = new Grid<>(Actividad.class); private final Grid<Actividad> grid = new Grid<>(Actividad.class);
@ -64,12 +68,7 @@ public class HoursWorkedView extends VerticalLayout {
private final Label numeroSemanaLabel = new Label("Número de la Semana: "); private final Label numeroSemanaLabel = new Label("Número de la Semana: ");
private DatePicker fechaPicker = new DatePicker("Selecciona una fecha"); private VDatePicker fechaPicker = new VDatePicker("Selecciona una fecha");
@Autowired
private InternalResourceViewResolver defaultViewResolver;
@Qualifier("defaultServletHandlerMapping")
@Autowired
private HandlerMapping defaultServletHandlerMapping;
public HoursWorkedView(final EmployeeService employeeService, final HoursWorkedService hoursWorkedService) { public HoursWorkedView(final EmployeeService employeeService, final HoursWorkedService hoursWorkedService) {
@ -100,9 +99,20 @@ public class HoursWorkedView extends VerticalLayout {
private void cargarDatos() { private void cargarDatos() {
if (selectedStartOfWeek != null && weekNumber > 0) { if (selectedStartOfWeek != null && weekNumber > 0) {
actividades.clear();
actividadesEspecificas.clear();
List<HoursWorked> listaDeHorasTrabajadas = obtenerDatos(); List<HoursWorked> listaDeHorasTrabajadas = obtenerDatos();
for (HoursWorked hours : listaDeHorasTrabajadas) {
LocalDate activityDate = hours.getFecha();
int activityWeek = getWeekOfYear(activityDate);
if (activityWeek == weekNumber) {
Actividad actividad = hours.getActividad();
if (actividad != null) {
DayOfWeek dayOfWeek = activityDate.getDayOfWeek();
agregarOActualizarActividad(actividad, dayOfWeek, hours.getTotalHours());
}
}
}
grid.setItems(actividades); grid.setItems(actividades);
gridActividadesEspecificas.setItems(actividadesEspecificas); gridActividadesEspecificas.setItems(actividadesEspecificas);
calcularTotalHoras(listaDeHorasTrabajadas); calcularTotalHoras(listaDeHorasTrabajadas);
@ -134,6 +144,7 @@ public class HoursWorkedView extends VerticalLayout {
} }
private void configurarVista() { private void configurarVista() {
fechaPicker.setMax(LocalDate.now());
fechaPicker.addValueChangeListener(event -> { fechaPicker.addValueChangeListener(event -> {
LocalDate selectedDate = event.getValue(); LocalDate selectedDate = event.getValue();
if (selectedDate != null) { if (selectedDate != null) {
@ -228,6 +239,13 @@ public class HoursWorkedView extends VerticalLayout {
Notification.show("Por favor, selecciona una fecha."); Notification.show("Por favor, selecciona una fecha.");
return; return;
} }
int selectedWeekNumber = getWeekOfYear(selectedDate);
if (selectedWeekNumber != weekNumber) {
Notification.show("Solo puedes agregar actividades dentro de la semana actual.");
return;
}
DayOfWeek selectedDay = selectedDate.getDayOfWeek(); DayOfWeek selectedDay = selectedDate.getDayOfWeek();
Actividad.Builder actividadBuilder = new Actividad.Builder() Actividad.Builder actividadBuilder = new Actividad.Builder()
@ -258,6 +276,10 @@ public class HoursWorkedView extends VerticalLayout {
actividades.add(nuevaActividad); actividades.add(nuevaActividad);
grid.setItems(actividades); grid.setItems(actividades);
} }
Actividad nuevaActividad = actividadBuilder.build();
agregarOActualizarActividad(nuevaActividad, selectedDay, horas);
actualizarTotales(); actualizarTotales();
Notification.show("Actividad agregada correctamente"); Notification.show("Actividad agregada correctamente");
actividadNombre.clear(); actividadNombre.clear();
@ -272,6 +294,44 @@ public class HoursWorkedView extends VerticalLayout {
return new HorizontalLayout(actividadNombre, horasInput, agregarActividadButton); return new HorizontalLayout(actividadNombre, horasInput, agregarActividadButton);
} }
private void agregarOActualizarActividad(Actividad nuevaActividad, DayOfWeek dia, double horas) {
Actividad actividadExistente = actividades.stream()
.filter(a -> a.getNombre().equals(nuevaActividad.getNombre()))
.findFirst()
.orElse(null);
if (actividadExistente != null) {
// Si la actividad ya existe, actualiza las horas para el día correspondiente
switch (dia) {
case MONDAY -> actividadExistente.setLunes(horas);
case TUESDAY -> actividadExistente.setMartes(horas);
case WEDNESDAY -> actividadExistente.setMiercoles(horas);
case THURSDAY -> actividadExistente.setJueves(horas);
case FRIDAY -> actividadExistente.setViernes(horas);
case SATURDAY -> actividadExistente.setSabado(horas);
case SUNDAY -> actividadExistente.setDomingo(horas);
default -> throw new IllegalArgumentException("Día seleccionado no válido: " + dia);
}
} else {
// Si no existe, se agrega como nueva actividad
switch (dia) {
case MONDAY -> nuevaActividad.setLunes(horas);
case TUESDAY -> nuevaActividad.setMartes(horas);
case WEDNESDAY -> nuevaActividad.setMiercoles(horas);
case THURSDAY -> nuevaActividad.setJueves(horas);
case FRIDAY -> nuevaActividad.setViernes(horas);
case SATURDAY -> nuevaActividad.setSabado(horas);
case SUNDAY -> nuevaActividad.setDomingo(horas);
default -> throw new IllegalArgumentException("Día seleccionado no válido: " + dia);
}
actividades.add(nuevaActividad);
}
// Actualiza el Grid
grid.setItems(actividades);
}
private HorizontalLayout configurarTareasEspecificasLayout() { private HorizontalLayout configurarTareasEspecificasLayout() {
Button agregarTareaButton = new Button("Agregar Tarea PFS", e -> { Button agregarTareaButton = new Button("Agregar Tarea PFS", e -> {