diff --git a/src/main/java/com/f_lab/la_planete/domain/Food.java b/src/main/java/com/f_lab/la_planete/domain/Food.java index 731b527..780e0a4 100644 --- a/src/main/java/com/f_lab/la_planete/domain/Food.java +++ b/src/main/java/com/f_lab/la_planete/domain/Food.java @@ -9,6 +9,8 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -20,8 +22,10 @@ @Entity +@Builder @Getter @Setter @NoArgsConstructor +@AllArgsConstructor @Table(name = "foods") public class Food extends BaseEntity { @@ -37,6 +41,10 @@ public class Food extends BaseEntity { @JoinColumn(name = "store_id") private Store store; + @ManyToOne(fetch = LAZY) + @JoinColumn(name = "currency_id") + private Currency currency; + public BigDecimal calculateCost(int quantity) { return price.multiply(BigDecimal.valueOf(quantity)); } diff --git a/src/main/java/com/f_lab/la_planete/domain/Order.java b/src/main/java/com/f_lab/la_planete/domain/Order.java index c6c3c33..4b55bfb 100644 --- a/src/main/java/com/f_lab/la_planete/domain/Order.java +++ b/src/main/java/com/f_lab/la_planete/domain/Order.java @@ -25,8 +25,7 @@ @Entity @Builder -@Getter -@Setter +@Getter @Setter @AllArgsConstructor @NoArgsConstructor @Table(name = "orders") @@ -44,8 +43,6 @@ public class Order extends BaseEntity { private int quantity; - // 화폐 추가 - @Enumerated(EnumType.STRING) private OrderStatus status; @@ -53,13 +50,13 @@ public class Order extends BaseEntity { @JoinColumn(name = "payment_id") private Payment payment; - @ManyToOne + @ManyToOne(fetch = LAZY) @JoinColumn(name = "voucher_id") private Voucher voucher; public BigDecimal calculateTotalCost() { return (voucher != null) - ? voucher.apply(food.calculateCost(quantity)) + ? voucher.apply(food.calculateCost(quantity), food.getCurrency()) : food.calculateCost(quantity); } } diff --git a/src/main/java/com/f_lab/la_planete/domain/Payment.java b/src/main/java/com/f_lab/la_planete/domain/Payment.java index b0b007e..4b311f5 100644 --- a/src/main/java/com/f_lab/la_planete/domain/Payment.java +++ b/src/main/java/com/f_lab/la_planete/domain/Payment.java @@ -8,6 +8,8 @@ import jakarta.persistence.Id; import jakarta.persistence.OneToOne; import jakarta.persistence.Table; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -16,12 +18,12 @@ import static jakarta.persistence.FetchType.LAZY; import static jakarta.persistence.GenerationType.IDENTITY; -import static lombok.AccessLevel.PRIVATE; -import static lombok.AccessLevel.PROTECTED; @Entity -@Getter @Setter(PRIVATE) -@NoArgsConstructor(access = PROTECTED) +@Builder +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor @Table(name = "payments") public class Payment extends BaseEntity { @@ -35,12 +37,4 @@ public class Payment extends BaseEntity { @OneToOne(mappedBy = "payment", fetch = LAZY) private Order order; - - public static Payment of(BigDecimal totalCost, Order order) { - Payment payment = new Payment(); - payment.setTotalCost(totalCost); - payment.setOrder(order); - payment.setStatus(PaymentStatus.READY); - return payment; - } } diff --git a/src/main/java/com/f_lab/la_planete/domain/Voucher.java b/src/main/java/com/f_lab/la_planete/domain/Voucher.java index ad35ec7..7619983 100644 --- a/src/main/java/com/f_lab/la_planete/domain/Voucher.java +++ b/src/main/java/com/f_lab/la_planete/domain/Voucher.java @@ -1,12 +1,16 @@ package com.f_lab.la_planete.domain; +import com.f_lab.la_planete.domain.base.BaseTimeEntity; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.Table; import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +import org.springframework.util.ObjectUtils; import java.math.BigDecimal; import java.time.LocalDateTime; @@ -14,21 +18,25 @@ import static jakarta.persistence.GenerationType.IDENTITY; @Entity -@Getter +@Builder +@Getter @Setter @NoArgsConstructor @AllArgsConstructor @Table(name = "vouchers") -public class Voucher { +public class Voucher extends BaseTimeEntity { @Id @GeneratedValue(strategy = IDENTITY) private Long id; private LocalDateTime expiryDate; - private BigDecimal percentages; + private BigDecimal discountRate; // 소수의 값으로 표시됩니다 (e.g. 0.45 == 45%) - public BigDecimal apply(BigDecimal totalCost) { - BigDecimal afterDiscounts = BigDecimal.valueOf(1).subtract(percentages); - return totalCost.multiply(afterDiscounts); + public BigDecimal apply(BigDecimal totalCost, Currency currency) { + if (ObjectUtils.isEmpty(currency)) + throw new IllegalStateException("화페 값이 비어있습니다. 적절히 변경 후 다시 시도해주시길 바랍니다."); + + BigDecimal afterDiscounts = BigDecimal.ONE.subtract(discountRate); + return totalCost.multiply(afterDiscounts).setScale(currency.getRoundingScale(), currency.getRoundingMode()); } } diff --git a/src/main/java/com/f_lab/la_planete/service/OrderService.java b/src/main/java/com/f_lab/la_planete/service/OrderService.java index ebe1b21..ff445a0 100644 --- a/src/main/java/com/f_lab/la_planete/service/OrderService.java +++ b/src/main/java/com/f_lab/la_planete/service/OrderService.java @@ -8,16 +8,13 @@ import com.f_lab.la_planete.repository.FoodRepository; import com.f_lab.la_planete.repository.OrderRepository; import com.f_lab.la_planete.repository.PaymentRepository; -import jakarta.persistence.LockTimeoutException; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.hibernate.PessimisticLockException; -import org.springframework.dao.PessimisticLockingFailureException; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; -import java.util.Optional; @Slf4j @Service @@ -42,8 +39,12 @@ public OrderCreateResponseDTO createFoodOrder(OrderCreateRequestDTO request) { BigDecimal totalCost = order.calculateTotalCost(); order.setTotalCost(order.calculateTotalCost()); + // TODO 추후에 따로 결제 진행 클래스를 만들어서 로직을 변경 // 결제 생성 - Payment payment = Payment.of(totalCost, order); + Payment payment = Payment.builder() + .totalCost(totalCost) + .order(order) + .build(); orderRepository.save(order); paymentRepository.save(payment);