Erweiterungen

This commit is contained in:
2025-09-23 10:57:06 +02:00
parent 1a5ea5d47a
commit d636c9e9d0

View File

@@ -17,7 +17,11 @@ import com.vaadin.flow.component.UI;
import com.vaadin.flow.component.textfield.EmailField; import com.vaadin.flow.component.textfield.EmailField;
import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.component.textfield.TextField;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Base64; import java.util.Base64;
import java.util.List;
import com.vaadin.flow.component.textfield.TextArea; import com.vaadin.flow.component.textfield.TextArea;
import com.vaadin.flow.component.tabs.TabSheet; import com.vaadin.flow.component.tabs.TabSheet;
@@ -28,9 +32,12 @@ import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route; import com.vaadin.flow.router.Route;
import de.assecutor.votianlt.model.User; import de.assecutor.votianlt.model.User;
import de.assecutor.votianlt.model.UserInvoiceData; 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.UserService;
import de.assecutor.votianlt.pages.service.UserInvoiceDataService; import de.assecutor.votianlt.pages.service.UserInvoiceDataService;
import de.assecutor.votianlt.security.SecurityService; import de.assecutor.votianlt.security.SecurityService;
import de.assecutor.votianlt.service.CustomerInvoiceService;
import jakarta.annotation.security.RolesAllowed; import jakarta.annotation.security.RolesAllowed;
@PageTitle("Profil bearbeiten") @PageTitle("Profil bearbeiten")
@@ -50,11 +57,14 @@ public class EditProfileView extends HorizontalLayout {
private final Binder<User> binder = new Binder<>(User.class); private final Binder<User> binder = new Binder<>(User.class);
private final User currentUser; private final User currentUser;
private final UserInvoiceDataService userInvoiceDataService; private final UserInvoiceDataService userInvoiceDataService;
private final CustomerInvoiceService customerInvoiceService;
private UserInvoiceData currentInvoiceData; private UserInvoiceData currentInvoiceData;
private Checkbox billingEnabled; 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.userInvoiceDataService = userInvoiceDataService;
this.customerInvoiceService = customerInvoiceService;
this.currentUser = securityService.getCurrentDatabaseUser(); this.currentUser = securityService.getCurrentDatabaseUser();
setSizeFull(); setSizeFull();
setPadding(true); setPadding(true);
@@ -443,28 +453,121 @@ public class EditProfileView extends HorizontalLayout {
} }
private void refreshPdf() { private void refreshPdf() {
try {
byte[] bytes = generatePreviewPdf(); byte[] bytes = generatePreviewPdf();
if (bytes != null && bytes.length > 0) {
String dataUrl = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(bytes) String dataUrl = "data:application/pdf;base64," + Base64.getEncoder().encodeToString(bytes)
+ "#toolbar=0&navpanes=0&statusbar=0&view=Fit&zoom=page-fit"; + "#toolbar=0&navpanes=0&statusbar=0&view=Fit&zoom=page-fit";
if (pdfFrame != null) { if (pdfFrame != null) {
pdfFrame.setSrc(dataUrl); 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() { private byte[] generatePreviewPdf() {
StringBuilder content = new StringBuilder(); try {
content.append("RECHNUNGSVORSCHAU\n\n"); // Create CustomerInvoiceData with user's billing information
content.append("Rechnungs Präfix: ").append(safe(prefixField)).append("\n"); CustomerInvoiceData invoiceData = new CustomerInvoiceData();
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");
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<CustomerInvoiceItem> 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 // Utility: safe getter für TextField/TextArea