키친포스

요구 사항

  • 간단한 매장의 포스기를 구현한다.

  • 상품

    • 상품에는 가격과 이름이 있어야 한다.
    • 상품을 등록할 수 있다.
      • 가격이 음수인 경우 예외를 발생시킨다.
      • 이름이 비속어를 포함한 경우, 예외를 발생시킨다.
      • 상품은 고유한 Id로 구별한다.
    • 상품은 가격만 변동될 수 있다.
      • 가격이 음수인 경우 예외를 발생시킨다.
      • 기존에 등록된 상품만 가격을 변경할 수 있다.
      • 상품을 찾지 못한 경우, 예외를 발생시킨다.
    • 등록된 상품의 목록을 조회할 수 있다.
  • 메뉴

    • 메뉴는 이름과 가격, 그리고 display 상태가 있다.
    • 메뉴는 여러 개의 상품 조합으로 이루어져 있다. (menu_product)
      • 메뉴에 등록되는 상품이 없을 경우, 예외를 발생시킨다.
      • 메뉴에 등록되어 있는 상품은 모두 상품 목록에 있어야 한다.
      • 메뉴에 등록될 상품은 0개 이상의 수량을 가진다.
    • 메뉴의 가격이 음수인 경우, 예외를 발생시킨다.
    • 메뉴를 등록할 수 있다.
      • 메뉴는 고유한 Id로 구별한다.
      • 메뉴를 등록할 때, menuGroup을 지정해야 한다.
      • 메뉴를 등록할 때, 가격의 정합성이 맞지 않으면 예외를 발생시킨다.
    • 메뉴는 가격이나 display 상태를 변경할 수 있다.
      • 메뉴의 가격을 변경하거나, display 상태로 변경할 때, 가격의 정합성이 맞지 않으면 예외를 발생시킨다.
      • 메뉴 목록에 없을 경우, 예외를 발생시킨다.
    • 메뉴의 이름이 비속어가 포함될 경우, 예외를 발생시킨다.
    • 등록된 메뉴의 목록을 조회할 수 있다.
    • 상품의 가격을 변경할 때, 상품이 속한 메뉴 가격과 정합성이 맞지 않으면 해당 메뉴를 hide한다.
  • 메뉴 그룹

    • 메뉴 그룹은 이름으로 구성된다.
    • 메뉴는 특성에 따라 분류할 수 있다. (menu_group)
      • 메뉴 그룹의 이름이 비어있을 경우, 예외를 발생시킨다.
    • 메뉴 그룹을 등록할 수 있다.
      • 메뉴 그룹은 고유한 Id로 구별한다.
    • 등록된 메뉴 그룹의 목록을 조회할 수 있다.
  • 주문

    • 주문은 배달받을 주소, 주문 시간, 주문 상태, 주문 유형, 매장 내 테이블 번호로 구성된다.
      • 주문 상태는 WAITING, ACCEPTED, SERVED, DELIVERING, DELIVERED, COMPLETED가 있다.
      • 주문 유형은 테이크아웃, 배달, 매장 내 식사가 있으며, 주문 유형이 없을 경우 예외를 발생시킨다.
    • 주문은 여러 개의 메뉴 조합으로 이루어져 있다. (order_line_item)
      • 주문할 메뉴는 가격과 수량이 포함되어야 한다.
    • 주문을 등록할 수 있다.
      • 주문은 고유한 Id로 구별한다.
      • 주문할 메뉴의 목록이 비어있을 경우, 예외를 발생시킨다.
      • 주문에 등록되어 있는 메뉴는 모두 메뉴 목록에 있어야 한다.
      • 주문할 메뉴의 수량이 0 미만인 경우, 예외를 발생시킨다.
      • 주문할 메뉴가 display 상태가 아닌 경우, 예외를 발생시킨다.
      • 주문할 때 가격의 정합성이 맞지 않는 경우, 예외를 발생시킨다.
      • 주문 유형이 배달일 때, 배달 받을 주소가 비어있을 경우, 예외를 발생시킨다.
      • 주문 유형이 매장 내 식사일 때, 매장 내 테이블 번호(order_table_id)는 필수로 입력해야 한다.
        • 배정받은 주문 테이블이 테이블 목록에 있어야 한다.
        • 주문 전에 미리 테이블을 배정받아야 한다.
        • 배정받은 테이블이 빈 테이블인 경우, 예외를 발생시킨다.
    • 주문 상태는 변경될 수 있다.
      • 주문 목록에 없는 경우 예외를 발생시킨다.
      • 주문을 수락할 수 있다.
        • 주문 상태가 waiting이 아닌 경우, 예외를 발생시킨다.
        • 주문 유형이 배달인 경우, kitchenridersClient에 배달을 요청한다.
        • 수락 상태로 변경한다.
      • 주문을 서빙할 수 있다.
        • 주문 상태가 accepted가 아닌 경우, 예외를 발생시킨다.
        • 서빙 상태로 변경한다.
      • 배달을 시작할 수 있다.
        • 주문 유형이 delivery가 아니거나 주문 상태가 Served가 아닌 경우, 예외를 발생시킨다.
        • 배달 중 상태로 변경한다.
      • 배달을 완료할 수 있다.
        • 주문 유형이 delivery가 아니거나 주문 상태가 delivering이 아닌 경우, 예외를 발생시킨다.
        • 배달 완료 상태로 변경한다.
      • 주문을 완료할 수 있다.
        • 주문 유형이 배달인 경우, 상태가 delivered가 아니면 예외를 발생시킨다.
        • 주문 유형이 takeout이거나 매장 내 식사 인 경우, 상태가 served가 아니면 예외를 발생시킨다.
        • 주문 완료 상태로 변경한다.
    • 주문 목록을 조회할 수 있다.
  • 주문한 테이블

    • 매장 내 테이블은 테이블 이름, 공석 여부, 손님 수로 구성된다. (order_table)
    • 매장 내 테이블은 등록할 수 있다.
      • 매장 내 테이블은 테이블 이름으로 등록할 수 있으며, 초기 상태는 공석, 손님 수 0이다.
      • 매장 내 테이블은 고유한 Id로 구별한다.
      • 매장 내 테이블의 이름이 비어있을 경우, 예외를 발생시킨다.
    • 매장 내 테이블의 상태를 변경할 수 있다.
      • 매장 내 테이블에 손님이 앉을 수 있다.
      • 매장 내 테이블을 치울 수 있다.
      • 이미 배정된 테이블에는 손님 수가 변경될 수 있다.
        • 손님 수가 0 미만인 경우 예외를 발생시킨다.
        • 손님 수가 변경될 때 테이블이 비어있으면 예외를 발생시킨다.
    • 매장 내 등록된 테이블 목록을 조회할 수 있다.
    • 매장 내 식사인 경우, 손님이 식사를 완료했을 때 테이블을 치운다.

용어 사전

한글명 영문명 설명

모델링