3 Commits

5 changed files with 397 additions and 55 deletions
Unified View
  1. +102
    -0
      src/main/java/mx/gob/jumapacelaya/models/encuestas/MantenimientosSinEncuesta.java
  2. +64
    -30
      src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java
  3. +7
    -11
      src/main/java/mx/gob/jumapacelaya/services/EmailService.java
  4. +22
    -0
      src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java
  5. +202
    -14
      src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java

+ 102
- 0
src/main/java/mx/gob/jumapacelaya/models/encuestas/MantenimientosSinEncuesta.java View File

@ -0,0 +1,102 @@
package mx.gob.jumapacelaya.models.encuestas;
import java.time.LocalDate;
public class MantenimientosSinEncuesta {
private int mantenimientoId;
private int planId;
private LocalDate fecha;
private String periodo;
private String tipomant;
private String departamento;
private String nomUsuario;
private String email;
private String encuesta;
public MantenimientosSinEncuesta(int mantenimientoId, int planId, LocalDate fecha,
String periodo, String tipomant, String departamento,
String nomUsuario, String email, String encuesta) {
this.mantenimientoId = mantenimientoId;
this.planId = planId;
this.fecha = fecha;
this.periodo = periodo;
this.tipomant = tipomant;
this.departamento = departamento;
this.nomUsuario = nomUsuario;
this.email = email;
this.encuesta = encuesta;
}
public int getMantenimientoId() {
return mantenimientoId;
}
public void setMantenimientoId(int mantenimientoId) {
this.mantenimientoId = mantenimientoId;
}
public int getPlanId() {
return planId;
}
public void setPlanId(int planId) {
this.planId = planId;
}
public LocalDate getFecha() {
return fecha;
}
public void setFecha(LocalDate fecha) {
this.fecha = fecha;
}
public String getPeriodo() {
return periodo;
}
public void setPeriodo(String periodo) {
this.periodo = periodo;
}
public String getTipomant() {
return tipomant;
}
public void setTipomant(String tipomant) {
this.tipomant = tipomant;
}
public String getDepartamento() {
return departamento;
}
public void setDepartamento(String departamento) {
this.departamento = departamento;
}
public String getNomUsuario() {
return nomUsuario;
}
public void setNomUsuario(String nomUsuario) {
this.nomUsuario = nomUsuario;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getEncuesta() {
return encuesta;
}
public void setEncuesta(String encuesta) {
this.encuesta = encuesta;
}
}

+ 64
- 30
src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java View File

@ -1,6 +1,7 @@
package mx.gob.jumapacelaya.services; package mx.gob.jumapacelaya.services;
import mx.gob.jumapacelaya.models.*; import mx.gob.jumapacelaya.models.*;
import mx.gob.jumapacelaya.models.encuestas.MantenimientosSinEncuesta;
import mx.gob.jumapacelaya.models.encuestas.Pregunta; import mx.gob.jumapacelaya.models.encuestas.Pregunta;
import mx.gob.jumapacelaya.models.encuestas.Respuesta; import mx.gob.jumapacelaya.models.encuestas.Respuesta;
import oracle.jdbc.OracleConnection; import oracle.jdbc.OracleConnection;
@ -89,7 +90,6 @@ public class DatabaseService {
return nomenclatura; return nomenclatura;
} }
/* -------------- Metodo para obtener a los usuarios ---------------- */ /* -------------- Metodo para obtener a los usuarios ---------------- */
public List<Usuario> getUsuarios() { public List<Usuario> getUsuarios() {
List<Usuario> usuarios = new ArrayList<>(); List<Usuario> usuarios = new ArrayList<>();
@ -114,7 +114,6 @@ public class DatabaseService {
return usuarios; return usuarios;
} }
/* -------------- Metodo para obtener los departamentos ---------------- */ /* -------------- Metodo para obtener los departamentos ---------------- */
public List<DepartamentosModel> getDepartamentos() { public List<DepartamentosModel> getDepartamentos() {
List<DepartamentosModel> departamentos = new ArrayList<>(); List<DepartamentosModel> departamentos = new ArrayList<>();
@ -137,7 +136,6 @@ public class DatabaseService {
return departamentos; return departamentos;
} }
/* -------------- Metodo para obtener los tipos de hardware ---------------- */ /* -------------- Metodo para obtener los tipos de hardware ---------------- */
public List<TiposHardware> getTiposHardware() { public List<TiposHardware> getTiposHardware() {
List<TiposHardware> tiposHardware = new ArrayList<>(); List<TiposHardware> tiposHardware = new ArrayList<>();
@ -160,8 +158,6 @@ public class DatabaseService {
return tiposHardware; return tiposHardware;
} }
/* ----------------Obtener el Plan Anual de Mantenimiento ---------------- */ /* ----------------Obtener el Plan Anual de Mantenimiento ---------------- */
public List<PlanAnual> getPlanAnual() { public List<PlanAnual> getPlanAnual() {
List<PlanAnual> planAnualList = new ArrayList<>(); List<PlanAnual> planAnualList = new ArrayList<>();
@ -215,7 +211,6 @@ public class DatabaseService {
return planAnualList; return planAnualList;
} }
/* ----------------Obtener el Plan Anual de Mantenimiento por ID ---------------- */ /* ----------------Obtener el Plan Anual de Mantenimiento por ID ---------------- */
public PlanAnual getPlanAnualPorId(int id) { public PlanAnual getPlanAnualPorId(int id) {
String query = """ String query = """
@ -267,8 +262,6 @@ public class DatabaseService {
return null; return null;
} }
/* ----------------Obtener detalles del mantenimiento ---------------- */ /* ----------------Obtener detalles del mantenimiento ---------------- */
public DetalleMantenimientoModel getDetalleMantenimientoPorPlanAnualId(int planAnualId) { public DetalleMantenimientoModel getDetalleMantenimientoPorPlanAnualId(int planAnualId) {
String query = "SELECT\n" + String query = "SELECT\n" +
@ -296,7 +289,7 @@ public class DatabaseService {
try (Connection connection = getMysqlConnection(); try (Connection connection = getMysqlConnection();
PreparedStatement statement = connection.prepareStatement(query)) { PreparedStatement statement = connection.prepareStatement(query)) {
statement.setInt(1, planAnualId); statement.setInt(1, planAnualId);
try (ResultSet rs = statement.executeQuery()) { try (ResultSet rs = statement.executeQuery()) {
@ -325,6 +318,65 @@ public class DatabaseService {
return null; return null;
} }
/* ----------------Obtener mantenimientos sin encuesta respondida por periodo ---------------- */
public List<MantenimientosSinEncuesta> getEncuestPendientes(String mes, int anio) {
List<MantenimientosSinEncuesta> lista = new ArrayList<>();
String query = """
SELECT
m.MANTENIMIENTOID MANTID,
m.PLANANUALID PLANID,
m.FECHA,
ms.NOMBRE PERIODO,
t.NOMBRE TIPOMANT,
d.DESCRIPCION DEPTO,
u.NOMBRE NOMUSUARIO,
u.EMAIL,
m.ENCUESTA
FROM MANTENIMIENTOS m
JOIN TIPOMANT t
ON t.TIPOMANTID = m.TIPOMANTID
JOIN DEPARTAMENTOS d
on d.DEPARTAMENTOID = m.DEPARTAMENTOID
JOIN USUARIOS u
on u.EMPLEADOID = m.EMPLEADOID
JOIN PLANANUAL p
ON p.PLANANUALID = m.PLANANUALID
JOIN MESES ms
ON ms.MESID = p.MESID
WHERE m.ENCUESTA = 'N'
AND m.TIPOMANTID = 1
AND m.PLANANUALID IS NOT NULL
AND UPPER(ms.NOMBRE) = UPPER(?)
AND EXTRACT(YEAR FROM m.FECHA) = ?
""";
try(Connection connection = getMysqlConnection();
PreparedStatement stmt = connection.prepareStatement(query)) {
stmt.setString(1, mes.toUpperCase());
stmt.setInt(2, anio);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
lista.add(new MantenimientosSinEncuesta(
rs.getInt("MANTID"),
rs.getInt("PLANID"),
rs.getDate("FECHA").toLocalDate(),
rs.getString("PERIODO"),
rs.getString("TIPOMANT"),
rs.getString("DEPTO"),
rs.getString("NOMUSUARIO"),
rs.getString("EMAIL"),
rs.getString("ENCUESTA")
));
}
} catch (SQLException e) {
e.printStackTrace();
}
return lista;
}
/* ----------------Obtener detalles del hardaware por ID ---------------- */ /* ----------------Obtener detalles del hardaware por ID ---------------- */
public List<HardwareDetalle> getHardwaredetallePorMantId(int mantenimientoId) { public List<HardwareDetalle> getHardwaredetallePorMantId(int mantenimientoId) {
@ -333,10 +385,10 @@ public class DatabaseService {
"FROM HARDWAREDET h\r\n" + // "FROM HARDWAREDET h\r\n" + //
"INNER JOIN TIPOSHARDWARE t ON h.TIPOHARDWAREID = t.TIPOHARDWAREID \r\n" + // "INNER JOIN TIPOSHARDWARE t ON h.TIPOHARDWAREID = t.TIPOHARDWAREID \r\n" + //
"WHERE h.MANTENIMIENTOID = ?"; "WHERE h.MANTENIMIENTOID = ?";
try (Connection conn = getMysqlConnection(); try (Connection conn = getMysqlConnection();
PreparedStatement stmt = conn.prepareStatement(query)) { PreparedStatement stmt = conn.prepareStatement(query)) {
stmt.setInt(1, mantenimientoId); stmt.setInt(1, mantenimientoId);
ResultSet rs = stmt.executeQuery(); ResultSet rs = stmt.executeQuery();
@ -358,14 +410,13 @@ public class DatabaseService {
return detalles; return detalles;
} }
/* ---------------- Obtener las actualizaciones de seguridad ---------------- */ /* ---------------- Obtener las actualizaciones de seguridad ---------------- */
public List<ActualizacioneSeguridadModel> getActualizacionesSeg(int mantenimientoId) { public List<ActualizacioneSeguridadModel> getActualizacionesSeg(int mantenimientoId) {
List<ActualizacioneSeguridadModel> actualizaciones = new ArrayList<>(); List<ActualizacioneSeguridadModel> actualizaciones = new ArrayList<>();
String query = "SELECT *\r\n" + // String query = "SELECT *\r\n" + //
"FROM ACTUALIZACIONESSEG a\r\n" + // "FROM ACTUALIZACIONESSEG a\r\n" + //
"WHERE a.MANTENIMIENTOID = ?"; "WHERE a.MANTENIMIENTOID = ?";
try (Connection conn = getMysqlConnection(); try (Connection conn = getMysqlConnection();
PreparedStatement stmt = conn.prepareStatement(query)) { PreparedStatement stmt = conn.prepareStatement(query)) {
@ -388,7 +439,6 @@ public class DatabaseService {
return actualizaciones; return actualizaciones;
} }
/* ---------------- Obtener los mantenimientos correctivos ---------------- */ /* ---------------- Obtener los mantenimientos correctivos ---------------- */
public List<MantCorrectivosModel> getMantenimientosCorrectivos(int tipomantId) { public List<MantCorrectivosModel> getMantenimientosCorrectivos(int tipomantId) {
List<MantCorrectivosModel> mantCorrectivos = new ArrayList<>(); List<MantCorrectivosModel> mantCorrectivos = new ArrayList<>();
@ -435,8 +485,6 @@ public class DatabaseService {
return mantCorrectivos; return mantCorrectivos;
} }
/*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/ /*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/
/*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/ /*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/
/*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/ /*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/
@ -565,7 +613,6 @@ public class DatabaseService {
return isInserted; return isInserted;
} }
public int getUltimoMantenimientoId() { public int getUltimoMantenimientoId() {
int ultimoId = -1; int ultimoId = -1;
try (Connection connection = getMysqlConnection()) { try (Connection connection = getMysqlConnection()) {
@ -582,7 +629,6 @@ public class DatabaseService {
return ultimoId; return ultimoId;
} }
// INSERTAR EN LA TABLA: ACTUALIZACIONESSEG // INSERTAR EN LA TABLA: ACTUALIZACIONESSEG
public boolean insertActualizacionSeg(String descripcion, String otras, int mantenimientoId) { public boolean insertActualizacionSeg(String descripcion, String otras, int mantenimientoId) {
String query = "INSERT INTO ACTUALIZACIONESSEG (descripcion, otrasactualizaciones, mantenimientoid) VALUES (?, ?, ?)"; String query = "INSERT INTO ACTUALIZACIONESSEG (descripcion, otrasactualizaciones, mantenimientoid) VALUES (?, ?, ?)";
@ -602,7 +648,6 @@ public class DatabaseService {
} }
} }
// INSERTAR ARCHIVO EXCEL EN LA TABLA: PLANANUAL // INSERTAR ARCHIVO EXCEL EN LA TABLA: PLANANUAL
public void insertarDesdeExcel(InputStream inputStream) { public void insertarDesdeExcel(InputStream inputStream) {
String query = "INSERT INTO PLANANUAL (NOMEQUIPO, AREA, MONITOR, TECLADO, MOUSE, " + String query = "INSERT INTO PLANANUAL (NOMEQUIPO, AREA, MONITOR, TECLADO, MOUSE, " +
@ -677,7 +722,6 @@ public class DatabaseService {
} }
} }
// INSERTAR NUEVO EQUIPO INDIVIDUAL EN PLANANUAL // INSERTAR NUEVO EQUIPO INDIVIDUAL EN PLANANUAL
public void insertarNuevoEquipo(String nomequipo, String area, boolean monitor, boolean teclado, public void insertarNuevoEquipo(String nomequipo, String area, boolean monitor, boolean teclado,
boolean mouse, boolean regulador, boolean cpu, boolean impresora, boolean mouse, boolean regulador, boolean cpu, boolean impresora,
@ -724,7 +768,6 @@ public class DatabaseService {
} }
// Método auxiliar para obtener un valor de tipo Date de una celda // Método auxiliar para obtener un valor de tipo Date de una celda
private Date getDateCellValue(Cell cell) { private Date getDateCellValue(Cell cell) {
if (cell != null) { if (cell != null) {
@ -780,7 +823,6 @@ public class DatabaseService {
return false; // Valor por defecto si la celda es nula return false; // Valor por defecto si la celda es nula
} }
/* ----------------Actualizar los detalles del del mantenimiento por ID ---------------- */ /* ----------------Actualizar los detalles del del mantenimiento por ID ---------------- */
public boolean actualizarPlanAnual(int planAnualId, String nombreEquipo) { public boolean actualizarPlanAnual(int planAnualId, String nombreEquipo) {
String sql = "UPDATE PLANANUAL SET NOMEQUIPO=? WHERE PLANANUALID=?"; String sql = "UPDATE PLANANUAL SET NOMEQUIPO=? WHERE PLANANUALID=?";
@ -822,7 +864,6 @@ public class DatabaseService {
} }
} }
/* ----------------Actualizar los detalles del hardaware por ID ---------------- */ /* ----------------Actualizar los detalles del hardaware por ID ---------------- */
public boolean actualizarHardwareDetalle(HardwareDetalle detalle) { public boolean actualizarHardwareDetalle(HardwareDetalle detalle) {
String sql = "UPDATE HARDWAREDET SET MODELO=?, NUMSERIE=?, PLACA=? WHERE HARDWAREDETID=?"; String sql = "UPDATE HARDWAREDET SET MODELO=?, NUMSERIE=?, PLACA=? WHERE HARDWAREDETID=?";
@ -839,7 +880,6 @@ public class DatabaseService {
} }
} }
/* ----------------Actualizar las actualizaciones de seguridad por ID ---------------- */ /* ----------------Actualizar las actualizaciones de seguridad por ID ---------------- */
public boolean actualizarActualizacionSeg(ActualizacioneSeguridadModel actualizacion) { public boolean actualizarActualizacionSeg(ActualizacioneSeguridadModel actualizacion) {
String sql = "UPDATE ACTUALIZACIONESSEG SET OTRASACTUALIZACIONES=? WHERE ACTUALIZACIONSEGID=?"; String sql = "UPDATE ACTUALIZACIONESSEG SET OTRASACTUALIZACIONES=? WHERE ACTUALIZACIONSEGID=?";
@ -854,7 +894,6 @@ public class DatabaseService {
} }
} }
/* ---------------- Insertar en bitacora ---------------- */ /* ---------------- Insertar en bitacora ---------------- */
public boolean insertarBitacora(int mantenimientoid, String usuarioid, LocalDate fechora, String motivo) { public boolean insertarBitacora(int mantenimientoid, String usuarioid, LocalDate fechora, String motivo) {
String query = "INSERT INTO BITACORACTUALIZACIONES (MANTENIMIENTOID, USUARIOID, FECHORA, MOTIVO) VALUES (?, ?, ?, ?)"; String query = "INSERT INTO BITACORACTUALIZACIONES (MANTENIMIENTOID, USUARIOID, FECHORA, MOTIVO) VALUES (?, ?, ?, ?)";
@ -871,7 +910,6 @@ public class DatabaseService {
} }
} }
/* ---------------- Insertar en bitacora de eliminacion de equipos ---------------- */ /* ---------------- Insertar en bitacora de eliminacion de equipos ---------------- */
public boolean insertarBitacoraEliminacion(int plananualid, String usuarioid, LocalDate fechora, String motivo) { public boolean insertarBitacoraEliminacion(int plananualid, String usuarioid, LocalDate fechora, String motivo) {
String query = "INSERT INTO BITACORAELIMINACIONES (PLANANUALID, USUARIOID, FECHAHORA, MOTIVO) VALUES (?, ?, ?, ?)"; String query = "INSERT INTO BITACORAELIMINACIONES (PLANANUALID, USUARIOID, FECHAHORA, MOTIVO) VALUES (?, ?, ?, ?)";
@ -888,7 +926,6 @@ public class DatabaseService {
} }
} }
/* ---------------- Eliminar equipo de PLAN ANUAL ---------------- */ /* ---------------- Eliminar equipo de PLAN ANUAL ---------------- */
public void eliminarEquipoPlanAnual(int planAnualId) { public void eliminarEquipoPlanAnual(int planAnualId) {
String sql = "DELETE FROM PLANANUAL WHERE PLANANUALID = ?"; String sql = "DELETE FROM PLANANUAL WHERE PLANANUALID = ?";
@ -909,7 +946,6 @@ public class DatabaseService {
} }
/*************************************** ENCUESTAS ******************************************************************************************************/ /*************************************** ENCUESTAS ******************************************************************************************************/
public List<Pregunta> getPreguntas() { public List<Pregunta> getPreguntas() {
List<Pregunta> preguntas = new ArrayList<>(); List<Pregunta> preguntas = new ArrayList<>();
@ -940,7 +976,6 @@ public class DatabaseService {
return preguntas; return preguntas;
} }
public void insertRespuestas(int manteniminetoId, List<Respuesta> respuestas, int empleadoid, String comentarios, String token) { public void insertRespuestas(int manteniminetoId, List<Respuesta> respuestas, int empleadoid, String comentarios, String token) {
String insertQuery = """ String insertQuery = """
@ -1004,7 +1039,6 @@ public class DatabaseService {
} }
} }
public String crearTokenEncuesta(int mantenimientoid) { public String crearTokenEncuesta(int mantenimientoid) {
String token = UUID.randomUUID().toString(); String token = UUID.randomUUID().toString();
Timestamp expira = new Timestamp(System.currentTimeMillis() + (24 * 60 * 60 * 1000)); Timestamp expira = new Timestamp(System.currentTimeMillis() + (24 * 60 * 60 * 1000));


+ 7
- 11
src/main/java/mx/gob/jumapacelaya/services/EmailService.java View File

@ -1,21 +1,14 @@
package mx.gob.jumapacelaya.services; package mx.gob.jumapacelaya.services;
import com.vaadin.flow.component.notification.Notification;
import jakarta.activation.DataSource;
import jakarta.mail.internet.MimeMessage; import jakarta.mail.internet.MimeMessage;
import jakarta.mail.util.ByteArrayDataSource;
import mx.gob.jumapacelaya.models.Usuario;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.InputStreamResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMailMessage;
import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.File;
import java.io.InputStream;
@Service @Service
public class EmailService { public class EmailService {
@ -23,10 +16,12 @@ public class EmailService {
@Autowired @Autowired
private JavaMailSender mailSender; private JavaMailSender mailSender;
private static final Logger log = LoggerFactory.getLogger(EmailService.class);
public void enviarCorreo(String destinatario, String asunto, String cuerpo, String imagePath) { public void enviarCorreo(String destinatario, String asunto, String cuerpo, String imagePath) {
try { try {
MimeMessage mensaje = mailSender.createMimeMessage(); MimeMessage mensaje = mailSender.createMimeMessage();
MimeMessageHelper helper = new MimeMessageHelper(mensaje, true);
MimeMessageHelper helper = new MimeMessageHelper(mensaje, true, "UTF-8");
helper.setTo(destinatario); helper.setTo(destinatario);
helper.setSubject(asunto); helper.setSubject(asunto);
helper.setFrom("noreply@jumapacelaya.gob.mx"); helper.setFrom("noreply@jumapacelaya.gob.mx");
@ -37,7 +32,8 @@ public class EmailService {
helper.addInline("image_id", imgResource); helper.addInline("image_id", imgResource);
mailSender.send(mensaje); mailSender.send(mensaje);
System.out.println("Correo enviado con imagen exitosamente");
log.info("Correo enviado a {}", destinatario);
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();


+ 22
- 0
src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java View File

@ -108,8 +108,30 @@ public class ActDiariaView extends VerticalLayout {
fechaDesde = new DatePicker(); fechaDesde = new DatePicker();
fechaDesde.setPlaceholder("Fecha desde:"); fechaDesde.setPlaceholder("Fecha desde:");
fechaDesde.setLocale(new Locale("es", "MX"));
DatePicker.DatePickerI18n i18n = new DatePicker.DatePickerI18n()
.setWeekdays(List.of("Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"))
.setWeekdaysShort(List.of("Dom","Lun","Mar","Mié","Jue","Vie","Sab"))
.setMonthNames(List.of("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"))
.setFirstDayOfWeek(1)
.setToday("Hoy")
.setCancel("Cancelar")
.setDateFormat("dd/MM/yyyy");
fechaDesde.setI18n(i18n);
fechaHasta = new DatePicker(); fechaHasta = new DatePicker();
fechaHasta.setPlaceholder("Fecha hasta:"); fechaHasta.setPlaceholder("Fecha hasta:");
fechaHasta.setLocale(new Locale("es", "MX"));
DatePicker.DatePickerI18n i18nh = new DatePicker.DatePickerI18n()
.setWeekdays(List.of("Domingo","Lunes","Martes","Miércoles","Jueves","Viernes","Sábado"))
.setWeekdaysShort(List.of("Dom","Lun","Mar","Mié","Jue","Vie","Sab"))
.setMonthNames(List.of("Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"))
.setFirstDayOfWeek(1)
.setToday("Hoy")
.setCancel("Cancelar")
.setDateFormat("dd/MM/yyyy");
fechaHasta.setI18n(i18nh);
btnBuscar = new Button("Buscar", VaadinIcon.SEARCH.create()); btnBuscar = new Button("Buscar", VaadinIcon.SEARCH.create());
// Listener del checkbox // Listener del checkbox


+ 202
- 14
src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java View File

@ -1,5 +1,6 @@
package mx.gob.jumapacelaya.ui; package mx.gob.jumapacelaya.ui;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
import com.vaadin.flow.component.Component; import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.UI; import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.Button;
@ -34,6 +35,7 @@ import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.component.upload.Upload; import com.vaadin.flow.component.upload.Upload;
import com.vaadin.flow.component.upload.receivers.MemoryBuffer; import com.vaadin.flow.component.upload.receivers.MemoryBuffer;
import com.vaadin.flow.data.provider.ListDataProvider; import com.vaadin.flow.data.provider.ListDataProvider;
import com.vaadin.flow.data.renderer.ComponentRenderer;
import com.vaadin.flow.data.value.ValueChangeMode; import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.function.ValueProvider; import com.vaadin.flow.function.ValueProvider;
import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.PageTitle;
@ -42,12 +44,15 @@ import com.vaadin.flow.server.StreamRegistration;
import com.vaadin.flow.server.StreamResource; import com.vaadin.flow.server.StreamResource;
import jakarta.annotation.security.PermitAll; import jakarta.annotation.security.PermitAll;
import mx.gob.jumapacelaya.models.PlanAnual; import mx.gob.jumapacelaya.models.PlanAnual;
import mx.gob.jumapacelaya.models.encuestas.MantenimientosSinEncuesta;
import mx.gob.jumapacelaya.services.DatabaseService; import mx.gob.jumapacelaya.services.DatabaseService;
import mx.gob.jumapacelaya.services.EmailService;
import mx.gob.jumapacelaya.services.ReportService; import mx.gob.jumapacelaya.services.ReportService;
import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperPrint;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.context.SecurityContextHolder;
@ -70,6 +75,9 @@ import java.util.stream.IntStream;
@CssImport("./themes/sistema-mantenimiento/styles.css") @CssImport("./themes/sistema-mantenimiento/styles.css")
public class PlanAnualView extends VerticalLayout { public class PlanAnualView extends VerticalLayout {
private final EmailService emailService;
@Value("${app.base-url}")
private String baseUrl;
private final Environment env; private final Environment env;
private final ReportService reportService; private final ReportService reportService;
@ -90,7 +98,7 @@ public class PlanAnualView extends VerticalLayout {
private Popover reportePopover; private Popover reportePopover;
ComboBox<Integer> yearFilter; ComboBox<Integer> yearFilter;
public PlanAnualView(DatabaseService databaseService, Environment env, ReportService reportService) {
public PlanAnualView(DatabaseService databaseService, Environment env, ReportService reportService, EmailService emailService) {
this.databaseService = databaseService; this.databaseService = databaseService;
this.env = env; this.env = env;
this.reportService = reportService; this.reportService = reportService;
@ -113,9 +121,14 @@ public class PlanAnualView extends VerticalLayout {
PlanAnualFilter planAnualFilter = new PlanAnualFilter(dataView); PlanAnualFilter planAnualFilter = new PlanAnualFilter(dataView);
planAnualFilter.setExcludeRealizado(true); planAnualFilter.setExcludeRealizado(true);
yearFilter.addValueChangeListener(event ->
planAnualFilter.setYear(event.getValue())
);
// Aplicar el valor actual del ComboBox al filtro al inicializar
if (yearFilter != null && yearFilter.getValue() != null) {
planAnualFilter.setYear(yearFilter.getValue());
}
if (yearFilter != null) {
yearFilter.addValueChangeListener(event -> planAnualFilter.setYear(event.getValue()));
}
HeaderRow headerRow = planAnualGrid.appendHeaderRow(); HeaderRow headerRow = planAnualGrid.appendHeaderRow();
/*headerRow.getCell(planAnualGrid.getColumnByKey("smtColumnKey")) /*headerRow.getCell(planAnualGrid.getColumnByKey("smtColumnKey"))
@ -130,6 +143,9 @@ public class PlanAnualView extends VerticalLayout {
headerRow.getCell(planAnualGrid.getColumnByKey("mesplaneado")) headerRow.getCell(planAnualGrid.getColumnByKey("mesplaneado"))
.setComponent(createFilterHeader("Mes Planeado", planAnualFilter::setMesPlaneado)); .setComponent(createFilterHeader("Mes Planeado", planAnualFilter::setMesPlaneado));
headerRow.getCell(planAnualGrid.getColumnByKey("encuesta"))
.setComponent(createFilterHeader("Encuesta", planAnualFilter::setEncuesta));
// MENU CONTEXTUAL DEL GRID // MENU CONTEXTUAL DEL GRID
@ -228,6 +244,7 @@ public class PlanAnualView extends VerticalLayout {
this.setSizeFull(); this.setSizeFull();
add(filtrosLayout, uploadLayout); add(filtrosLayout, uploadLayout);
add(gridLayout); add(gridLayout);
this.emailService = emailService;
} }
private void setupHeader() { private void setupHeader() {
@ -369,14 +386,8 @@ public class PlanAnualView extends VerticalLayout {
btnAddEquipo.setTooltipText("Agregar nuevo equipo"); btnAddEquipo.setTooltipText("Agregar nuevo equipo");
btnEnviarEncuestas = new Button(VaadinIcon.ENVELOPE.create()); btnEnviarEncuestas = new Button(VaadinIcon.ENVELOPE.create());
ConfirmDialog enviarEncConfirm = new ConfirmDialog();
enviarEncConfirm.setHeader("Enviar encuestas");
enviarEncConfirm.setText("¿Deseas enviar las encuestas de satisfacción?, Esto enviara la encuesta solo a los mantenimientos realizados");
enviarEncConfirm.setCancelable(true);
enviarEncConfirm.addCancelListener(e -> enviarEncConfirm.close());
enviarEncConfirm.setConfirmText("Enviar");
enviarEncConfirm.addConfirmListener(e -> {});
btnEnviarEncuestas.addClickListener(e -> enviarEncConfirm.open());
btnEnviarEncuestas.addClickListener(e -> showParametrosDialog());
btnEnviarEncuestas.setTooltipText("Enviar encuestas masivamente");
yearFilter = new ComboBox<>(); yearFilter = new ComboBox<>();
int currentYear = Year.now().getValue(); int currentYear = Year.now().getValue();
@ -384,12 +395,14 @@ public class PlanAnualView extends VerticalLayout {
.boxed().collect(Collectors.toList()); .boxed().collect(Collectors.toList());
yearFilter.setItems(years); yearFilter.setItems(years);
yearFilter.setPlaceholder("Año"); yearFilter.setPlaceholder("Año");
yearFilter.setValue(currentYear);
yearFilter.setClearButtonVisible(true); yearFilter.setClearButtonVisible(true);
List<PlanAnual> todosLosPlanes = databaseService.getPlanAnual(); List<PlanAnual> todosLosPlanes = databaseService.getPlanAnual();
btnImprimirLayout = new HorizontalLayout(btnColumns, btnImprimirRpt, btnAddEquipo/*, btnEnviarEncuestas*/, yearFilter);
btnImprimirLayout = new HorizontalLayout(btnColumns, btnImprimirRpt, btnAddEquipo, btnEnviarEncuestas, yearFilter);
btnImprimirLayout.setAlignItems(Alignment.BASELINE); btnImprimirLayout.setAlignItems(Alignment.BASELINE);
HorizontalLayout columnSelectorLayout = new HorizontalLayout(); HorizontalLayout columnSelectorLayout = new HorizontalLayout();
columnSelectorLayout.setAlignItems(Alignment.END); columnSelectorLayout.setAlignItems(Alignment.END);
@ -541,6 +554,11 @@ public class PlanAnualView extends VerticalLayout {
private String equipo; private String equipo;
private String departamento; private String departamento;
private String mesPlaneado; private String mesPlaneado;
private LocalDate fechaProgramada;
private LocalDate fechaRealizacion;
private String encuesta;
private String estado;
private String situacion;
private Integer year; private Integer year;
private boolean excludeRealizado = true; private boolean excludeRealizado = true;
@ -569,6 +587,11 @@ public class PlanAnualView extends VerticalLayout {
this.dataView.refreshAll(); this.dataView.refreshAll();
} }
public void setEncuesta(String encuesta) {
this.encuesta = encuesta;
this.dataView.refreshAll();
}
public void setYear(Integer year) { public void setYear(Integer year) {
this.year = year; this.year = year;
dataView.refreshAll(); dataView.refreshAll();
@ -586,6 +609,7 @@ public class PlanAnualView extends VerticalLayout {
boolean matchesEquipo = matches(planAnual.getNomEquipo(), equipo); boolean matchesEquipo = matches(planAnual.getNomEquipo(), equipo);
boolean matchesDepartamento = matches(planAnual.getDepartamento(), departamento); boolean matchesDepartamento = matches(planAnual.getDepartamento(), departamento);
boolean matchesMesPlaneado = matches(planAnual.getMesplaneado(), mesPlaneado); boolean matchesMesPlaneado = matches(planAnual.getMesplaneado(), mesPlaneado);
boolean matchesEncuesta = matches(planAnual.getEncuesta(), encuesta);
boolean matchesYear = true; boolean matchesYear = true;
if (year != null) { if (year != null) {
@ -608,7 +632,8 @@ public class PlanAnualView extends VerticalLayout {
&& matchesDepartamento && matchesDepartamento
&& matchesMesPlaneado && matchesMesPlaneado
&& matchesYear && matchesYear
&& matchesEstado;
&& matchesEstado
&& matchesEncuesta;
} }
private boolean matches(String value, String serachTerm) { private boolean matches(String value, String serachTerm) {
@ -1005,4 +1030,167 @@ public class PlanAnualView extends VerticalLayout {
dialog.getFooter().add(dialogFooter); dialog.getFooter().add(dialogFooter);
dialog.open(); dialog.open();
} }
private void showParametrosDialog() {
Dialog dialog = new Dialog();
dialog.setHeaderTitle("Ingresar periodo");
TextField txtMes = new TextField("Mes:");
txtMes.setPlaceholder("ENERO, FEBRERO, MARZO...");
txtMes.setClearButtonVisible(true);
TextField txtAnio = new TextField("Año");
txtAnio.setPlaceholder("Ej. 2025");
Button btnBuscar = new Button("Buscar", VaadinIcon.SEARCH.create(), e -> {
String mes = txtMes.getValue();
String anioTexto = txtAnio.getValue();
if (mes.isEmpty() || anioTexto.isEmpty()) {
Notification.show("Mes y año son requeridos.", 3000, Notification.Position.MIDDLE);
return;
}
int anio;
try {
anio = Integer.parseInt(anioTexto);
} catch (NumberFormatException ex) {
Notification.show("El año debe ser numérico.", 3000, Notification.Position.MIDDLE);
return;
}
dialog.close();
showEncuestasDialog(mes, anio);
});
btnBuscar.addThemeVariants(ButtonVariant.LUMO_PRIMARY);
Button btnCancelar = new Button("Cancelar", VaadinIcon.CLOSE_CIRCLE.create(), e -> dialog.close());
HorizontalLayout actions = new HorizontalLayout(btnBuscar, btnCancelar);
VerticalLayout layout = new VerticalLayout(txtMes, txtAnio, actions);
layout.setPadding(false);
layout.setSpacing(true);
dialog.add(layout);
dialog.open();
}
private void showEncuestasDialog(String mes, int anio) {
Dialog dialog = new Dialog();
dialog.setWidth("90%");
dialog.setHeight("90%");
dialog.setHeaderTitle("Encuestas pendientes por enviar...");
Grid<MantenimientosSinEncuesta> grid = new Grid<>(MantenimientosSinEncuesta.class, false);
grid.addColumn(MantenimientosSinEncuesta::getMantenimientoId)
.setHeader("ID")
.setAutoWidth(true);
grid.addColumn(item -> item.getFecha().format(DateTimeFormatter.ofPattern("dd/MM/yyyy")))
.setHeader("Fecha");
grid.addColumn(MantenimientosSinEncuesta::getPeriodo)
.setHeader("Periodo");
grid.addColumn(createStatusRender())
.setHeader("Encuesta");
grid.addColumn(MantenimientosSinEncuesta::getDepartamento)
.setHeader("Departamento")
.setAutoWidth(true);
grid.addColumn(MantenimientosSinEncuesta::getNomUsuario)
.setHeader("Usuario")
.setAutoWidth(true);
grid.addColumn(MantenimientosSinEncuesta::getEmail)
.setHeader("Correo")
.setAutoWidth(true);
grid.addComponentColumn(item -> {
Button btnEnviar = new Button(
"Enviar",
LineAwesomeIcon.ENVELOPE_SOLID.create()
);
btnEnviar.addThemeVariants(ButtonVariant.LUMO_PRIMARY,
ButtonVariant.LUMO_SUCCESS);
btnEnviar.addClickListener(e -> {
enviarEncuestaDesdeGrid(item);
btnEnviar.setEnabled(false);
});
return btnEnviar;
}).setHeader("Accion");
List<MantenimientosSinEncuesta> lista = databaseService.getEncuestPendientes(mes, anio);
grid.setItems(lista);
dialog.add(grid);
dialog.getFooter().add(new Button("Cerrar", LineAwesomeIcon.TIMES_SOLID.create(), e -> dialog.close()));
dialog.open();
}
private void enviarEncuestaDesdeGrid(MantenimientosSinEncuesta item) {
if (item.getEmail() == null || item.getEmail().isBlank()) {
Notification.show("El usuario no tiene correo", 3000, Notification.Position.MIDDLE)
.addThemeVariants(NotificationVariant.LUMO_ERROR);
return;
}
int mantenimientoId = item.getMantenimientoId();
String token = databaseService.crearTokenEncuesta(mantenimientoId);
String linkEncuesta = baseUrl + "/encuesta?token=" + token;
String cuerpo = """
<html>
<body>
<a href="%s">
<img src="cid:image_id"/>
</a>
</body>
</html>
""".formatted(linkEncuesta);
String asunto = "Encuesta de satisfacción - Mantenimiento #" + mantenimientoId;
String imagePath = "META-INF/resources/images/imgCorreo/imgEncuesta.png";
emailService.enviarCorreo(
item.getEmail(),
asunto,
cuerpo,
imagePath
);
Notification.show("Encuesta enviada correctamente", 3000, Notification.Position.MIDDLE)
.addThemeVariants(NotificationVariant.LUMO_SUCCESS);
}
private ComponentRenderer<Span, MantenimientosSinEncuesta> createStatusRender() {
return new ComponentRenderer<>(encuesta -> {
Span span = new Span(encuesta.getEncuesta());
switch (encuesta.getEncuesta().toUpperCase()) {
case "N":
String theme1 = String.format("badge %s", "error");
span.getElement().setAttribute("theme", theme1);
break;
case "S":
String theme2 = String.format("badge %s", "success");
span.getElement().setAttribute("theme", theme2);
break;
default:
String theme3 = String.format("badge %s", "");
span.getElement().setAttribute("theme", theme3);
}
return span;
});
}
} }

Loading…
Cancel
Save