3 Commits

5 changed files with 397 additions and 55 deletions
Split 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;
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.Respuesta;
import oracle.jdbc.OracleConnection;
@ -89,7 +90,6 @@ public class DatabaseService {
return nomenclatura;
}
/* -------------- Metodo para obtener a los usuarios ---------------- */
public List<Usuario> getUsuarios() {
List<Usuario> usuarios = new ArrayList<>();
@ -114,7 +114,6 @@ public class DatabaseService {
return usuarios;
}
/* -------------- Metodo para obtener los departamentos ---------------- */
public List<DepartamentosModel> getDepartamentos() {
List<DepartamentosModel> departamentos = new ArrayList<>();
@ -137,7 +136,6 @@ public class DatabaseService {
return departamentos;
}
/* -------------- Metodo para obtener los tipos de hardware ---------------- */
public List<TiposHardware> getTiposHardware() {
List<TiposHardware> tiposHardware = new ArrayList<>();
@ -160,8 +158,6 @@ public class DatabaseService {
return tiposHardware;
}
/* ----------------Obtener el Plan Anual de Mantenimiento ---------------- */
public List<PlanAnual> getPlanAnual() {
List<PlanAnual> planAnualList = new ArrayList<>();
@ -215,7 +211,6 @@ public class DatabaseService {
return planAnualList;
}
/* ----------------Obtener el Plan Anual de Mantenimiento por ID ---------------- */
public PlanAnual getPlanAnualPorId(int id) {
String query = """
@ -267,8 +262,6 @@ public class DatabaseService {
return null;
}
/* ----------------Obtener detalles del mantenimiento ---------------- */
public DetalleMantenimientoModel getDetalleMantenimientoPorPlanAnualId(int planAnualId) {
String query = "SELECT\n" +
@ -296,7 +289,7 @@ public class DatabaseService {
try (Connection connection = getMysqlConnection();
PreparedStatement statement = connection.prepareStatement(query)) {
statement.setInt(1, planAnualId);
try (ResultSet rs = statement.executeQuery()) {
@ -325,6 +318,65 @@ 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<>();
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 ---------------- */
public List<HardwareDetalle> getHardwaredetallePorMantId(int mantenimientoId) {
@ -333,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();
@ -358,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)) {
@ -388,7 +439,6 @@ public class DatabaseService {
return actualizaciones;
}
/* ---------------- Obtener los mantenimientos correctivos ---------------- */
public List<MantCorrectivosModel> getMantenimientosCorrectivos(int tipomantId) {
List<MantCorrectivosModel> mantCorrectivos = new ArrayList<>();
@ -435,8 +485,6 @@ public class DatabaseService {
return mantCorrectivos;
}
/*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/
/*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/
/*-=iii=<() *-=iii=<() *-=iii=<() *-=iii=<()*/
@ -565,7 +613,6 @@ public class DatabaseService {
return isInserted;
}
public int getUltimoMantenimientoId() {
int ultimoId = -1;
try (Connection connection = getMysqlConnection()) {
@ -582,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 (?, ?, ?)";
@ -602,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, " +
@ -677,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,
@ -724,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) {
@ -780,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=?";
@ -822,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=?";
@ -839,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=?";
@ -854,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 (?, ?, ?, ?)";
@ -871,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 (?, ?, ?, ?)";
@ -888,7 +926,6 @@ public class DatabaseService {
}
}
/* ---------------- Eliminar equipo de PLAN ANUAL ---------------- */
public void eliminarEquipoPlanAnual(int planAnualId) {
String sql = "DELETE FROM PLANANUAL WHERE PLANANUALID = ?";
@ -909,7 +946,6 @@ public class DatabaseService {
}
/*************************************** ENCUESTAS ******************************************************************************************************/
public List<Pregunta> getPreguntas() {
List<Pregunta> preguntas = new ArrayList<>();
@ -940,7 +976,6 @@ public class DatabaseService {
return preguntas;
}
public void insertRespuestas(int manteniminetoId, List<Respuesta> respuestas, int empleadoid, String comentarios, String token) {
String insertQuery = """
@ -1004,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();


+ 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.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.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());
// 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;
import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.UI;
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.receivers.MemoryBuffer;
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.function.ValueProvider;
import com.vaadin.flow.router.PageTitle;
@ -42,12 +44,15 @@ import com.vaadin.flow.server.StreamRegistration;
import com.vaadin.flow.server.StreamResource;
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;
@ -70,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;
@ -90,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;
@ -113,9 +121,14 @@ public class PlanAnualView extends VerticalLayout {
PlanAnualFilter planAnualFilter = new PlanAnualFilter(dataView);
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.getCell(planAnualGrid.getColumnByKey("smtColumnKey"))
@ -130,6 +143,9 @@ public class PlanAnualView extends VerticalLayout {
headerRow.getCell(planAnualGrid.getColumnByKey("mesplaneado"))
.setComponent(createFilterHeader("Mes Planeado", planAnualFilter::setMesPlaneado));
headerRow.getCell(planAnualGrid.getColumnByKey("encuesta"))
.setComponent(createFilterHeader("Encuesta", planAnualFilter::setEncuesta));
// MENU CONTEXTUAL DEL GRID
@ -228,6 +244,7 @@ public class PlanAnualView extends VerticalLayout {
this.setSizeFull();
add(filtrosLayout, uploadLayout);
add(gridLayout);
this.emailService = emailService;
}
private void setupHeader() {
@ -369,14 +386,8 @@ public class PlanAnualView extends VerticalLayout {
btnAddEquipo.setTooltipText("Agregar nuevo equipo");
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<>();
int currentYear = Year.now().getValue();
@ -384,12 +395,14 @@ public class PlanAnualView extends VerticalLayout {
.boxed().collect(Collectors.toList());
yearFilter.setItems(years);
yearFilter.setPlaceholder("Año");
yearFilter.setValue(currentYear);
yearFilter.setClearButtonVisible(true);
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);
HorizontalLayout columnSelectorLayout = new HorizontalLayout();
columnSelectorLayout.setAlignItems(Alignment.END);
@ -541,6 +554,11 @@ public class PlanAnualView extends VerticalLayout {
private String equipo;
private String departamento;
private String mesPlaneado;
private LocalDate fechaProgramada;
private LocalDate fechaRealizacion;
private String encuesta;
private String estado;
private String situacion;
private Integer year;
private boolean excludeRealizado = true;
@ -569,6 +587,11 @@ public class PlanAnualView extends VerticalLayout {
this.dataView.refreshAll();
}
public void setEncuesta(String encuesta) {
this.encuesta = encuesta;
this.dataView.refreshAll();
}
public void setYear(Integer year) {
this.year = year;
dataView.refreshAll();
@ -586,6 +609,7 @@ public class PlanAnualView extends VerticalLayout {
boolean matchesEquipo = matches(planAnual.getNomEquipo(), equipo);
boolean matchesDepartamento = matches(planAnual.getDepartamento(), departamento);
boolean matchesMesPlaneado = matches(planAnual.getMesplaneado(), mesPlaneado);
boolean matchesEncuesta = matches(planAnual.getEncuesta(), encuesta);
boolean matchesYear = true;
if (year != null) {
@ -608,7 +632,8 @@ public class PlanAnualView extends VerticalLayout {
&& matchesDepartamento
&& matchesMesPlaneado
&& matchesYear
&& matchesEstado;
&& matchesEstado
&& matchesEncuesta;
}
private boolean matches(String value, String serachTerm) {
@ -1005,4 +1030,167 @@ public class PlanAnualView extends VerticalLayout {
dialog.getFooter().add(dialogFooter);
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