diff --git a/src/main/java/com/zenfulcode/commercify/commercify/api/requests/orders/CreateOrderRequest.java b/src/main/java/com/zenfulcode/commercify/commercify/api/requests/orders/CreateOrderRequest.java index 6e1f493..73a8a95 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/api/requests/orders/CreateOrderRequest.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/api/requests/orders/CreateOrderRequest.java @@ -9,6 +9,7 @@ public record CreateOrderRequest( String currency, CustomerDetailsDTO customerDetails, List orderLines, + Double shippingCost, AddressDTO shippingAddress, AddressDTO billingAddress ) { diff --git a/src/main/java/com/zenfulcode/commercify/commercify/api/responses/orders/GetOrderResponse.java b/src/main/java/com/zenfulcode/commercify/commercify/api/responses/orders/GetOrderResponse.java index b50e37a..13a77b7 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/api/responses/orders/GetOrderResponse.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/api/responses/orders/GetOrderResponse.java @@ -18,7 +18,8 @@ public record GetOrderResponse( AddressDTO shippingAddress, OrderStatus orderStatus, String currency, - Double totalAmount, + Double subTotal, + Double shippingCost, Instant createdAt, Instant updatedAt, List orderLines @@ -33,7 +34,8 @@ public static GetOrderResponse from(OrderDetailsDTO orderDetails) { orderDetails.getShippingAddress(), order.getOrderStatus(), order.getCurrency(), - order.getTotalAmount(), + order.getSubTotal(), + order.getShippingCost(), order.getCreatedAt(), order.getUpdatedAt(), orderDetails.getOrderLines().stream() diff --git a/src/main/java/com/zenfulcode/commercify/commercify/dto/OrderDTO.java b/src/main/java/com/zenfulcode/commercify/commercify/dto/OrderDTO.java index d45ab8c..0b257cc 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/dto/OrderDTO.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/dto/OrderDTO.java @@ -14,9 +14,14 @@ public class OrderDTO { private long id; private Long userId; private String currency; - private double totalAmount; + private double subTotal; + private double shippingCost; private OrderStatus orderStatus; private int orderLinesAmount; private Instant createdAt; private Instant updatedAt; + + public double getTotal() { + return subTotal + shippingCost; + } } \ No newline at end of file diff --git a/src/main/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapper.java b/src/main/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapper.java index d6d3f34..1a96e7d 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapper.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapper.java @@ -19,8 +19,9 @@ public OrderDTO apply(OrderEntity order) { .orderStatus(order.getStatus()) .createdAt(order.getCreatedAt()) .updatedAt(order.getUpdatedAt()) + .shippingCost(order.getShippingCost() != null ? order.getShippingCost() : 0.0) .currency(order.getCurrency() != null ? order.getCurrency() : null) - .totalAmount(order.getTotalAmount() != null ? order.getTotalAmount() : 0.0) + .subTotal(order.getSubTotal() != null ? order.getSubTotal() : 0.0) .orderLinesAmount(order.getOrderLines() != null ? order.getOrderLines().size() : 0) .build(); } diff --git a/src/main/java/com/zenfulcode/commercify/commercify/entity/OrderEntity.java b/src/main/java/com/zenfulcode/commercify/commercify/entity/OrderEntity.java index b94ee21..01cb693 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/entity/OrderEntity.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/entity/OrderEntity.java @@ -43,8 +43,11 @@ public class OrderEntity { private OrderStatus status; private String currency; - @Column(name = "total_amount") - private Double totalAmount; + @Column(name = "sub_total") + private Double subTotal; + + @Column(name = "shipping_cost") + private Double shippingCost; @ToString.Exclude @ManyToOne(cascade = CascadeType.ALL) @@ -59,6 +62,10 @@ public class OrderEntity { @UpdateTimestamp private Instant updatedAt; + public double getTotal() { + return subTotal + shippingCost; + } + @Override public final boolean equals(Object o) { if (this == o) return true; diff --git a/src/main/java/com/zenfulcode/commercify/commercify/integration/mobilepay/MobilePayService.java b/src/main/java/com/zenfulcode/commercify/commercify/integration/mobilepay/MobilePayService.java index b410edb..aafa1d2 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/integration/mobilepay/MobilePayService.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/integration/mobilepay/MobilePayService.java @@ -78,7 +78,7 @@ public PaymentResponse initiatePayment(PaymentRequest request) { // Create and save payment entity PaymentEntity payment = PaymentEntity.builder() .orderId(order.getId()) - .totalAmount(order.getTotalAmount()) + .totalAmount(order.getTotal()) .paymentProvider(PaymentProvider.MOBILEPAY) .status(PaymentStatus.PENDING) .paymentMethod(request.paymentMethod()) // 'WALLET' or 'CARD' @@ -158,7 +158,7 @@ public Map createMobilePayRequest(OrderEntity order, PaymentRequ // Amount object Map amount = new HashMap<>(); - String value = String.valueOf(Math.round(order.getTotalAmount() * 100)); // Convert to minor units + String value = String.valueOf(Math.round(order.getTotal() * 100)); // Convert to minor units amount.put("value", value); // Convert to minor units amount.put("currency", "DKK"); paymentRequest.put("amount", amount); diff --git a/src/main/java/com/zenfulcode/commercify/commercify/integration/stripe/StripeService.java b/src/main/java/com/zenfulcode/commercify/commercify/integration/stripe/StripeService.java index cfbf7c1..d45d57f 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/integration/stripe/StripeService.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/integration/stripe/StripeService.java @@ -43,7 +43,7 @@ public PaymentResponse initiatePayment(PaymentRequest request) { PaymentEntity payment = PaymentEntity.builder() .orderId(order.getId()) - .totalAmount(order.getTotalAmount()) + .totalAmount(order.getTotal()) .paymentProvider(PaymentProvider.STRIPE) .status(PaymentStatus.PENDING) .paymentMethod(request.paymentMethod()) diff --git a/src/main/java/com/zenfulcode/commercify/commercify/service/email/EmailService.java b/src/main/java/com/zenfulcode/commercify/commercify/service/email/EmailService.java index b4f0ccc..814278d 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/service/email/EmailService.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/service/email/EmailService.java @@ -127,7 +127,9 @@ private Map createOrderContext(OrderDetailsDTO orderDetails) { orderContext.put("status", order.getOrderStatus()); orderContext.put("createdAt", order.getCreatedAt()); orderContext.put("currency", order.getCurrency()); - orderContext.put("totalAmount", order.getTotalAmount()); + orderContext.put("subTotal", order.getSubTotal()); + orderContext.put("totalPrice", order.getTotal()); + orderContext.put("shippingCost", order.getShippingCost()); orderContext.put("customerName", orderDetails.getCustomerDetails().getFullName()); orderContext.put("customerEmail", orderDetails.getCustomerDetails().getEmail()); orderContext.put("customerPhone", orderDetails.getCustomerDetails().getPhone()); diff --git a/src/main/java/com/zenfulcode/commercify/commercify/service/order/OrderService.java b/src/main/java/com/zenfulcode/commercify/commercify/service/order/OrderService.java index e6d5c62..4cc915a 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/service/order/OrderService.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/service/order/OrderService.java @@ -196,14 +196,15 @@ private OrderEntity buildOrderEntity(Long userId, line.variantId() != null ? variants.get(line.variantId()) : null)) .collect(Collectors.toSet()); - double totalAmount = calculationService.calculateTotalAmount(orderLines); + double subTotal = calculationService.calculateTotalAmount(orderLines); OrderEntity order = OrderEntity.builder() .userId(userId) .orderLines(orderLines) .status(OrderStatus.PENDING) .currency(request.currency()) - .totalAmount(totalAmount) + .subTotal(subTotal) + .shippingCost(request.shippingCost()) .orderShippingInfo(shippingInfo) .build(); diff --git a/src/main/java/com/zenfulcode/commercify/commercify/viewmodel/OrderViewModel.java b/src/main/java/com/zenfulcode/commercify/commercify/viewmodel/OrderViewModel.java index 7308826..7b2831e 100644 --- a/src/main/java/com/zenfulcode/commercify/commercify/viewmodel/OrderViewModel.java +++ b/src/main/java/com/zenfulcode/commercify/commercify/viewmodel/OrderViewModel.java @@ -19,7 +19,7 @@ public static OrderViewModel fromDTO(OrderDTO orderDTO) { orderDTO.getId(), orderDTO.getUserId(), orderDTO.getOrderLinesAmount(), - orderDTO.getTotalAmount(), + orderDTO.getSubTotal(), orderDTO.getCurrency(), orderDTO.getOrderStatus(), orderDTO.getCreatedAt() diff --git a/src/main/resources/db/changelog/db.changelog-master.xml b/src/main/resources/db/changelog/db.changelog-master.xml index 37b1cb7..4077c94 100644 --- a/src/main/resources/db/changelog/db.changelog-master.xml +++ b/src/main/resources/db/changelog/db.changelog-master.xml @@ -15,4 +15,5 @@ + \ No newline at end of file diff --git a/src/main/resources/db/changelog/migrations/250115175031-changelog.xml b/src/main/resources/db/changelog/migrations/250115175031-changelog.xml new file mode 100644 index 0000000..90b180a --- /dev/null +++ b/src/main/resources/db/changelog/migrations/250115175031-changelog.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapperTest.java b/src/test/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapperTest.java index 6a88ad7..7a8b1ae 100644 --- a/src/test/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapperTest.java +++ b/src/test/java/com/zenfulcode/commercify/commercify/dto/mapper/OrderMapperTest.java @@ -45,7 +45,8 @@ void setUp() { .orderLines(orderLines) .status(OrderStatus.PENDING) .currency("USD") - .totalAmount(199.98) + .subTotal(199.98) + .shippingCost(39.0) .createdAt(now) .updatedAt(now) .build(); @@ -61,7 +62,8 @@ void apply_Success() { assertEquals(orderEntity.getUserId(), result.getUserId()); assertEquals(orderEntity.getStatus(), result.getOrderStatus()); assertEquals(orderEntity.getCurrency(), result.getCurrency()); - assertEquals(orderEntity.getTotalAmount(), result.getTotalAmount()); + assertEquals(orderEntity.getSubTotal(), result.getSubTotal()); + assertEquals(orderEntity.getShippingCost(), result.getShippingCost()); assertEquals(orderEntity.getCreatedAt(), result.getCreatedAt()); assertEquals(orderEntity.getUpdatedAt(), result.getUpdatedAt()); assertEquals(orderEntity.getOrderLines().size(), result.getOrderLinesAmount()); @@ -81,18 +83,19 @@ void apply_HandlesNullValues() { assertEquals(0, result.getOrderLinesAmount()); assertNull(result.getUserId()); assertNull(result.getCurrency()); - assertEquals(0.0, result.getTotalAmount()); + assertEquals(0.0, result.getSubTotal()); + assertEquals(0.0, result.getShippingCost()); } @Test @DisplayName("Should handle null totalAmount correctly") void apply_HandlesNullTotalAmount() { - orderEntity.setTotalAmount(null); + orderEntity.setSubTotal(null); OrderDTO result = orderMapper.apply(orderEntity); assertNotNull(result); - assertEquals(0.0, result.getTotalAmount()); + assertEquals(0.0, result.getSubTotal()); } @Test @@ -105,4 +108,13 @@ void apply_HandlesNullOrderLines() { assertNotNull(result); assertEquals(0, result.getOrderLinesAmount()); } + + @Test + @DisplayName("Should handle getTotalPrice correctly") + void getTotalPrice() { + OrderDTO result = orderMapper.apply(orderEntity); + + assertNotNull(result); + assertEquals(238.98, result.getTotal()); + } } \ No newline at end of file diff --git a/src/test/java/com/zenfulcode/commercify/commercify/entity/OrderEntityTest.java b/src/test/java/com/zenfulcode/commercify/commercify/entity/OrderEntityTest.java index 92586f1..5586a61 100644 --- a/src/test/java/com/zenfulcode/commercify/commercify/entity/OrderEntityTest.java +++ b/src/test/java/com/zenfulcode/commercify/commercify/entity/OrderEntityTest.java @@ -34,7 +34,8 @@ void setUp() { .orderLines(orderLines) .status(OrderStatus.PENDING) .currency("USD") - .totalAmount(199.98) + .subTotal(199.98) + .shippingCost(39.0) .build(); // Set up bidirectional relationship @@ -49,7 +50,8 @@ void testOrderBuilder() { assertEquals(1L, order.getUserId()); assertEquals(OrderStatus.PENDING, order.getStatus()); assertEquals("USD", order.getCurrency()); - assertEquals(199.98, order.getTotalAmount()); + assertEquals(199.98, order.getSubTotal()); + assertEquals(39.0, order.getShippingCost()); } @Test diff --git a/src/test/java/com/zenfulcode/commercify/commercify/service/order/OrderServiceTest.java b/src/test/java/com/zenfulcode/commercify/commercify/service/order/OrderServiceTest.java index fafaa77..bc6b4f3 100644 --- a/src/test/java/com/zenfulcode/commercify/commercify/service/order/OrderServiceTest.java +++ b/src/test/java/com/zenfulcode/commercify/commercify/service/order/OrderServiceTest.java @@ -92,7 +92,8 @@ void setUp() { .userId(1L) .status(OrderStatus.PENDING) .currency("USD") - .totalAmount(199.98) + .subTotal(199.98) + .shippingCost(39.0) .orderLines(Set.of(orderLine)) .createdAt(Instant.now()) .build(); @@ -102,7 +103,7 @@ void setUp() { .userId(1L) .orderStatus(OrderStatus.PENDING) .currency("USD") - .totalAmount(199.98) + .subTotal(199.98) .build(); AddressDTO addressDTO = AddressDTO.builder() @@ -134,7 +135,7 @@ void setUp() { .build(); CreateOrderLineRequest orderLineRequest = new CreateOrderLineRequest(1L, null, 2); - createOrderRequest = new CreateOrderRequest("USD", customerDetailsDTO, List.of(orderLineRequest), addressDTO, null); + createOrderRequest = new CreateOrderRequest("USD", customerDetailsDTO, List.of(orderLineRequest), 39.0, addressDTO, null); } @Nested @@ -154,7 +155,9 @@ void createOrder_Success() { assertNotNull(result); assertEquals(orderDTO.getId(), result.getId()); - assertEquals(orderDTO.getTotalAmount(), result.getTotalAmount()); + assertEquals(orderDTO.getSubTotal(), result.getSubTotal()); + assertEquals(orderDTO.getShippingCost(), result.getShippingCost()); + assertEquals(orderDTO.getTotal(), result.getTotal()); verify(validationService).validateCreateOrderRequest(createOrderRequest); }