From 90e3c13c5adb9caa1cfc2ef1e8b99ae8812df284 Mon Sep 17 00:00:00 2001 From: mramirezg Date: Thu, 31 Oct 2024 13:04:00 -0600 Subject: [PATCH] =?UTF-8?q?Los=20combos=20ya=20muestran=20los=20nombres=20?= =?UTF-8?q?en=20lugar=20de=20sus=20id's=20pero=20a=20la=20BD=20se=20insert?= =?UTF-8?q?an=20sus=20id=C2=B4s=20y=20tambien=20se=20agrego=20otro=20campo?= =?UTF-8?q?=20de=20texto=20para=20el=20nombre=20de=20la=20computadora?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/mx/gob/jumapacelaya/Application.java | 2 + .../models/DepartamentosModel.java | 33 +++++ .../models/TiposMantenimiento.java | 32 +++++ .../mx/gob/jumapacelaya/models/Usuario.java | 33 +++++ .../services/DatabaseService.java | 44 ++++-- .../jumapacelaya/ui/MantenimientoView.java | 84 +++++++---- .../mx/gob/jumapacelaya/ui/PlanAnualView.java | 131 +++++++++++++++++- .../META-INF/resources/images/960X960_Nvo.png | Bin 0 -> 50718 bytes 8 files changed, 315 insertions(+), 44 deletions(-) create mode 100644 src/main/java/mx/gob/jumapacelaya/models/DepartamentosModel.java create mode 100644 src/main/java/mx/gob/jumapacelaya/models/TiposMantenimiento.java create mode 100644 src/main/java/mx/gob/jumapacelaya/models/Usuario.java create mode 100644 src/main/resources/META-INF/resources/images/960X960_Nvo.png 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 0000000000000000000000000000000000000000..5786eb239f8bfd879d6007c44cec852ac965dad1 GIT binary patch literal 50718 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 literal 0 HcmV?d00001