Erweiterungen
This commit is contained in:
@@ -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<User> 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() {
|
||||
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<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
|
||||
|
||||
Reference in New Issue
Block a user