From 2206bf234267e05d7f142c487b5981ab8621720a Mon Sep 17 00:00:00 2001 From: ricardo051199 Date: Sat, 23 Nov 2024 14:55:12 -0400 Subject: [PATCH] Descargar reporte general de vacaciones en excel. --- Reporte_Vacaciones.xlsx | Bin 0 -> 4181 bytes .../views/RequestsListView.java | 66 +++++++++++++++++- 2 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 Reporte_Vacaciones.xlsx diff --git a/Reporte_Vacaciones.xlsx b/Reporte_Vacaciones.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..8ce8134d9c64dbcc7b5e2998c2636aa3375c88d2 GIT binary patch literal 4181 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 H0KmThbjG&X literal 0 HcmV?d00001 diff --git a/src/main/java/com/primefactorsolutions/views/RequestsListView.java b/src/main/java/com/primefactorsolutions/views/RequestsListView.java index 864e0da..cb54b03 100644 --- a/src/main/java/com/primefactorsolutions/views/RequestsListView.java +++ b/src/main/java/com/primefactorsolutions/views/RequestsListView.java @@ -5,19 +5,33 @@ import com.primefactorsolutions.service.EmployeeService; import com.primefactorsolutions.service.TeamService; import com.primefactorsolutions.service.TimeOffRequestService; import com.primefactorsolutions.service.VacationService; +import com.vaadin.flow.component.UI; import com.vaadin.flow.component.button.Button; import com.vaadin.flow.component.combobox.ComboBox; +import com.vaadin.flow.component.dialog.Dialog; +import com.vaadin.flow.component.html.Anchor; +import com.vaadin.flow.component.html.Span; import com.vaadin.flow.component.notification.Notification; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.StreamRegistration; +import com.vaadin.flow.server.StreamResource; import com.vaadin.flow.spring.annotation.SpringComponent; import jakarta.annotation.security.PermitAll; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.context.annotation.Scope; import org.vaadin.firitin.components.grid.PagingGrid; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.time.DayOfWeek; import java.time.LocalDate; import java.time.Period; +import java.time.temporal.WeekFields; import java.util.*; import java.util.stream.Collectors; @@ -67,7 +81,6 @@ public class RequestsListView extends BaseView { hl.add(createEmployeeFilter()); hl.add(createTeamFilter()); hl.add(createStateFilter()); - getCurrentPageLayout().add(hl); } @@ -95,8 +108,9 @@ public class RequestsListView extends BaseView { Notification.show("Seleccione una solicitud.", 3000, Notification.Position.MIDDLE); } }); + Button downloadButton = new Button("Descargar reporte", event -> downloadReport()); Button closeButton = new Button("Salir", event -> navigateToMainView()); - return new HorizontalLayout(viewButton, closeButton); + return new HorizontalLayout(viewButton, downloadButton, closeButton); } private void refreshGeneralRequestGrid(final Employee employee, @@ -419,4 +433,52 @@ public class RequestsListView extends BaseView { private void navigateToTimeOffRequestView(final UUID idEmployee) { getUI().ifPresent(ui -> ui.navigate("requests/" + idEmployee.toString())); } + + private ByteArrayInputStream generateExcelReport(List employees) { + try (Workbook workbook = new XSSFWorkbook()) { + Sheet sheet = workbook.createSheet("Reporte Horas Trabajadas"); + Row headerRow = sheet.createRow(0); + + String[] headers = {"Nombre", "Equipo", "Estado", "Total Horas"}; + for (int i = 0; i < headers.length; i++) { + Cell cell = headerRow.createCell(i); + cell.setCellValue(headers[i]); + } + + int rowIndex = 1; + for (Employee employee : employees) { + Row row = sheet.createRow(rowIndex++); + row.createCell(0).setCellValue(getEmployeeFullName(employee)); + row.createCell(1).setCellValue(getTeamName(employee)); + row.createCell(2).setCellValue(getEmployeeStatus(employee)); + row.createCell(3).setCellValue(getGeneralTotal(employee)); + } + + try (ByteArrayOutputStream out = new ByteArrayOutputStream()) { + workbook.write(out); + return new ByteArrayInputStream(out.toByteArray()); + } + } catch (IOException e) { + throw new UncheckedIOException("Error al generar el archivo Excel", e); + } + } + + private StreamResource generateGeneralVacationReport() { + List employees = employeeService.findAllEmployees(); + + ByteArrayInputStream excelStream = generateExcelReport(employees); + + return new StreamResource("reporte_general_de_vacaciones_" + LocalDate.now() + ".xlsx", + () -> excelStream); + } + + private void downloadReport() { + StreamResource resource = generateGeneralVacationReport(); + getUI().ifPresent(ui -> openDocumentStream(resource, ui)); + } + + private void openDocumentStream(final StreamResource resource, final UI ui) { + StreamRegistration registration = ui.getSession().getResourceRegistry().registerResource(resource); + ui.getPage().open(registration.getResourceUri().toString()); + } } \ No newline at end of file