From 377fdc1d5f7dd68e0243d2b62ae20d8db0bd4ef3 Mon Sep 17 00:00:00 2001 From: mramirezg Date: Fri, 18 Jul 2025 19:25:31 -0600 Subject: [PATCH] Se agrego una nueva carateristica que si el mantenimiento se esta realizando en un mes distinto del que estaba planeado se le pedira al usuario una justificacion de por que se esta haciendo a destiempo y esta se guardara en una nueva columna en la tabla de mantenimientos, ademas en el grid principal del plan anual se fijaron las dos primeras columnas para facilitar la navegacion al formulario de mantenimiento, los radio buttons se cambiaron por botones normales para filtrar por pendientes y realizados --- .../services/DatabaseService.java | 53 ++- .../mx/gob/jumapacelaya/ui/MainLayout.java | 4 +- .../jumapacelaya/ui/MantenimientoView.java | 369 ++++++++++-------- .../mx/gob/jumapacelaya/ui/PlanAnualView.java | 49 ++- 4 files changed, 288 insertions(+), 187 deletions(-) diff --git a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java index ed01772..e3eee9d 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java @@ -209,6 +209,54 @@ public class DatabaseService { } + /* ----------------Obtener el Plan Anual de Mantenimiento por ID ---------------- */ + public PlanAnual getPlanAnualPorId(int id) { + String query = "SELECT p.plananualid, p.nomEquipo, p.area,\n" + + " p.monitor, p.teclado, p.mouse, p.regulador,\n" + + " p.cpu, p.impresora, p.miniPrint, p.laptop, p.escaner,\n" + + " p.fechaprog, m.fecha AS fechaMantenimiento,\n" + + " me.NOMBRE AS MESPLANEADO, p.tecnicosmt, p.estado,\n" + + " COALESCE(v.SITUACION, 'NO REALIZADO') AS SITUACION\n" + + " FROM PLANANUAL p\n" + + " LEFT JOIN MANTENIMIENTOS m ON p.plananualid = m.plananualid\n" + + " LEFT JOIN MESES me ON p.MESID = me.MESID\n" + + " LEFT JOIN VW_SITUACION_MANTENIMIENTO v ON v.PLANANUALID = p.PLANANUALID\n" + + " where p.plananualid = ?"; + try (Connection connection = getMysqlConnection(); + PreparedStatement statement = connection.prepareStatement(query)) { + + statement.setInt(1, id); + try (ResultSet resultSet = statement.executeQuery()) { + if (resultSet.next()) { + return new PlanAnual( + resultSet.getInt("plananualid"), + resultSet.getString("nomEquipo"), + resultSet.getString("area"), + resultSet.getBoolean("monitor"), + resultSet.getBoolean("teclado"), + resultSet.getBoolean("mouse"), + resultSet.getBoolean("regulador"), + resultSet.getBoolean("cpu"), + resultSet.getBoolean("impresora"), + resultSet.getBoolean("miniPrint"), + resultSet.getBoolean("laptop"), + resultSet.getBoolean("escaner"), + resultSet.getDate("fechaprog").toLocalDate(), // Cambiado a LocalDate + resultSet.getDate("fechaMantenimiento") != null ? resultSet.getDate("fechaMantenimiento").toLocalDate() : null, // Cambiado a LocalDate + resultSet.getString("mesplaneado"), + resultSet.getString("tecnicosmt"), + resultSet.getString("estado"), + resultSet.getString("SITUACION") + ); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + /* ----------------Obtener detalles del mantenimiento ---------------- */ public DetalleMantenimientoModel getDetalleMantenimientoPorPlanAnualId(int planAnualId) { @@ -339,10 +387,10 @@ public class DatabaseService { // INSERTAR EN TABLA: MANTENIMINETOS public int insertarMantenimiento(LocalDate fecha, String tipoMantId, String departamentoId, String empleadoId, String formaMant, String equipoId, String userSignatureBase64, - String smtSignatureBase64, String planAnualId) { + String smtSignatureBase64, String planAnualId, String justificacion) { String query = "INSERT INTO MANTENIMIENTOS (fecha, tipoMantId, departamentoId, empleadoId, formaMant, nombreequipo," + - " firmaUsuario, firmaSmt, planAnualId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"; + " firmaUsuario, firmaSmt, planAnualId, justificacion) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; String updateStatusQuery = "UPDATE PLANANUAL SET estado = 'REALIZADO' WHERE planAnualId = ?"; @@ -382,6 +430,7 @@ public class DatabaseService { } preparedStatement.setLong(9, Long.parseLong(planAnualId)); + preparedStatement.setString(10, justificacion); preparedStatement.executeUpdate(); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java b/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java index 6627c72..3150b8a 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MainLayout.java @@ -44,7 +44,7 @@ public class MainLayout extends AppLayout { String u = securityService.getAuthenticatedUser(); - Span usrNameLabel = new Span("Hola " + u); + Span usrNameLabel = new Span(u); usrNameLabel.getStyle().set("color", "#691b31"); usrNameLabel.getStyle().set("font-weight", "bold"); usrNameLabel.getStyle().set("font-size", "20px"); @@ -88,7 +88,7 @@ public class MainLayout extends AppLayout { nav.addItem(new SideNavItem("Plan Anual", PlanAnualView.class, VaadinIcon.CALENDAR.create())); nav.addItem(new SideNavItem("Listado de Actividades", ActDiariaView.class, VaadinIcon.EDIT.create())); - nav.addItem(new SideNavItem("Mantenimiento", MantenimientoView.class, VaadinIcon.WRENCH.create())); + //nav.addItem(new SideNavItem("Mantenimiento", MantenimientoView.class, VaadinIcon.WRENCH.create())); nav.getStyle().set("background-color", "white"); nav.getStyle().set("border-radius", "5px"); nav.getStyle().set("opacity", "0.9"); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java index fe8b98e..2154e7d 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java @@ -7,6 +7,7 @@ import com.vaadin.flow.component.checkbox.CheckboxGroup; import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.datepicker.DatePicker; import com.vaadin.flow.component.dependency.CssImport; +import com.vaadin.flow.component.dialog.Dialog; import com.vaadin.flow.component.html.H1; import com.vaadin.flow.component.html.H2; import com.vaadin.flow.component.html.Image; @@ -29,10 +30,7 @@ import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import de.f0rce.signaturepad.SignaturePad; import jakarta.annotation.security.PermitAll; -import mx.gob.jumapacelaya.models.DepartamentosModel; -import mx.gob.jumapacelaya.models.TiposHardware; -import mx.gob.jumapacelaya.models.TiposMantenimiento; -import mx.gob.jumapacelaya.models.Usuario; +import mx.gob.jumapacelaya.models.*; import mx.gob.jumapacelaya.services.DatabaseService; import mx.gob.jumapacelaya.services.EmailService; import mx.gob.jumapacelaya.services.SecurityService; @@ -74,6 +72,10 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse private SignaturePad userSignPad; private SignaturePad smtSignPad; //private SignaturePad gciatiSignPad; + private PlanAnual planAnualActual; + private LocalDate fechaProgramada; + private LocalDate fechaSeleccionada; + private TextArea jsutificacion; Span userSignSpan = new Span("Nombre Usuario"); @@ -496,209 +498,244 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse btnGuardar.addClickListener(event -> { - LocalDate fechaSeleccionada = fecha.getValue(); - TiposMantenimiento tiposMantenimiento = tipoMantt.getValue(); - String tipoMantId = tiposMantenimiento != null ? tiposMantenimiento.getTipomantId() : null; - String planAnualValue = txtPlananualID.getValue(); + if (planAnualActual == null) { + Notification.show("No se pudo cargar el Plan Anual. Verifica el ID.", 4000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_ERROR); + } - DepartamentosModel departamentoSeleccionado = area.getValue(); - String departamentoId = departamentoSeleccionado != null ? departamentoSeleccionado.getDepartamentoId().toString() : null; + if (planAnualActual != null) { + fechaProgramada = planAnualActual.getFechaProgramada(); + fechaSeleccionada = fecha.getValue(); + boolean mismoMes = fechaSeleccionada != null && + fechaSeleccionada.getMonthValue() == fechaProgramada.getMonthValue() && + fechaSeleccionada.getYear() == fechaProgramada.getYear(); + + if (!mismoMes) { + Dialog confirmDialog = new Dialog(); + Span aviso = new Span("El mantenimiento esta fuera de tiempo, justifique el motivo"); + jsutificacion = new TextArea(); + jsutificacion.setSizeFull(); + Button btnSi = new Button("Guardar",LineAwesomeIcon.SAVE_SOLID.create(), e -> { + confirmDialog.close(); + guardarMantenimiento(); + }); + btnSi.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + VerticalLayout layout = new VerticalLayout(aviso, jsutificacion, btnSi); + layout.setSizeFull(); + layout.setAlignItems(Alignment.CENTER); + confirmDialog.add(layout); + confirmDialog.open(); + } else { + guardarMantenimiento(); + } + } + }); - Usuario usuarioSeleccionado = usuario.getValue(); - String empleadoId = usuarioSeleccionado != null ? usuarioSeleccionado.getEmpleadoId().toString() : null; - String equipoId = txtNombreEquipo.getValue(); + buttonsLayout.setSizeFull(); + buttonsLayout.add(btnGuardar); + buttonsLayout.setAlignItems(Alignment.CENTER); + botonesLayout.add(buttonsLayout); + botonesLayout.setSizeFull(); + //botonesLayout.setAlignItems(Alignment.CENTER); + } - String formaSeleccionada = formaGroup.getValue(); - String formaMantt = null; - if ("Remota".equals(formaSeleccionada)) { - formaMantt = "R"; - } else if ("Manual".equals(formaSeleccionada)) { - formaMantt = "M"; - } - // Validación de campos obligatorios - if (fechaSeleccionada == null || tipoMantId == null || departamentoId == null || empleadoId == null || - equipoId == null || equipoId.trim().isEmpty() || formaMantt == null || planAnualValue == null || planAnualValue.trim().isEmpty()) { - Notification.show("Por favor, completa todos los campos requeridos", 4000, Notification.Position.MIDDLE); - return; - } + // METODO PARA ENVIAR CORREOS ELECTRONICOS + private void enviarCorreo() { + Usuario usuarioSeleccionado = usuario.getValue(); + if (usuarioSeleccionado != null && usuarioSeleccionado.getEmail() != null) { + String destinatario = usuarioSeleccionado.getEmail(); + String asunto = "MANTENIMIENTO DE EQUIPO DE COMPUTO REALIZADO"; + + String cuerpo = "" + + "" + + ""+ + "" + + ""; + + String imagePath = "META-INF/resources/images/imgCorreo/correoMantt.png"; - byte[] userSignatureBytes = userSignPad.getImageBase64(); - byte[] smtSignatureBytes = smtSignPad.getImageBase64(); - //byte[] gciaSignatureBytes = gciatiSignPad.getImageBase64(); + emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath); - String userSignatureBase64 = Base64.getEncoder().encodeToString(userSignatureBytes); - String smtSignatureBase64 = Base64.getEncoder().encodeToString(smtSignatureBytes); - //String gciaSignatureBase64 = Base64.getEncoder().encodeToString(gciaSignatureBytes); + } else { + Notification.show("Por favor selecciona un usuario", 4000, Notification.Position.MIDDLE); + } + } - if (esFirmaVacia(userSignatureBase64)) userSignatureBase64 = null; - if (esFirmaVacia(smtSignatureBase64)) smtSignatureBase64 = null; - //if (esFirmaVacia(gciaSignatureBase64)) gciaSignatureBase64 = null; + private void guardarMantenimiento() { + TiposMantenimiento tiposMantenimiento = tipoMantt.getValue(); + String tipoMantId = tiposMantenimiento != null ? tiposMantenimiento.getTipomantId() : null; + String planAnualValue = txtPlananualID.getValue(); + String justificacionValue = jsutificacion != null ? jsutificacion.getValue() : null; - // Validación de campos de hardware - List> detallesHardware = new ArrayList<>(); - for (HorizontalLayout layout : hardwareLayouts) { - ComboBox tipoHardware = (ComboBox) layout.getComponentAt(0); - TextField noSerie = (TextField) layout.getComponentAt(1); - TextField modelo = (TextField) layout.getComponentAt(2); - TextField placa = (TextField) layout.getComponentAt(3); - - TiposHardware tipoSeleccionado = tipoHardware.getValue(); - if (tipoSeleccionado == null) { - Notification.show("Por favor, selecciona un tipo de hardware", 4000, Notification.Position.MIDDLE) - .addThemeVariants(NotificationVariant.LUMO_WARNING); - return; - } + DepartamentosModel departamentoSeleccionado = area.getValue(); + String departamentoId = departamentoSeleccionado != null ? departamentoSeleccionado.getDepartamentoId().toString() : null; + + Usuario usuarioSeleccionado = usuario.getValue(); + String empleadoId = usuarioSeleccionado != null ? usuarioSeleccionado.getEmpleadoId().toString() : null; + String equipoId = txtNombreEquipo.getValue(); + + String formaSeleccionada = formaGroup.getValue(); + String formaMantt = null; + if ("Remota".equals(formaSeleccionada)) { + formaMantt = "R"; + } else if ("Manual".equals(formaSeleccionada)) { + formaMantt = "M"; + } + + // Validación de campos obligatorios + if (fechaSeleccionada == null || tipoMantId == null || departamentoId == null || empleadoId == null || + equipoId == null || equipoId.trim().isEmpty() || formaMantt == null || planAnualValue == null || planAnualValue.trim().isEmpty()) { + Notification.show("Por favor, completa todos los campos requeridos", 4000, Notification.Position.MIDDLE); + return; + } - boolean esOpcional = Arrays.asList("TECLADO", "MOUSE").contains(tipoSeleccionado.getNombreHardware()); - - String numSerie = noSerie.getValue(); - String modeloVal = modelo.getValue(); - String placaVal = placa.getValue(); + byte[] userSignatureBytes = userSignPad.getImageBase64(); + byte[] smtSignatureBytes = smtSignPad.getImageBase64(); + //byte[] gciaSignatureBytes = gciatiSignPad.getImageBase64(); - if (!esOpcional && (modeloVal == null || modeloVal.isEmpty() || numSerie == null || numSerie.isEmpty() || placaVal == null || placaVal.isEmpty())) { - Notification.show("Por favor, completa todos los campos de hardware.", 4000, Notification.Position.MIDDLE) + String userSignatureBase64 = Base64.getEncoder().encodeToString(userSignatureBytes); + String smtSignatureBase64 = Base64.getEncoder().encodeToString(smtSignatureBytes); + //String gciaSignatureBase64 = Base64.getEncoder().encodeToString(gciaSignatureBytes); + + if (esFirmaVacia(userSignatureBase64)) userSignatureBase64 = null; + if (esFirmaVacia(smtSignatureBase64)) smtSignatureBase64 = null; + //if (esFirmaVacia(gciaSignatureBase64)) gciaSignatureBase64 = null; + + + // Validación de campos de hardware + List> detallesHardware = new ArrayList<>(); + for (HorizontalLayout layout : hardwareLayouts) { + ComboBox tipoHardware = (ComboBox) layout.getComponentAt(0); + TextField noSerie = (TextField) layout.getComponentAt(1); + TextField modelo = (TextField) layout.getComponentAt(2); + TextField placa = (TextField) layout.getComponentAt(3); + + TiposHardware tipoSeleccionado = tipoHardware.getValue(); + if (tipoSeleccionado == null) { + Notification.show("Por favor, selecciona un tipo de hardware", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_WARNING); - return; - } + return; + } + + boolean esOpcional = Arrays.asList("TECLADO", "MOUSE").contains(tipoSeleccionado.getNombreHardware()); - Map hw = new HashMap<>(); - hw.put("tipoHardwareId", tipoSeleccionado.getTipoHardwareId()); - hw.put("numSerie", numSerie); - hw.put("modelo", modeloVal); - hw.put("placa", placaVal); - detallesHardware.add(hw); + String numSerie = noSerie.getValue(); + String modeloVal = modelo.getValue(); + String placaVal = placa.getValue(); + + if (!esOpcional && (modeloVal == null || modeloVal.isEmpty() || numSerie == null || numSerie.isEmpty() || placaVal == null || placaVal.isEmpty())) { + Notification.show("Por favor, completa todos los campos de hardware.", 4000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_WARNING); + return; } - Set actualizacionesSeleccionadas = actualizaciones.getSelectedItems(); - String otrasActualizaciones = null; - if ("Si".equals(masActualizacionesGroup.getValue())) { - otrasActualizaciones = txtCuales.getValue(); - if (otrasActualizaciones == null || otrasActualizaciones.trim().isEmpty()) { - Notification.show("Especifica las otras actualizaciones", 4000, Notification.Position.MIDDLE) + Map hw = new HashMap<>(); + hw.put("tipoHardwareId", tipoSeleccionado.getTipoHardwareId()); + hw.put("numSerie", numSerie); + hw.put("modelo", modeloVal); + hw.put("placa", placaVal); + detallesHardware.add(hw); + } + + Set actualizacionesSeleccionadas = actualizaciones.getSelectedItems(); + String otrasActualizaciones = null; + if ("Si".equals(masActualizacionesGroup.getValue())) { + otrasActualizaciones = txtCuales.getValue(); + if (otrasActualizaciones == null || otrasActualizaciones.trim().isEmpty()) { + Notification.show("Especifica las otras actualizaciones", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_WARNING); - return; - } + return; } + } - // Una vez que validamos todos los campos del formulario, procedemos a insertar en BD - try { - int isInserted = databaseService.insertarMantenimiento(fechaSeleccionada, tipoMantId, departamentoId, empleadoId, formaMantt, equipoId, userSignatureBase64, smtSignatureBase64, planAnualValue); + // Una vez que validamos todos los campos del formulario, procedemos a insertar en BD + try { + int isInserted = databaseService.insertarMantenimiento(fechaSeleccionada, tipoMantId, departamentoId, empleadoId, formaMantt, equipoId, userSignatureBase64, smtSignatureBase64, planAnualValue, justificacionValue); - if (isInserted <= 0) { - Notification.show("Error al guardar el mantenimiento", 4000, Notification.Position.MIDDLE) + if (isInserted <= 0) { + Notification.show("Error al guardar el mantenimiento", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - return; - } + return; + } - int mantenimientoId = databaseService.getUltimoMantenimientoId(); + int mantenimientoId = databaseService.getUltimoMantenimientoId(); - for (Map hw : detallesHardware) { - boolean ok = databaseService.insertarHardware( + for (Map hw : detallesHardware) { + boolean ok = databaseService.insertarHardware( hw.get("tipoHardwareId"), hw.get("numSerie"), hw.get("modelo"), hw.get("placa"), mantenimientoId - ); + ); - if (!ok) { - Notification.show("Error al insertar detalles del hardware: ", 4000, Notification.Position.MIDDLE) + if (!ok) { + Notification.show("Error al insertar detalles del hardware: ", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - return; - } + return; } + } - for (String act : actualizacionesSeleccionadas) { - boolean ok = databaseService.insertActualizacionSeg(act, null, mantenimientoId); - if (!ok) { - Notification.show("Error al insertar actualización de seguridad", 4000, Notification.Position.MIDDLE) + for (String act : actualizacionesSeleccionadas) { + boolean ok = databaseService.insertActualizacionSeg(act, null, mantenimientoId); + if (!ok) { + Notification.show("Error al insertar actualización de seguridad", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - return; - } + return; } + } - if (otrasActualizaciones != null) { - boolean ok = databaseService.insertActualizacionSeg("Otras", otrasActualizaciones, mantenimientoId); - if (!ok) { - Notification.show("Error al insertar otras actualizaciones", 4000, Notification.Position.MIDDLE) + if (otrasActualizaciones != null) { + boolean ok = databaseService.insertActualizacionSeg("Otras", otrasActualizaciones, mantenimientoId); + if (!ok) { + Notification.show("Error al insertar otras actualizaciones", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - return; - } + return; } + } - // === EXITO === - Notification.show("¡Mantenimiento guardado exitosamente!", 4000, Notification.Position.MIDDLE) + // === EXITO === + Notification.show("¡Mantenimiento guardado exitosamente!", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_SUCCESS); - try { - enviarCorreo(); - } catch (Exception e) { - Notification.show("Error al enviar el correo", 4000, Notification.Position.MIDDLE) + try { + enviarCorreo(); + } catch (Exception e) { + Notification.show("Error al enviar el correo", 4000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - e.printStackTrace(); - } - - // Limpiar campos - fecha.clear(); - txtPlananualID.clear(); - tipoMantt.clear(); - area.clear(); - usuario.clear(); - txtNombreEquipo.clear(); - formaGroup.clear(); - actualizaciones.clear(); - masActualizacionesGroup.clear(); - txtCuales.clear(); - userSignPad.clear(); - smtSignPad.clear(); - //gciatiSignPad.clear(); - - for (HorizontalLayout layout : hardwareLayouts) { - ((ComboBox) layout.getComponentAt(0)).clear(); - ((TextField) layout.getComponentAt(1)).clear(); - ((TextField) layout.getComponentAt(2)).clear(); - ((TextField) layout.getComponentAt(3)).clear(); - } - - UI.getCurrent().navigate("/"); - - } catch (Exception ex) { - Notification.show("Ocurrio un error inesperado: " + ex.getMessage(), 5000, Notification.Position.MIDDLE) - .addThemeVariants(NotificationVariant.LUMO_ERROR); - ex.printStackTrace(); + e.printStackTrace(); } - }); - buttonsLayout.setSizeFull(); - buttonsLayout.add(btnGuardar); - buttonsLayout.setAlignItems(Alignment.CENTER); - botonesLayout.add(buttonsLayout); - botonesLayout.setSizeFull(); - //botonesLayout.setAlignItems(Alignment.CENTER); - } - - - // METODO PARA ENVIAR CORREOS ELECTRONICOS - private void enviarCorreo() { - Usuario usuarioSeleccionado = usuario.getValue(); - if (usuarioSeleccionado != null && usuarioSeleccionado.getEmail() != null) { - String destinatario = usuarioSeleccionado.getEmail(); - String asunto = "MANTENIMIENTO DE EQUIPO DE COMPUTO REALIZADO"; - - String cuerpo = "" + - "" + - ""+ - "" + - ""; + // Limpiar campos + fecha.clear(); + txtPlananualID.clear(); + tipoMantt.clear(); + area.clear(); + usuario.clear(); + txtNombreEquipo.clear(); + formaGroup.clear(); + actualizaciones.clear(); + masActualizacionesGroup.clear(); + txtCuales.clear(); + userSignPad.clear(); + smtSignPad.clear(); + //gciatiSignPad.clear(); - String imagePath = "META-INF/resources/images/imgCorreo/correoMantt.png"; + for (HorizontalLayout layout : hardwareLayouts) { + ((ComboBox) layout.getComponentAt(0)).clear(); + ((TextField) layout.getComponentAt(1)).clear(); + ((TextField) layout.getComponentAt(2)).clear(); + ((TextField) layout.getComponentAt(3)).clear(); + } - emailService.enviarCorreo(destinatario, asunto, cuerpo, imagePath); + UI.getCurrent().navigate("/"); - } else { - Notification.show("Por favor selecciona un usuario", 4000, Notification.Position.MIDDLE); + } catch (Exception ex) { + Notification.show("Ocurrio un error inesperado: " + ex.getMessage(), 5000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_ERROR); + ex.printStackTrace(); } } @@ -716,6 +753,14 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse String idParam = beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("id") != null ? beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("id").stream().findFirst().orElse(null) : null; + if (idParam != null) { + try { + int id = Integer.parseInt(idParam); + planAnualActual = databaseService.getPlanAnualPorId(id); + } catch (NumberFormatException e) { + planAnualActual = null; + } + } String equipoParam = beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("nomEquipo") != null ? beforeEnterEvent.getLocation().getQueryParameters().getParameters().get("nomEquipo").stream().findFirst().orElse(null) diff --git a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java index de8e967..543128a 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java @@ -57,14 +57,13 @@ public class PlanAnualView extends VerticalLayout { private final Environment env; - HorizontalLayout header = new HorizontalLayout(); H4 titulo = new H4(); H5 titulo1 = new H5(); Button btnInsertar; private byte[] fileContent; VerticalLayout gridLayout = new VerticalLayout(); HorizontalLayout uploadLayout = new HorizontalLayout(); - HorizontalLayout checkLayout = new HorizontalLayout(); + HorizontalLayout filtrosLayout = new HorizontalLayout(); private final DatabaseService databaseService; public PlanAnualView(DatabaseService databaseService, Environment env) { @@ -162,30 +161,38 @@ public class PlanAnualView extends VerticalLayout { uploadLayout.add(upload, btnInsertar); toggleLayouts(dataView); - RadioButtonGroup radioFiltro = new RadioButtonGroup<>(); - radioFiltro.setItems("Ver realizados", "Ver pendientes"); - radioFiltro.setValue("Ver pendientes"); - radioFiltro.addValueChangeListener(event -> { - String value = event.getValue(); - if ("Ver pendientes".equals(value)) { - planAnualFilter.setExcludeRealizado(true); - } else if ("Ver realizados".equals(value)) { - planAnualFilter.setExcludeRealizado(false); - } + filtrosLayout.addClassNames("lumo-justify-content-center", "lumo-gap-m", "lumo-padding-s"); + filtrosLayout.setWidthFull(); + filtrosLayout.setJustifyContentMode(JustifyContentMode.CENTER); + + Button btnPendientes = new Button("Pendientes"); + Button btnRealizados = new Button("Realizados"); + + //btnPendientes.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE); + //btnRealizados.addThemeVariants(ButtonVariant.LUMO_TERTIARY_INLINE); + + btnPendientes.addClassName("selected-tab"); + + btnPendientes.addClickListener(e -> { + planAnualFilter.setExcludeRealizado(true); + btnPendientes.addClassName("selected-tab"); + btnRealizados.removeClassName("selected-tab"); + }); + btnRealizados.addClickListener(e -> { + planAnualFilter.setExcludeRealizado(false); + btnRealizados.addClassName("selected-tab"); + btnPendientes.removeClassName("selected-tab"); }); - checkLayout = new HorizontalLayout(radioFiltro); - checkLayout.setWidthFull(); - checkLayout.setMargin(false); - checkLayout.setSpacing(true); - checkLayout.setJustifyContentMode(JustifyContentMode.CENTER); + filtrosLayout.add(btnPendientes, btnRealizados); + this.setPadding(false); this.setMargin(false); this.setSpacing(false); this.setSizeFull(); - add(header, checkLayout, gridLayout, uploadLayout); + add(filtrosLayout, gridLayout, uploadLayout); } private void setupHeader() { @@ -202,8 +209,8 @@ public class PlanAnualView extends VerticalLayout { nomenclaturaTxt.setReadOnly(true); nomenclaturaTxt.addClassName("nomenclatura-txt"); - header.setAlignSelf(Alignment.CENTER, titulo, titulo1); headerLayout.add(titulo, titulo1); + headerLayout.setAlignItems(Alignment.CENTER); add(headerLayout); } @@ -212,7 +219,7 @@ public class PlanAnualView extends VerticalLayout { Grid planAnualGrid = new Grid<>(PlanAnual.class, false); planAnualGrid.addColumn((ValueProvider) PlanAnual::getNumero) - .setHeader("No.").setSortable(true); + .setHeader("No.").setSortable(true).setAutoWidth(true).setFrozen(true); // Botón condicional planAnualGrid.addComponentColumn(planAnual -> { @@ -254,7 +261,7 @@ public class PlanAnualView extends VerticalLayout { } return btn; - }); + }).setAutoWidth(true).setFrozen(true); planAnualGrid.addColumn((ValueProvider) PlanAnual::getNomEquipo) .setHeader("Equipo").setAutoWidth(true).setKey("equipoColumnKey");