Browse Source

Se arreglo el error al dejar las firmas en blanco durante la edicion de estas

main
mramirezg 3 months ago
parent
commit
7d4084c23e
4 changed files with 434 additions and 240 deletions
  1. +67
    -32
      src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java
  2. +67
    -31
      src/main/java/mx/gob/jumapacelaya/models/Ticket.java
  3. +174
    -41
      src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java
  4. +126
    -136
      src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java

+ 67
- 32
src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java View File

@ -34,47 +34,57 @@ public class RedmineClient {
}
//AQUI OBTENGO LOS TICKETS DESDE REDMINE
public List<Ticket> getTickets(RedmineUser user, boolean includeClosed) {
public List<Ticket> getTickets(RedmineUser user, boolean includeClosed, int offset, int limit) {
List<Ticket> 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<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
if (response.statusCode() == 200) {
String responseBody = response.body();
List<Ticket> 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<String> 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<String> 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<Ticket> getTicketsAuthor(RedmineUser user, boolean includeClosed) {
/*public List<Ticket> getTicketsAuthor(RedmineUser user, boolean includeClosed) {
List<Ticket> 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'");


+ 67
- 31
src/main/java/mx/gob/jumapacelaya/models/Ticket.java View File

@ -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";
}


+ 174
- 41
src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java View File

@ -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<Ticket> 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<String> columns = List.of("tipo","tiempoEst","asunto","autor","estado","fechaCreacion","fechaCierre","fechaActualizacion","duracion");
CheckboxGroup<String> 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<String> 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<Ticket> tickets = redmineClient.getTickets(userService.getRedmineUser(), true);
List<Ticket> 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<Ticket> 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<Span, Ticket> createStatusRender() {
@ -161,7 +294,7 @@ public class ActDiariaView extends VerticalLayout {
});
}
public ComponentRenderer<Button, Ticket> buttonTicketComponentRenderer() {
/*public ComponentRenderer<Button, Ticket> 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 {


+ 126
- 136
src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java View File

@ -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<TiposMantenimiento> cbTipo;
private TextField txtFecha;
private TextField txtFechaProgramada;
private TextField txtSituacion;
private ComboBox<Usuario> cbUsuario;
private ComboBox<DepartamentosModel> cbDepartamento;
private GridPro<HardwareDetalle> gridHardware;
private GridPro<ActualizacioneSeguridadModel> gridActualizaciones;
private Button btnEditar;
private Button btnEditarFirmas;
private Button btnImprimirRepo;
private Button btnCancelar;
private Button btnGuardar;
private final TextField txtEquipo;
private final ComboBox<TiposMantenimiento> cbTipo;
private final TextField txtFecha;
private final TextField txtFechaProgramada;
private final TextField txtSituacion;
private final ComboBox<Usuario> cbUsuario;
private final ComboBox<DepartamentosModel> cbDepartamento;
private final GridPro<HardwareDetalle> gridHardware;
private final GridPro<ActualizacioneSeguridadModel> 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<HardwareDetalle> 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();


Loading…
Cancel
Save