diff --git a/src/main/java/de/assecutor/votianlt/pages/base/ui/view/AdminLayout.java b/src/main/java/de/assecutor/votianlt/pages/base/ui/view/AdminLayout.java index 1e15bb1..9d4f2ee 100644 --- a/src/main/java/de/assecutor/votianlt/pages/base/ui/view/AdminLayout.java +++ b/src/main/java/de/assecutor/votianlt/pages/base/ui/view/AdminLayout.java @@ -77,14 +77,16 @@ public final class AdminLayout extends AppLayout { // Only admin-specific menu items SideNavItem dashboard = new SideNavItem("Dashboard", "admin-dashboard", new Icon(VaadinIcon.DASHBOARD)); - SideNavItem systemSettings = new SideNavItem("Systemeinstellungen", "admin-settings", new Icon(VaadinIcon.COG)); - SideNavItem userManagement = new SideNavItem("Benutzerverwaltung", "admin-users", new Icon(VaadinIcon.USERS)); - SideNavItem systemLogs = new SideNavItem("System-Logs", "admin-logs", new Icon(VaadinIcon.FILE_TEXT)); + SideNavItem pdfTest = new SideNavItem("PDF Test", "pdf-test", new Icon(VaadinIcon.FILE_TEXT_O)); + //SideNavItem systemSettings = new SideNavItem("Systemeinstellungen", "admin-settings", new Icon(VaadinIcon.COG)); + //SideNavItem userManagement = new SideNavItem("Benutzerverwaltung", "admin-users", new Icon(VaadinIcon.USERS)); + //SideNavItem systemLogs = new SideNavItem("System-Logs", "admin-logs", new Icon(VaadinIcon.FILE_TEXT)); nav.addItem(dashboard); - nav.addItem(systemSettings); - nav.addItem(userManagement); - nav.addItem(systemLogs); + nav.addItem(pdfTest); + //nav.addItem(systemSettings); + //nav.addItem(userManagement); + //nav.addItem(systemLogs); // Create a vertical layout to hold menu items VerticalLayout navContainer = new VerticalLayout(); diff --git a/src/main/java/de/assecutor/votianlt/pages/view/PdfTestView.java b/src/main/java/de/assecutor/votianlt/pages/view/PdfTestView.java new file mode 100644 index 0000000..b6d8ab7 --- /dev/null +++ b/src/main/java/de/assecutor/votianlt/pages/view/PdfTestView.java @@ -0,0 +1,211 @@ +package de.assecutor.votianlt.pages.view; + +import com.vaadin.flow.component.button.Button; +import com.vaadin.flow.component.button.ButtonVariant; +import com.vaadin.flow.component.html.Anchor; +import com.vaadin.flow.component.html.Div; +import com.vaadin.flow.component.html.H1; +import com.vaadin.flow.component.html.H3; +import com.vaadin.flow.component.html.Main; +import com.vaadin.flow.component.html.Paragraph; +import com.vaadin.flow.component.icon.VaadinIcon; +import com.vaadin.flow.component.notification.Notification; +import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.router.Menu; +import com.vaadin.flow.router.PageTitle; +import com.vaadin.flow.router.Route; +import com.vaadin.flow.server.StreamResource; +import com.vaadin.flow.theme.lumo.LumoUtility; +import de.assecutor.votianlt.model.InvoiceData; +import de.assecutor.votianlt.service.InvoicePdfGenerator; +import jakarta.annotation.security.RolesAllowed; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.ByteArrayInputStream; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.Arrays; + +@Route(value = "pdf-test", layout = de.assecutor.votianlt.pages.base.ui.view.AdminLayout.class) +@PageTitle("PDF Test") +@RolesAllowed("ADMIN") +@Menu(order = 2, icon = "lumo:edit") +@Slf4j +public class PdfTestView extends Main { + + private final InvoicePdfGenerator invoicePdfGenerator; + private final VerticalLayout contentLayout; + + @Autowired + public PdfTestView(InvoicePdfGenerator invoicePdfGenerator) { + this.invoicePdfGenerator = invoicePdfGenerator; + + setSizeFull(); + addClassNames(LumoUtility.BoxSizing.BORDER, LumoUtility.Display.FLEX, + LumoUtility.FlexDirection.COLUMN, LumoUtility.Padding.MEDIUM); + + // Header + H1 title = new H1("PDF Test"); + title.addClassNames(LumoUtility.Margin.Bottom.MEDIUM, LumoUtility.Margin.Top.NONE); + + Paragraph description = new Paragraph( + "Hier können Sie den InvoicePdfGenerator mit Testdaten testen. " + + "Klicken Sie auf 'PDF generieren', um eine Test-Rechnung zu erstellen." + ); + + // Generate PDF button + Button generateButton = new Button("PDF generieren", VaadinIcon.FILE_TEXT_O.create()); + generateButton.addThemeVariants(ButtonVariant.LUMO_PRIMARY); + generateButton.addClickListener(e -> generateTestPdf()); + + // Content layout for results + contentLayout = new VerticalLayout(); + contentLayout.setPadding(false); + contentLayout.setSpacing(true); + + add(title, description, generateButton, contentLayout); + } + + private void generateTestPdf() { + try { + log.info("Generating test PDF with InvoicePdfGenerator"); + + // Create test invoice data + InvoiceData testData = createTestInvoiceData(); + + // Generate PDF + byte[] pdfBytes = invoicePdfGenerator.generateInvoicePdf(testData); + + // Clear previous content + contentLayout.removeAll(); + + // Create download link + StreamResource resource = new StreamResource("test-rechnung.pdf", + () -> new ByteArrayInputStream(pdfBytes)); + resource.setContentType("application/pdf"); + + Anchor downloadLink = new Anchor(resource, ""); + downloadLink.getElement().setAttribute("download", true); + downloadLink.add(new Button("PDF herunterladen", VaadinIcon.DOWNLOAD.create())); + + // Success message + H3 successTitle = new H3("PDF erfolgreich generiert!"); + successTitle.addClassName(LumoUtility.TextColor.SUCCESS); + + Paragraph info = new Paragraph( + String.format("PDF-Größe: %d KB", pdfBytes.length / 1024) + ); + + // PDF preview container + Div pdfContainer = new Div(); + pdfContainer.addClassName(LumoUtility.Background.CONTRAST_5); + pdfContainer.getStyle() + .set("border-radius", "8px") + .set("padding", "1rem") + .set("margin-top", "1rem"); + + // Embed PDF for preview + String pdfDataUrl = "data:application/pdf;base64," + + java.util.Base64.getEncoder().encodeToString(pdfBytes); + + pdfContainer.getElement().setProperty("innerHTML", + ""); + + contentLayout.add(successTitle, info, downloadLink, pdfContainer); + + Notification.show("PDF erfolgreich generiert!", 3000, Notification.Position.BOTTOM_CENTER); + + } catch (Exception e) { + log.error("Error generating test PDF", e); + + contentLayout.removeAll(); + + H3 errorTitle = new H3("Fehler beim Generieren des PDFs"); + errorTitle.addClassName(LumoUtility.TextColor.ERROR); + + Paragraph errorMsg = new Paragraph("Fehler: " + e.getMessage()); + + contentLayout.add(errorTitle, errorMsg); + + Notification.show("Fehler beim PDF-Generieren: " + e.getMessage(), + 5000, Notification.Position.BOTTOM_CENTER); + } + } + + private InvoiceData createTestInvoiceData() { + InvoiceData data = new InvoiceData(); + + // Invoice details + data.setInvoiceNumber("TEST-2024-001"); + data.setInvoiceDate(LocalDate.now()); + data.setDueDate(LocalDate.now().plusDays(14)); + + // Company information + data.setCompanyName("VotianLT Logistics GmbH"); + data.setCompanyStreet("Musterstraße"); + data.setCompanyHouseNumber("123"); + data.setCompanyZip("12345"); + data.setCompanyCity("Berlin"); + data.setCompanyPhone("+49 30 12345678"); + data.setCompanyEmail("info@votianlt.de"); + data.setCompanyWebsite("www.votianlt.de"); + + // Tax information + data.setTaxNumber("12/345/67890"); + data.setVatId("DE123456789"); + data.setCommercialRegister("HRB 12345 B"); + data.setManagingDirector("Max Mustermann"); + + // Bank details + data.setBankName("Deutsche Bank AG"); + data.setIban("DE89 3704 0044 0532 0130 00"); + data.setBic("COBADEFFXXX"); + + // Customer information + data.setCustomerName("Musterkunde GmbH"); + data.setCustomerStreet("Kundenstraße"); + data.setCustomerHouseNumber("456"); + data.setCustomerZip("54321"); + data.setCustomerCity("Hamburg"); + data.setCustomerCountry("Deutschland"); + + // Invoice items + data.setItems(Arrays.asList( + new InvoiceData.InvoiceItem( + "Transport Hamburg - Berlin", + new BigDecimal("1"), + "Stück", + new BigDecimal("250.00"), + new BigDecimal("19") + ), + new InvoiceData.InvoiceItem( + "Zusätzliche Wartezeit", + new BigDecimal("2.5"), + "Stunden", + new BigDecimal("45.00"), + new BigDecimal("19") + ), + new InvoiceData.InvoiceItem( + "Verpackungsmaterial", + new BigDecimal("5"), + "Stück", + new BigDecimal("12.50"), + new BigDecimal("19") + ), + new InvoiceData.InvoiceItem( + "Expressaufschlag", + new BigDecimal("1"), + "Stück", + new BigDecimal("75.00"), + new BigDecimal("19") + ) + )); + + // VAT rate + data.setVatRate(new BigDecimal("19.0")); + + return data; + } +} \ No newline at end of file