diff --git a/src/main/java/de/assecutor/votianlt/pages/view/EditProfileView.java b/src/main/java/de/assecutor/votianlt/pages/view/EditProfileView.java index ff52ab2..e1c856d 100644 --- a/src/main/java/de/assecutor/votianlt/pages/view/EditProfileView.java +++ b/src/main/java/de/assecutor/votianlt/pages/view/EditProfileView.java @@ -17,7 +17,11 @@ import com.vaadin.flow.component.UI; import com.vaadin.flow.component.textfield.EmailField; import com.vaadin.flow.component.textfield.TextField; import java.io.ByteArrayOutputStream; +import java.math.BigDecimal; +import java.time.LocalDate; +import java.util.ArrayList; import java.util.Base64; +import java.util.List; import com.vaadin.flow.component.textfield.TextArea; import com.vaadin.flow.component.tabs.TabSheet; @@ -28,9 +32,12 @@ import com.vaadin.flow.router.PageTitle; import com.vaadin.flow.router.Route; import de.assecutor.votianlt.model.User; import de.assecutor.votianlt.model.UserInvoiceData; +import de.assecutor.votianlt.model.invoices.CustomerInvoiceData; +import de.assecutor.votianlt.model.invoices.CustomerInvoiceItem; import de.assecutor.votianlt.pages.service.UserService; import de.assecutor.votianlt.pages.service.UserInvoiceDataService; import de.assecutor.votianlt.security.SecurityService; +import de.assecutor.votianlt.service.CustomerInvoiceService; import jakarta.annotation.security.RolesAllowed; @PageTitle("Profil bearbeiten") @@ -50,11 +57,14 @@ public class EditProfileView extends HorizontalLayout { private final Binder binder = new Binder<>(User.class); private final User currentUser; private final UserInvoiceDataService userInvoiceDataService; + private final CustomerInvoiceService customerInvoiceService; private UserInvoiceData currentInvoiceData; private Checkbox billingEnabled; - public EditProfileView(UserService userService, UserInvoiceDataService userInvoiceDataService, SecurityService securityService) { + public EditProfileView(UserService userService, UserInvoiceDataService userInvoiceDataService, + CustomerInvoiceService customerInvoiceService, SecurityService securityService) { this.userInvoiceDataService = userInvoiceDataService; + this.customerInvoiceService = customerInvoiceService; this.currentUser = securityService.getCurrentDatabaseUser(); setSizeFull(); setPadding(true); @@ -443,28 +453,121 @@ public class EditProfileView extends HorizontalLayout { } private void refreshPdf() { - byte[] bytes = generatePreviewPdf(); - String dataUrl = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(bytes) - + "#toolbar=0&navpanes=0&statusbar=0&view=Fit&zoom=page-fit"; - if (pdfFrame != null) { - pdfFrame.setSrc(dataUrl); + try { + byte[] bytes = generatePreviewPdf(); + if (bytes != null && bytes.length > 0) { + String dataUrl = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(bytes) + + "#toolbar=0&navpanes=0&statusbar=0&view=Fit&zoom=page-fit"; + if (pdfFrame != null) { + pdfFrame.setSrc(dataUrl); + } + } + } catch (Exception e) { + // Log error or show notification + Notification.show("Fehler bei PDF-Generierung: " + e.getMessage(), 3000, Notification.Position.BOTTOM_END); } } - // Einfache Text-Vorschau generieren (PDF-Funktionalität entfernt) private byte[] generatePreviewPdf() { - StringBuilder content = new StringBuilder(); - content.append("RECHNUNGSVORSCHAU\n\n"); - content.append("Rechnungs Präfix: ").append(safe(prefixField)).append("\n"); - content.append("USt-IdNr.: ").append(safe(ustIdField)).append("\n"); - content.append("Steuernummer: ").append(safe(taxNumberField)).append("\n"); - content.append("Bankname: ").append(safe(bankNameField)).append("\n"); - content.append("IBAN: ").append(safe(ibanField)).append("\n"); - content.append("Steuersatz: ").append(safe(taxRateField)).append("\n\n"); - content.append("Einleitungstext:\n").append(safe(introTextArea)).append("\n\n"); - content.append("Zahlungsbedingungen:\n").append(safe(termsTextArea)).append("\n"); + try { + // Create CustomerInvoiceData with user's billing information + CustomerInvoiceData invoiceData = new CustomerInvoiceData(); - return content.toString().getBytes(java.nio.charset.StandardCharsets.UTF_8); + // Set invoice details + String invoiceNumber = safe(prefixField) + "-" + System.currentTimeMillis(); + invoiceData.setInvoiceNumber(invoiceNumber); + invoiceData.setInvoiceDate(LocalDate.now()); + invoiceData.setDeliveryDate(LocalDate.now()); + invoiceData.setDescription(safe(introTextArea)); + + // Set sender details from user profile and invoice settings + String companyName = safe(currentUser.getCompany()); + if (companyName.isEmpty()) { + companyName = safe(currentUser.getFirstname()) + " " + safe(currentUser.getName()); + } + invoiceData.setSenderName(companyName); + invoiceData.setSenderAddress(safe(currentUser.getStreet()) + " " + safe(currentUser.getHouseNumber())); + invoiceData.setSenderPostcode(safe(currentUser.getZip())); + invoiceData.setSenderCity(safe(currentUser.getCity())); + invoiceData.setSenderCountry("Deutschland"); + invoiceData.setSenderTaxNumber(safe(taxNumberField)); + invoiceData.setSenderVatId(safe(ustIdField)); + invoiceData.setSenderPhone(safe(currentUser.getPhone())); + invoiceData.setSenderEmail(safe(currentUser.getEmail())); + invoiceData.setSenderWebsite(""); + + // Set recipient details (example data for preview) + invoiceData.setRecipientName("Max Mustermann"); + invoiceData.setRecipientCompany("Musterfirma GmbH"); + invoiceData.setRecipientAddress("Beispielstraße 123"); + invoiceData.setRecipientPostcode("12345"); + invoiceData.setRecipientCity("Beispielstadt"); + invoiceData.setRecipientCountry("Deutschland"); + invoiceData.setRecipientVatId("DE123456789"); + + // Create sample invoice items for preview + List items = new ArrayList<>(); + BigDecimal vatRate = parseVatRate(safe(taxRateField)); + + CustomerInvoiceItem item1 = new CustomerInvoiceItem( + new BigDecimal("1"), "Stk.", "Beispiel-Dienstleistung 1", + new BigDecimal("100.00"), vatRate); + CustomerInvoiceItem item2 = new CustomerInvoiceItem( + new BigDecimal("2"), "Std.", "Beispiel-Dienstleistung 2", + new BigDecimal("50.00"), vatRate); + + items.add(item1); + items.add(item2); + invoiceData.setItems(items); + + // Calculate amounts + BigDecimal netAmount = items.stream() + .map(CustomerInvoiceItem::getNetTotal) + .reduce(BigDecimal.ZERO, BigDecimal::add); + BigDecimal vatAmount = netAmount.multiply(vatRate); + BigDecimal totalAmount = netAmount.add(vatAmount); + + invoiceData.setNetAmount(netAmount); + invoiceData.setVatRate(vatRate); + invoiceData.setVatAmount(vatAmount); + invoiceData.setTotalAmount(totalAmount); + + // Set payment details + invoiceData.setPaymentTerms(safe(termsTextArea)); + invoiceData.setPaymentDueDate(LocalDate.now().plusDays(14)); + invoiceData.setBankAccount(safe(bankNameField)); + invoiceData.setIban(safe(ibanField)); + invoiceData.setBic(""); + + // Legal notes + invoiceData.setLegalNotes(""); + + // Generate PDF using CustomerInvoiceService + return customerInvoiceService.generateCustomerInvoicePdf(invoiceData); + + } catch (Exception e) { + e.printStackTrace(); + // Return empty PDF on error + return new byte[0]; + } + } + + private BigDecimal parseVatRate(String taxRateStr) { + try { + if (taxRateStr == null || taxRateStr.isEmpty()) { + return new BigDecimal("0.19"); // Default 19% + } + // Remove % sign if present and convert to decimal + taxRateStr = taxRateStr.replace("%", "").trim(); + BigDecimal rate = new BigDecimal(taxRateStr); + // If value is greater than 1, assume it's a percentage and convert + if (rate.compareTo(BigDecimal.ONE) > 0) { + rate = rate.divide(new BigDecimal("100")); + } + return rate; + } catch (Exception e) { + return new BigDecimal("0.19"); // Default 19% on error + } } // Utility: safe getter für TextField/TextArea