diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java index 3f1a18c..a3ed7a5 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -78,15 +78,18 @@ public class RedmineClient { //AQUI OBTENGO LOS TICKETS DESDE REDMINE - public List getTicketsAuthor(RedmineUser user) { + public List getTicketsAuthor(RedmineUser user, boolean includeClosed) { 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"; + while (true) { HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + "&author_id=" + user.getId() + "&offset=" + offset)) + .uri(URI.create(REDMINE_URL + "/issues.json?key=" + user.getKey() + "&author_id=" + user.getId() + statusFilter + "&offset=" + offset)) .header("Content-Type", "application/json") .build(); @@ -306,4 +309,33 @@ public class RedmineClient { //user.setKey(userJson.get("key").getAsString()); return user; } + + + /*Este metodo sirve para actualizar el estatus de los tickets + en este caso se actualiza al estatus TERMINADO */ + public void closeTicket(int ticketId, RedmineUser user) throws IOException, InterruptedException { + int closedStatusId = 9; //este es el ID del estado TERMINADO, se debe poner el id a segĂșn corresponda + + Map payload = new HashMap<>(); + Map issue = new HashMap<>(); + issue.put("status_id", closedStatusId); + payload.put("issue", issue); + String jsonPayload = GSON.toJson(payload); + + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(REDMINE_URL + "/issues/" + ticketId + ".json?key=" + user.getKey())) + .header("Content-Type", "application/json") + .PUT(HttpRequest.BodyPublishers.ofString(jsonPayload)) + .build(); + + HttpClient client = HttpClient.newHttpClient(); + HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); + if (response.statusCode() == 204) { + String responseBody = response.body(); + System.out.println("Ticket " + ticketId + " cerrado correctamente."); + } else { + System.err.println("Error al cerrar el ticket: " + response.statusCode()); + System.err.println(response.body()); + } + } } diff --git a/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java b/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java index c063503..2406568 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/ActDiariaView.java @@ -1,5 +1,6 @@ package mx.gob.jumapacelaya.ui; +import com.vaadin.flow.component.UI; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.dependency.CssImport; import com.vaadin.flow.component.grid.Grid; @@ -7,6 +8,7 @@ import com.vaadin.flow.component.grid.GridVariant; import com.vaadin.flow.component.html.H3; import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.notification.Notification; +import com.vaadin.flow.component.notification.NotificationVariant; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; import com.vaadin.flow.data.renderer.ComponentRenderer; @@ -16,13 +18,16 @@ import jakarta.annotation.security.PermitAll; import mx.gob.jumapacelaya.api.RedmineClient; import mx.gob.jumapacelaya.api.ServerProperties; import mx.gob.jumapacelaya.models.ActividadDiaria; +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 java.io.IOException; import java.text.SimpleDateFormat; import java.time.LocalDate; +import java.time.format.DateTimeFormatter; import java.util.*; @@ -67,7 +72,12 @@ public class ActDiariaView extends VerticalLayout { grid.addColumn(ticket -> { LocalDate fechaCierre = ticket.getDateClose(); - return fechaCierre != null ? fechaCierre.toString() : ""; + if (fechaCierre != null) { + DateTimeFormatter formatterClose = DateTimeFormatter.ofPattern("dd/MM/yyyy"); + return fechaCierre.format(formatterClose); + } else { + return ""; + } }).setHeader("Fecha cierre").setAutoWidth(true); grid.addColumn(ticket -> ticket.tiempoEst(ticket.getTrackerId())).setHeader("Tiempo estimado de atencion").setAutoWidth(false); @@ -94,7 +104,7 @@ public class ActDiariaView extends VerticalLayout { private void loadTickets() { try { - List tickets = redmineClient.getTicketsAuthor(userService.getRedmineUser()); + List tickets = redmineClient.getTicketsAuthor(userService.getRedmineUser(), true); List filteredTickets = tickets.stream() .filter(ticket -> ticket.getTrackerId() == 17 || ticket.getTrackerId() == 16) .toList(); @@ -131,10 +141,29 @@ public class ActDiariaView extends VerticalLayout { return new ComponentRenderer<>(ticket -> { Button button = new Button("Realizar"); button.addClickListener(e -> { - Notification.show("Accion para ticket: " + ticket.getId()); + RedmineUser currentUser = userService.getRedmineUser(); + + if (ticket.getTrackerId() == 16) { + UI.getCurrent().navigate("mantenimiento"); + } else if (ticket.getTrackerId() == 17) { + cerrarTicket(ticket, currentUser); + } else { + Notification.show("El ticket no es de tipo Mantenimiento o Actividad."); + } }); return button; }); } + public void cerrarTicket(Ticket ticket, RedmineUser user) { + try { + //Llamar al metodo para cambiar el estado del ticket + redmineClient.closeTicket(ticket.getId(), user); + Notification.show("El ticket " + ticket.getId() + " se ha cerrado exitosamente.", 3000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_WARNING); + } catch (IOException | InterruptedException e) { + e.printStackTrace(); + Notification.show("Error al cerrar el ticket " + ticket.getId()); + } + } }