- products.md 파일을 읽고 사용자가 볼 수 있게끔 가공한다.
- promotions.md의 프로모션 목록들의 조건들을 product 클래스에 매핑한다.
- products.md내 각각의 Product의 정보와 Promotion의 정보를 담고 있는 product 클래스를 생성한다.
- 모든 Product를 담고 있는 ProductRepository를 생성한다.
- 매 결제별로 ProductRepository를 통해 Product의 재고를 반영한다.
- 사용자가 입력한 상품의 가격과 수량을 기반으로 결제 금액을 산출한다.
- 영수증이 출력된 후 추가 구매를 진행할지 종료할지 선택이 가능하다.
- 멤버십 사용 여부를 입력받는다.
- 입력이 잘못된 경우 에러를 발생시킨다.
- promotions.md 내의 promotion들을 저장하는 클래스를 만든다. 같은 품목이어도 promotion이 적용되는 수량과 그렇지 않은 수량을 따로 관리한다.
- 프로모션 기간을 확인하고 기간 내라면 프로모션 재고를 우선적으로 차감할 수 있게 한다.
- 프로모션 적용이 가능한 상품에 대해 고객이 해당 수량보다 적게 가져온 경우, 필요한 수량을 추가로 가져오면 혜택을 받을 수 있음을 안내한다.
- 프로모션 재고가 부족하여 일부 수량을 프로모션 혜택 없이 결제해야 하는 경우, 일부 수량에 대해 정가로 결제하게 됨 을 안내한다.
- 최대 한도(8000원)를 담고 있는 membership 클래스를 생성한다.
- 멤버십 할인 요청이 들어오면 프로모션 미적용 금액에서 30퍼센트를 한도에서 제하고 영수증에 이를 반영한다.
- 총구매액은 상품별 가격과 수량을 곱하여 계산하며, 프로모션 및 멤버십 할인 정책을 반영하여 최종 결제 금액을 산출한다.
- 영수증은 고객의 구매 내역과 할인을 요약하여 주어진 양식에 맞게 출력한다.
- 영수증의 구성 요소를 보기 좋게 정렬하여 고객이 쉽게 금액과 수량을 확인할 수 있게 한다.