diff --git a/backend/src/main/java/com/printcalculator/controller/DevEmailTestController.java b/backend/src/main/java/com/printcalculator/controller/DevEmailTestController.java index e60726d..7ae62a7 100644 --- a/backend/src/main/java/com/printcalculator/controller/DevEmailTestController.java +++ b/backend/src/main/java/com/printcalculator/controller/DevEmailTestController.java @@ -29,8 +29,11 @@ public class DevEmailTestController { public ResponseEntity testTemplate() { Context context = new Context(); Map templateData = new HashMap<>(); + UUID orderId = UUID.randomUUID(); templateData.put("customerName", "Mario Rossi"); - templateData.put("orderId", UUID.randomUUID()); + templateData.put("orderId", orderId); + templateData.put("orderNumber", orderId.toString().split("-")[0]); + templateData.put("orderDetailsUrl", "https://tuosito.it/ordine/" + orderId); templateData.put("orderDate", OffsetDateTime.now().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))); templateData.put("totalCost", "45.50"); diff --git a/backend/src/main/java/com/printcalculator/controller/OrderController.java b/backend/src/main/java/com/printcalculator/controller/OrderController.java index 272b41b..3bfc8a9 100644 --- a/backend/src/main/java/com/printcalculator/controller/OrderController.java +++ b/backend/src/main/java/com/printcalculator/controller/OrderController.java @@ -135,7 +135,7 @@ public class OrderController { vars.put("sellerAddressLine2", "Sede Bienne, Svizzera"); vars.put("sellerEmail", "info@3dfab.ch"); - vars.put("invoiceNumber", "INV-" + order.getId().toString().substring(0, 8).toUpperCase()); + vars.put("invoiceNumber", "INV-" + getDisplayOrderNumber(order).toUpperCase()); vars.put("invoiceDate", order.getCreatedAt().format(DateTimeFormatter.ISO_LOCAL_DATE)); vars.put("dueDate", order.getCreatedAt().plusDays(7).format(DateTimeFormatter.ISO_LOCAL_DATE)); @@ -187,7 +187,7 @@ public class OrderController { byte[] pdf = invoiceService.generateInvoicePdfBytesFromTemplate(vars, qrBillSvg); return ResponseEntity.ok() - .header("Content-Disposition", "attachment; filename=\"invoice-" + orderId + ".pdf\"") + .header("Content-Disposition", "attachment; filename=\"invoice-" + getDisplayOrderNumber(order) + ".pdf\"") .contentType(MediaType.APPLICATION_PDF) .body(pdf); } @@ -249,6 +249,7 @@ public class OrderController { private OrderDto convertToDto(Order order, List items) { OrderDto dto = new OrderDto(); dto.setId(order.getId()); + dto.setOrderNumber(getDisplayOrderNumber(order)); dto.setStatus(order.getStatus()); dto.setCustomerEmail(order.getCustomerEmail()); dto.setCustomerPhone(order.getCustomerPhone()); @@ -306,4 +307,12 @@ public class OrderController { return dto; } + private String getDisplayOrderNumber(Order order) { + String orderNumber = order.getOrderNumber(); + if (orderNumber != null && !orderNumber.isBlank()) { + return orderNumber; + } + return order.getId() != null ? order.getId().toString() : "unknown"; + } + } diff --git a/backend/src/main/java/com/printcalculator/dto/OrderDto.java b/backend/src/main/java/com/printcalculator/dto/OrderDto.java index 982d9c3..eee6ef0 100644 --- a/backend/src/main/java/com/printcalculator/dto/OrderDto.java +++ b/backend/src/main/java/com/printcalculator/dto/OrderDto.java @@ -7,6 +7,7 @@ import java.util.UUID; public class OrderDto { private UUID id; + private String orderNumber; private String status; private String customerEmail; private String customerPhone; @@ -27,6 +28,9 @@ public class OrderDto { public UUID getId() { return id; } public void setId(UUID id) { this.id = id; } + public String getOrderNumber() { return orderNumber; } + public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } + public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } diff --git a/backend/src/main/java/com/printcalculator/entity/Order.java b/backend/src/main/java/com/printcalculator/entity/Order.java index 9ca1ea6..1c59d6c 100644 --- a/backend/src/main/java/com/printcalculator/entity/Order.java +++ b/backend/src/main/java/com/printcalculator/entity/Order.java @@ -138,6 +138,16 @@ public class Order { this.id = id; } + @Transient + public String getOrderNumber() { + if (id == null) { + return null; + } + String rawId = id.toString(); + int dashIndex = rawId.indexOf('-'); + return dashIndex > 0 ? rawId.substring(0, dashIndex) : rawId; + } + public QuoteSession getSourceQuoteSession() { return sourceQuoteSession; } @@ -410,4 +420,4 @@ public class Order { this.paidAt = paidAt; } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/printcalculator/event/listener/OrderEmailListener.java b/backend/src/main/java/com/printcalculator/event/listener/OrderEmailListener.java index 18b95cc..d600847 100644 --- a/backend/src/main/java/com/printcalculator/event/listener/OrderEmailListener.java +++ b/backend/src/main/java/com/printcalculator/event/listener/OrderEmailListener.java @@ -27,6 +27,9 @@ public class OrderEmailListener { @Value("${app.mail.admin.address:}") private String adminMailAddress; + @Value("${app.frontend.base-url:http://localhost:4200}") + private String frontendBaseUrl; + @Async @EventListener public void handleOrderCreatedEvent(OrderCreatedEvent event) { @@ -48,12 +51,14 @@ public class OrderEmailListener { Map templateData = new HashMap<>(); templateData.put("customerName", order.getCustomer().getFirstName()); templateData.put("orderId", order.getId()); + templateData.put("orderNumber", getDisplayOrderNumber(order)); + templateData.put("orderDetailsUrl", buildOrderDetailsUrl(order)); templateData.put("orderDate", order.getCreatedAt().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))); templateData.put("totalCost", String.format("%.2f", order.getTotalChf())); emailNotificationService.sendEmail( order.getCustomer().getEmail(), - "Conferma Ordine #" + order.getId() + " - 3D-Fab", + "Conferma Ordine #" + getDisplayOrderNumber(order) + " - 3D-Fab", "order-confirmation", templateData ); @@ -63,15 +68,30 @@ public class OrderEmailListener { Map templateData = new HashMap<>(); templateData.put("customerName", order.getCustomer().getFirstName() + " " + order.getCustomer().getLastName()); templateData.put("orderId", order.getId()); + templateData.put("orderNumber", getDisplayOrderNumber(order)); + templateData.put("orderDetailsUrl", buildOrderDetailsUrl(order)); templateData.put("orderDate", order.getCreatedAt().format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm"))); templateData.put("totalCost", String.format("%.2f", order.getTotalChf())); // Possiamo riutilizzare lo stesso template per ora o crearne uno ad-hoc in futuro emailNotificationService.sendEmail( adminMailAddress, - "Nuovo Ordine Ricevuto #" + order.getId() + " - " + order.getCustomer().getLastName(), + "Nuovo Ordine Ricevuto #" + getDisplayOrderNumber(order) + " - " + order.getCustomer().getLastName(), "order-confirmation", templateData ); } + + private String getDisplayOrderNumber(Order order) { + String orderNumber = order.getOrderNumber(); + if (orderNumber != null && !orderNumber.isBlank()) { + return orderNumber; + } + return order.getId() != null ? order.getId().toString() : "unknown"; + } + + private String buildOrderDetailsUrl(Order order) { + String baseUrl = frontendBaseUrl == null ? "" : frontendBaseUrl.replaceAll("/+$", ""); + return baseUrl + "/ordine/" + order.getId(); + } } diff --git a/backend/src/main/java/com/printcalculator/service/OrderService.java b/backend/src/main/java/com/printcalculator/service/OrderService.java index 569269a..ad965af 100644 --- a/backend/src/main/java/com/printcalculator/service/OrderService.java +++ b/backend/src/main/java/com/printcalculator/service/OrderService.java @@ -231,7 +231,7 @@ public class OrderService { vars.put("sellerAddressLine2", "Sede Bienne, Svizzera"); vars.put("sellerEmail", "info@3dfab.ch"); - vars.put("invoiceNumber", "INV-" + order.getId().toString().substring(0, 8).toUpperCase()); + vars.put("invoiceNumber", "INV-" + getDisplayOrderNumber(order).toUpperCase()); vars.put("invoiceDate", order.getCreatedAt().format(DateTimeFormatter.ISO_LOCAL_DATE)); vars.put("dueDate", order.getCreatedAt().plusDays(7).format(DateTimeFormatter.ISO_LOCAL_DATE)); @@ -305,4 +305,12 @@ public class OrderService { } return "stl"; } + + private String getDisplayOrderNumber(Order order) { + String orderNumber = order.getOrderNumber(); + if (orderNumber != null && !orderNumber.isBlank()) { + return orderNumber; + } + return order.getId() != null ? order.getId().toString() : "unknown"; + } } diff --git a/backend/src/main/java/com/printcalculator/service/QrBillService.java b/backend/src/main/java/com/printcalculator/service/QrBillService.java index 093739f..430e193 100644 --- a/backend/src/main/java/com/printcalculator/service/QrBillService.java +++ b/backend/src/main/java/com/printcalculator/service/QrBillService.java @@ -51,7 +51,8 @@ public class QrBillService { // Reference // bill.setReference(QRBill.createCreditorReference("...")); // If using QRR - bill.setUnstructuredMessage("Order " + order.getId()); + String orderRef = order.getOrderNumber() != null ? order.getOrderNumber() : order.getId().toString(); + bill.setUnstructuredMessage("Order " + orderRef); return bill; } diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 810d11e..ddaa42e 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -39,3 +39,4 @@ spring.mail.properties.mail.smtp.starttls.enable=${MAIL_SMTP_STARTTLS:false} app.mail.from=${APP_MAIL_FROM:${MAIL_USERNAME:noreply@printcalculator.local}} app.mail.admin.enabled=${APP_MAIL_ADMIN_ENABLED:true} app.mail.admin.address=${APP_MAIL_ADMIN_ADDRESS:admin@printcalculator.local} +app.frontend.base-url=${APP_FRONTEND_BASE_URL:http://localhost:4200} diff --git a/backend/src/main/resources/templates/email/order-confirmation.html b/backend/src/main/resources/templates/email/order-confirmation.html index fb75eea..708accf 100644 --- a/backend/src/main/resources/templates/email/order-confirmation.html +++ b/backend/src/main/resources/templates/email/order-confirmation.html @@ -55,7 +55,7 @@
-

Grazie per il tuo ordine!

+

Grazie per il tuo ordine #00000000

Ciao Cliente,

@@ -65,7 +65,7 @@ - + @@ -78,6 +78,11 @@
Numero Ordine:#000000000000
Data:
+

+ Clicca qui per i dettagli: + https://tuosito.it/ordine/00000000-0000-0000-0000-000000000000 +

+

Se hai domande o dubbi, non esitare a contattarci.