From b52519979cddd6b389c1808657855177a86a1f08 Mon Sep 17 00:00:00 2001 From: Dennis Eckerskorn Date: Wed, 28 May 2025 23:44:56 +0200 Subject: [PATCH] Added better invoice generation --- .../finance_service/InvoicePdfGenerator.java | 67 ++++++++++++++++--- 1 file changed, 56 insertions(+), 11 deletions(-) diff --git a/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java b/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java index 02dbeda..cb4fcd8 100644 --- a/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java +++ b/memberflow-api/src/main/java/com/denniseckerskorn/services/finance_service/InvoicePdfGenerator.java @@ -1,6 +1,9 @@ package com.denniseckerskorn.services.finance_service; import com.denniseckerskorn.entities.finance.Invoice; +import com.denniseckerskorn.entities.finance.InvoiceLine; +import com.denniseckerskorn.entities.finance.ProductService; +import com.denniseckerskorn.entities.user_managment.users.Student; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.layout.Document; @@ -8,6 +11,7 @@ import com.itextpdf.layout.element.Paragraph; import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; +import java.math.BigDecimal; @Service public class InvoicePdfGenerator { @@ -19,24 +23,65 @@ public class InvoicePdfGenerator { PdfDocument pdf = new PdfDocument(writer); Document doc = new Document(pdf); - doc.add(new Paragraph("Factura #" + invoice.getId())); + // Cabecera + doc.add(new Paragraph("FACTURA #" + invoice.getId()).setFontSize(16).setBold()); doc.add(new Paragraph("Fecha: " + invoice.getDate())); - doc.add(new Paragraph("Cliente: " + invoice.getUser().getName() + " " + invoice.getUser().getSurname())); doc.add(new Paragraph("Estado: " + invoice.getStatus())); + doc.add(new Paragraph(" ")); + + // Información del cliente + var user = invoice.getUser(); + doc.add(new Paragraph("Cliente: " + user.getName() + " " + user.getSurname())); + doc.add(new Paragraph("Email: " + user.getEmail())); + doc.add(new Paragraph("Teléfono: " + user.getPhoneNumber())); + doc.add(new Paragraph("Dirección: " + user.getAddress())); + + // Si es estudiante, mostrar info básica (sin tutor ni cinturón) + Student student = user.getStudent(); + if (student != null) { + doc.add(new Paragraph("DNI: " + student.getDni())); + doc.add(new Paragraph("Fecha de nacimiento: " + student.getBirthdate())); + } doc.add(new Paragraph(" ")); - doc.add(new Paragraph("Detalle de productos:")); - invoice.getInvoiceLines().forEach(line -> { - String product = line.getProductService().getName(); - int qty = line.getQuantity(); - var price = line.getUnitPrice(); - var total = line.getSubtotal(); - doc.add(new Paragraph("- " + product + " x" + qty + " - " + price + " € = " + total + " €")); - }); + // Detalle de productos + doc.add(new Paragraph("Detalle de productos:").setBold()); + doc.add(new Paragraph("Producto | Cant. | Precio | IVA % | Subtotal (sin IVA) | IVA")); + + BigDecimal totalSubtotal = BigDecimal.ZERO; + BigDecimal totalIVA = BigDecimal.ZERO; + + for (InvoiceLine line : invoice.getInvoiceLines()) { + ProductService product = line.getProductService(); + String nombre = product.getName(); + int cantidad = line.getQuantity(); + BigDecimal unitPrice = line.getUnitPrice(); // sin IVA + BigDecimal subtotalSinIVA = unitPrice.multiply(BigDecimal.valueOf(cantidad)); + BigDecimal porcentajeIVA = product.getIvaType().getPercentage(); + BigDecimal iva = subtotalSinIVA.multiply(porcentajeIVA).divide(BigDecimal.valueOf(100)); + + totalSubtotal = totalSubtotal.add(subtotalSinIVA); + totalIVA = totalIVA.add(iva); + + doc.add(new Paragraph( + nombre + " | " + + cantidad + " | " + + unitPrice + " € | " + + porcentajeIVA + "% | " + + subtotalSinIVA + " € | " + + iva + " €" + )); + } + + // Totales + doc.add(new Paragraph(" ")); + doc.add(new Paragraph("Subtotal (sin IVA): " + totalSubtotal + " €").setBold()); + doc.add(new Paragraph("IVA total: " + totalIVA + " €").setBold()); + doc.add(new Paragraph("TOTAL: " + totalSubtotal.add(totalIVA) + " €").setFontSize(14).setBold()); doc.add(new Paragraph(" ")); - doc.add(new Paragraph("TOTAL: " + invoice.getTotal() + " €")); + doc.add(new Paragraph("Gracias por su compra.").setItalic()); doc.close(); return out.toByteArray();