diff --git a/pom.xml b/pom.xml index e9d29a8..3e8e00d 100644 --- a/pom.xml +++ b/pom.xml @@ -178,6 +178,11 @@ 7.0.3 + + com.google.code.gson + gson + + diff --git a/src/main/bundles/prod.bundle b/src/main/bundles/prod.bundle index 2a14c7c..b3a8225 100644 Binary files a/src/main/bundles/prod.bundle and b/src/main/bundles/prod.bundle differ diff --git a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java index 6d57e34..cf24a25 100644 --- a/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java +++ b/src/main/java/mx/gob/jumapacelaya/api/RedmineClient.java @@ -1,9 +1,6 @@ package mx.gob.jumapacelaya.api; -import com.nimbusds.jose.shaded.gson.*; -import com.vaadin.flow.component.button.Button; -import com.vaadin.flow.component.notification.Notification; -import com.vaadin.flow.data.renderer.ComponentRenderer; +import com.google.gson.*; import mx.gob.jumapacelaya.models.RedmineUser; import mx.gob.jumapacelaya.models.Ticket; import org.springframework.beans.factory.annotation.Value; diff --git a/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java b/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java index 9d26f53..5bb8c8d 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/DetallesMantView.java @@ -283,7 +283,7 @@ public class DetallesMantView extends VerticalLayout implements BeforeEnterObser // Se crea el recurso para descarga StreamResource resource = new StreamResource("reporte.pdf", () -> new ByteArrayInputStream(pdf)); Anchor downloadLink = new Anchor(resource, "Descargar Reporte"); - downloadLink.getElement().setAttribute("download", true); + downloadLink.setTarget("_blank"); downloadLink.setId("descargar-reporte-link"); add(downloadLink); diff --git a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java index ad2aa6d..fec2ed8 100644 --- a/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java +++ b/src/main/java/mx/gob/jumapacelaya/ui/PlanAnualView.java @@ -6,15 +6,14 @@ 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.grid.HeaderRow; import com.vaadin.flow.component.grid.dataview.GridListDataView; -import com.vaadin.flow.component.html.Div; -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.html.*; import com.vaadin.flow.component.icon.Icon; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.notification.Notification; @@ -31,9 +30,13 @@ import com.vaadin.flow.data.value.ValueChangeMode; import com.vaadin.flow.function.ValueProvider; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.StreamResource; import jakarta.annotation.security.PermitAll; import mx.gob.jumapacelaya.models.PlanAnual; import mx.gob.jumapacelaya.services.DatabaseService; +import mx.gob.jumapacelaya.services.ReportService; +import net.sf.jasperreports.engine.JasperFillManager; +import net.sf.jasperreports.engine.JasperPrint; import org.apache.commons.lang3.StringUtils; import org.apache.poi.ss.usermodel.*; import org.springframework.core.env.Environment; @@ -41,6 +44,7 @@ import org.vaadin.lineawesome.LineAwesomeIcon; import java.io.*; import java.lang.reflect.Array; +import java.sql.Date; import java.time.LocalDate; import java.time.Year; import java.time.format.DateTimeFormatter; @@ -54,6 +58,7 @@ import java.util.function.Consumer; public class PlanAnualView extends VerticalLayout { private final Environment env; + private final ReportService reportService; H4 titulo = new H4(); H5 titulo1 = new H5(); @@ -65,10 +70,14 @@ public class PlanAnualView extends VerticalLayout { private final DatabaseService databaseService; Grid planAnualGrid; Button btnColumns; + Button btnImprimirRpt; + HorizontalLayout btnImprimirLayout; - public PlanAnualView(DatabaseService databaseService, Environment env) { + public PlanAnualView(DatabaseService databaseService, Environment env, ReportService reportService) { this.databaseService = databaseService; this.env = env; + this.reportService = reportService; + setupHeader(); Grid planAnualGrid = setupGrid(); @@ -154,7 +163,7 @@ public class PlanAnualView extends VerticalLayout { btnInsertar = new Button("Insertar archivo", event -> insertarDatos()); btnInsertar.setVisible(false); - gridLayout.add(btnColumns,planAnualGrid); + gridLayout.add(btnImprimirLayout,planAnualGrid); gridLayout.setSizeFull(); uploadLayout.add(upload, btnInsertar); @@ -309,6 +318,12 @@ public class PlanAnualView extends VerticalLayout { btnColumns = new Button(VaadinIcon.GRID_H.create()); btnColumns.addThemeVariants(ButtonVariant.LUMO_ICON); btnColumns.setAriaLabel("Show/Hide Columns"); + btnColumns.setTooltipText("Show/Hide Columns"); + + btnImprimirRpt = new Button(VaadinIcon.PRINT.create()); + btnImprimirRpt.addClickListener(event -> sacarReporte()); + btnImprimirRpt.setTooltipText("Imprimir reporte"); + btnImprimirLayout = new HorizontalLayout(btnColumns, btnImprimirRpt); HorizontalLayout columnSelectorLayout = new HorizontalLayout(); columnSelectorLayout.setAlignItems(Alignment.END); @@ -519,4 +534,78 @@ public class PlanAnualView extends VerticalLayout { gridLayout.setVisible(hasItems); uploadLayout.setVisible(!hasItems); } + + + private void sacarReporte() { + Dialog dialog = new Dialog(); + dialog.setHeaderTitle("Seleccione la fecha de inicio y fin"); + + DatePicker.DatePickerI18n i18n = new DatePicker.DatePickerI18n() + .setWeekdays(List.of("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sabado")) + .setWeekdaysShort(List.of("Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb")) + .setMonthNames(List.of("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre")) + .setFirstDayOfWeek(1) + .setToday("Hoy") + .setCancel("Cancelar") + .setDateFormat("dd/MM/yyyy"); + + DatePicker fechaInicio = new DatePicker("Fecha de inicio:"); + fechaInicio.setRequired(true); + fechaInicio.setI18n(i18n); + + DatePicker fechaFin = new DatePicker("Fecha de fin:"); + fechaFin.setRequired(true); + fechaFin.setI18n(i18n); + + + Button btnGenerar = new Button("Generar", VaadinIcon.PRINT.create()); + btnGenerar.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + btnGenerar.addClickListener(e -> { + if (fechaInicio.getValue() == null || fechaFin.getValue() == null) { + Notification.show("Por favor, seleccione ambas fechas.", 3000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_ERROR); + return; + } + + LocalDate inicio = fechaInicio.getValue(); + LocalDate fin = fechaFin.getValue(); + + + try { + // Prepara los parámetros para el reporte + Map parametros = new HashMap<>(); + parametros.put("FECHAINICIO", java.sql.Date.valueOf(inicio)); + parametros.put("FECHAFIN", java.sql.Date.valueOf(fin)); + + // Genera el PDF + byte[] pdf = reportService.generarReporte("mantenimientoFechas", parametros); + + // Creando el recurso de descarga + StreamResource resource = new StreamResource("reporte.pdf", () -> new ByteArrayInputStream(pdf)); + Anchor downloadLink = new Anchor(resource, "Descargar Reporte"); + downloadLink.setTarget("_blank"); + downloadLink.setId("descargar-reporte-link"); + add(downloadLink); + + getUI().ifPresent(ui -> + ui.getPage().executeJs("document.getElementById('descargar-reporte-link').click();") + ); + + + } catch (Exception ex) { + Notification.show("Error al genrar el reporte: " + ex.getMessage(), 5000, Notification.Position.MIDDLE) + .addThemeVariants(NotificationVariant.LUMO_ERROR); + ex.printStackTrace(); + } + }); + + Button btnCancelar = new Button("Cancelar", VaadinIcon.CLOSE_CIRCLE.create(), e -> dialog.close()); + dialog.getFooter().add(btnCancelar); + dialog.getFooter().add(btnGenerar); + + HorizontalLayout fechasLayout = new HorizontalLayout(fechaInicio, fechaFin); + dialog.add(fechasLayout); + + dialog.open(); + } } diff --git a/src/main/resources/META-INF/resources/reportes/mantenimientoFechas.jasper b/src/main/resources/META-INF/resources/reportes/mantenimientoFechas.jasper new file mode 100644 index 0000000..ce2edb7 Binary files /dev/null and b/src/main/resources/META-INF/resources/reportes/mantenimientoFechas.jasper differ