From 1445c23c0b5de110cb0ba7985d4e60f40deff307 Mon Sep 17 00:00:00 2001 From: Sven Carstensen Date: Tue, 10 Mar 2026 11:59:28 +0100 Subject: [PATCH] fix: refine invoice visibility in jobs and invoices --- .../votianlt/pages/view/InvoicesView.java | 5 ++++ .../votianlt/pages/view/ShowJobsView.java | 27 ++++++++++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/src/main/java/de/assecutor/votianlt/pages/view/InvoicesView.java b/src/main/java/de/assecutor/votianlt/pages/view/InvoicesView.java index 405bdf1..e1968aa 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/InvoicesView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/InvoicesView.java @@ -75,6 +75,7 @@ public class InvoicesView extends VerticalLayout implements HasDynamicTitle { private void loadInvoices() { String currentUserId = securityService.getCurrentUserId().toHexString(); List invoices = customerInvoiceRepository.findByUserId(currentUserId).stream() + .filter(this::hasPdfData) .sorted((left, right) -> { if (left.getInvoiceDate() == null && right.getInvoiceDate() == null) { return 0; @@ -120,6 +121,10 @@ public class InvoicesView extends VerticalLayout implements HasDynamicTitle { } } + private boolean hasPdfData(CustomerInvoice invoice) { + return invoice != null && invoice.getPdfData() != null && invoice.getPdfData().length > 0; + } + private String getRecipientLabel(CustomerInvoice invoice) { return firstNonBlank(invoice.getRecipientCompany(), invoice.getRecipientName(), ""); } diff --git a/src/main/java/de/assecutor/votianlt/pages/view/ShowJobsView.java b/src/main/java/de/assecutor/votianlt/pages/view/ShowJobsView.java index a9aadbe..3fa1015 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/ShowJobsView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/ShowJobsView.java @@ -138,9 +138,9 @@ public class ShowJobsView extends VerticalLayout implements HasDynamicTitle { // Invoice column - only show for completed jobs grid.addComponentColumn(job -> { if (job.getStatus() == JobStatus.COMPLETED) { - Button invoiceBtn = new Button(new Icon(VaadinIcon.DOLLAR)); - invoiceBtn.addThemeVariants(ButtonVariant.LUMO_TERTIARY, ButtonVariant.LUMO_SUCCESS); - if (job.getInvoiceId() != null) { + if (hasInvoice(job)) { + Button invoiceBtn = new Button(new Icon(VaadinIcon.FILE_TEXT_O)); + invoiceBtn.addThemeVariants(ButtonVariant.LUMO_TERTIARY); invoiceBtn.setTooltipText(getTranslation("jobs.tooltip.showinvoice")); invoiceBtn.addClickListener(e -> { e.getSource().getElement().getNode(); @@ -153,14 +153,17 @@ public class ShowJobsView extends VerticalLayout implements HasDynamicTitle { } }, () -> getUI().ifPresent(ui -> ui.navigate("create_invoice/" + job.getId().toHexString()))); }); - } else { - invoiceBtn.setTooltipText(getTranslation("jobs.tooltip.createinvoice")); - invoiceBtn.addClickListener(e -> { - e.getSource().getElement().getNode(); - getUI().ifPresent(ui -> ui.navigate("create_invoice/" + job.getId().toHexString())); - }); + return invoiceBtn; } - return invoiceBtn; + + Button createInvoiceBtn = new Button(new Icon(VaadinIcon.DOLLAR)); + createInvoiceBtn.addThemeVariants(ButtonVariant.LUMO_TERTIARY, ButtonVariant.LUMO_SUCCESS); + createInvoiceBtn.setTooltipText(getTranslation("jobs.tooltip.createinvoice")); + createInvoiceBtn.addClickListener(e -> { + e.getSource().getElement().getNode(); + getUI().ifPresent(ui -> ui.navigate("create_invoice/" + job.getId().toHexString())); + }); + return createInvoiceBtn; } return new com.vaadin.flow.component.html.Span(); }).setHeader("").setWidth("60px").setFlexGrow(0); @@ -357,6 +360,10 @@ public class ShowJobsView extends VerticalLayout implements HasDynamicTitle { return value; } + private boolean hasInvoice(Job job) { + return job.getInvoiceId() != null && !job.getInvoiceId().isBlank(); + } + private String extractCompanyName(String customerSelection) { if (customerSelection == null || customerSelection.isBlank()) { return "";