diff --git a/src/main/java/mx/gob/jumapacelaya/Application.java b/src/main/java/mx/gob/jumapacelaya/Application.java index d95efaf..a800726 100644 --- a/src/main/java/mx/gob/jumapacelaya/Application.java +++ b/src/main/java/mx/gob/jumapacelaya/Application.java @@ -1,6 +1,7 @@ package mx.gob.jumapacelaya; import com.vaadin.flow.component.page.AppShellConfigurator; +import com.vaadin.flow.server.PWA; import com.vaadin.flow.theme.Theme; import mx.gob.jumapacelaya.services.DatabaseService; import org.springframework.boot.SpringApplication; @@ -15,6 +16,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; */ @SpringBootApplication @Theme(value = "sistema-mantenimiento") +@PWA(name = "Aplicacion de Mantenimiento de Equipo de Computo", shortName = "App Mantenimiento de Computo", iconPath = "images/960x960_Nvo.png") public class Application implements AppShellConfigurator { public static void main(String[] args) { diff --git a/src/main/java/mx/gob/jumapacelaya/models/DepartamentosModel.java b/src/main/java/mx/gob/jumapacelaya/models/DepartamentosModel.java new file mode 100644 index 0000000..a0815a6 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/models/DepartamentosModel.java @@ -0,0 +1,33 @@ +package mx.gob.jumapacelaya.models; + +public class DepartamentosModel { + private String departamentoId; + private String nombre; + + public DepartamentosModel(String departamentoId, String nombre) { + this.departamentoId = departamentoId; + this.nombre = nombre; + } + + public String getDepartamentoId() { + return departamentoId; + } + + public void setDepartamentoId(String departamentoId) { + this.departamentoId = departamentoId; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + + @Override + public String toString() { + return nombre; + } +} diff --git a/src/main/java/mx/gob/jumapacelaya/models/TiposMantenimiento.java b/src/main/java/mx/gob/jumapacelaya/models/TiposMantenimiento.java new file mode 100644 index 0000000..6b77da2 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/models/TiposMantenimiento.java @@ -0,0 +1,32 @@ +package mx.gob.jumapacelaya.models; + +public class TiposMantenimiento { + private String tipomantId; + private String nombre; + + public TiposMantenimiento(String tipomantId, String nombre) { + this.tipomantId = tipomantId; + this.nombre = nombre; + } + + public String getTipomantId() { + return tipomantId; + } + + public void setTipomantId(String tipomantId) { + this.tipomantId = tipomantId; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + @Override + public String toString() { + return nombre; + } +} diff --git a/src/main/java/mx/gob/jumapacelaya/models/Usuario.java b/src/main/java/mx/gob/jumapacelaya/models/Usuario.java new file mode 100644 index 0000000..d9e4c91 --- /dev/null +++ b/src/main/java/mx/gob/jumapacelaya/models/Usuario.java @@ -0,0 +1,33 @@ +package mx.gob.jumapacelaya.models; + +public class Usuario { + private String empleadoId; + private String nombre; + + public Usuario(String empleadoId, String nombre) { + this.empleadoId = empleadoId; + this.nombre = nombre; + } + + public String getEmpleadoId() { + return empleadoId; + } + + public void setEmpleadoId(String empleadoId) { + this.empleadoId = empleadoId; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + + @Override + public String toString() { + return nombre; + } +} diff --git a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java index f6d026f..ab75d93 100644 --- a/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java +++ b/src/main/java/mx/gob/jumapacelaya/services/DatabaseService.java @@ -1,7 +1,10 @@ package mx.gob.jumapacelaya.services; import com.fasterxml.jackson.databind.jsontype.impl.StdTypeResolverBuilder; +import mx.gob.jumapacelaya.models.DepartamentosModel; import mx.gob.jumapacelaya.models.PlanAnual; +import mx.gob.jumapacelaya.models.TiposMantenimiento; +import mx.gob.jumapacelaya.models.Usuario; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; @@ -26,16 +29,20 @@ public class DatabaseService { } // Método para obtener los tipos de mantenimientos - public List getTiposDeMantenimientos() { - List tiposDeMantenimientos = new ArrayList<>(); - String query = "SELECT tipomantid FROM TIPOMANT"; + public List getTiposDeMantenimientos() { + List tiposDeMantenimientos = new ArrayList<>(); + String query = "SELECT tipomantid, nombre FROM TIPOMANT"; try (Connection connection = getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query)) { while (resultSet.next()) { - tiposDeMantenimientos.add(resultSet.getString("TIPOMANTID")); + TiposMantenimiento tipo = new TiposMantenimiento( + resultSet.getString("tipomantid"), + resultSet.getString("nombre") + ); + tiposDeMantenimientos.add(tipo); } } catch (SQLException e) { e.printStackTrace(); @@ -66,16 +73,20 @@ public class DatabaseService { /* -------------- Metodo para obtener a los usuarios ---------------- */ - public List getUsuarios() { - List usuarios = new ArrayList<>(); - String query = "select EMPLEADOID from USUARIOSFINAN"; + public List getUsuarios() { + List usuarios = new ArrayList<>(); + String query = "select EMPLEADOID, NOMBRE from USUARIOSFINAN"; try (Connection connection = getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query)) { while (resultSet.next()) { - usuarios.add(resultSet.getString("EMPLEADOID")); + Usuario usuario = new Usuario( + resultSet.getString("empleadoid"), + resultSet.getString("nombre") + ); + usuarios.add(usuario); } } catch (SQLException e) { e.printStackTrace(); @@ -85,16 +96,20 @@ public class DatabaseService { /* -------------- Metodo para obtener los departamentos ---------------- */ - public List getDepartamentos() { - List departamentos = new ArrayList<>(); - String query = "select DEPARTAMENTOID from DEPARTAMENTOSFINAN"; + public List getDepartamentos() { + List departamentos = new ArrayList<>(); + String query = "select DEPARTAMENTOID, DESCRIPCION from DEPARTAMENTOSFINAN"; try (Connection connection = getConnection(); Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query)) { while (resultSet.next()) { - departamentos.add(resultSet.getString("DEPARTAMENTOID")); + DepartamentosModel departamentosModel = new DepartamentosModel( + resultSet.getString("departamentoid"), + resultSet.getString("descripcion") + ); + departamentos.add(departamentosModel); } } catch (SQLException e) { e.printStackTrace(); @@ -186,8 +201,8 @@ public class DatabaseService { /*-=iii=<() *-=iii=<()*/ /* ( ͡° ͜ʖ ͡°) Metodos para insetar en la BD ( ͡° ͜ʖ ͡°) ( ͡° ͜ʖ ͡°) Metodos para insetar en la BD ( ͡° ͜ʖ ͡°) ( ͡° ͜ʖ ͡°) Metodos para insetar en la BD ( ͡° ͜ʖ ͡°) */ // INSERTAR EN TABLA: MANTENIMINETOS - public int insertarMantenimiento(LocalDate fecha, String tipoMantId, String departamentoId, String empleadoId, String formaMant) { - String query = "INSERT INTO MANTENIMIENTOS (fecha, tipoMantId, departamentoId, empleadoId, formaMant) VALUES (?, ?, ?, ?, ?)"; + public int insertarMantenimiento(LocalDate fecha, String tipoMantId, String departamentoId, String empleadoId, String formaMant, String equipoId) { + String query = "INSERT INTO MANTENIMIENTOS (fecha, tipoMantId, departamentoId, empleadoId, formaMant, nombreequipo) VALUES (?, ?, ?, ?, ?, ?)"; int nuevoId = -1; try (Connection connection = getConnection(); @@ -198,6 +213,7 @@ public class DatabaseService { preparedStatement.setString(3, departamentoId); preparedStatement.setString(4, empleadoId); preparedStatement.setString(5, formaMant); + preparedStatement.setString(6, equipoId); int rowsAffected = preparedStatement.executeUpdate(); if (rowsAffected > 0) { diff --git a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java index de33382..7cb31a9 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/MantenimientoView.java @@ -27,6 +27,9 @@ 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.TiposMantenimiento; +import mx.gob.jumapacelaya.models.Usuario; import mx.gob.jumapacelaya.services.DatabaseService; import java.time.LocalDate; @@ -46,9 +49,10 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse private final VerticalLayout etiquetaLayout; private final HorizontalLayout firmasLayout; private final DatePicker fecha; - private final ComboBox tipoMantt; - private final ComboBox area; - private final ComboBox usuario; + private final ComboBox tipoMantt; + private final ComboBox area; + private final ComboBox usuario; + private final TextField nombreEquipo; private RadioButtonGroup formaGroup; private CheckboxGroup actualizaciones; private final HorizontalLayout botonesLayout; @@ -79,34 +83,46 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse //Selector de fecha this.fecha = new DatePicker("Fecha"); + fecha.setRequired(true); //fecha.setPlaceholder("Fecha"); - //ComboBox Tipo de Mantenimiento + // ComboBox Tipo de Mantenimiento this.tipoMantt = new ComboBox<>("Tipo de Mantenimiento"); - tipoMantt.setItems(databaseService.getTiposDeMantenimientos()); + List tiposMantenimiento = databaseService.getTiposDeMantenimientos(); + tipoMantt.setItems(tiposMantenimiento); tipoMantt.addClassName("mantenimiento-combo"); + + // Listener para manejar el cambio en el tipo de mantenimiento tipoMantt.addValueChangeListener(event -> { - String tipoSeleccionado = event.getValue(); + TiposMantenimiento tipoSeleccionado = event.getValue(); if (tipoSeleccionado != null) { // Actualizar nomenclatura dependiendo del tipo de mantenimiento - String nomenclaturaValue = databaseService.getNomenclatura(tipoSeleccionado); + String nomenclaturaValue = databaseService.getNomenclatura(tipoSeleccionado.getTipomantId()); nomenclatura.setValue(nomenclaturaValue); // Si el tipo es preventivo se establecerá la fecha automáticamente a la fecha del sistema - if ("1".equals(tipoSeleccionado)) { // 1 es para PREVENTIVO + if ("1".equals(tipoSeleccionado.getTipomantId())) { // 1 es para PREVENTIVO this.fecha.setValue(LocalDate.now()); etiquetaLayout.setVisible(false); - } else if ("2".equals(tipoSeleccionado)) { // 2 es para CORRECTIVO + // Limpiar el layout de correctivo si es necesario + etiquetaLayout.removeAll(); + } else if ("2".equals(tipoSeleccionado.getTipomantId())) { // 2 es para CORRECTIVO this.fecha.clear(); etiquetaLayout.setVisible(true); - correctivoLayout(); + correctivoLayout(); // Asegúrate de que este método se llame + } else { + // Para otros tipos de mantenimiento + this.fecha.clear(); + etiquetaLayout.setVisible(false); + etiquetaLayout.removeAll(); // Limpia el layout para otros tipos } } else { nomenclatura.clear(); this.fecha.clear(); etiquetaLayout.setVisible(false); + etiquetaLayout.removeAll(); // Limpia el layout } }); fechaLayout.add(this.fecha); @@ -118,22 +134,33 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse HorizontalLayout departamentoLayout = new HorizontalLayout(); //ComboBox Area o Departamento this.area = new ComboBox<>("Area o Departamento"); - List areas = databaseService.getDepartamentos(); + area.setRequired(true); + List areas = databaseService.getDepartamentos(); area.setItems(areas); this.usuario = new ComboBox<>("Usuario"); - usuario.setItems(databaseService.getUsuarios()); + List usuarios = databaseService.getUsuarios(); + usuario.setItems(usuarios); + usuario.setItemLabelGenerator(Usuario::getNombre); + usuario.setRequired(true); + usuario.addValueChangeListener(event -> { - String usuarioSeleccionado = event.getValue(); + Usuario usuarioSeleccionado = event.getValue(); if (usuarioSeleccionado != null) { - String nombreUsuario = databaseService.getNombreUsuario(usuarioSeleccionado); + String empleadoId = usuarioSeleccionado.getEmpleadoId(); + String nombreUsuario = usuarioSeleccionado.getNombre(); userSignSpan.setText(nombreUsuario); } else { userSignSpan.setText("S.M.T Nombre"); } }); - departamentoLayout.add(area, usuario); + + this.nombreEquipo = new TextField("Nombre del Equipo"); + nombreEquipo.setRequired(true); + + + departamentoLayout.add(area, usuario, nombreEquipo); departamentoLayout.setWidthFull(); createHardwareSection(databaseService); @@ -297,8 +324,8 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse Span Titulo = new Span("Reparación Realizada al Equipo: "); // Verificar el ID del tipo de mantenimiento - String tipoMantId = tipoMantt.getValue(); - if ("2".equals(tipoMantId)) { // Solo si el tipo es CORRECTIVO + TiposMantenimiento tiposMantenimiento = tipoMantt.getValue(); + if (tiposMantenimiento != null && "2".equals(tiposMantenimiento.getTipomantId())) { // Solo si el tipo es CORRECTIVO TextField txtModelo = new TextField(); txtModelo.setPlaceholder("Modelo"); txtModelo.setWidth("240px"); @@ -392,9 +419,17 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse btnGuardar.addClickListener(event -> { LocalDate fechaSeleccionada = fecha.getValue(); - String tipoMantId = tipoMantt.getValue(); - String departamentoId = area.getValue(); - String empleadoId = usuario.getValue(); + TiposMantenimiento tiposMantenimiento = tipoMantt.getValue(); + String tipoMantId = tiposMantenimiento != null ? tiposMantenimiento.getTipomantId() : null; + + // Cambié aquí para obtener el departamento seleccionado correctamente + DepartamentosModel departamentoSeleccionado = area.getValue(); + String departamentoId = departamentoSeleccionado != null ? departamentoSeleccionado.getDepartamentoId().toString() : null; + + // Obtener el empleado y el equipo + Usuario usuarioSeleccionado = usuario.getValue(); + String empleadoId = usuarioSeleccionado != null ? usuarioSeleccionado.getEmpleadoId().toString() : null; + String equipoId = nombreEquipo.getValue(); // AQUI SE MANEJA LA OPCION SELECCIONADA EN LA FORMA DE MANTENIMIENTO (REMOTA o MANUAL) String formaSeleccionada = formaGroup.getValue(); @@ -407,12 +442,12 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse } // VALIDACION PARA QUE TODOS LOS CAMPOS OBLIGATORIOS SEAN LLENADOS - if (fechaSeleccionada == null || tipoMantId == null || departamentoId == null || empleadoId == null || formaMantt == null) { + if (fechaSeleccionada == null || tipoMantId == null || departamentoId == null || empleadoId == null || equipoId == null || formaMantt == null) { Notification.show("Por favor, completa todos los campos requeridos", 4000, Notification.Position.MIDDLE); return; } - int isInserted = databaseService.insertarMantenimiento(fechaSeleccionada, tipoMantId, departamentoId, empleadoId, formaMantt); + int isInserted = databaseService.insertarMantenimiento(fechaSeleccionada, tipoMantId, departamentoId, empleadoId, formaMantt, equipoId); // AQUI SE MANEJA LA INSERCION DE LOS DETALLES DE HARDWARE (TIPO DE HARDWARE, NO. DE SERIE, MODELO, PLACA) if (isInserted > 0) { @@ -480,6 +515,7 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse tipoMantt.clear(); area.clear(); usuario.clear(); + nombreEquipo.clear(); formaGroup.clear(); actualizaciones.clear(); masActualizacionesGroup.clear(); @@ -516,12 +552,12 @@ public class MantenimientoView extends VerticalLayout implements BeforeEnterObse } // Cambiamos el valor por el ID - if ("1".equals(tipoParam)) { // 1 es para PREVENTIVO + /*if ("1".equals(tipoParam)) { // 1 es para PREVENTIVO tipoMantt.setValue("1"); // Establecemos el ID en el ComboBox tipoMantt.setReadOnly(true); } else if ("2".equals(tipoParam)) { // 2 es para CORRECTIVO tipoMantt.setValue("2"); tipoMantt.setReadOnly(true); - } + }*/ } } diff --git a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java index ba6a5b9..ad42179 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java @@ -1,10 +1,12 @@ package mx.gob.jumapacelaya.ui; import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.button.ButtonVariant; import com.vaadin.flow.component.dependency.CssImport; import com.vaadin.flow.component.grid.Grid; import com.vaadin.flow.component.html.H4; import com.vaadin.flow.component.html.H5; +import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.notification.Notification; @@ -19,10 +21,15 @@ import com.vaadin.flow.router.Route; import jakarta.annotation.security.PermitAll; import mx.gob.jumapacelaya.models.PlanAnual; import mx.gob.jumapacelaya.services.DatabaseService; +import org.apache.poi.ss.usermodel.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Array; import java.time.LocalDate; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -36,6 +43,8 @@ public class PlanAnualView extends VerticalLayout { H4 titulo = new H4(); H5 titulo1 = new H5(); DatabaseService databaseService = new DatabaseService(); + Button btnInsertar; + private byte[] fileContent; public PlanAnualView() { setupHeader(); @@ -51,16 +60,55 @@ public class PlanAnualView extends VerticalLayout { upload.addSucceededListener(event -> { try { - InputStream inputStream = buffer.getInputStream(); - databaseService.insertarDesdeExcel(inputStream); - Notification.show("Archivo insertado correctamente").addThemeVariants(NotificationVariant.LUMO_SUCCESS); - } catch (Exception e) { - Notification.show("Error al insertar el archivo: " + e.getMessage()).addThemeVariants(NotificationVariant.LUMO_ERROR); + // Almacena el contenido del archivo en un arreglo de bytes + try (InputStream inputStream = buffer.getInputStream(); + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { + + inputStream.transferTo(byteArrayOutputStream); + fileContent = byteArrayOutputStream.toByteArray(); + } + + // Validación del archivo cargado + List errores = validarExcel(new ByteArrayInputStream(fileContent)); + if (!errores.isEmpty()) { + // Crear notificación con mensaje de error y sin duración + final Notification ntfError = new Notification(); + ntfError.setText("Errores en el archivo: " + String.join(", ", errores)); + ntfError.setDuration(0); // La notificación no se cerrará automáticamente + ntfError.setPosition(Notification.Position.MIDDLE); + ntfError.addThemeVariants(NotificationVariant.LUMO_ERROR); + + // Texto del mensaje de error + Span errorMessage = new Span("Errores en el archivo: " + String.join(", ", errores)); + errorMessage.getStyle().set("margin-right", "10px"); + + // Crear botón de cierre + final Button closeButton = new Button(new Icon(VaadinIcon.CLOSE)); + closeButton.addClickListener(e -> ntfError.close()); + + // Agregar el mensaje y el botón de cierre a la notificación + HorizontalLayout notificationLayout = new HorizontalLayout(errorMessage, closeButton); + ntfError.add(notificationLayout); + + + ntfError.open(); // Abrir la notificación en pantalla + + // Ocultar el botón de insertar si hay errores + btnInsertar.setVisible(false); + } else { + btnInsertar.setVisible(true); + } + } catch (IOException e) { + Notification.show("Error al leer el archivo: " + e.getMessage()) + .addThemeVariants(NotificationVariant.LUMO_ERROR); } }); + btnInsertar = new Button("Insertar archivo", event -> insertarDatos()); + btnInsertar.setVisible(false); + VerticalLayout gridLayout = new VerticalLayout(); - gridLayout.add(planAnualGrid, upload); + gridLayout.add(planAnualGrid, upload, btnInsertar); this.setPadding(false); @@ -125,6 +173,8 @@ public class PlanAnualView extends VerticalLayout { return planAnualGrid; } + + /* (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * SUSTITUIR VALORES BOOLEANOS POR UN ICONO (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * */ private Icon getIcon(boolean value) { if (value) { return new Icon(VaadinIcon.CHECK_CIRCLE); @@ -132,4 +182,73 @@ public class PlanAnualView extends VerticalLayout { return new Icon(); } } + + + /* (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * METODO PARA VALIDAR QUE EL ARCHIOVO TENGA LA ESTRUCTURA CORRECTA (∩ ͡° ͜ʖ ͡°)⊃━☆゚. * */ + private List validarExcel(InputStream inputStream) throws IOException { + List errores = new ArrayList<>(); + Workbook workbook = WorkbookFactory.create(inputStream); + Sheet sheet = workbook.getSheetAt(0); + + // Lista de nombres de columnas esperados en el encabezado + List columnas = Arrays.asList("NOMEQUIPO", "DEPARTAMENTO", "MONITOR", "TECLADO", "MOUSE", "REGULADOR", + "CPU", "IMPRESORA", "MINIPRINT", "LAPTOP", "ESCANER", "FECHAPROG", "TECNICO", "ESTADO"); + + // Obtener la primera fila como encabezado + Row headerRow = sheet.getRow(0); + if (headerRow != null) { + // Validar que cada celda en el encabezado tiene el nombre correcto + for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { + Cell cell = headerRow.getCell(i); + if (cell != null) { // Verificar si la celda no es null antes de acceder a su valor + String columnName = cell.getStringCellValue(); + if (!columnas.contains(columnName)) { + errores.add("Columna inesperada: " + columnName); + } + } else { + errores.add("Celda vacía en la columna de índice " + i); + } + } + } else { + errores.add("La hoja no contiene un encabezado en la primera fila."); + } + + // Verificar si faltan columnas esperadas en el encabezado + for (String columnName : columnas) { + boolean found = false; + if (headerRow != null) { + for (int i = 0; i < headerRow.getPhysicalNumberOfCells(); i++) { + Cell cell = headerRow.getCell(i); + if (cell != null && cell.getStringCellValue().equals(columnName)) { + found = true; + break; + } + } + } + if (!found) { + errores.add("Falta la columna: " + columnName); + } + } + + workbook.close(); + return errores; + } + + + + private void insertarDatos() { + if (fileContent == null) { + Notification.show("Error: No hay archivo cargado.").addThemeVariants(NotificationVariant.LUMO_ERROR); + return; + } + + try (InputStream inputStream = new ByteArrayInputStream(fileContent)) { + databaseService.insertarDesdeExcel(inputStream); + Notification.show("Archivo insertado correctamente").addThemeVariants(NotificationVariant.LUMO_SUCCESS); + btnInsertar.setVisible(false); // Ocultar el botón después de la inserción + } catch (Exception e) { + Notification.show("Error al insertar el archivo: " + e.getMessage()) + .addThemeVariants(NotificationVariant.LUMO_ERROR); + } + } } diff --git a/src/main/resources/META-INF/resources/images/960X960_Nvo.png b/src/main/resources/META-INF/resources/images/960X960_Nvo.png new file mode 100644 index 0000000..5786eb2 Binary files /dev/null and b/src/main/resources/META-INF/resources/images/960X960_Nvo.png differ