Skip to content

Latest commit

 

History

History
87 lines (68 loc) · 5.58 KB

README.md

File metadata and controls

87 lines (68 loc) · 5.58 KB

편의점

구매자의 할인 혜택과 재고 상황을 고려하여 최종 결제 금액을 계산하고 안내하는 결제 시스템을 구현한다.

구현할 기능 목록

결제 시스템

  • 사용자가 입력한 상품의 가격과 수량을 기반으로 최종 결제 금액을 계산한다.
    • 총구매액은 상품별 가격과 수량을 곱하여 계산한다.
    • 프로모션 및 멤버십 할인 정책을 반영하여 최종 결제 금액을 산출한다.
  • 구매 내역과 산출한 금액 정보를 영수증으로 출력한다.
  • 영수증 출력 후 추가 구매를 진행할지 또는 종료할지를 선택할 수 있다.

재고 관리 시스템

  • 각 상품의 재고 수량을 고려하여 결제 가능 여부를 확인한다.
  • 고객이 상품을 구매할 때마다, 결제된 수량만큼 해당 상품의 재고에서 차감하여 수량을 관리한다.
    • 재고를 차감함으로써 시스템은 최신 재고 상태를 유지한다.

프로모션 할인

  • 프로모션 할인을 적용한다.
    • 오늘 날짜가 프로모션 기간 내에 포함된 경우에만 할인을 적용한다.
      • 현재 날짜와 시간을 가져오려면 camp.nextstep.edu.missionutils.DateTimes의 now()를 활용한다.
    • 프로모션은 N개 구매 시 1개 무료 증정의 형태로 진행한다.
      • 1+1 또는 2+1 프로모션을 각각 지정된 상품에 적용하며, 동일 상품에 여러 프로모션을 적용하지 않는다.
    • 프로모션 혜택은 프로모션 재고 내에서만 적용할 수 있다.
      • 프로모션 기간 중이라면 프로모션 재고를 우선적으로 차감하며, 프로모션 재고가 부족할 경우에는 일반 재고를 사용한다.
    • 프로모션 적용이 가능한 상품에 대해 고객이 해당 수량보다 적게 가져온 경우, 필요한 수량을 추가로 가져오면 혜택을 받을 수 있음을 안내한다.
    • 프로모션 재고가 부족하여 일부 수량을 프로모션 혜택 없이 결제해야 하는 경우, 일부 수량에 대해 정가로 결제하게 됨을 안내한다.

멤버십 할인

  • 멤버십 회원은 프로모션 미적용 금액의 30%를 할인받는다.
    • 프로모션 적용 후 남은 금액에 대해 멤버십 할인을 적용한다.
    • 멤버십 할인의 최대 한도는 8,000원이다.

영수증 시스템

  • 영수증은 고객의 구매 내역과 할인을 요약한다.
    • 구매 상품 내역: 구매한 상품명, 수량, 가격
    • 증정 상품 내역: 프로모션에 따라 무료로 제공된 증정 상품의 목록
    • 금액 정보
      • 총구매액: 구매한 상품의 총 수량과 총 금액
      • 행사할인: 프로모션에 의해 할인된 금액
      • 멤버십할인: 멤버십에 의해 추가로 할인된 금액
      • 내실돈: 최종 결제 금액
  • 영수증의 구성 요소를 정렬한다.

입출력

입력

  • 사용자가 입력하는 값은 camp.nextstep.edu.missionutils.Console의 readLine()을 활용한다.
  • 구현에 필요한 상품 목록과 행사 목록을 파일 입출력을 통해 불러온다.
    • src/main/resources/products.md과 src/main/resources/promotions.md 파일을 이용한다.
    • 두 파일 모두 내용의 형식을 유지한다면 값은 수정할 수 있다.
  • 구매할 상품과 수량을 입력 받는다.
    • 상품명, 수량은 하이픈(-)으로, 개별 상품은 대괄호([])로 묶어 쉼표(,)로 구분한다. (ex. [콜라-10],[사이다-3])
  • 프로모션 적용이 가능한 상품에 대해 고객이 해당 수량보다 적게 가져온 경우, 그 수량만큼 추가 여부를 입력받는다.
    • Y: 증정 받을 수 있는 상품을 추가한다.
    • N: 증정 받을 수 있는 상품을 추가하지 않는다.
  • 프로모션 재고가 부족하여 일부 수량을 프로모션 혜택 없이 결제해야 하는 경우, 일부 수량에 대해 정가로 결제할지 여부를 입력받는다.
    • Y: 일부 수량에 대해 정가로 결제한다.
    • N: 정가로 결제해야하는 수량만큼 제외한 후 결제를 진행한다.
  • 멤버십 할인 적용 여부를 입력 받는다.
    • Y: 멤버십 할인을 적용한다.
    • N: 멤버십 할인을 적용하지 않는다.
  • 추가 구매 여부를 입력 받는다.
    • Y: 재고가 업데이트된 상품 목록을 확인 후 추가로 구매를 진행한다.
    • N: 구매를 종료한다.

출력

  • 환영 인사와 함께 상품명, 가격, 프로모션 이름, 재고를 출력한다.
    • 만약 재고가 0개라면 재고 없음을 출력한다.

예외 처리

  • 사용자가 잘못된 값을 입력할 경우 IllegalArgumentException를 발생시키고, 그 부분부터 입력을 다시 받는다.
    • Exception이 아닌 IllegalArgumentException, IllegalStateException 등과 같은 명확한 유형을 처리한다.
    • 사용자가 잘못된 값을 입력했을 때, "[ERROR]"로 시작하는 오류 메시지와 함께 상황에 맞는 안내를 출력한다.
      • 구매할 상품과 수량 형식이 올바르지 않은 경우: [ERROR] 올바르지 않은 형식으로 입력했습니다. 다시 입력해 주세요.
      • 존재하지 않는 상품을 입력한 경우: [ERROR] 존재하지 않는 상품입니다. 다시 입력해 주세요.
      • 구매 수량이 재고 수량을 초과한 경우: [ERROR] 재고 수량을 초과하여 구매할 수 없습니다. 다시 입력해 주세요.
      • 기타 잘못된 입력의 경우: [ERROR] 잘못된 입력입니다. 다시 입력해 주세요.