Browse Source

Ya se agrego la funcion de enviar los correos desde el dialog de mantenimientos faltantes

main
mramirezg 1 month ago
parent
commit
0f65ece163
3 changed files with 73 additions and 47 deletions
  1. +4
    -33
      src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java
  2. +7
    -11
      src/main/java/mx/gob/jumapacelaya/services/EmailService.java
  3. +62
    -3
      src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java

+ 4
- 33
src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java View File

@ -90,7 +90,6 @@ public class DatabaseService {
return nomenclatura;
}
/* -------------- Metodo para obtener a los usuarios ---------------- */
public List<Usuario> getUsuarios() {
List<Usuario> usuarios = new ArrayList<>();
@ -115,7 +114,6 @@ public class DatabaseService {
return usuarios;
}
/* -------------- Metodo para obtener los departamentos ---------------- */
public List<DepartamentosModel> getDepartamentos() {
List<DepartamentosModel> departamentos = new ArrayList<>();
@ -138,7 +136,6 @@ public class DatabaseService {
return departamentos;
}
/* -------------- Metodo para obtener los tipos de hardware ---------------- */
public List<TiposHardware> getTiposHardware() {
List<TiposHardware> tiposHardware = new ArrayList<>();
@ -161,8 +158,6 @@ public class DatabaseService {
return tiposHardware;
}
/* ----------------Obtener el Plan Anual de Mantenimiento ---------------- */
public List<PlanAnual> getPlanAnual() {
List<PlanAnual> 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<MantenimientosSinEncuesta> getEncuestPendientes(String mes, int anio) {
List<MantenimientosSinEncuesta> lista = new ArrayList<>();
@ -388,7 +378,6 @@ public class DatabaseService {
return lista;
}
/* ----------------Obtener detalles del hardaware por ID ---------------- */
public List<HardwareDetalle> getHardwaredetallePorMantId(int mantenimientoId) {
List<HardwareDetalle> 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<ActualizacioneSeguridadModel> getActualizacionesSeg(int mantenimientoId) {
List<ActualizacioneSeguridadModel> 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<MantCorrectivosModel> getMantenimientosCorrectivos(int tipomantId) {
List<MantCorrectivosModel> 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<Pregunta> getPreguntas() {
List<Pregunta> preguntas = new ArrayList<>();
@ -1003,7 +976,6 @@ public class DatabaseService {
return preguntas;
}
public void insertRespuestas(int manteniminetoId, List<Respuesta> 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));


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

@ -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();


+ 62
- 3
src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java View File

@ -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<Integer> 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<MantenimientosSinEncuesta> 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 = """
<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());


Loading…
Cancel
Save