feat(back-end front-end): integration with twint
This commit is contained in:
@@ -212,15 +212,16 @@ public class OrderController {
|
||||
|
||||
@GetMapping("/{orderId}/twint")
|
||||
public ResponseEntity<Map<String, String>> getTwintPayment(@PathVariable UUID orderId) {
|
||||
if (!orderRepo.existsById(orderId)) {
|
||||
Order order = orderRepo.findById(orderId).orElse(null);
|
||||
if (order == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
byte[] qrPng = twintPaymentService.generateQrPng(360);
|
||||
byte[] qrPng = twintPaymentService.generateQrPng(order, 360);
|
||||
String qrDataUri = "data:image/png;base64," + Base64.getEncoder().encodeToString(qrPng);
|
||||
|
||||
Map<String, String> data = new HashMap<>();
|
||||
data.put("paymentUrl", twintPaymentService.getTwintPaymentUrl());
|
||||
data.put("paymentUrl", twintPaymentService.getTwintPaymentUrl(order));
|
||||
data.put("openUrl", "/api/orders/" + orderId + "/twint/open");
|
||||
data.put("qrImageUrl", "/api/orders/" + orderId + "/twint/qr");
|
||||
data.put("qrImageDataUri", qrDataUri);
|
||||
@@ -229,12 +230,13 @@ public class OrderController {
|
||||
|
||||
@GetMapping("/{orderId}/twint/open")
|
||||
public ResponseEntity<Void> openTwintPayment(@PathVariable UUID orderId) {
|
||||
if (!orderRepo.existsById(orderId)) {
|
||||
Order order = orderRepo.findById(orderId).orElse(null);
|
||||
if (order == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
return ResponseEntity.status(302)
|
||||
.location(URI.create(twintPaymentService.getTwintPaymentUrl()))
|
||||
.location(URI.create(twintPaymentService.getTwintPaymentUrl(order)))
|
||||
.build();
|
||||
}
|
||||
|
||||
@@ -243,12 +245,13 @@ public class OrderController {
|
||||
@PathVariable UUID orderId,
|
||||
@RequestParam(defaultValue = "320") int size
|
||||
) {
|
||||
if (!orderRepo.existsById(orderId)) {
|
||||
Order order = orderRepo.findById(orderId).orElse(null);
|
||||
if (order == null) {
|
||||
return ResponseEntity.notFound().build();
|
||||
}
|
||||
|
||||
int normalizedSize = Math.max(200, Math.min(size, 600));
|
||||
byte[] png = twintPaymentService.generateQrPng(normalizedSize);
|
||||
byte[] png = twintPaymentService.generateQrPng(order, normalizedSize);
|
||||
|
||||
return ResponseEntity.ok()
|
||||
.contentType(MediaType.IMAGE_PNG)
|
||||
|
||||
@@ -71,7 +71,7 @@ public class QuoteSessionController {
|
||||
session.setPricingVersion("v1");
|
||||
// Default material/settings will be set when items are added or updated?
|
||||
// For now set safe defaults
|
||||
session.setMaterialCode("pla_basic");
|
||||
session.setMaterialCode("PLA");
|
||||
session.setSupportsEnabled(false);
|
||||
session.setCreatedAt(OffsetDateTime.now());
|
||||
session.setExpiresAt(OffsetDateTime.now().plusDays(30));
|
||||
@@ -125,6 +125,15 @@ public class QuoteSessionController {
|
||||
// Apply Basic/Advanced Logic
|
||||
applyPrintSettings(settings);
|
||||
|
||||
// Update session global settings from the most recent item added
|
||||
session.setMaterialCode(settings.getMaterial());
|
||||
session.setNozzleDiameterMm(BigDecimal.valueOf(settings.getNozzleDiameter() != null ? settings.getNozzleDiameter() : 0.4));
|
||||
session.setLayerHeightMm(BigDecimal.valueOf(settings.getLayerHeight() != null ? settings.getLayerHeight() : 0.2));
|
||||
session.setInfillPattern(settings.getInfillPattern());
|
||||
session.setInfillPercent(settings.getInfillDensity() != null ? settings.getInfillDensity().intValue() : 20);
|
||||
session.setSupportsEnabled(settings.getSupportsEnabled() != null ? settings.getSupportsEnabled() : false);
|
||||
sessionRepo.save(session);
|
||||
|
||||
// REAL SLICING
|
||||
// 1. Pick Machine (default to first active or specific)
|
||||
PrinterMachine machine = machineRepo.findFirstByIsActiveTrue()
|
||||
|
||||
@@ -15,6 +15,7 @@ public class PrintSettingsDto {
|
||||
private String quality; // "draft", "standard", "high"
|
||||
|
||||
// Advanced Mode (Optional in Basic)
|
||||
private Double nozzleDiameter;
|
||||
private Double layerHeight;
|
||||
private Double infillDensity;
|
||||
private String infillPattern;
|
||||
|
||||
@@ -21,14 +21,37 @@ public class TwintPaymentService {
|
||||
this.twintPaymentUrl = twintPaymentUrl;
|
||||
}
|
||||
|
||||
public String getTwintPaymentUrl() {
|
||||
return twintPaymentUrl;
|
||||
public String getTwintPaymentUrl(com.printcalculator.entity.Order order) {
|
||||
StringBuilder urlBuilder = new StringBuilder(twintPaymentUrl);
|
||||
|
||||
if (order != null) {
|
||||
if (order.getTotalChf() != null) {
|
||||
urlBuilder.append("&amount=").append(order.getTotalChf().toPlainString());
|
||||
}
|
||||
|
||||
String orderNumber = order.getOrderNumber();
|
||||
if (orderNumber == null && order.getId() != null) {
|
||||
orderNumber = order.getId().toString();
|
||||
}
|
||||
|
||||
if (orderNumber != null) {
|
||||
try {
|
||||
urlBuilder.append("&trxInfo=").append(order.getId());
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return urlBuilder.toString();
|
||||
}
|
||||
|
||||
public byte[] generateQrPng(int sizePx) {
|
||||
public byte[] generateQrPng(com.printcalculator.entity.Order order, int sizePx) {
|
||||
try {
|
||||
String url = getTwintPaymentUrl(order);
|
||||
// Use High Error Correction for financial QR codes
|
||||
QrCode qrCode = QrCode.encodeText(twintPaymentUrl, QrCode.Ecc.HIGH);
|
||||
QrCode qrCode = QrCode.encodeText(url, QrCode.Ecc.HIGH);
|
||||
|
||||
// Standard QR quiet zone is 4 modules
|
||||
int borderModules = 4;
|
||||
|
||||
@@ -31,7 +31,7 @@ payment.twint.url=${TWINT_PAYMENT_URL:https://go.twint.ch/1/e/tw?tw=acq.gERQQytO
|
||||
spring.mail.host=${MAIL_HOST:mail.infomaniak.com}
|
||||
spring.mail.port=${MAIL_PORT:587}
|
||||
spring.mail.username=${MAIL_USERNAME:info@3d-fab.ch}
|
||||
spring.mail.password=${MAIL_PASSWORD:ht*44k+Tq39R+R-O}
|
||||
spring.mail.password=${MAIL_PASSWORD:}
|
||||
spring.mail.properties.mail.smtp.auth=${MAIL_SMTP_AUTH:false}
|
||||
spring.mail.properties.mail.smtp.starttls.enable=${MAIL_SMTP_STARTTLS:false}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user