From 7d4084c23ec507e606d1349c5fe921f98c1e406a Mon Sep 17 00:00:00 2001 From: mramirezg Date: Thu, 18 Sep 2025 15:49:49 -0600 Subject: [PATCH] Se arreglo el error al dejar las firmas en blanco durante la edicion de estas --- .../gob/jumapacelaya/api/RedmineClient.java | 99 ++++--- .../mx/gob/jumapacelaya/models/Ticket.java | 98 ++++--- .../mx/gob/jumapacelaya/ui/ActDiariaView.java | 215 +++++++++++--- .../gob/jumapacelaya/ui/DetallesMantView.java | 262 +++++++++--------- 4 files changed, 434 insertions(+), 240 deletions(-) diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java index cf24a25..5ab93f0 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -34,47 +34,57 @@ public class RedmineClient { } //AQUI OBTENGO LOS TICKETS DESDE REDMINE - public List getTickets(RedmineUser user, boolean includeClosed) { + public List getTickets(RedmineUser user, boolean includeClosed, int offset, int limit) { List tickets = new ArrayList<>(); HttpClient client = HttpClient.newHttpClient(); - int offset = 0; - // Si includeClose es true, incluira todos los tikets si no, incluira solo los que estan abiertos - String statusFilter = includeClosed ? "&status_id=*" : "&status_id=open"; + // Muestra solamnete los que estan cerrados + String statusFilter = includeClosed ? "&status_id=closed" : "&status_id=open"; - while (true) { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + statusFilter + "&offset=" + offset)) - .header("Content-Type", "application/json") - .build(); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + + statusFilter + "&offset=" + offset + "&limit=" + limit)) + .header("Content-Type", "application/json") + .build(); + System.out.println(request.toString()); - try { - HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - if (response.statusCode() == 200) { - String responseBody = response.body(); - List pageTickets = parseTickets(responseBody); - tickets.addAll(pageTickets); - if (pageTickets.size() < PAGE_SIZE) { - break; - } - offset += PAGE_SIZE; - } else { - System.err.println("Error en la respuesta: " + response.statusCode()); - break; - } - } catch (Exception e) { - e.printStackTrace(); - break; + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) { + tickets.addAll(parseTickets(response.body())); + } else { + System.err.println("Error en la respuesta: " + response.statusCode()); } + } catch (Exception e) { + e.printStackTrace(); } - System.out.println("Total tickets obtenidos: " + tickets.size()); return tickets; } + public int getTotalTickets(RedmineUser user, boolean includedClose) { + HttpClient client = HttpClient.newHttpClient(); + String statusFilter = includedClose ? "&status_id=closed" : "&status_id=open"; + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + statusFilter + "&limit=1")) + .header("Content-Type", "application/json") + .build(); + + try { + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 200) { + JsonObject jsonObject = JsonParser.parseString(response.body()).getAsJsonObject(); + return jsonObject.get("total_count").getAsInt(); + } + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + //AQUI OBTENGO LOS TICKETS DESDE REDMINE - public List getTicketsAuthor(RedmineUser user, boolean includeClosed) { + /*public List getTicketsAuthor(RedmineUser user, boolean includeClosed) { List tickets = new ArrayList<>(); HttpClient client = HttpClient.newHttpClient(); int offset = 0; @@ -110,7 +120,7 @@ public class RedmineClient { } System.out.println("Total tickets obtenidos: " + tickets.size()); return tickets; - } + }*/ // Aquí se parsean todos los tickets que existen y se les da un formato con los campos a mostrarse @@ -167,6 +177,29 @@ public class RedmineClient { } } + // Verifica y obtiene la fecha de actualizacion + String updateDateString = issue.has("updated_on") && !issue.get("updated_on").isJsonNull() ? issue.get("updated_on").getAsString() : ""; + LocalDate dateUpdate = null; + if (!updateDateString.isEmpty()) { + try { + DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; + dateUpdate = LocalDate.parse(updateDateString, formatter); + } catch (DateTimeParseException e) { + System.err.println("Error al parsear la fecha de actualización: " + updateDateString); + e.printStackTrace(); + } + } + + + Ticket.User autor = null; + if (issue.has("author") && !issue.get("author").isJsonNull()) { + JsonObject authorObj = issue.getAsJsonObject("author"); + if (authorObj.has("name") && !authorObj.get("name").isJsonNull()) { + String authorName = authorObj.get("name").getAsString(); + autor = new Ticket.User(authorName); + } + } + //Verifica y obtiene el ID del tipo de ticket Integer trackerId = null; @@ -180,9 +213,11 @@ public class RedmineClient { // Agrega el ticket a la lista tickets.add(new Ticket(id, subject, description, status, - dateCreate != null ? dateCreate.toString() : "", - dateClose != null ? dateClose.toString() : "", - trackerId, "Tipo Desconocido")); + dateCreate != null ? dateCreate.toString() : "", + dateClose != null ? dateClose.toString() : "", + dateUpdate != null ? dateUpdate.toString() : "", + autor, + trackerId, "Tipo Desconocido")); } } else { System.out.println("La respuesta JSON no contiene la clave 'issues'"); diff --git a/src/main/java/mx/gob/jumapacelaya/models/Ticket.java b/src/main/java/mx/gob/jumapacelaya/models/Ticket.java index 3fbadfa..3367010 100644 --- a/src/main/java/mx/gob/jumapacelaya/models/Ticket.java +++ b/src/main/java/mx/gob/jumapacelaya/models/Ticket.java @@ -2,43 +2,67 @@ package mx.gob.jumapacelaya.models; import java.sql.Date; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.OffsetDateTime; +import java.time.ZoneId; public class Ticket { private final int id; private final String subject; private final String description; private final String status; - private final LocalDate dateCreate; - private LocalDate dateClose; - private User author; + private final LocalDateTime dateCreate; + private LocalDateTime dateClose; + private final LocalDateTime updateOn; + private User autor; private Integer trackerId; private String type; - public Ticket(int id, String subject, String description, String status, String dateCreate, String dateClose, Integer trackerId, String type) { + public Ticket(int id, String subject, String description, String status, + String dateCreate, String dateClose, String updateOn, + User autor, Integer trackerId, String type) { this.id = id; this.subject = subject; this.description = description; this.status = status; - // Manejo de la fecha de creación - if (dateCreate != null && !dateCreate.isEmpty()) { - this.dateCreate = LocalDate.parse(dateCreate); // Solo se parsea si no está vacío - } else { - this.dateCreate = null; // Si está vacío, asignar null - } - // Manejo de la fecha de cierre - if (dateClose != null && !dateClose.isEmpty()) { - this.dateClose = LocalDate.parse(dateClose); // Solo se parsea si no está vacío - } else { - this.dateClose = null; // Si está vacío, asignar null - } - this.author = author; + this.dateCreate = parseDate(dateCreate); + this.dateClose = parseDate(dateClose); + this.updateOn = parseDate(updateOn); + + this.autor = autor; this.trackerId = trackerId; this.type = type; } + + /** + * Método para parsear fechas en formato: + * - yyyy-MM-dd + * - yyyy-MM-dd'T'HH:mm:ssZ + * Siempre convierte a zona horaria local del sistema. + */ + private static LocalDateTime parseDate(String dateStr) { + if (dateStr == null || dateStr.isEmpty()) { + return null; + } + try { + OffsetDateTime odt = OffsetDateTime.parse(dateStr); + return odt.atZoneSameInstant(ZoneId.systemDefault()).toLocalDateTime(); + } catch (Exception e) { + try { + LocalDate ld = LocalDate.parse(dateStr); + return ld.atStartOfDay(); + } catch (Exception ex) { + System.err.println("Error al parsear fecha: " + dateStr); + return null; + } + } + } + + public int getId() { return id; } @@ -56,15 +80,15 @@ public class Ticket { } public User getAuthor() { - return author; + return autor; } public void setAuthor(User author) { - this.author = author; + this.autor = author; } - public Date getDateCreate() { - return java.sql.Date.valueOf(this.dateCreate); + public LocalDateTime getDateCreate() { + return dateCreate; } public Integer getTrackerId() { @@ -75,11 +99,11 @@ public class Ticket { this.trackerId = tipoId; } - public LocalDate getDateClose() { + public LocalDateTime getDateClose() { return dateClose; } - public void setDateClose(LocalDate dateClose) { + public void setDateClose(LocalDateTime dateClose) { this.dateClose = dateClose; } @@ -87,6 +111,18 @@ public class Ticket { this.type = type; } + public LocalDateTime getUpdateOn() { + return updateOn; + } + + public LocalDateTime getDateCreateLocal() { + return this.dateCreate; + } + + public LocalDateTime getDateCloseLocal() { + return this.dateClose; + } + public static class User { private String username; @@ -111,16 +147,16 @@ public class Ticket { } switch (trackerId) { - case 1,3,4,7: - return "1-2 dias Max"; - case 2,12: - return "2 hrs Max"; case 5: - return "5 dias aprox."; - case 8,11: - return "2-6 hrs Max"; + return "12 horas"; + case 6,16: + return "2 horas"; + case 7,8,12,13: + return "48 horas"; case 9,10: - return "2 hrs Max"; + return "72 horas"; + case 11,14,15: + return "24 horas"; default: return "N/A"; } diff --git a/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java b/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java index 6404a70..d7d9ce3 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java @@ -3,10 +3,15 @@ package mx.gob.jumapacelaya.ui; import com.vaadin.flow.component.UI; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.button.ButtonVariant; +import com.vaadin.flow.component.checkbox.Checkbox; +import com.vaadin.flow.component.checkbox.CheckboxGroup; +import com.vaadin.flow.component.checkbox.CheckboxGroupVariant; +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.grid.Grid; import com.vaadin.flow.component.grid.GridVariant; +import com.vaadin.flow.component.html.Div; import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.icon.Icon; @@ -16,6 +21,8 @@ import com.vaadin.flow.component.notification.NotificationVariant; import com.vaadin.flow.component.orderedlayout.FlexComponent; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.popover.Popover; +import com.vaadin.flow.component.popover.PopoverPosition; import com.vaadin.flow.component.richtexteditor.RichTextEditor; import com.vaadin.flow.data.renderer.ComponentRenderer; import com.vaadin.flow.router.PageTitle; @@ -28,13 +35,17 @@ import mx.gob.jumapacelaya.models.RedmineUser; import mx.gob.jumapacelaya.models.Ticket; import mx.gob.jumapacelaya.services.LdapService; import mx.gob.jumapacelaya.services.UserService; +import org.apache.commons.lang3.StringUtils; import java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.stream.Stream; @PermitAll @@ -46,85 +57,207 @@ public class ActDiariaView extends VerticalLayout { private final RedmineClient redmineClient; private final UserService userService; private final Grid grid; - + private final HorizontalLayout showColumnsLyt; + private final Button btnColumns; + private final HorizontalLayout opcionesLyt; + private final Checkbox chkVerCerrados; + private DatePicker fechaDesde; + private DatePicker fechaHasta; + private Button btnBuscar; public ActDiariaView(ServerProperties properties, RedmineClient redmineClient, UserService userService) { this.userService = userService; this.redmineClient = redmineClient; this.grid = new Grid<>(Ticket.class, false); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"); + + // Configuracion de las opciones de arriba + opcionesLyt = new HorizontalLayout(); + opcionesLyt.setWidthFull(); + opcionesLyt.setMargin(false); + opcionesLyt.getStyle() + .set("box-shadow", "0 4px 8px rgba(0,0,0,0.2)") + .set("border-radius", "10px") + .set("background-color", "white") + .set("padding", "1rem") + .set("margin", "1rem auto"); + + + chkVerCerrados = new Checkbox(); + chkVerCerrados.setLabel("Ver solo abiertos"); + chkVerCerrados.addValueChangeListener(e -> { + boolean soloAbiertos = e.getValue().equals(false); + loadTickets(soloAbiertos); + fechaDesde.setEnabled(false); + fechaHasta.setEnabled(false); + btnBuscar.setEnabled(false); + }); + + fechaDesde = new DatePicker("Fecha desde:"); + fechaDesde.setEnabled(true); + + fechaHasta = new DatePicker("Fecha hasta:"); + fechaHasta.setEnabled(true); + + btnBuscar = new Button("Buscar"); + opcionesLyt.add(chkVerCerrados,fechaDesde,fechaHasta,btnBuscar); + + // Configuración de columnas del grid grid.addColumn(Ticket::getId).setHeader("No.") - .setAutoWidth(true).setFlexGrow(0).setSortable(true); + .setAutoWidth(true) + .setSortable(true); grid.addColumn(Ticket::getType) .setHeader("Tipo") - .setAutoWidth(true); + .setAutoWidth(true) + .setKey("tipo"); + + + grid.addColumn(ticket -> ticket.tiempoEst(ticket.getTrackerId())) + .setHeader("Tiempo estimado") + .setAutoWidth(true) + .setKey("tiempoEst"); + - grid.addColumn(Ticket::getSubject).setHeader("Asunto") - .setWidth("25em"); + grid.addColumn(Ticket::getSubject) + .setHeader("Asunto") + .setWidth("25rem") + .setKey("asunto"); - grid.addColumn(createStatusRender()).setHeader("Estado"); + + grid.addColumn(ticket -> + ticket.getAuthor() != null ? ticket.getAuthor().getUsername() : "") + .setHeader("Autor") + .setAutoWidth(true) + .setKey("autor"); + + grid.addColumn(createStatusRender()).setHeader("Estado") + .setKey("estado"); grid.addColumn(ticket -> { - Date date = ticket.getDateCreate(); - if (date != null) { - SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy"); - return formatter.format(date); - } else { - return ""; - } - }).setHeader("Fecha creacion").setAutoWidth(true); + LocalDateTime fecha = ticket.getDateCreate(); + return fecha != null ? fecha.format(formatter) : ""; + }).setHeader("Fecha creación") + .setAutoWidth(true) + .setKey("fechaCreacion"); grid.addColumn(ticket -> { - LocalDate fechaCierre = ticket.getDateClose(); - if (fechaCierre != null) { - DateTimeFormatter formatterClose = DateTimeFormatter.ofPattern("dd/MM/yyyy"); - return fechaCierre.format(formatterClose); + LocalDateTime fecha = ticket.getDateClose(); + return fecha != null ? fecha.format(formatter) : ""; + }).setHeader("Fecha cierre") + .setAutoWidth(true) + .setKey("fechaCierre"); + + grid.addColumn(ticket -> { + LocalDateTime fecha = ticket.getUpdateOn(); + return fecha != null ? fecha.format(formatter) : ""; + }).setHeader("Fecha actualización") + .setAutoWidth(true) + .setKey("fechaActualizacion"); + + + grid.addColumn(ticket -> { + if (ticket.getDateCreateLocal() != null) { + LocalDateTime fechaInicio = ticket.getDateCreateLocal(); + LocalDateTime fechaFin = (ticket.getDateCloseLocal() != null) + ? ticket.getDateCloseLocal() + : LocalDateTime.now(); + long dias = ChronoUnit.DAYS.between(fechaInicio, fechaFin); + return dias + " días"; } else { return ""; } - }).setHeader("Fecha cierre").setAutoWidth(true); + }).setHeader("Duración").setAutoWidth(true).setKey("duracion"); - //grid.addColumn(ticket -> ticket.tiempoEst(ticket.getTrackerId())).setHeader("Tiempo estimado de atencion").setAutoWidth(false); grid.addComponentColumn(ticket -> { Button btnVer = new Button(new Icon(VaadinIcon.EYE)); btnVer.addClickListener(event -> showDescription(ticket)); btnVer.getStyle().set("color", "#A02142"); return btnVer; - }).setAutoWidth(true); + }); - grid.addColumn(buttonTicketComponentRenderer()).setAutoWidth(true); + //grid.addColumn(buttonTicketComponentRenderer()).setAutoWidth(true); grid.addThemeVariants(GridVariant.LUMO_WRAP_CELL_CONTENT); - grid.getStyle().set("opacity", "0.8"); - grid.setAllRowsVisible(false); + grid.addThemeVariants(GridVariant.LUMO_ROW_STRIPES); + //grid.getStyle().set("opacity", "0.8"); + //grid.setAllRowsVisible(false); grid.setSizeFull(); + + // Mostrar boton para elegir que columnas mostrar + /**/btnColumns = new Button(VaadinIcon.GRID_H.create()); + /**/showColumnsLyt = new HorizontalLayout(btnColumns); + HorizontalLayout columnsSelectorLyt = new HorizontalLayout(); + columnsSelectorLyt.setAlignItems(Alignment.END); + Popover popover = new Popover(); + popover.setModal(true); + popover.setBackdropVisible(true); + popover.setPosition(PopoverPosition.BOTTOM_END); + popover.setTarget(btnColumns); + Div heading = new Div("Ver/Ocultar columnas"); + heading.getStyle().set("font-weight", "600"); + heading.getStyle().set("padding", "var(--lumo-space-xs)"); + List columns = List.of("tipo","tiempoEst","asunto","autor","estado","fechaCreacion","fechaCierre","fechaActualizacion","duracion"); + CheckboxGroup chkColumns = new CheckboxGroup<>(); + chkColumns.addThemeVariants(CheckboxGroupVariant.LUMO_VERTICAL); + chkColumns.setItems(columns); + chkColumns.setItemLabelGenerator((item) -> { + String label = StringUtils + .join(StringUtils.splitByCharacterTypeCamelCase(item), " "); + return StringUtils.capitalize(label.toLowerCase()); + }); + chkColumns.addValueChangeListener((e) -> { + columns.forEach((key) -> { + Grid.Column col = grid.getColumnByKey(key); + if (col != null) { + col.setVisible(e.getValue().contains(key)); + } else { + System.out.println("Columna no encontrada para: " + key); + } + }); + }); + Set defaultColumns = Set.of("tipo","asunto","autor","estado","fechaCreacion","fechaCierre"); + chkColumns.setValue(defaultColumns); + popover.add(heading, chkColumns); + /****/ + + // Ajustar tamaño del Grid y Layout grid.setSizeFull(); setSizeFull(); - - - add(grid); + add(opcionesLyt, showColumnsLyt, grid); //expand(grid); setMargin(false); - loadTickets(); + loadTickets(true); } - private void loadTickets() { - try { - List tickets = redmineClient.getTickets(userService.getRedmineUser(), true); - List filteredTickets = tickets.stream() - .filter(ticket -> ticket.getTrackerId() == 13 || ticket.getTrackerId() == 14) - .toList(); - grid.setItems(filteredTickets); - } catch (Exception e) { - e.printStackTrace(); - // Manejo de error al cargar los tickets - } + + // NOTA: Ajuste en la carga de tickets para que ahora haga LazyLoad al cargar todos los ticktes cerrados + private void loadTickets(boolean soloAbiertos) { + RedmineUser user = userService.getRedmineUser(); + + grid.setItems( + query -> { + int offset = query.getOffset(); + int limit = query.getLimit(); + + try { + List ticketsPage = redmineClient.getTickets(user, soloAbiertos, offset, limit); + return ticketsPage.stream(); + } catch (Exception e) { + e.printStackTrace(); + return Stream.empty(); + } + }, + query -> { + return redmineClient.getTotalTickets(user, soloAbiertos); + } + ); } private ComponentRenderer createStatusRender() { @@ -161,7 +294,7 @@ public class ActDiariaView extends VerticalLayout { }); } - public ComponentRenderer buttonTicketComponentRenderer() { + /*public ComponentRenderer buttonTicketComponentRenderer() { return new ComponentRenderer<>(ticket -> { Button button = new Button(new Icon(VaadinIcon.EDIT) ); button.getStyle().set("color", "#A02142"); @@ -178,7 +311,7 @@ public class ActDiariaView extends VerticalLayout { }); return button; }); - } + }*/ public void cerrarTicket(Ticket ticket, RedmineUser user) { try { diff --git a/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java b/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java index a2b404e..b837d38 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java @@ -54,28 +54,23 @@ import mx.gob.jumapacelaya.services.SecurityService; @CssImport("./themes/sistema-mantenimiento/styles.css") public class DetallesMantView extends VerticalLayout implements BeforeEnterObserver { - private H3 id; - private VerticalLayout mainLayout; - private HorizontalLayout headerLayout; - private HorizontalLayout layout2; - private HorizontalLayout layout3; - private HorizontalLayout botonesLayout; + private final H3 id; private HorizontalLayout fechasLayout; private TextField txtId; - private TextField txtEquipo; - private ComboBox cbTipo; - private TextField txtFecha; - private TextField txtFechaProgramada; - private TextField txtSituacion; - private ComboBox cbUsuario; - private ComboBox cbDepartamento; - private GridPro gridHardware; - private GridPro gridActualizaciones; - private Button btnEditar; - private Button btnEditarFirmas; - private Button btnImprimirRepo; - private Button btnCancelar; - private Button btnGuardar; + private final TextField txtEquipo; + private final ComboBox cbTipo; + private final TextField txtFecha; + private final TextField txtFechaProgramada; + private final TextField txtSituacion; + private final ComboBox cbUsuario; + private final ComboBox cbDepartamento; + private final GridPro gridHardware; + private final GridPro gridActualizaciones; + private final Button btnEditar; + private final Button btnEditarFirmas; + private final Button btnImprimirRepo; + private final Button btnCancelar; + private final Button btnGuardar; private int planAnualIdActual; private int mantenimientoIdActual; private Dialog confirmDialog; @@ -91,29 +86,25 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser private VerticalLayout smtSignLayout; private VerticalLayout gciaSignLayout; - private final SecurityService securityService; private final DatabaseService service; - private final ReportService reportService; public DetallesMantView(SecurityService securityService, DatabaseService service, ReportService reportService) { this.service = service; - this.securityService = securityService; - this.reportService = reportService; setPadding(true); - mainLayout = new VerticalLayout(); + VerticalLayout mainLayout = new VerticalLayout(); mainLayout.setHeightFull(); mainLayout.getStyle() - .set("box-shadow","0 4px 8px rgba(0,0,0,0.2)") - .set("border-radius", "12px") - .set("background-color", "white") - .set("padding", "1rem") - .set("margin", "1rem auto"); + .set("box-shadow","0 4px 8px rgba(0,0,0,0.2)") + .set("border-radius", "12px") + .set("background-color", "white") + .set("padding", "1rem") + .set("margin", "1rem auto"); id = new H3(); - headerLayout = new HorizontalLayout(); + HorizontalLayout headerLayout = new HorizontalLayout(); headerLayout.setWidthFull(); headerLayout.add(id); @@ -129,7 +120,7 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser cbDepartamento.setItems(service.getDepartamentos()); cbDepartamento.setItemLabelGenerator(DepartamentosModel::getNombre); - layout2 = new HorizontalLayout(); + HorizontalLayout layout2 = new HorizontalLayout(); layout2.setWidthFull(); txtEquipo = new TextField("Equipo:"); txtEquipo.setReadOnly(true); @@ -147,7 +138,7 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser txtSituacion.setReadOnly(true); fechasLayout.add(txtFechaProgramada,txtFecha,txtSituacion); - layout3 = new HorizontalLayout(); + HorizontalLayout layout3 = new HorizontalLayout(); layout3.setWidthFull(); cbUsuario.setReadOnly(true); cbDepartamento.setReadOnly(true); @@ -159,22 +150,22 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser // Grid que muestra los detalles del hardware gridHardware = new GridPro<>(); gridHardware.addColumn(item -> item.getDescripcion()) - .setHeader("Descripción"); + .setHeader("Descripción"); gridHardware.addEditColumn(HardwareDetalle::getNumSerie) - .text((item, newValue) -> item.setNumSerie(newValue)) - .setHeader("No. Serie") - .setEditorComponent(new TextField()); + .text((item, newValue) -> item.setNumSerie(newValue)) + .setHeader("No. Serie") + .setEditorComponent(new TextField()); gridHardware.addEditColumn(HardwareDetalle::getModelo) - .text((item, newValue) -> item.setModelo(newValue)) - .setHeader("Modelo") - .setEditorComponent(new TextField()); + .text((item, newValue) -> item.setModelo(newValue)) + .setHeader("Modelo") + .setEditorComponent(new TextField()); gridHardware.addEditColumn(HardwareDetalle::getPlaca) - .text((item, newValue) -> item.setPlaca(newValue)) - .setHeader("Placa") - .setEditorComponent(new TextField()); + .text((item, newValue) -> item.setPlaca(newValue)) + .setHeader("Placa") + .setEditorComponent(new TextField()); gridHardware.setWidthFull(); gridHardware.setEditOnClick(false); @@ -186,14 +177,14 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser // Grid que muestra las actualizaciones de seguridad gridActualizaciones = new GridPro<>(); gridActualizaciones.addEditColumn(ActualizacioneSeguridadModel::getDescripcion) - .text((item, newValue) -> item.setDescripcion(newValue)) - .setHeader("Descripción") - .setEditorComponent(new TextField()); - + .text((item, newValue) -> item.setDescripcion(newValue)) + .setHeader("Descripción") + .setEditorComponent(new TextField()); + gridActualizaciones.addEditColumn(ActualizacioneSeguridadModel::getOtrasactualizaciones) - .text((item, newValue) -> item.setOtrasactualizaciones(newValue)) - .setHeader("Otras Actualizaciones") - .setEditorComponent(new TextField()); + .text((item, newValue) -> item.setOtrasactualizaciones(newValue)) + .setHeader("Otras Actualizaciones") + .setEditorComponent(new TextField()); gridActualizaciones.setWidthFull(); gridActualizaciones.setEditOnClick(false); @@ -201,8 +192,7 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser gridActualizaciones.addThemeVariants(GridVariant.LUMO_ROW_STRIPES); - - botonesLayout = new HorizontalLayout(); + HorizontalLayout botonesLayout = new HorizontalLayout(); botonesLayout.setWidthFull(); botonesLayout.setJustifyContentMode(JustifyContentMode.CENTER); btnEditar = new Button("Editar", new Icon(VaadinIcon.EDIT)); @@ -317,10 +307,10 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser txtJustificacion.setRequired(true); confirmDialog.add( - new VerticalLayout( - new Span("¿Estás seguro de que deseas actualizar el mantenimiento?"), - txtJustificacion - ) + new VerticalLayout( + new Span("¿Estás seguro de que deseas actualizar el mantenimiento?"), + txtJustificacion + ) ); Button btnConfirmar = new Button("Actualizar", event -> { @@ -371,7 +361,7 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser addSignatureSection(); - mainLayout.add(headerLayout,layout2,fechasLayout,layout3,gridHardware,gridActualizaciones,firmasLAyout,botonesLayout); + mainLayout.add(headerLayout, layout2,fechasLayout, layout3,gridHardware,gridActualizaciones,firmasLAyout, botonesLayout); add(mainLayout); } @@ -379,103 +369,103 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser private void realizarActualizacion() { boolean exito = true; - // Obtén los objetos seleccionados - TiposMantenimiento tipoSeleccionado = cbTipo.getValue(); - Usuario usuarioSeleccionado = cbUsuario.getValue(); - DepartamentosModel departamentoSeleccionado = cbDepartamento.getValue(); + // Obtén los objetos seleccionados + TiposMantenimiento tipoSeleccionado = cbTipo.getValue(); + Usuario usuarioSeleccionado = cbUsuario.getValue(); + DepartamentosModel departamentoSeleccionado = cbDepartamento.getValue(); - int tipoId = tipoSeleccionado != null ? Integer.parseInt(tipoSeleccionado.getTipomantId()) : 0; - int empleadoId = usuarioSeleccionado != null ? Integer.parseInt(usuarioSeleccionado.getEmpleadoId()) : 0; - String departamentoId = departamentoSeleccionado != null ? departamentoSeleccionado.getDepartamentoId() : null; + int tipoId = tipoSeleccionado != null ? Integer.parseInt(tipoSeleccionado.getTipomantId()) : 0; + int empleadoId = usuarioSeleccionado != null ? Integer.parseInt(usuarioSeleccionado.getEmpleadoId()) : 0; + String departamentoId = departamentoSeleccionado != null ? departamentoSeleccionado.getDepartamentoId() : null; - // Fechas (corrige el campo) - DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); - LocalDate fechaProg = !txtFechaProgramada.getValue().isEmpty() ? LocalDate.parse(txtFechaProgramada.getValue(), formatter) : null; - LocalDate fechaRealizado = !txtFecha.getValue().isEmpty() ? LocalDate.parse(txtFecha.getValue(), formatter) : null; + // Fechas (corrige el campo) + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + LocalDate fechaProg = !txtFechaProgramada.getValue().isEmpty() ? LocalDate.parse(txtFechaProgramada.getValue(), formatter) : null; + LocalDate fechaRealizado = !txtFecha.getValue().isEmpty() ? LocalDate.parse(txtFecha.getValue(), formatter) : null; - // Obtener las firmas como en MantenimientoView - byte[] userSignatureBytes = userSignPad.getImageBase64(); - byte[] smtSignatureBytes = smtSignPad.getImageBase64(); + // Obtener las firmas como en MantenimientoView + byte[] userSignatureBytes = userSignPad.getImageBase64(); + byte[] smtSignatureBytes = smtSignPad.getImageBase64(); - String userSignatureBase64 = (userSignatureBytes != null) ? Base64.getEncoder().encodeToString(userSignatureBytes) : null; - String smtSignatureBase64 = (smtSignatureBytes != null) ? Base64.getEncoder().encodeToString(smtSignatureBytes) : null; + String userSignatureBase64 = (userSignatureBytes != null) ? Base64.getEncoder().encodeToString(userSignatureBytes) : null; + String smtSignatureBase64 = (smtSignatureBytes != null) ? Base64.getEncoder().encodeToString(smtSignatureBytes) : null; - // Si la firma está vacía, conserva la anterior - if (userSignatureBase64 == null || esFirmaVacia(userSignatureBase64)) { - userSignatureBase64 = service.getDetalleMantenimientoPorPlanAnualId(planAnualIdActual).getFirmaUser(); - } - if (smtSignatureBase64 == null || esFirmaVacia(smtSignatureBase64)) { - smtSignatureBase64 = service.getDetalleMantenimientoPorPlanAnualId(planAnualIdActual).getFirmaSmt(); - } + // Si la firma está vacía, conserva la anterior + if (userSignatureBase64 == null || esFirmaVacia(userSignatureBase64)) { + userSignatureBase64 = service.getDetalleMantenimientoPorPlanAnualId(planAnualIdActual).getFirmaUser(); + } + if (smtSignatureBase64 == null || esFirmaVacia(smtSignatureBase64)) { + smtSignatureBase64 = service.getDetalleMantenimientoPorPlanAnualId(planAnualIdActual).getFirmaSmt(); + } - // ACTUALIZA PLANANUAL (nombre del equipo y fecha programada) - if (!service.actualizarPlanAnual(planAnualIdActual, txtEquipo.getValue())) { - exito = false; - } - // ACTUALIZA MANTENIMIENTOS (tipo, departamento, usuario, fecha realizado) - if (!service.actualizarMantenimiento( + // ACTUALIZA PLANANUAL (nombre del equipo y fecha programada) + if (!service.actualizarPlanAnual(planAnualIdActual, txtEquipo.getValue())) { + exito = false; + } + // ACTUALIZA MANTENIMIENTOS (tipo, departamento, usuario, fecha realizado) + if (!service.actualizarMantenimiento( mantenimientoIdActual, tipoId, departamentoId, empleadoId, fechaRealizado, txtEquipo.getValue(), - userSignatureBase64, - smtSignatureBase64 - )) { - exito = false; - } + userSignatureBase64, + smtSignatureBase64 + )) { + exito = false; + } - // ACTUALIZA HARDWARE (grid) - for (HardwareDetalle detalle : gridHardware.getListDataView().getItems().toList()) { - if (!service.actualizarHardwareDetalle(detalle)) { - exito = false; - } + // ACTUALIZA HARDWARE (grid) + for (HardwareDetalle detalle : gridHardware.getListDataView().getItems().toList()) { + if (!service.actualizarHardwareDetalle(detalle)) { + exito = false; } + } - // ACTUALIZA ACTUALIZACIONES DE SEGURIDAD (grid) - for (ActualizacioneSeguridadModel actualizacion : gridActualizaciones.getListDataView().getItems().toList()) { - if (!service.actualizarActualizacionSeg(actualizacion)) { - exito = false; - } + // ACTUALIZA ACTUALIZACIONES DE SEGURIDAD (grid) + for (ActualizacioneSeguridadModel actualizacion : gridActualizaciones.getListDataView().getItems().toList()) { + if (!service.actualizarActualizacionSeg(actualizacion)) { + exito = false; } + } - if (exito) { - Notification.show("Registros actualizados correctamente", 3000, Notification.Position.MIDDLE) + if (exito) { + Notification.show("Registros actualizados correctamente", 3000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_SUCCESS); - } else { - Notification.show("Error al actualizar uno o más registros", 3000, Notification.Position.MIDDLE) + } else { + Notification.show("Error al actualizar uno o más registros", 3000, Notification.Position.MIDDLE) .addThemeVariants(NotificationVariant.LUMO_ERROR); - } - // Opcional: volver a modo solo lectura - txtEquipo.setReadOnly(true); - cbTipo.setReadOnly(true); - txtFecha.setReadOnly(true); - cbUsuario.setReadOnly(true); - cbDepartamento.setReadOnly(true); - btnImprimirRepo.setVisible(true); - btnEditar.setVisible(true); - btnEditarFirmas.setVisible(true); - btnGuardar.setVisible(false); - btnCancelar.setVisible(false); - gridHardware.setEditOnClick(false); - gridHardware.getEditor().cancel(); - if (firmaUsuarioImg != null && userSignPad.getParent().isPresent()) { - userSignLayout.replace(userSignPad, firmaUsuarioImg); - } - if (firmaSmtImg != null && smtSignPad.getParent().isPresent()) { - smtSignLayout.replace(smtSignPad, firmaSmtImg); - } + } + // Opcional: volver a modo solo lectura + txtEquipo.setReadOnly(true); + cbTipo.setReadOnly(true); + txtFecha.setReadOnly(true); + cbUsuario.setReadOnly(true); + cbDepartamento.setReadOnly(true); + btnImprimirRepo.setVisible(true); + btnEditar.setVisible(true); + btnEditarFirmas.setVisible(true); + btnGuardar.setVisible(false); + btnCancelar.setVisible(false); + gridHardware.setEditOnClick(false); + gridHardware.getEditor().cancel(); + if (firmaUsuarioImg != null && userSignPad.getParent().isPresent()) { + userSignLayout.replace(userSignPad, firmaUsuarioImg); + } + if (firmaSmtImg != null && smtSignPad.getParent().isPresent()) { + smtSignLayout.replace(smtSignPad, firmaSmtImg); + } } // Metodo para verificar si la firma corresponde a una cadena de firma vacia private boolean esFirmaVacia(String firmaBase64) { - String firmaVacia = "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"; + String firmaVacia = "iVBORw0KGgoAAAANSUhEUgAAAdQAAAD8CAYAAADOr1WDAAAKOElEQVR4Xu3VsQ0AIAwEMbL/0IBYgStNTwrrpZt93/IIECBAgACBL4ER1C8/nwkQIECAwBMQVEMgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgAABQbUBAgQIECAQCAhqgOgEAQIECBAQVBsgQIAAAQKBgKAGiE4QIECAAAFBtQECBAgQIBAICGqA6AQBAgQIEBBUGyBAgAABAoGAoAaIThAgQIAAAUG1AQIECBAgEAgIaoDoBAECBAgQEFQbIECAAAECgYCgBohOECBAgACBA8Bc7Tp3N5/2AAAAAElFTkSuQmCC"; return firmaBase64.equals(firmaVacia); } @@ -534,9 +524,9 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser id.setText("Plan ID: " + idParam); txtEquipo.setValue(String.valueOf(detalle.getNombreEquipo())); cbTipo.setValue( - cbTipo.getListDataView().getItems() - .filter(t -> t.getNombre().equals(detalle.getTipo())) - .findFirst().orElse(null) + cbTipo.getListDataView().getItems() + .filter(t -> t.getNombre().equals(detalle.getTipo())) + .findFirst().orElse(null) ); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy"); @@ -548,14 +538,14 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser txtFecha.setValue(fechaReal); txtSituacion.setValue(situacion); cbUsuario.setValue( - cbUsuario.getListDataView().getItems() - .filter(u -> u.getNombre().equals(detalle.getUsuario())) - .findFirst().orElse(null) + cbUsuario.getListDataView().getItems() + .filter(u -> u.getNombre().equals(detalle.getUsuario())) + .findFirst().orElse(null) ); cbDepartamento.setValue( - cbDepartamento.getListDataView().getItems() - .filter(d -> d.getNombre().equals(detalle.getDepartamento())) - .findFirst().orElse(null) + cbDepartamento.getListDataView().getItems() + .filter(d -> d.getNombre().equals(detalle.getDepartamento())) + .findFirst().orElse(null) ); int mantId = detalle.getId(); List listaHardware = service.getHardwaredetallePorMantId(mantId); @@ -589,7 +579,7 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser firmaSmtImg.setWidthFull(); smtSignLayout.replace(smtSignPad, firmaSmtImg); } - + Image firmaGcia = new Image("images/FirmaGerenteTI.png", "Firma de la Gcia. de T.I"); firmaGcia.setHeight("200px"); firmaGcia.setWidthFull();