diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java index ccdf6397..2ec2c216 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/adaptor/IssuedTicketAdaptor.java @@ -75,6 +75,10 @@ public Long countPaidTicket(Long userId, Long itemId) { return issuedTicketRepository.countPaidTicket(userId, itemId); } + public Long countIssuedTicketByItemId(Long itemId) { + return issuedTicketRepository.countIssuedTicketByItemId(itemId); + } + public IssuedTicket queryByIssuedTicketNo(String issuedTicketNo) { return issuedTicketRepository .findByIssuedTicketNo(issuedTicketNo) diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java index 3d269a5f..5b12812b 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepository.java @@ -14,4 +14,6 @@ public interface IssuedTicketCustomRepository { Optional find(Long issuedTicketId); Long countPaidTicket(Long userId, Long issuedTicketId); + + Long countIssuedTicketByItemId(Long ticketItemId); } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java index e9d3f104..d7ea0e61 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/issuedTicket/repository/IssuedTicketCustomRepositoryImpl.java @@ -69,11 +69,20 @@ public Optional find(Long issuedTicketId) { } @Override - public Long countPaidTicket(Long userId, Long issuedTicketId) { + public Long countPaidTicket(Long userId, Long ticketItemId) { return queryFactory .select(count(issuedTicket)) .from(issuedTicket) - .where(eqUserId(userId), eqEventId(issuedTicketId), filterPaidTickets()) + .where(eqUserId(userId), eqTicketItemId(ticketItemId), filterPaidTickets()) + .fetchOne(); + } + + @Override + public Long countIssuedTicketByItemId(Long ticketItemId) { + return queryFactory + .select(count(issuedTicket)) + .from(issuedTicket) + .where(eqTicketItemId(ticketItemId), filterPaidTickets()) .fetchOne(); } @@ -81,8 +90,8 @@ private BooleanExpression filterPaidTickets() { return issuedTicket.issuedTicketStatus.in(ENTRANCE_COMPLETED, ENTRANCE_INCOMPLETE); } - private BooleanExpression eqEventId(Long issuedTicketId) { - return issuedTicket.itemInfo.ticketItemId.eq(issuedTicketId); + private BooleanExpression eqTicketItemId(Long ticketItemId) { + return issuedTicket.itemInfo.ticketItemId.eq(ticketItemId); } private BooleanExpression eqUserId(Long userId) { diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/adaptor/OrderAdaptor.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/adaptor/OrderAdaptor.java index 9ca2444f..d84b6163 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/adaptor/OrderAdaptor.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/adaptor/OrderAdaptor.java @@ -57,6 +57,10 @@ public Page findEventOrders(FindEventOrdersCondition condition, Pageable return orderRepository.findEventOrders(condition, pageable); } + public List findByEventIdAndOrderStatus(Long eventId, OrderStatus orderStatus) { + return orderRepository.findByEventIdAndOrderStatus(eventId, orderStatus); + } + public List findByEventIdAndOrderStatusAndUserId( Long eventId, Long userId, OrderStatus orderStatus) { return orderRepository.findByEventIdAndUserIdAndOrderStatus(eventId, userId, orderStatus); diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java index dfa6e18a..c3d1ceea 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/Order.java @@ -154,6 +154,7 @@ public static Order createApproveOrder( .build(); orderValidator.validCanCreate(order); orderValidator.validApproveStatePurchaseLimit(order); + orderValidator.validApproveOrderCreateTotalStock(order); order.calculatePaymentInfo(); return order; } diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/validator/OrderValidator.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/validator/OrderValidator.java index 25b62c37..ea3fcd35 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/validator/OrderValidator.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/domain/validator/OrderValidator.java @@ -194,6 +194,23 @@ public void validApproveStatePurchaseLimit(Order order) { } } + public void validApproveOrderCreateTotalStock(Order order) { + TicketItem item = getItem(order); + + List approveWaitingOrders = + orderAdaptor.findByEventIdAndOrderStatus( + order.getEventId(), OrderStatus.PENDING_APPROVE); + Long approveWaitingTicketCount = + approveWaitingOrders.stream().map(Order::getTotalQuantity).reduce(0L, Long::sum); + + Long alreadyIssuedCount = issuedTicketAdaptor.countIssuedTicketByItemId(order.getItemId()); + + Long expectQuantity = + alreadyIssuedCount + approveWaitingTicketCount + order.getTotalQuantity(); + + item.validEnoughQuantity(expectQuantity); + } + /** 이벤트가 열려있는 상태인지 */ public void validEventIsOpen(Event event) { event.validateNotOpenStatus(); diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/repository/OrderRepository.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/repository/OrderRepository.java index a4432c52..77eb0810 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/repository/OrderRepository.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/order/repository/OrderRepository.java @@ -10,6 +10,8 @@ public interface OrderRepository extends CrudRepository, OrderCusto List findByEventId(Long eventId); + List findByEventIdAndOrderStatus(Long eventId, OrderStatus orderStatus); + List findByEventIdAndUserIdAndOrderStatus( Long eventId, Long userId, OrderStatus orderStatus); diff --git a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java index c34c0c5c..df0eb741 100644 --- a/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java +++ b/DuDoong-Domain/src/main/java/band/gosrock/domain/domains/ticket_item/exception/TicketItemErrorCode.java @@ -18,7 +18,10 @@ public enum TicketItemErrorCode implements BaseErrorCode { @ExplainError("요청에서 보내준 옵션 id 값이 올바르지 않을 때 발생하는 오류입니다.") OPTION_NOT_FOUND(NOT_FOUND, "Option_404_1", "옵션을 찾을 수 없습니다."), @ExplainError("주문 요청한 티켓 상품 재고가 부족할 때 발생하는 오류입니다.") - TICKET_ITEM_QUANTITY_LACK(BAD_REQUEST, "Ticket_Item_400_1", "티켓 상품 재고가 부족합니다."), + TICKET_ITEM_QUANTITY_LACK( + BAD_REQUEST, + "Ticket_Item_400_1", + "티켓 상품 재고가 부족합니다. ( 승인 대기 또는 앞선 주문으로 인해, 재고가 있어도 주문이 불가할 수 있습니다.)"), @ExplainError("주문 및 승인 요청 시 티켓 상품 재고보다 많은 양을 주문 시 발생하는 오류입니다.") TICKET_ITEM_QUANTITY_LESS_THAN_ZERO( BAD_REQUEST, "Ticket_Item_400_2", "티켓 아이템 재고가 0보다 작을 수 없습니다."),