diff --git a/src/main/java/mx/gob/jumapacelaya/services/EmailService.java b/src/main/java/mx/gob/jumapacelaya/services/EmailService.java index a2eb270..098e1d8 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/EmailService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/EmailService.java @@ -1,30 +1,43 @@ package mx.gob.jumapacelaya.services; import com.vaadin.flow.component.notification.Notification; +import jakarta.mail.internet.MimeMessage; import mx.gob.jumapacelaya.models.Usuario; import org.springframework.beans.factory.annotation.Autowired; 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; + @Service public class EmailService { @Autowired private JavaMailSender mailSender; - public void enviarCorreo(String destinatario, String asunto, String cuerpo) { - SimpleMailMessage mensaje = new SimpleMailMessage(); - mensaje.setTo(destinatario); - mensaje.setSubject(asunto); - mensaje.setText(cuerpo); - mensaje.setFrom("noreply@jumapacelaya.gob.mx"); - - try { - mailSender.send(mensaje); - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException("Error al enviar el correo: " + e.getMessage()); - } + public void enviarCorreo(String destinatario, String asunto, String cuerpo, String imagePath) { + try { + MimeMessage mensaje = mailSender.createMimeMessage(); + + MimeMessageHelper helper = new MimeMessageHelper(mensaje, true); + helper.setTo(destinatario); + helper.setSubject(asunto); + helper.setFrom("noreply@jumapacelaya.gob.mx"); + + helper.setText(cuerpo, true); + + File image = new File(imagePath); + helper.addInline("image_id", image); + + mailSender.send(mensaje); + System.out.println("Correo enviado con imagen exitosamente"); + + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("Error al enviar el correo: " + e.getMessage()); + } } } diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java index acdc1a1..631d846 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java @@ -177,13 +177,17 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse }); + // Boton auxiliar para probar el envio de los correos electronicos + Button btnEnviarCorreo = new Button("Enviar correo de prueba"); + btnEnviarCorreo.addClickListener(event -> enviarCorreo()); + this.txtNombreEquipo = new TextField("Nombre del Equipo"); txtNombreEquipo.setRequired(true); txtNombreEquipo.setReadOnly(true); - departamentoLayout.add(area, usuario, txtNombreEquipo); + departamentoLayout.add(area, usuario, btnEnviarCorreo, txtNombreEquipo); departamentoLayout.setWidthFull(); createHardwareSection(databaseService); @@ -390,6 +394,8 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse + private String emptySignature; + private void signLayout() { VerticalLayout userSignLayout = new VerticalLayout(); userSignPad = new SignaturePad(); @@ -404,6 +410,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse userSignLayout.setAlignItems(Alignment.CENTER); userSignLayout.add(userSignPad, userSignSpan, tituloUser); + VerticalLayout smtSignLayout = new VerticalLayout(); smtSignPad = new SignaturePad(); smtSignPad.setHeight("200px"); @@ -440,6 +447,20 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse } + // Metodo para verificar si la firma corresponde a una cadena de firma vacia + private boolean esFirmaVacia(String firmaBase64) { + + if (firmaBase64 == null || firmaBase64.isEmpty()) { + return true; + } + + String firmaVacia = "iVBORw0KGgoAAAANSUhEUgAAAXkAAAD8CAYAAACSCdTiAAAAAXNSR0IArs4c6QAACGZJREFUeF7t1AERAAAIAjHpX9oef7MBw2PnCBAgQCArsGwywQgQIEDgjLwnIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAgYOT9AAECBMICRj5crmgECBAw8n6AAAECYQEjHy5XNAIECBh5P0CAAIGwgJEPlysaAQIEjLwfIECAQFjAyIfLFY0AAQJG3g8QIEAgLGDkw+WKRoAAASPvBwgQIBAWMPLhckUjQICAkfcDBAgQCAsY+XC5ohEgQMDI+wECBAiEBYx8uFzRCBAg8PqXAP1/uaJ0AAAAAElFTkSuQmCC"; + + return firmaBase64.equals(firmaVacia); + + } + + private void buttons() { HorizontalLayout buttonsLayout = new HorizontalLayout(); Button btnGuardar = new Button("Guardar"); @@ -484,15 +505,6 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse byte[] smtSignatureBytes = smtSignPad.getImageBase64(); byte[] gciatiSignatureBytes = gciatiSignPad.getImageBase64(); - // Valida si los campos de firma estan vacios - if (userSignatureBytes == null || userSignatureBytes.length == 0 || - smtSignatureBytes == null || smtSignatureBytes.length == 0 || - gciatiSignatureBytes == null || gciatiSignatureBytes.length == 0) { - - Notification.show("Por favor, firme el mantenimiento.", 4000, Notification.Position.MIDDLE) - .addThemeVariants(NotificationVariant.LUMO_WARNING); - return; - } // Convierte los byte[] a String en formato Base64 String userSignatureBase64 = Base64.getEncoder().encodeToString(userSignatureBytes); @@ -500,6 +512,13 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse String gciaSignatureBase64 = Base64.getEncoder().encodeToString(gciatiSignatureBytes); + // Validacion de firmas si es igual o no a la cadena de firma vacia + userSignatureBase64 = esFirmaVacia(userSignatureBase64) ? null : userSignatureBase64; + smtSignatureBase64 = esFirmaVacia(smtSignatureBase64) ? null : smtSignatureBase64; + gciaSignatureBase64 = esFirmaVacia(gciaSignatureBase64) ? null : gciaSignatureBase64; + + + // Aqui se manda llamar al metodo de insertar mantenimiento en DatabaseService y se le pasan los argumentos necesarios int isInserted = databaseService.insertarMantenimiento( fechaSeleccionada, tipoMantId, departamentoId, empleadoId, formaMantt, equipoId, @@ -604,7 +623,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse } catch (Exception e) { Notification.show("Error al enviar el correo", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - e.printStackTrace(); // Registro de error para diagnóstico + e.printStackTrace(); } fecha.clear(); @@ -639,10 +658,15 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse Usuario usuarioSeleccionado = usuario.getValue(); if (usuarioSeleccionado != null && usuarioSeleccionado.getEmail() != null) { String destinatario = usuarioSeleccionado.getEmail(); - String asunto = "Mantenimiento de Equipo de Computo"; - String cuerpo = "Buen día, les hacemos llegar por medio de este correo electrónico una notificación de que su mantenimiento (preventivo/correctivo) se realizo con éxito. Si desea tener una copia del formato, favor de mandar correo electrónico directamente a la Lic. David"; + String asunto = "MANTENIMIENTO DE EQUIPO DE COMPUTO REALIZADO"; + + String cuerpo = "" + + "" + + ""; + + String imagePath = "src/main/resources/META-INF/resources/images/imgCorreo/correoMantt.png"; - emailService.enviarCorreo(destinatario, asunto, cuerpo); + emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath); } else { Notification.show("Por favor selecciona un usuario", 4000, Notification.Position.MIDDLE); diff --git a/src/main/resources/META-INF/resources/images/imgCorreo/correoMantt.png b/src/main/resources/META-INF/resources/images/imgCorreo/correoMantt.png new file mode 100644 index 0000000..4203de3 Binary files /dev/null and b/src/main/resources/META-INF/resources/images/imgCorreo/correoMantt.png differ diff --git a/src/main/resources/META-INF/resources/images/imgCorreo/imgCorreo.png b/src/main/resources/META-INF/resources/images/imgCorreo/imgCorreo.png new file mode 100644 index 0000000..9933d9b Binary files /dev/null and b/src/main/resources/META-INF/resources/images/imgCorreo/imgCorreo.png differ