diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderService.java b/src/main/java/kitchenpos/eatinorders/application/OrderService.java index e0a87d305..e46e71706 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderService.java @@ -1,24 +1,21 @@ package kitchenpos.eatinorders.application; import kitchenpos.deliveryorders.infra.KitchenridersClient; -import kitchenpos.eatinorders.domain.Order; -import kitchenpos.eatinorders.domain.OrderLineItem; import kitchenpos.eatinorders.domain.OrderRepository; import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; import kitchenpos.eatinorders.domain.OrderTableRepository; import kitchenpos.eatinorders.domain.OrderType; +import kitchenpos.eatinorders.tobe.domain.Order; +import kitchenpos.eatinorders.tobe.domain.OrderLineItem; +import kitchenpos.eatinorders.tobe.domain.OrderTable; import kitchenpos.menus.domain.MenuRepository; import kitchenpos.menus.tobe.domain.Menu; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.math.BigDecimal; -import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; import java.util.stream.Collectors; @@ -43,14 +40,8 @@ public OrderService( @Transactional public Order create(final Order request) { - final OrderType type = request.getType(); - if (Objects.isNull(type)) { - throw new IllegalArgumentException(); - } final List orderLineItemRequests = request.getOrderLineItems(); - if (Objects.isNull(orderLineItemRequests) || orderLineItemRequests.isEmpty()) { - throw new IllegalArgumentException(); - } + final List menus = menuRepository.findAllByIdIn( orderLineItemRequests.stream() .map(OrderLineItem::getMenuId) @@ -59,14 +50,11 @@ public Order create(final Order request) { if (menus.size() != orderLineItemRequests.size()) { throw new IllegalArgumentException(); } + final List orderLineItems = new ArrayList<>(); for (final OrderLineItem orderLineItemRequest : orderLineItemRequests) { final long quantity = orderLineItemRequest.getQuantity(); - if (type != OrderType.EAT_IN) { - if (quantity < 0) { - throw new IllegalArgumentException(); - } - } + final Menu menu = menuRepository.findById(orderLineItemRequest.getMenuId()) .orElseThrow(NoSuchElementException::new); if (!menu.isDisplayed()) { @@ -75,32 +63,14 @@ public Order create(final Order request) { if (menu.getPrice().getPrice().compareTo(orderLineItemRequest.getPrice()) != 0) { throw new IllegalArgumentException(); } - final OrderLineItem orderLineItem = new OrderLineItem(); - orderLineItem.setMenu(menu); - orderLineItem.setQuantity(quantity); + final OrderLineItem orderLineItem = new OrderLineItem(menu, quantity); orderLineItems.add(orderLineItem); } - Order order = new Order(); - order.setId(UUID.randomUUID()); - order.setType(type); - order.setStatus(OrderStatus.WAITING); - order.setOrderDateTime(LocalDateTime.now()); - order.setOrderLineItems(orderLineItems); - if (type == OrderType.DELIVERY) { - final String deliveryAddress = request.getDeliveryAddress(); - if (Objects.isNull(deliveryAddress) || deliveryAddress.isEmpty()) { - throw new IllegalArgumentException(); - } - order.setDeliveryAddress(deliveryAddress); - } - if (type == OrderType.EAT_IN) { - final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()) - .orElseThrow(NoSuchElementException::new); - if (!orderTable.isOccupied()) { - throw new IllegalStateException(); - } - order.setOrderTable(orderTable); - } + final OrderTable orderTable = orderTableRepository.findById(request.getOrderTableId()).orElseThrow(NoSuchElementException::new); + + final Order order = Order.createDeliveryOrder(request.getOrderType(), request.getOrderLineItems(), request.getOrderStatus(), + orderTable, request.getDeliveryAddress()); + return orderRepository.save(order); } @@ -108,20 +78,8 @@ public Order create(final Order request) { public Order accept(final UUID orderId) { final Order order = orderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - if (order.getStatus() != OrderStatus.WAITING) { - throw new IllegalStateException(); - } - if (order.getType() == OrderType.DELIVERY) { - BigDecimal sum = BigDecimal.ZERO; - for (final OrderLineItem orderLineItem : order.getOrderLineItems()) { - sum = orderLineItem.getMenu() - .getPrice() - .getPrice() - .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); - } - kitchenridersClient.requestDelivery(orderId, sum, order.getDeliveryAddress()); - } - order.setStatus(OrderStatus.ACCEPTED); + order.accept(kitchenridersClient); + return order; } @@ -129,10 +87,7 @@ public Order accept(final UUID orderId) { public Order serve(final UUID orderId) { final Order order = orderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - if (order.getStatus() != OrderStatus.ACCEPTED) { - throw new IllegalStateException(); - } - order.setStatus(OrderStatus.SERVED); + order.serve(); return order; } @@ -140,13 +95,7 @@ public Order serve(final UUID orderId) { public Order startDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - if (order.getType() != OrderType.DELIVERY) { - throw new IllegalStateException(); - } - if (order.getStatus() != OrderStatus.SERVED) { - throw new IllegalStateException(); - } - order.setStatus(OrderStatus.DELIVERING); + order.startDelivery(); return order; } @@ -154,10 +103,7 @@ public Order startDelivery(final UUID orderId) { public Order completeDelivery(final UUID orderId) { final Order order = orderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - if (order.getStatus() != OrderStatus.DELIVERING) { - throw new IllegalStateException(); - } - order.setStatus(OrderStatus.DELIVERED); + order.completeDelivery(); return order; } @@ -165,24 +111,12 @@ public Order completeDelivery(final UUID orderId) { public Order complete(final UUID orderId) { final Order order = orderRepository.findById(orderId) .orElseThrow(NoSuchElementException::new); - final OrderType type = order.getType(); - final OrderStatus status = order.getStatus(); - if (type == OrderType.DELIVERY) { - if (status != OrderStatus.DELIVERED) { - throw new IllegalStateException(); - } - } - if (type == OrderType.TAKEOUT || type == OrderType.EAT_IN) { - if (status != OrderStatus.SERVED) { - throw new IllegalStateException(); - } - } - order.setStatus(OrderStatus.COMPLETED); - if (type == OrderType.EAT_IN) { + order.complete(); + + if (order.getOrderType() == OrderType.EAT_IN) { final OrderTable orderTable = order.getOrderTable(); if (!orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { - orderTable.setNumberOfGuests(0); - orderTable.setOccupied(false); + orderTable.makeEmpty(); } } return order; diff --git a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java index 1df7e345f..9119ee666 100644 --- a/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java +++ b/src/main/java/kitchenpos/eatinorders/application/OrderTableService.java @@ -2,14 +2,13 @@ import kitchenpos.eatinorders.domain.OrderRepository; import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; import kitchenpos.eatinorders.domain.OrderTableRepository; +import kitchenpos.eatinorders.tobe.domain.OrderTable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; import java.util.NoSuchElementException; -import java.util.Objects; import java.util.UUID; @Service @@ -24,22 +23,14 @@ public OrderTableService(final OrderTableRepository orderTableRepository, final @Transactional public OrderTable create(final OrderTable request) { - final String name = request.getName(); - if (Objects.isNull(name) || name.isEmpty()) { - throw new IllegalArgumentException(); - } - final OrderTable orderTable = new OrderTable(); - orderTable.setId(UUID.randomUUID()); - orderTable.setName(name); - orderTable.setNumberOfGuests(0); - orderTable.setOccupied(false); + OrderTable orderTable = new OrderTable(request.getName(), request.getNumberOfGuests(), false); return orderTableRepository.save(orderTable); } @Transactional public OrderTable sit(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); orderTable.setOccupied(true); return orderTable; } @@ -47,7 +38,7 @@ public OrderTable sit(final UUID orderTableId) { @Transactional public OrderTable clear(final UUID orderTableId) { final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (orderRepository.existsByOrderTableAndStatusNot(orderTable, OrderStatus.COMPLETED)) { throw new IllegalStateException(); } @@ -63,7 +54,7 @@ public OrderTable changeNumberOfGuests(final UUID orderTableId, final OrderTable throw new IllegalArgumentException(); } final OrderTable orderTable = orderTableRepository.findById(orderTableId) - .orElseThrow(NoSuchElementException::new); + .orElseThrow(NoSuchElementException::new); if (!orderTable.isOccupied()) { throw new IllegalStateException(); } diff --git a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java index 01c825c45..1ac690653 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderRepository.java @@ -1,5 +1,6 @@ package kitchenpos.eatinorders.domain; +import kitchenpos.eatinorders.tobe.domain.Order; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java index 84c0d3c6f..eedb9a4be 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/JpaOrderTableRepository.java @@ -1,5 +1,6 @@ package kitchenpos.eatinorders.domain; +import kitchenpos.eatinorders.tobe.domain.OrderTable; import org.springframework.data.jpa.repository.JpaRepository; import java.util.UUID; diff --git a/src/main/java/kitchenpos/eatinorders/domain/Order.java b/src/main/java/kitchenpos/eatinorders/domain/Order.java index c6e630c90..77d9a9b5e 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/Order.java +++ b/src/main/java/kitchenpos/eatinorders/domain/Order.java @@ -1,115 +1,115 @@ -package kitchenpos.eatinorders.domain; - -import javax.persistence.*; -import java.time.LocalDateTime; -import java.util.List; -import java.util.UUID; - -@Table(name = "orders") -@Entity -public class Order { - @Column(name = "id", columnDefinition = "binary(16)") - @Id - private UUID id; - - @Column(name = "type", nullable = false) - @Enumerated(EnumType.STRING) - private OrderType type; - - @Column(name = "status", nullable = false) - @Enumerated(EnumType.STRING) - private OrderStatus status; - - @Column(name = "order_date_time", nullable = false) - private LocalDateTime orderDateTime; - - @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) - @JoinColumn( - name = "order_id", - nullable = false, - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") - ) - private List orderLineItems; - - @Column(name = "delivery_address") - private String deliveryAddress; - - @ManyToOne - @JoinColumn( - name = "order_table_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_orders_to_order_table") - ) - private OrderTable orderTable; - - @Transient - private UUID orderTableId; - - public Order() { - } - - public UUID getId() { - return id; - } - - public void setId(final UUID id) { - this.id = id; - } - - public OrderType getType() { - return type; - } - - public void setType(final OrderType type) { - this.type = type; - } - - public OrderStatus getStatus() { - return status; - } - - public void setStatus(final OrderStatus status) { - this.status = status; - } - - public LocalDateTime getOrderDateTime() { - return orderDateTime; - } - - public void setOrderDateTime(final LocalDateTime orderDateTime) { - this.orderDateTime = orderDateTime; - } - - public List getOrderLineItems() { - return orderLineItems; - } - - public void setOrderLineItems(final List orderLineItems) { - this.orderLineItems = orderLineItems; - } - - public String getDeliveryAddress() { - return deliveryAddress; - } - - public void setDeliveryAddress(final String deliveryAddress) { - this.deliveryAddress = deliveryAddress; - } - - public OrderTable getOrderTable() { - return orderTable; - } - - public void setOrderTable(final OrderTable orderTable) { - this.orderTable = orderTable; - } - - public UUID getOrderTableId() { - return orderTableId; - } - - public void setOrderTableId(final UUID orderTableId) { - this.orderTableId = orderTableId; - } -} +//package kitchenpos.eatinorders.domain; +// +//import javax.persistence.*; +//import java.time.LocalDateTime; +//import java.util.List; +//import java.util.UUID; +// +//@Table(name = "orders") +//@Entity +//public class Order { +// @Column(name = "id", columnDefinition = "binary(16)") +// @Id +// private UUID id; +// +// @Column(name = "type", nullable = false) +// @Enumerated(EnumType.STRING) +// private OrderType type; +// +// @Column(name = "status", nullable = false) +// @Enumerated(EnumType.STRING) +// private OrderStatus status; +// +// @Column(name = "order_date_time", nullable = false) +// private LocalDateTime orderDateTime; +// +// @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) +// @JoinColumn( +// name = "order_id", +// nullable = false, +// columnDefinition = "binary(16)", +// foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") +// ) +// private List orderLineItems; +// +// @Column(name = "delivery_address") +// private String deliveryAddress; +// +// @ManyToOne +// @JoinColumn( +// name = "order_table_id", +// columnDefinition = "binary(16)", +// foreignKey = @ForeignKey(name = "fk_orders_to_order_table") +// ) +// private OrderTable orderTable; +// +// @Transient +// private UUID orderTableId; +// +// public Order() { +// } +// +// public UUID getId() { +// return id; +// } +// +// public void setId(final UUID id) { +// this.id = id; +// } +// +// public OrderType getType() { +// return type; +// } +// +// public void setType(final OrderType type) { +// this.type = type; +// } +// +// public OrderStatus getStatus() { +// return status; +// } +// +// public void setStatus(final OrderStatus status) { +// this.status = status; +// } +// +// public LocalDateTime getOrderDateTime() { +// return orderDateTime; +// } +// +// public void setOrderDateTime(final LocalDateTime orderDateTime) { +// this.orderDateTime = orderDateTime; +// } +// +// public List getOrderLineItems() { +// return orderLineItems; +// } +// +// public void setOrderLineItems(final List orderLineItems) { +// this.orderLineItems = orderLineItems; +// } +// +// public String getDeliveryAddress() { +// return deliveryAddress; +// } +// +// public void setDeliveryAddress(final String deliveryAddress) { +// this.deliveryAddress = deliveryAddress; +// } +// +// public OrderTable getOrderTable() { +// return orderTable; +// } +// +// public void setOrderTable(final OrderTable orderTable) { +// this.orderTable = orderTable; +// } +// +// public UUID getOrderTableId() { +// return orderTableId; +// } +// +// public void setOrderTableId(final UUID orderTableId) { +// this.orderTableId = orderTableId; +// } +//} diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java index 12b8e02b5..32184816f 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderLineItem.java @@ -1,85 +1,85 @@ -package kitchenpos.eatinorders.domain; - -import kitchenpos.menus.tobe.domain.Menu; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.ForeignKey; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; -import javax.persistence.Transient; -import java.math.BigDecimal; -import java.util.UUID; - -@Table(name = "order_line_item") -@Entity -public class OrderLineItem { - @Column(name = "seq") - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Id - private Long seq; - - @ManyToOne(optional = false) - @JoinColumn( - name = "menu_id", - columnDefinition = "binary(16)", - foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") - ) - private Menu menu; - - @Column(name = "quantity", nullable = false) - private long quantity; - - @Transient - private UUID menuId; - - @Transient - private BigDecimal price; - - public OrderLineItem() { - } - - public Long getSeq() { - return seq; - } - - public void setSeq(final Long seq) { - this.seq = seq; - } - - public Menu getMenu() { - return menu; - } - - public void setMenu(final Menu menu) { - this.menu = menu; - } - - public long getQuantity() { - return quantity; - } - - public void setQuantity(final long quantity) { - this.quantity = quantity; - } - - public UUID getMenuId() { - return menuId; - } - - public void setMenuId(final UUID menuId) { - this.menuId = menuId; - } - - public BigDecimal getPrice() { - return price; - } - - public void setPrice(final BigDecimal price) { - this.price = price; - } -} +//package kitchenpos.eatinorders.domain; +// +//import kitchenpos.menus.tobe.domain.Menu; +// +//import javax.persistence.Column; +//import javax.persistence.Entity; +//import javax.persistence.ForeignKey; +//import javax.persistence.GeneratedValue; +//import javax.persistence.GenerationType; +//import javax.persistence.Id; +//import javax.persistence.JoinColumn; +//import javax.persistence.ManyToOne; +//import javax.persistence.Table; +//import javax.persistence.Transient; +//import java.math.BigDecimal; +//import java.util.UUID; +// +//@Table(name = "order_line_item") +//@Entity +//public class OrderLineItem { +// @Column(name = "seq") +// @GeneratedValue(strategy = GenerationType.IDENTITY) +// @Id +// private Long seq; +// +// @ManyToOne(optional = false) +// @JoinColumn( +// name = "menu_id", +// columnDefinition = "binary(16)", +// foreignKey = @ForeignKey(name = "fk_order_line_item_to_menu") +// ) +// private Menu menu; +// +// @Column(name = "quantity", nullable = false) +// private long quantity; +// +// @Transient +// private UUID menuId; +// +// @Transient +// private BigDecimal price; +// +// public OrderLineItem() { +// } +// +// public Long getSeq() { +// return seq; +// } +// +// public void setSeq(final Long seq) { +// this.seq = seq; +// } +// +// public Menu getMenu() { +// return menu; +// } +// +// public void setMenu(final Menu menu) { +// this.menu = menu; +// } +// +// public long getQuantity() { +// return quantity; +// } +// +// public void setQuantity(final long quantity) { +// this.quantity = quantity; +// } +// +// public UUID getMenuId() { +// return menuId; +// } +// +// public void setMenuId(final UUID menuId) { +// this.menuId = menuId; +// } +// +// public BigDecimal getPrice() { +// return price; +// } +// +// public void setPrice(final BigDecimal price) { +// this.price = price; +// } +//} diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java b/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java index f98d45c15..a00cf45da 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderRepository.java @@ -1,5 +1,8 @@ package kitchenpos.eatinorders.domain; +import kitchenpos.eatinorders.tobe.domain.Order; +import kitchenpos.eatinorders.tobe.domain.OrderTable; + import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java b/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java index 9e1dc5519..758fe32ba 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderTable.java @@ -1,59 +1,59 @@ -package kitchenpos.eatinorders.domain; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; -import java.util.UUID; - -@Table(name = "order_table") -@Entity -public class OrderTable { - @Column(name = "id", columnDefinition = "binary(16)") - @Id - private UUID id; - - @Column(name = "name", nullable = false) - private String name; - - @Column(name = "number_of_guests", nullable = false) - private int numberOfGuests; - - @Column(name = "occupied", nullable = false) - private boolean occupied; - - public OrderTable() { - } - - public UUID getId() { - return id; - } - - public void setId(final UUID id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(final String name) { - this.name = name; - } - - public int getNumberOfGuests() { - return numberOfGuests; - } - - public void setNumberOfGuests(final int numberOfGuests) { - this.numberOfGuests = numberOfGuests; - } - - public boolean isOccupied() { - return occupied; - } - - public void setOccupied(final boolean occupied) { - this.occupied = occupied; - } -} +//package kitchenpos.eatinorders.domain; +// +//import javax.persistence.Column; +//import javax.persistence.Entity; +//import javax.persistence.Id; +//import javax.persistence.Table; +//import java.util.UUID; +// +//@Table(name = "order_table") +//@Entity +//public class OrderTable { +// @Column(name = "id", columnDefinition = "binary(16)") +// @Id +// private UUID id; +// +// @Column(name = "name", nullable = false) +// private String name; +// +// @Column(name = "number_of_guests", nullable = false) +// private int numberOfGuests; +// +// @Column(name = "occupied", nullable = false) +// private boolean occupied; +// +// public OrderTable() { +// } +// +// public UUID getId() { +// return id; +// } +// +// public void setId(final UUID id) { +// this.id = id; +// } +// +// public String getName() { +// return name; +// } +// +// public void setName(final String name) { +// this.name = name; +// } +// +// public int getNumberOfGuests() { +// return numberOfGuests; +// } +// +// public void setNumberOfGuests(final int numberOfGuests) { +// this.numberOfGuests = numberOfGuests; +// } +// +// public boolean isOccupied() { +// return occupied; +// } +// +// public void setOccupied(final boolean occupied) { +// this.occupied = occupied; +// } +//} diff --git a/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java b/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java index 1e9047d43..07e79181b 100644 --- a/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java +++ b/src/main/java/kitchenpos/eatinorders/domain/OrderTableRepository.java @@ -1,5 +1,7 @@ package kitchenpos.eatinorders.domain; +import kitchenpos.eatinorders.tobe.domain.OrderTable; + import java.util.List; import java.util.Optional; import java.util.UUID; diff --git a/src/main/java/kitchenpos/eatinorders/tobe/domain/Order.java b/src/main/java/kitchenpos/eatinorders/tobe/domain/Order.java new file mode 100644 index 000000000..1550162c6 --- /dev/null +++ b/src/main/java/kitchenpos/eatinorders/tobe/domain/Order.java @@ -0,0 +1,159 @@ +package kitchenpos.eatinorders.tobe.domain; + +import kitchenpos.deliveryorders.infra.KitchenridersClient; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderType; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.ForeignKey; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; +import java.math.BigDecimal; +import java.util.List; +import java.util.UUID; + +@Table(name = "orders") +@Entity +public class Order { + private static final String NOT_WAITING_MESSAGE = "대기 상태에만 수락 상태로 변경할 수 있습니다."; + private static final String NOT_ACCEPT_MESSAGE = "수락 상태에만 서빙 완료 상태로 변경할 수 있습니다."; + private static final String NOT_SERVED_MESSAGE = "서빙 완료 상태에서만 완료 상태로 변경할 수 있습니다."; + private static final String CAN_NOT_MINUS_QUANTITY_EXCEPT_EAT_IN = "매장 주문이 아니라면 주문 수량은 0보다 크거나 같아야 한다."; + + @Column(name = "id", columnDefinition = "binary(16)") + @Id + private UUID id; + private OrderType orderType; + @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) + @JoinColumn( + name = "order_id", + nullable = false, + columnDefinition = "binary(16)", + foreignKey = @ForeignKey(name = "fk_order_line_item_to_orders") + ) + private List orderLineItems; + private OrderStatus orderStatus; + private OrderTable orderTable; + private UUID orderTableId; + private String deliveryAddress; + + + public static Order createDeliveryOrder(final OrderType orderType, final List orderLineItems, + final OrderStatus orderStatus, final OrderTable orderTable, final String address) { + return new Order(orderType, orderLineItems, orderStatus, orderTable, address); + } + + private Order(final OrderType orderType, final List orderLineItems, final OrderStatus orderStatus, + final OrderTable orderTable, final String address) { + if (orderType != OrderType.EAT_IN && orderLineItems.stream().anyMatch(o -> o.getQuantity() < 0)) { + throw new IllegalArgumentException(CAN_NOT_MINUS_QUANTITY_EXCEPT_EAT_IN); + } + this.orderType = orderType; + this.orderLineItems = orderLineItems; + this.orderStatus = orderStatus; + this.orderTable = orderTable; + } + + public Order(final OrderType orderType, final List orderLineItems, final OrderStatus orderStatus, final OrderTable orderTable) { + if (orderType != OrderType.EAT_IN && orderLineItems.stream().anyMatch(o -> o.getQuantity() < 0)) { + throw new IllegalArgumentException(CAN_NOT_MINUS_QUANTITY_EXCEPT_EAT_IN); + } + this.orderType = orderType; + this.orderLineItems = orderLineItems; + this.orderStatus = orderStatus; + this.orderTable = orderTable; + } + + public Order() { + } + + public UUID getId() { + return id; + } + + public OrderType getOrderType() { + return orderType; + } + + public UUID getOrderTableId() { + return orderTableId; + } + + public List getOrderLineItems() { + return orderLineItems; + } + + public String getDeliveryAddress() { + return deliveryAddress; + } + + public OrderStatus getOrderStatus() { + return orderStatus; + } + + public OrderTable getOrderTable() { + return orderTable; + } + + public void accept(KitchenridersClient client) { + if (orderStatus != OrderStatus.WAITING) { + throw new IllegalArgumentException(NOT_WAITING_MESSAGE); + } + if (orderType == OrderType.DELIVERY) { + BigDecimal sum = BigDecimal.ZERO; + for (final OrderLineItem orderLineItem : this.getOrderLineItems()) { + sum = orderLineItem.getMenu() + .getPrice() + .getPrice() + .multiply(BigDecimal.valueOf(orderLineItem.getQuantity())); + } + client.requestDelivery(this.id, sum, this.getDeliveryAddress()); + } + orderStatus = OrderStatus.ACCEPTED; + } + + public void accept() { + if (orderStatus != OrderStatus.WAITING) { + throw new IllegalArgumentException(NOT_WAITING_MESSAGE); + } + orderStatus = OrderStatus.ACCEPTED; + } + + public void serve() { + if (orderStatus != OrderStatus.ACCEPTED) { + throw new IllegalArgumentException(NOT_ACCEPT_MESSAGE); + } + orderStatus = OrderStatus.SERVED; + } + + public void complete() { + if (orderStatus != OrderStatus.SERVED) { + throw new IllegalArgumentException(NOT_ACCEPT_MESSAGE); + } + orderStatus = OrderStatus.COMPLETED; + if (orderType == OrderType.EAT_IN) { + orderTable.makeEmpty(); + } + } + + public void startDelivery() { + if (orderType != OrderType.DELIVERY) { + throw new IllegalArgumentException(); + } + if (orderStatus != OrderStatus.SERVED) { + throw new IllegalArgumentException(); + } + orderStatus = OrderStatus.DELIVERING; + } + + public void completeDelivery() { + if (orderStatus != OrderStatus.DELIVERING) { + throw new IllegalArgumentException(); + } + orderStatus = OrderStatus.DELIVERED; + } +} diff --git a/src/main/java/kitchenpos/eatinorders/tobe/domain/OrderLineItem.java b/src/main/java/kitchenpos/eatinorders/tobe/domain/OrderLineItem.java new file mode 100644 index 000000000..489001ebf --- /dev/null +++ b/src/main/java/kitchenpos/eatinorders/tobe/domain/OrderLineItem.java @@ -0,0 +1,49 @@ +package kitchenpos.eatinorders.tobe.domain; + +import kitchenpos.menus.tobe.domain.Menu; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.math.BigDecimal; +import java.util.UUID; + +@Table(name = "order_line_item") +@Entity +public class OrderLineItem { + @Column(name = "seq") + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + private Long seq; + private Menu menu; + private long quantity; + private UUID menuId; + private BigDecimal price; + + public OrderLineItem(final Menu menu, final long quantity) { + this.menu = menu; + this.quantity = quantity; + } + + public OrderLineItem() { + } + + public Menu getMenu() { + return menu; + } + + public long getQuantity() { + return quantity; + } + + public UUID getMenuId() { + return menuId; + } + + public BigDecimal getPrice() { + return price; + } +} diff --git a/src/main/java/kitchenpos/eatinorders/tobe/domain/OrderTable.java b/src/main/java/kitchenpos/eatinorders/tobe/domain/OrderTable.java new file mode 100644 index 000000000..206c26a5a --- /dev/null +++ b/src/main/java/kitchenpos/eatinorders/tobe/domain/OrderTable.java @@ -0,0 +1,75 @@ +package kitchenpos.eatinorders.tobe.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Objects; +import java.util.UUID; + +@Table(name = "order_table") +@Entity +public class OrderTable { + @Column(name = "id", columnDefinition = "binary(16)") + @Id + private UUID id; + + private String name; + + private int numberOfGuests; + private boolean occupied; + + public OrderTable(final String name, final int numberOfGuests, final boolean occupied) { + if (Objects.isNull(name) || name.isEmpty()) { + throw new IllegalArgumentException(); + } + this.name = name; + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public OrderTable(final int numberOfGuests, final boolean occupied) { + this.numberOfGuests = numberOfGuests; + this.occupied = occupied; + } + + public OrderTable() { + } + + public UUID getId() { + return id; + } + + public String getName() { + return name; + } + + public int getNumberOfGuests() { + return numberOfGuests; + } + + public boolean isOccupied() { + return occupied; + } + + public void makeEmpty() { + numberOfGuests = 0; + occupied = false; + } + + public void setId(final UUID id) { + this.id = id; + } + + public void setName(final String name) { + this.name = name; + } + + public void setNumberOfGuests(final int numberOfGuests) { + this.numberOfGuests = numberOfGuests; + } + + public void setOccupied(final boolean occupied) { + this.occupied = occupied; + } +} diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java index 1c2741f73..d8e49e2a1 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderRestController.java @@ -1,9 +1,15 @@ package kitchenpos.eatinorders.ui; import kitchenpos.eatinorders.application.OrderService; -import kitchenpos.eatinorders.domain.Order; +import kitchenpos.eatinorders.tobe.domain.Order; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.net.URI; import java.util.List; @@ -22,7 +28,7 @@ public OrderRestController(final OrderService orderService) { public ResponseEntity create(@RequestBody final Order request) { final Order response = orderService.create(request); return ResponseEntity.created(URI.create("/api/orders/" + response.getId())) - .body(response); + .body(response); } @PutMapping("/{orderId}/accept") diff --git a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java index 120c28d1d..a8fe6a0de 100644 --- a/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java +++ b/src/main/java/kitchenpos/eatinorders/ui/OrderTableRestController.java @@ -1,7 +1,7 @@ package kitchenpos.eatinorders.ui; import kitchenpos.eatinorders.application.OrderTableService; -import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.tobe.domain.OrderTable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; diff --git a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java index 38d22969c..da87ccf07 100644 --- a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java +++ b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderRepository.java @@ -1,11 +1,16 @@ package kitchenpos.eatinorders.application; -import kitchenpos.eatinorders.domain.Order; import kitchenpos.eatinorders.domain.OrderRepository; import kitchenpos.eatinorders.domain.OrderStatus; -import kitchenpos.eatinorders.domain.OrderTable; +import kitchenpos.eatinorders.tobe.domain.Order; +import kitchenpos.eatinorders.tobe.domain.OrderTable; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; public class InMemoryOrderRepository implements OrderRepository { private final Map orders = new HashMap<>(); @@ -29,7 +34,7 @@ public List findAll() { @Override public boolean existsByOrderTableAndStatusNot(final OrderTable orderTable, final OrderStatus status) { return orders.values() - .stream() - .anyMatch(order -> order.getOrderTable().equals(orderTable) && order.getStatus() != status); + .stream() + .anyMatch(order -> order.getOrderTable().equals(orderTable) && order.getStatus() != status); } } diff --git a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java index 1aa4febce..67e144f24 100644 --- a/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java +++ b/src/test/java/kitchenpos/eatinorders/application/InMemoryOrderTableRepository.java @@ -2,6 +2,7 @@ import kitchenpos.eatinorders.domain.OrderTable; import kitchenpos.eatinorders.domain.OrderTableRepository; +import kitchenpos.eatinorders.tobe.domain.OrderTable; import java.util.*; diff --git a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java index 96bf0f286..ce1392a9e 100644 --- a/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java +++ b/src/test/java/kitchenpos/eatinorders/application/OrderServiceTest.java @@ -1,18 +1,35 @@ package kitchenpos.eatinorders.application; -import kitchenpos.eatinorders.domain.*; +import kitchenpos.eatinorders.domain.OrderRepository; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderTableRepository; +import kitchenpos.eatinorders.domain.OrderType; +import kitchenpos.eatinorders.tobe.domain.Order; import kitchenpos.menus.application.InMemoryMenuRepository; import kitchenpos.menus.domain.MenuRepository; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.*; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.EnumSource; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.NullSource; +import org.junit.jupiter.params.provider.ValueSource; import java.math.BigDecimal; -import java.util.*; - -import static kitchenpos.Fixtures.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +import static kitchenpos.Fixtures.INVALID_ID; +import static kitchenpos.Fixtures.menu; +import static kitchenpos.Fixtures.menuProduct; +import static kitchenpos.Fixtures.order; +import static kitchenpos.Fixtures.orderTable; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -39,17 +56,17 @@ void setUp() { void createDeliveryOrder() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest( - OrderType.DELIVERY, "서울시 송파구 위례성대로 2", createOrderLineItemRequest(menuId, 19_000L, 3L) + OrderType.DELIVERY, "서울시 송파구 위례성대로 2", createOrderLineItemRequest(menuId, 19_000L, 3L) ); final Order actual = orderService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1), - () -> assertThat(actual.getDeliveryAddress()).isEqualTo(expected.getDeliveryAddress()) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getType()).isEqualTo(expected.getType()), + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), + () -> assertThat(actual.getOrderDateTime()).isNotNull(), + () -> assertThat(actual.getOrderLineItems()).hasSize(1), + () -> assertThat(actual.getDeliveryAddress()).isEqualTo(expected.getDeliveryAddress()) ); } @@ -61,11 +78,11 @@ void createTakeoutOrder() { final Order actual = orderService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getType()).isEqualTo(expected.getType()), + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), + () -> assertThat(actual.getOrderDateTime()).isNotNull(), + () -> assertThat(actual.getOrderLineItems()).hasSize(1) ); } @@ -78,12 +95,12 @@ void createEatInOrder() { final Order actual = orderService.create(expected); assertThat(actual).isNotNull(); assertAll( - () -> assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getType()).isEqualTo(expected.getType()), - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), - () -> assertThat(actual.getOrderDateTime()).isNotNull(), - () -> assertThat(actual.getOrderLineItems()).hasSize(1), - () -> assertThat(actual.getOrderTable().getId()).isEqualTo(expected.getOrderTableId()) + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getType()).isEqualTo(expected.getType()), + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.WAITING), + () -> assertThat(actual.getOrderDateTime()).isNotNull(), + () -> assertThat(actual.getOrderLineItems()).hasSize(1), + () -> assertThat(actual.getOrderTable().getId()).isEqualTo(expected.getOrderTableId()) ); } @@ -94,7 +111,7 @@ void create(final OrderType type) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest(type, createOrderLineItemRequest(menuId, 19_000L, 3L)); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("메뉴가 없으면 등록할 수 없다.") @@ -103,14 +120,14 @@ void create(final OrderType type) { void create(final List orderLineItems) { final Order expected = createOrderRequest(OrderType.TAKEOUT, orderLineItems); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } private static List orderLineItems() { return Arrays.asList( - null, - Arguments.of(Collections.emptyList()), - Arguments.of(Arrays.asList(createOrderLineItemRequest(INVALID_ID, 19_000L, 3L))) + null, + Arguments.of(Collections.emptyList()), + Arguments.of(Arrays.asList(createOrderLineItemRequest(INVALID_ID, 19_000L, 3L))) ); } @@ -121,7 +138,7 @@ void createEatInOrder(final long quantity) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); final Order expected = createOrderRequest( - OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, quantity) + OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, quantity) ); assertDoesNotThrow(() -> orderService.create(expected)); } @@ -132,10 +149,10 @@ OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, quan void createWithoutEatInOrder(final long quantity) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest( - OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, quantity) + OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, quantity) ); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("배달 주소가 올바르지 않으면 배달 주문을 등록할 수 없다.") @@ -144,10 +161,10 @@ OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, quantity) void create(final String deliveryAddress) { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest( - OrderType.DELIVERY, deliveryAddress, createOrderLineItemRequest(menuId, 19_000L, 3L) + OrderType.DELIVERY, deliveryAddress, createOrderLineItemRequest(menuId, 19_000L, 3L) ); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("빈 테이블에는 매장 주문을 등록할 수 없다.") @@ -156,10 +173,10 @@ void createEmptyTableEatInOrder() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); final Order expected = createOrderRequest( - OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L) + OrderType.EAT_IN, orderTableId, createOrderLineItemRequest(menuId, 19_000L, 3L) ); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("숨겨진 메뉴는 주문할 수 없다.") @@ -168,7 +185,7 @@ void createNotDisplayedMenuOrder() { final UUID menuId = menuRepository.save(menu(19_000L, false, menuProduct())).getId(); final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 19_000L, 3L)); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다.") @@ -177,7 +194,7 @@ void createNotMatchedMenuPriceOrder() { final UUID menuId = menuRepository.save(menu(19_000L, true, menuProduct())).getId(); final Order expected = createOrderRequest(OrderType.TAKEOUT, createOrderLineItemRequest(menuId, 16_000L, 3L)); assertThatThrownBy(() -> orderService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("주문을 접수한다.") @@ -194,7 +211,7 @@ void accept() { void accept(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, orderTable(true, 4))).getId(); assertThatThrownBy(() -> orderService.accept(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("배달 주문을 접수되면 배달 대행사를 호출한다.") @@ -203,9 +220,9 @@ void acceptDeliveryOrder() { final UUID orderId = orderRepository.save(order(OrderStatus.WAITING, "서울시 송파구 위례성대로 2")).getId(); final Order actual = orderService.accept(orderId); assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED), - () -> assertThat(kitchenridersClient.getOrderId()).isEqualTo(orderId), - () -> assertThat(kitchenridersClient.getDeliveryAddress()).isEqualTo("서울시 송파구 위례성대로 2") + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.ACCEPTED), + () -> assertThat(kitchenridersClient.getOrderId()).isEqualTo(orderId), + () -> assertThat(kitchenridersClient.getDeliveryAddress()).isEqualTo("서울시 송파구 위례성대로 2") ); } @@ -223,7 +240,7 @@ void serve() { void serve(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status)).getId(); assertThatThrownBy(() -> orderService.serve(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("주문을 배달한다.") @@ -239,7 +256,7 @@ void startDelivery() { void startDeliveryWithoutDeliveryOrder() { final UUID orderId = orderRepository.save(order(OrderStatus.SERVED)).getId(); assertThatThrownBy(() -> orderService.startDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("서빙된 주문만 배달할 수 있다.") @@ -248,7 +265,7 @@ void startDeliveryWithoutDeliveryOrder() { void startDelivery(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); assertThatThrownBy(() -> orderService.startDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("주문을 배달 완료한다.") @@ -265,7 +282,7 @@ void completeDelivery() { void completeDelivery(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); assertThatThrownBy(() -> orderService.completeDelivery(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("주문을 완료한다.") @@ -282,7 +299,7 @@ void complete() { void completeDeliveryOrder(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status, "서울시 송파구 위례성대로 2")).getId(); assertThatThrownBy(() -> orderService.complete(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("포장 및 매장 주문의 경우 서빙된 주문만 완료할 수 있다.") @@ -291,7 +308,7 @@ void completeDeliveryOrder(final OrderStatus status) { void completeTakeoutAndEatInOrder(final OrderStatus status) { final UUID orderId = orderRepository.save(order(status)).getId(); assertThatThrownBy(() -> orderService.complete(orderId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("주문 테이블의 모든 매장 주문이 완료되면 빈 테이블로 설정한다.") @@ -301,9 +318,9 @@ void completeEatInOrder() { final Order expected = orderRepository.save(order(OrderStatus.SERVED, orderTable)); final Order actual = orderService.complete(expected.getId()); assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isFalse(), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(0) + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isFalse(), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(0) ); } @@ -315,9 +332,9 @@ void completeNotTable() { final Order expected = orderRepository.save(order(OrderStatus.SERVED, orderTable)); final Order actual = orderService.complete(expected.getId()); assertAll( - () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isTrue(), - () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(4) + () -> assertThat(actual.getStatus()).isEqualTo(OrderStatus.COMPLETED), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().isOccupied()).isTrue(), + () -> assertThat(orderTableRepository.findById(orderTable.getId()).get().getNumberOfGuests()).isEqualTo(4) ); } @@ -332,9 +349,9 @@ void findAll() { } private Order createOrderRequest( - final OrderType type, - final String deliveryAddress, - final OrderLineItem... orderLineItems + final OrderType type, + final String deliveryAddress, + final OrderLineItem... orderLineItems ) { final Order order = new Order(); order.setType(type); @@ -355,9 +372,9 @@ private Order createOrderRequest(final OrderType orderType, final List assertThat(actual.getId()).isNotNull(), - () -> assertThat(actual.getName()).isEqualTo(expected.getName()), - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse() + () -> assertThat(actual.getId()).isNotNull(), + () -> assertThat(actual.getName()).isEqualTo(expected.getName()), + () -> assertThat(actual.getNumberOfGuests()).isZero(), + () -> assertThat(actual.isOccupied()).isFalse() ); } @@ -52,7 +51,7 @@ void create() { void create(final String name) { final OrderTable expected = createOrderTableRequest(name); assertThatThrownBy(() -> orderTableService.create(expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("빈 테이블을 해지할 수 있다.") @@ -69,8 +68,8 @@ void clear() { final UUID orderTableId = orderTableRepository.save(orderTable(true, 4)).getId(); final OrderTable actual = orderTableService.clear(orderTableId); assertAll( - () -> assertThat(actual.getNumberOfGuests()).isZero(), - () -> assertThat(actual.isOccupied()).isFalse() + () -> assertThat(actual.getNumberOfGuests()).isZero(), + () -> assertThat(actual.isOccupied()).isFalse() ); } @@ -81,7 +80,7 @@ void clearWithUncompletedOrders() { final UUID orderTableId = orderTable.getId(); orderRepository.save(order(OrderStatus.ACCEPTED, orderTable)); assertThatThrownBy(() -> orderTableService.clear(orderTableId)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("방문한 손님 수를 변경할 수 있다.") @@ -100,7 +99,7 @@ void changeNumberOfGuests(final int numberOfGuests) { final UUID orderTableId = orderTableRepository.save(orderTable(true, 0)).getId(); final OrderTable expected = changeNumberOfGuestsRequest(numberOfGuests); assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTableId, expected)) - .isInstanceOf(IllegalArgumentException.class); + .isInstanceOf(IllegalArgumentException.class); } @DisplayName("빈 테이블은 방문한 손님 수를 변경할 수 없다.") @@ -109,7 +108,7 @@ void changeNumberOfGuestsInEmptyTable() { final UUID orderTableId = orderTableRepository.save(orderTable(false, 0)).getId(); final OrderTable expected = changeNumberOfGuestsRequest(4); assertThatThrownBy(() -> orderTableService.changeNumberOfGuests(orderTableId, expected)) - .isInstanceOf(IllegalStateException.class); + .isInstanceOf(IllegalStateException.class); } @DisplayName("주문 테이블의 목록을 조회할 수 있다.") diff --git a/src/test/java/kitchenpos/eatinorders/tobe/domain/DeliveryOrderTest.java b/src/test/java/kitchenpos/eatinorders/tobe/domain/DeliveryOrderTest.java new file mode 100644 index 000000000..916bb79d8 --- /dev/null +++ b/src/test/java/kitchenpos/eatinorders/tobe/domain/DeliveryOrderTest.java @@ -0,0 +1,58 @@ +package kitchenpos.eatinorders.tobe.domain; + +import kitchenpos.eatinorders.application.FakeKitchenridersClient; +import kitchenpos.eatinorders.domain.OrderStatus; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +import java.math.BigDecimal; + +import static kitchenpos.eatinorders.tobe.domain.fixture.OrderFixture.createDeliveryOrder; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +/* +- 배달 주문을 등록한다. + - [x] 1개 이상의 등록된 메뉴로 배달 주문을 등록할 수 있다. + - [x] 배달 주소가 올바르지 않으면 배달 주문을 등록할 수 없다. + - [x] 배달 주소는 비워 둘 수 없다. + - [x] 배달 주문의 경우 주문 항목의 수량은 0 이상이어야 한다. +- 배달 주문을 시작한다. + - [x] 배달 주문만 배달 할 수 있다. + - [x] 서빙된 주문만 배달 할 수 있다. +- 주문을 배달 완료한다. + - [x] 배달 중인 주문만 배달 완료할 수 있다. + - [x] 배달 주문의 경우 배달 완료된 주문만 완료할 수 있다. + */ +class DeliveryOrderTest { + @DisplayName("1개 이상의 등록된 메뉴로 배달 주문을 등록할 수 있다.") + @Test + void register() { + assertThatCode(() -> createDeliveryOrder()) + .doesNotThrowAnyException(); + } + + @DisplayName("배달 주문을 시작한다.") + @Test + void startDelivery() { + final Order deliveryOrder = createDeliveryOrder(); + deliveryOrder.accept(new FakeKitchenridersClient()); + deliveryOrder.serve(); + deliveryOrder.startDelivery(); + + assertThat(deliveryOrder.getOrderStatus()).isEqualTo(OrderStatus.DELIVERING); + } + + @DisplayName("주문을 배달 완료한다.") + @Test + void completeDelivery() { + final Order deliveryOrder = createDeliveryOrder(); + deliveryOrder.accept(new FakeKitchenridersClient()); + deliveryOrder.serve(); + deliveryOrder.startDelivery(); + + deliveryOrder.completeDelivery(); + + assertThat(deliveryOrder.getOrderStatus()).isEqualTo(OrderStatus.DELIVERED); + } +} diff --git a/src/test/java/kitchenpos/eatinorders/tobe/domain/EatInOrderTest.java b/src/test/java/kitchenpos/eatinorders/tobe/domain/EatInOrderTest.java new file mode 100644 index 000000000..a4c21cc37 --- /dev/null +++ b/src/test/java/kitchenpos/eatinorders/tobe/domain/EatInOrderTest.java @@ -0,0 +1,68 @@ +package kitchenpos.eatinorders.tobe.domain; + +import kitchenpos.eatinorders.domain.OrderStatus; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static kitchenpos.eatinorders.tobe.domain.fixture.OrderFixture.createEatInOrder; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +/* +공통 +- [x] 주문 유형이 올바르지 않으면 등록할 수 없다. +- [x] 메뉴가 없으면 등록할 수 없다. +- [x] 숨겨진 메뉴는 주문할 수 없다. +- [x] 접수 대기 중인 주문만 접수할 수 있다. +- [x] 접수된 주문만 서빙할 수 있다. +- [] 주문한 메뉴의 가격은 실제 메뉴 가격과 일치해야 한다. + +매장 +- [x] 매장 주문은 주문 항목의 수량이 0 미만일 수 있다. +- [x] 매장 주문의 경우 서빙된 주문만 완료할 수 있다. +- [x] 1개 이상의 등록된 메뉴로 매장 주문을 등록할 수 있다. +- [x] 주문 테이블의 모든 매장 주문이 완료되면 빈 테이블로 설정한다. +- [x] 완료되지 않은 매장 주문이 있는 주문 테이블은 빈 테이블로 설정하지 않는다. +- [x] 빈 테이블에는 매장 주문을 등록할 수 없다. +*/ +public class EatInOrderTest { + @DisplayName("매장 주문 등록") + @ParameterizedTest(name = "{0}") + @ValueSource(strings = { + "주문 유형이 올바르지 않으면 등록할 수 없다.", + "메뉴가 없으면 등록할 수 없다.", + "숨겨진 메뉴는 주문할 수 없다.", + "접수 대기 중인 주문만 접수할 수 있다.", + "매장 주문은 주문 항목의 수량이 0 미만일 수 있다.", + "빈 테이블에는 매장 주문을 등록할 수 없다." + }) + void registerWithEatIn(String message) { + assertThatCode(() -> createEatInOrder()) + .doesNotThrowAnyException(); + } + + @DisplayName("접수된 주문만 서빙할 수 있다.") + @Test + void serve() { + final Order order = createEatInOrder(); + order.accept(); + + order.serve(); + + assertThat(order.getOrderStatus()).isEqualTo(OrderStatus.SERVED); + } + + @DisplayName("주문 테이블의 모든 매장 주문이 완료되면 빈 테이블로 설정한다.") + @Test + void completeAndEmpty() { + final Order eatInOrder = createEatInOrder(); + eatInOrder.accept(); + eatInOrder.serve(); + + eatInOrder.complete(); + + assertThat(eatInOrder.getOrderTable().isOccupied()).isFalse(); + } +} diff --git a/src/test/java/kitchenpos/eatinorders/tobe/domain/TakeOutOrderTest.java b/src/test/java/kitchenpos/eatinorders/tobe/domain/TakeOutOrderTest.java new file mode 100644 index 000000000..d079fb725 --- /dev/null +++ b/src/test/java/kitchenpos/eatinorders/tobe/domain/TakeOutOrderTest.java @@ -0,0 +1,41 @@ +package kitchenpos.eatinorders.tobe.domain; + +import kitchenpos.eatinorders.domain.OrderStatus; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import static kitchenpos.eatinorders.tobe.domain.fixture.OrderFixture.createTakeOutOrder; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatCode; + +/* +- [x] 포장 주문의 경우 서빙된 주문만 완료할 수 있다. +- [x] 1개 이상의 등록된 메뉴로 포장 주문을 등록할 수 있다. +- [x] 포장 주문의 경우 주문 항목의 수량은 0 이상이어야 한다. + */ +public class TakeOutOrderTest { + @DisplayName("포장 주문 등록") + @ParameterizedTest(name = "{0}") + @ValueSource(strings = { + "1개 이상의 등록된 메뉴로 포장 주문을 등록할 수 있다.", + "포장 주문의 경우 주문 항목의 수량은 0 이상이어야 한다." + }) + void registerWithTakeOut(String message) { + assertThatCode(() -> createTakeOutOrder()) + .doesNotThrowAnyException(); + } + + @DisplayName("포장 주문의 경우 서빙된 주문만 완료할 수 있다.") + @Test + void completeTable() { + final Order takeOutOrder = createTakeOutOrder(); + takeOutOrder.accept(); + takeOutOrder.serve(); + + takeOutOrder.complete(); + + assertThat(takeOutOrder.getOrderStatus()).isEqualTo(OrderStatus.COMPLETED); + } +} diff --git a/src/test/java/kitchenpos/eatinorders/tobe/domain/fixture/OrderFixture.java b/src/test/java/kitchenpos/eatinorders/tobe/domain/fixture/OrderFixture.java new file mode 100644 index 000000000..d5d6764cd --- /dev/null +++ b/src/test/java/kitchenpos/eatinorders/tobe/domain/fixture/OrderFixture.java @@ -0,0 +1,58 @@ +package kitchenpos.eatinorders.tobe.domain.fixture; + +import kitchenpos.common.FakeProfanity; +import kitchenpos.common.vo.DisplayedName; +import kitchenpos.common.vo.Price; +import kitchenpos.eatinorders.domain.OrderStatus; +import kitchenpos.eatinorders.domain.OrderType; +import kitchenpos.eatinorders.tobe.domain.Order; +import kitchenpos.eatinorders.tobe.domain.OrderLineItem; +import kitchenpos.eatinorders.tobe.domain.OrderTable; +import kitchenpos.menus.domain.MenuGroup; +import kitchenpos.menus.tobe.domain.Menu; +import kitchenpos.menus.tobe.domain.MenuProduct; +import kitchenpos.products.tobe.domain.Product; + +import java.math.BigDecimal; +import java.util.List; + +public class OrderFixture { + public static Order createEatInOrder() { + final OrderType orderType = OrderType.EAT_IN; + final Menu menu = createMenu(); + final List orderLineItems = List.of(new OrderLineItem(menu, -1L)); + final OrderStatus orderStatus = OrderStatus.WAITING; + final OrderTable orderTable = new OrderTable(5, true); + + return new Order(orderType, orderLineItems, orderStatus, orderTable); + } + + public static Order createTakeOutOrder() { + final OrderType orderType = OrderType.TAKEOUT; + final Menu menu = createMenu(); + final List orderLineItems = List.of(new OrderLineItem(menu, 1L)); + final OrderStatus orderStatus = OrderStatus.WAITING; + final OrderTable orderTable = new OrderTable(5, true); + + return new Order(orderType, orderLineItems, orderStatus, orderTable); + } + + public static Order createDeliveryOrder() { + final OrderType orderType = OrderType.DELIVERY; + final Menu menu = createMenu(); + final List orderLineItems = List.of(new OrderLineItem(menu, 1L)); + final OrderStatus orderStatus = OrderStatus.WAITING; + final OrderTable orderTable = new OrderTable(5, true); + final String address = "테스트-주소"; + + return Order.createDeliveryOrder(orderType, orderLineItems, orderStatus, orderTable, address); + } + + private static Menu createMenu() { + final Price price = new Price(BigDecimal.TEN); + final DisplayedName name = new DisplayedName("치킨 세트", new FakeProfanity()); + final MenuProduct menuProduct = new MenuProduct(2L, new Product(BigDecimal.valueOf(6L))); + return new Menu(price, name, List.of(menuProduct), new MenuGroup()); + } + +}