diff --git a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java index 9e5ce3b..ff57138 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java @@ -90,7 +90,6 @@ public class DatabaseService { return nomenclatura; } - /* -------------- Metodo para obtener a los usuarios ---------------- */ public List getUsuarios() { List usuarios = new ArrayList<>(); @@ -115,7 +114,6 @@ public class DatabaseService { return usuarios; } - /* -------------- Metodo para obtener los departamentos ---------------- */ public List getDepartamentos() { List departamentos = new ArrayList<>(); @@ -138,7 +136,6 @@ public class DatabaseService { return departamentos; } - /* -------------- Metodo para obtener los tipos de hardware ---------------- */ public List getTiposHardware() { List tiposHardware = new ArrayList<>(); @@ -161,8 +158,6 @@ public class DatabaseService { return tiposHardware; } - - /* ----------------Obtener el Plan Anual de Mantenimiento ---------------- */ public List getPlanAnual() { List planAnualList = new ArrayList<>(); @@ -216,7 +211,6 @@ public class DatabaseService { return planAnualList; } - /* ----------------Obtener el Plan Anual de Mantenimiento por ID ---------------- */ public PlanAnual getPlanAnualPorId(int id) { String query = """ @@ -268,8 +262,6 @@ public class DatabaseService { return null; } - - /* ----------------Obtener detalles del mantenimiento ---------------- */ public DetalleMantenimientoModel getDetalleMantenimientoPorPlanAnualId(int planAnualId) { String query = "SELECT\n" + @@ -297,7 +289,7 @@ public class DatabaseService { try (Connection connection = getMysqlConnection(); PreparedStatement statement = connection.prepareStatement(query)) { - + statement.setInt(1, planAnualId); try (ResultSet rs = statement.executeQuery()) { @@ -326,8 +318,6 @@ public class DatabaseService { return null; } - - /* ----------------Obtener mantenimientos sin encuesta respondida por periodo ---------------- */ public List getEncuestPendientes(String mes, int anio) { List lista = new ArrayList<>(); @@ -388,7 +378,6 @@ public class DatabaseService { return lista; } - /* ----------------Obtener detalles del hardaware por ID ---------------- */ public List getHardwaredetallePorMantId(int mantenimientoId) { List detalles = new ArrayList<>(); @@ -396,10 +385,10 @@ public class DatabaseService { "FROM HARDWAREDET h\r\n" + // "INNER JOIN TIPOSHARDWARE t ON h.TIPOHARDWAREID = t.TIPOHARDWAREID \r\n" + // "WHERE h.MANTENIMIENTOID = ?"; - + try (Connection conn = getMysqlConnection(); PreparedStatement stmt = conn.prepareStatement(query)) { - + stmt.setInt(1, mantenimientoId); ResultSet rs = stmt.executeQuery(); @@ -421,14 +410,13 @@ public class DatabaseService { return detalles; } - /* ---------------- Obtener las actualizaciones de seguridad ---------------- */ public List getActualizacionesSeg(int mantenimientoId) { List actualizaciones = new ArrayList<>(); String query = "SELECT *\r\n" + // "FROM ACTUALIZACIONESSEG a\r\n" + // "WHERE a.MANTENIMIENTOID = ?"; - + try (Connection conn = getMysqlConnection(); PreparedStatement stmt = conn.prepareStatement(query)) { @@ -451,7 +439,6 @@ public class DatabaseService { return actualizaciones; } - /* ---------------- Obtener los mantenimientos correctivos ---------------- */ public List getMantenimientosCorrectivos(int tipomantId) { List mantCorrectivos = new ArrayList<>(); @@ -498,8 +485,6 @@ public class DatabaseService { return mantCorrectivos; } - - /*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/ /*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/ /*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/ @@ -628,7 +613,6 @@ public class DatabaseService { return isInserted; } - public int getUltimoMantenimientoId() { int ultimoId = -1; try (Connection connection = getMysqlConnection()) { @@ -645,7 +629,6 @@ public class DatabaseService { return ultimoId; } - // INSERTAR EN LA TABLA: ACTUALIZACIONESSEG public boolean insertActualizacionSeg(String descripcion, String otras, int mantenimientoId) { String query = "INSERT INTO ACTUALIZACIONESSEG (descripcion, otrasactualizaciones, mantenimientoid) VALUES (?, ?, ?)"; @@ -665,7 +648,6 @@ public class DatabaseService { } } - // INSERTAR ARCHIVO EXCEL EN LA TABLA: PLANANUAL public void insertarDesdeExcel(InputStream inputStream) { String query = "INSERT INTO PLANANUAL (NOMEQUIPO, AREA, MONITOR, TECLADO, MOUSE, " + @@ -740,7 +722,6 @@ public class DatabaseService { } } - // INSERTAR NUEVO EQUIPO INDIVIDUAL EN PLANANUAL public void insertarNuevoEquipo(String nomequipo, String area, boolean monitor, boolean teclado, boolean mouse, boolean regulador, boolean cpu, boolean impresora, @@ -787,7 +768,6 @@ public class DatabaseService { } - // Método auxiliar para obtener un valor de tipo Date de una celda private Date getDateCellValue(Cell cell) { if (cell != null) { @@ -843,7 +823,6 @@ public class DatabaseService { return false; // Valor por defecto si la celda es nula } - /* ----------------Actualizar los detalles del del mantenimiento por ID ---------------- */ public boolean actualizarPlanAnual(int planAnualId, String nombreEquipo) { String sql = "UPDATE PLANANUAL SET NOMEQUIPO=? WHERE PLANANUALID=?"; @@ -885,7 +864,6 @@ public class DatabaseService { } } - /* ----------------Actualizar los detalles del hardaware por ID ---------------- */ public boolean actualizarHardwareDetalle(HardwareDetalle detalle) { String sql = "UPDATE HARDWAREDET SET MODELO=?, NUMSERIE=?, PLACA=? WHERE HARDWAREDETID=?"; @@ -902,7 +880,6 @@ public class DatabaseService { } } - /* ----------------Actualizar las actualizaciones de seguridad por ID ---------------- */ public boolean actualizarActualizacionSeg(ActualizacioneSeguridadModel actualizacion) { String sql = "UPDATE ACTUALIZACIONESSEG SET OTRASACTUALIZACIONES=? WHERE ACTUALIZACIONSEGID=?"; @@ -917,7 +894,6 @@ public class DatabaseService { } } - /* ---------------- Insertar en bitacora ---------------- */ public boolean insertarBitacora(int mantenimientoid, String usuarioid, LocalDate fechora, String motivo) { String query = "INSERT INTO BITACORACTUALIZACIONES (MANTENIMIENTOID, USUARIOID, FECHORA, MOTIVO) VALUES (?, ?, ?, ?)"; @@ -934,7 +910,6 @@ public class DatabaseService { } } - /* ---------------- Insertar en bitacora de eliminacion de equipos ---------------- */ public boolean insertarBitacoraEliminacion(int plananualid, String usuarioid, LocalDate fechora, String motivo) { String query = "INSERT INTO BITACORAELIMINACIONES (PLANANUALID, USUARIOID, FECHAHORA, MOTIVO) VALUES (?, ?, ?, ?)"; @@ -951,7 +926,6 @@ public class DatabaseService { } } - /* ---------------- Eliminar equipo de PLAN ANUAL ---------------- */ public void eliminarEquipoPlanAnual(int planAnualId) { String sql = "DELETE FROM PLANANUAL WHERE PLANANUALID = ?"; @@ -972,7 +946,6 @@ public class DatabaseService { } - /*************************************** ENCUESTAS ******************************************************************************************************/ public List getPreguntas() { List preguntas = new ArrayList<>(); @@ -1003,7 +976,6 @@ public class DatabaseService { return preguntas; } - public void insertRespuestas(int manteniminetoId, List respuestas, int empleadoid, String comentarios, String token) { String insertQuery = """ @@ -1067,7 +1039,6 @@ public class DatabaseService { } } - public String crearTokenEncuesta(int mantenimientoid) { String token = UUID.randomUUID().toString(); Timestamp expira = new Timestamp(System.currentTimeMillis() + (24 * 60 * 60 * 1000)); diff --git a/src/main/java/mx/gob/jumapacelaya/services/EmailService.java b/src/main/java/mx/gob/jumapacelaya/services/EmailService.java index 06ad057..cd26e89 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/EmailService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/EmailService.java @@ -1,21 +1,14 @@ package mx.gob.jumapacelaya.services; -import com.vaadin.flow.component.notification.Notification; -import jakarta.activation.DataSource; 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.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.MimeMailMessage; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; -import java.io.File; -import java.io.InputStream; @Service public class EmailService { @@ -23,10 +16,12 @@ public class EmailService { @Autowired private JavaMailSender mailSender; + private static final Logger log = LoggerFactory.getLogger(EmailService.class); + public void enviarCorreo(String destinatario, String asunto, String cuerpo, String imagePath) { try { MimeMessage mensaje = mailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(mensaje, true); + MimeMessageHelper helper = new MimeMessageHelper(mensaje, true, "UTF-8"); helper.setTo(destinatario); helper.setSubject(asunto); helper.setFrom("noreply@jumapacelaya.gob.mx"); @@ -37,7 +32,8 @@ public class EmailService { helper.addInline("image_id", imgResource); mailSender.send(mensaje); - System.out.println("Correo enviado con imagen exitosamente"); + log.info("Correo enviado a {}", destinatario); + } catch (Exception e) { e.printStackTrace(); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java index 151955e..2614554 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java @@ -46,11 +46,13 @@ import jakarta.annotation.security.PermitAll; import mx.gob.jumapacelaya.models.PlanAnual; import mx.gob.jumapacelaya.models.encuestas.MantenimientosSinEncuesta; import mx.gob.jumapacelaya.services.DatabaseService; +import mx.gob.jumapacelaya.services.EmailService; import mx.gob.jumapacelaya.services.ReportService; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.JasperPrint; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; +import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; @@ -73,6 +75,9 @@ import java.util.stream.IntStream; @CssImport("./themes/sistema-mantenimiento/styles.css") public class PlanAnualView extends VerticalLayout { + private final EmailService emailService; + @Value("${app.base-url}") + private String baseUrl; private final Environment env; private final ReportService reportService; @@ -93,7 +98,7 @@ public class PlanAnualView extends VerticalLayout { private Popover reportePopover; ComboBox yearFilter; - public PlanAnualView(DatabaseService databaseService, Environment env, ReportService reportService) { + public PlanAnualView(DatabaseService databaseService, Environment env, ReportService reportService, EmailService emailService) { this.databaseService = databaseService; this.env = env; this.reportService = reportService; @@ -234,6 +239,7 @@ public class PlanAnualView extends VerticalLayout { this.setSizeFull(); add(filtrosLayout, uploadLayout); add(gridLayout); + this.emailService = emailService; } private void setupHeader() { @@ -1067,7 +1073,7 @@ public class PlanAnualView extends VerticalLayout { private void showEncuestasDialog(String mes, int anio) { Dialog dialog = new Dialog(); - dialog.setWidth("80%"); + dialog.setWidth("90%"); dialog.setHeight("90%"); dialog.setHeaderTitle("Encuestas pendientes por enviar..."); @@ -1097,15 +1103,68 @@ public class PlanAnualView extends VerticalLayout { .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 lista = databaseService.getEncuestPendientes(mes, anio); grid.setItems(lista); dialog.add(grid); - dialog.getFooter().add(new Button("Cerrar", e -> dialog.close())); + 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 = """ + + + + + + + + """.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 createStatusRender() { return new ComponentRenderer<>(encuesta -> { Span span = new Span(encuesta.getEncuesta());