diff --git a/src/main/bundles/prod.bundle b/src/main/bundles/prod.bundle index 8cd2200..027d69c 100644 Binary files a/src/main/bundles/prod.bundle and b/src/main/bundles/prod.bundle differ diff --git a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java index b84dfb2..fd91748 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java @@ -1048,7 +1048,7 @@ public class DatabaseService { ZonedDateTime ahora = ZonedDateTime.now(zonaMX); ZonedDateTime fechaExp = ahora; - int diasPorSumar = 3; + int diasPorSumar = 5; while (diasPorSumar > 0) { fechaExp = fechaExp.plusDays(1); if (!(fechaExp.getDayOfWeek() == DayOfWeek.SATURDAY || @@ -1079,6 +1079,31 @@ public class DatabaseService { } } + public String getTokenPorMtto(int mantenimientoid) { + String query = """ + select e.TOKEN + from ENCUESTATOKENS e + where e.MANTENIMIENTOID = ? + """; + + try(Connection conn = getMysqlConnection(); + PreparedStatement ps = conn.prepareStatement(query)) { + + ps.setInt(1, mantenimientoid); + + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return rs.getString("TOKEN"); + } + } + } catch (SQLException e) { + logger.error("Error al obtener el token de encuesta: ", e); + throw new RuntimeException("Error en DB", e); + } + + return null; + } + public Integer validarTokenYObtenerId(String token) { String query = "SELECT MANTENIMIENTOID FROM ENCUESTATOKENS " + "WHERE TOKEN = ? AND FECHAEXPIRACION > NOW() AND USADO = FALSE"; diff --git a/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java b/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java index 131e4fd..304d6e6 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java @@ -535,31 +535,43 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser } - // METODO PARA ENVIAR LOS CORREOS ELECTRONICOS private void enviarCorreo() { Usuario usuarioDestino = cbUsuario.getValue(); - if (usuarioDestino != null && usuarioDestino.getEmail() != null) { - try { - String token = service.crearTokenEncuesta(mantenimientoIdActual); - - String destinatario = usuarioDestino.getEmail(); - String asunto = "Encuesta de satisfacción - Mantenimiento #" + mantenimientoIdActual; - String linkEncuesta = baseUrl + "/encuesta?token=" + token; - String cuerpo = ""; - String imagePath = "META-INF/resources/images/imgCorreo/imgEncuesta.png"; + if (usuarioDestino == null || usuarioDestino.getEmail() == null) { + Notification.show("Por favor, selecciona un usuario destino", 3000, Notification.Position.MIDDLE); + return; + } - emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath); + String tokenExistente = service.getTokenPorMtto(mantenimientoIdActual); - Notification.show("Encuesta enviada correctamente", 3000, Notification.Position.BOTTOM_END) - .addThemeVariants(NotificationVariant.LUMO_SUCCESS); + if (tokenExistente != null) { + showNotiReenvio(usuarioDestino, tokenExistente); + } else { + try { + String nuevoToken = service.crearTokenEncuesta(mantenimientoIdActual); } catch (Exception e) { - Notification.show("Error: No se pudo enviar. Es probable que ya exista una encuesta generada.", - 5000, Notification.Position.MIDDLE) + Notification.show("Error al generar la encuesta: " + e.getMessage(), 5000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); } - } else { - Notification.show("Por favor, seleccione un usuario destino", 3000, Notification.Position.MIDDLE); + } + } + + private void ejecutarEnvio(Usuario usuario, String token) { + try { + String destinatario = usuario.getEmail(); + String asunto = "Encuesta de satisfacción - Mantenimiento #" + mantenimientoIdActual; + String linkEncuesta = baseUrl + "/encuesta?token=" + token; + String cuerpo = ""; + String imagePath = "META-INF/resources/images/imgCorreo/imgEncuesta.png"; + + emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath); + + Notification.show("Encuesta enviada correctamente", 3000, Notification.Position.BOTTOM_END) + .addThemeVariants(NotificationVariant.LUMO_SUCCESS); + } catch (Exception e) { + Notification.show("Error al enviar el correo: " + e.getMessage(), 5000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_ERROR); } } @@ -684,4 +696,30 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser } } } + + + + private void showNotiReenvio(Usuario usuario, String tokenExistente) { + Notification ntf = new Notification(); + ntf.setDuration(0); + ntf.setPosition(Notification.Position.MIDDLE); + ntf.addThemeVariants(NotificationVariant.LUMO_WARNING); + + Span text = new Span("Atención: Ya se ha enviado una encuesta para este mantenimiento. ¿Deseas reenviar el link actual?"); + + Button reenvioBtn = new Button("Reenviar", new Icon("lumo", "reload"), event -> { + ejecutarEnvio(usuario, tokenExistente); + ntf.close(); + }); + reenvioBtn.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + + Button cancelBtn = new Button(new Icon("lumo", "cross"), event -> ntf.close()); + cancelBtn.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE); + + HorizontalLayout layout = new HorizontalLayout(text, reenvioBtn, cancelBtn); + layout.setAlignItems(Alignment.CENTER); + + ntf.add(layout); + ntf.open(); + } } \ No newline at end of file