@@ -0,0 +1,302 @@
+# 🎄 크리스마스 프로모션
+
+우테코 식당의 크리스마스 프로모션을 위한 '이벤트 플래너' 프로젝트입니다.
+
+고객이 식당에 방문할 날짜와 메뉴를 미리 선택하면 주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용을 보여줍니다. 
+
+## 🎁 차례
+[1. 기능 요구사항](#-기능-요구사항)
+
+[2. 기능 목록](#-기능-목록)
+
+[3. 주요 클래스와 메서드](#-주요-클래스와-메서드)
+
+
+## 🎁 기능 요구사항
+### 방문할 날짜 선택
+  - 1이상 31이하의 숫자만 입력 가능하다. 
+  - 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요." 출력한다.
+
+### 메뉴
+- 메뉴의 종류는 에피타이저, 메인, 디저트, 음료가 있다.
+- 에피타이저
+  - 양송이수프(6,000), 타파스(5,500), 시저샐러드(8,000)
+- 메인
+  - 티본스테이크(55,000), 바비큐립(54,000), 해산물파스타(35,000), 크리스마스파스타(25,000)
+- 디저트
+  - 초코케이크(15,000), 아이스크림(5,000)
+- 음료
+  - 제로콜라(3,000), 레드와인(60,000), 샴페인(25,000)
+
+### 메뉴 선택
+  - 주문할 메뉴와 개수를 입력한다. (e.g. "타파스-1,해산물파스타-2,레드와인-2")
+  - 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
+  - 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력한다.
+  - 메뉴의 개수가 1 이상의 숫자가 아닌 경우 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력한다.
+  - 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력한다.
+
+### 혜택 플랜 안내
+  - 주문 메뉴 안내
+    - 주문한 메뉴와 개수 출력한다.
+      ```
+      <주문 메뉴>
+      타파스 1개
+      해산물파스타 2개
+      레드와인 2개
+      ```
+
+  - 총주문 금액 안내
+    - 할인 전 총주문 금액을 출력한다.
+      ```
+      <할인 전 총주문 금액>
+      195,500원
+      ```
+    
+  - 증정 메뉴 안내
+    - 증정 사항이 없는 경우 "없음" 출력한다.
+    - 증정 있는 경우 증정품과 증정 개수를 출력한다.
+      ```
+      <증정 메뉴>
+      샴페인 1개
+      ```
+
+  - 혜택 내역 안내
+    - 여러개의 혜택이 적용될 수 있다.
+    - 적용된 이벤트 내역만 출력한다.
+    - 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"을 출력한다. 
+      ```
+      크리스마스 디데이 할인: -3,400원
+      특별 할인: -1,000원
+      증정 이벤트: -25,000원
+      ```
+    
+  - 총혜택 금액 안내
+    - 총 혜택 금액은 할인 금액의 합계와 증정 메뉴의 가격을 합한 금액이다.
+       ```
+      <총혜택 금액>
+      -29,400원
+      ```   
+
+  - 할인 후 예상 결제 금액 안내
+    - 예상 결제 금액은 할인 전 총주문 금액에서 할인 금액을 제한 금액이다.
+       ```
+      <할인 후 예상 결제 금액>
+      199,900원
+      ```   
+
+  - 12월 이벤트 배지 안내
+    - 총혜택 금액에 따라 받은 배지를 출력한다.
+      ```
+      <12월 이벤트 배지>
+      산타
+      ```
+      
+
+### 주문
+- 음료만 주문 시, 주문할 수 없다.
+- 메뉴는 한 번에 최대 20개 까지만 주문할 수 있다. 
+  - (e.g. 시저샐러드-1, 티본스테이크-1, 크리스마스파스타-1, 제로콜라-3, 아이스크림-1의 총개수는 7개)
+
+### 이벤트
+- 할인
+  - 디데이 할인
+    - 적용 기간 : 2023.12.1 ~ 2023.12.25
+    - 할인 대상 : 총 주문 금액
+    - 할인 금액 : 날짜별 할인 금액
+      - 1,000원으로 시작, 날마다 할인 금액이 100원씩 증가
+      - (e.g. 시작일인 12월 1일에 1,000원, 25일엔 3,400원 할인)
+  - 평일 할인
+    - 적용 기간 : 2023.12.1 ~ 2023.12.31 내 매주 일요일 ~ 목요일
+    - 할인 대상 : 디저트 메뉴 금액
+    - 할인 금액 : 디저트 메뉴 1개당 2,023원 할인 
+      - (e.g. 디저트 두 개 주문 시 4,046원 할인)
+  - 주말 할인
+    - 적용 기간 : 2023.12.1 ~ 2023.12.31 내 매주 금요일, 토요일
+    - 할인 대상 : 메인 메뉴
+    - 할인 금액 : 메인 메뉴 1개당 2,023원 할인
+  - 특별 할인
+    - 적용 기간 : 2023.12.1 ~ 2023.12.31 내 이벤트 달력에 별이 있는 날들
+    - 할인 대상 : 총 주문 금액
+    - 할인 금액 : 1,000원 할인 
+- 증정
+  - 적용 기간 : 2023.12.1 ~ 2023.12.31
+  - 증정 조건 : 할인 전 총 주문 금액이 12만원 이상
+  - 증정품 : 샴페인 1개
+- 할인과 증정은 중복될 수 있다.
+- 모든 이벤트는 총주문 금액 10,000원 이상일때 적용 가능하다.
+
+### 이벤트 배지
+- 총혜택 금액에 따라 배지가 다르다. 
+  - 별 : 총혜택 금액이 오천원 이상
+  - 트리 : 총혜택 금액이 1만원 이상
+  - 산타 : 총혜택 금액이 2만원 이상
+
+## 🎁 기능 목록
+
+### 방문 날짜
+- [x] 1~31 중 방문 날짜를 선택할 수 있다.
+  - [x] 예외 처리
+    - [x] 1~31의 숫자가 아닌 경우 "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지를 출력하고 다시 입력받는다.
+- [x] 선택한 방문 날짜가 무슨 요일인지 판별한다.
+- [x] 선택한 방문 날짜가 특정날로부터 몇번째 날짜인지 판별한다.
+- [x] 선택한 방문 날짜가 특정 날짜들 중 하나인지 판별한다.
+- [x] 선택한 방문 날짜가 특정 기간에 포함되는 지 판별한다. 
+
+### 메뉴 선택
+- [x] 고객은 메뉴에 존재하는 메뉴를 주문할 수 있다.
+  - [x] 주문한 상품이 메뉴에 존재하는지 판단한다.
+- [x] 예외 처리
+  - [x] 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력하고 다시 입력받는다.
+  - [x] 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력하고 다시 입력받는다.
+  - [x] 주문 개수가 1보다 작은 경우 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력하고 다시 입력받는다.
+- [x] 선택한 메뉴의 총 개수를 구한다.
+- [x] 선택한 메뉴들이 모두 특정 카테고리에 해당하는지 구한다.
+- [x] 선택한 메뉴들 중 특정 카테고리에 해당하는 메뉴의 개수를 구한다.
+- [x] 총 주문 금액을 구한다.
+ 
+### 주문 
+- [x] 예외 처리 
+  - [x] 음료만 주문 시 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력하고 다시 입력받는다.
+  - [x] 주문 메뉴가 20개 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력하고 다시 입력받는다.
+- [x] 적용된 증정품을 구한다.
+- [x] 총 혜택 금액을 구한다.
+- [x] 총 할인 금액을 구한다.
+
+### 이벤트 적용
+- [x] 10000원 이상이면 이벤트를 적용한다.
+- [x] 적용되는 디데이 할인 금액을 구한다.
+- [x] 적용되는 평일 할인 금액을 구한다.
+- [x] 적용되는 주말 할인을 구한다.
+- [x] 적용되는 특별 할인 금액을 구한다.
+- [x] 할인 전 총 주문 금액이 12만원 이상이면 증정품을 증정한다.
+- [x] 증정품 적용 금액을 구한다.
+
+### 이벤트 배지
+- [x] 총 혜택 금액에 따른 배지를 구한다.
+
+### 입력
+- [x] 방문 날짜를 입력받는다.
+  - [x] 예외 처리
+    - [x] 숫자가 아닌 경우 에러 메시지를 출력하고 다시 입력받는다.
+- [x] 메뉴를 입력받는다.
+  - [x] 예외 처리
+    - [x] 메뉴의 개수는 1 이상의 숫자가 아닌 경우 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
+    - [x] 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
+
+### 출력
+- [x] 주문 메뉴를 출력한다.
+- [x] 할인 전 총주문 금액을 출력한다.
+- [x] 증정 메뉴를 출력한다.
+  - [x] 없으면 "없음"을 출력한다.
+- [x] 혜택 내역을 출력한다.
+  - [x] 없으면 "없음"을 출력한다.
+- [x] 총혜택 금액을 출력한다.
+- [x] 할인 후 예상 결제 금액을 출력한다.
+- [x] 12월 이벤트 배지를 출력한다.
+  - [x] 없으면 없음을 출력한다.
+
+
+## 🎁 주요 클래스와 메서드
+<table>
+    <thead>
+        <tr>
+            <th>클래스</th></th>
+            <th>소개</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <td rowspan=2>Date</td>
+            <td>방문 날짜를 추상화한 클래스<br> 1 ~ 31 사이의 정수만 가질  수 있는 자료구조 </td>
+        </tr>
+        <tr>
+            <td>dayFromDate(int) : 방문 날짜가 파라미터의 날짜로부터 몇번째 날인지 반환<br>
+                dayOfWeek(): 방문 날짜가 무슨 요일인지 반환<br>
+                isIncluded(List&lt;Integer&gt;): 방문 날짜가 파라미터로 들어온 날짜들 중 하나인지 반환<br>
+                isInRange(int,int): 방문날짜가 파라미터로 들어온 첫번째 날짜와 두번째 날짜 사이의 날인지 반환 </td>
+        </tr>
+        <tr>
+            <td rowspan=2>Menus</td>
+            <td>선택한 메뉴들을 추상화한 클래스<br>메뉴판의 메뉴들을 최대 20개까지 담을 수 있는 자료구조</td>
+        </tr>
+        <tr>
+            <td>isAllInCategory(Category): 선택한 메뉴들이 모두 파라미터로 들어온 카테고리의 메뉴인지 반환<br>
+                countByCategory(Category): 선택한 메뉴들 중 파라미터로 들어온 카테고리에 해당하는 메뉴의 개수를 반환<br>
+                totalCount(): 선택한 메뉴들의 총개수를 반환<br>
+                totalAmount(): 선택한 메뉴들의 총금액을 반환 <br></td>
+        </tr>
+        <tr>
+            <td rowspan=2>Order</td>
+            <td>주문을 추상화한 클래스<br>음료만 주문하거나 20개 넘는 주문은 허용하지 않는 자료구조</td>
+        </tr>
+        <tr>
+            <td>benefitDetails(): 선택한 날짜에 선택한 메뉴들을 주문하면 받게되는 해택 내역 반환<br>
+                totalBenefit(): 적용되는 모든 혜택을 합한 금액을 반환<br>
+                totalDiscount(): 적용되는 모든 할인을 합한 금액을 반환<br>
+                finalAmount(): 할인 적용 후 실제 결제할 금액을 반환<br></td>
+        </tr>
+    </tbody>
+</table>
+
+
+<table>
+    <thead>
+        <tr>
+            <th>구분</th>
+            <th>클래스</th>
+            <th>소개</th>
+        </tr>
+    </thead>
+    <tbody>
+        <tr>
+            <td rowspan=2>인터페이스</td>
+            <td rowspan=2>EventPolicy</td>
+            <td>증정/할인 이벤트를 추상화한 인터페이스</td>
+        </tr>
+        <tr>
+            <td>isApplicableMenus(Menus): 선택한 메뉴들이 10000원 이상인지 반환<br>
+          			canBeApplied(Date, Menus): 이벤트 조건에 만족하는 날짜/메뉴인지 반환하는 추상메서드<br> 			amount(Date, Menus): 이벤트 적용 금액을 반환하는 추상메서드</td>
+        </tr>
+        <tr>
+            <td rowspan=10>구현체</td>
+            <td rowspan=2>DDayDiscount</td>            
+            <td>디데이 할인을 추상화한 클래스</td>
+        </tr>
+        <tr>
+            <td>canBeApplied(Date, Menus):  선택한 메뉴들이 10000원 이상이면서 방문일이 1~25 사이 인지 반환<br>
+          			amount(Date, Menus): 날짜에 따라 적용 가능한 디데이 할인 금액 반환</td>
+        </tr>
+        <tr>
+            <td rowspan=2>WeekdayDiscount</td>            
+            <td>평일 할인을 추상화한 클래스</td>
+        </tr>
+        <tr>
+            <td>canBeApplied(Date, Menus):  선택한 메뉴들이 10000원 이상이면서 방문일이 평일인지 반환<br>
+          			amount(Date, Menus): 디저트 개수로 적용 가능한 평일 할인 금액 반환</td>
+        </tr>
+      <tr>
+            <td rowspan=2>WeekendDiscount</td>            
+            <td>주말 할인을 추상화한 클래스</td>
+        </tr>
+        <tr>
+            <td>canBeApplied(Date, Menus):  선택한 메뉴들이 10000원 이상이면서 방문일이 주말인지 반환<br>
+          			amount(Date, Menus): 메인 메뉴개수로 적용 가능한 주말 할인 금액 반환</td>
+        </tr>        
+      <tr>
+            <td rowspan=2>SpecialDiscount</td>            
+            <td>특별 할인을 추상화한 클래스</td>
+        </tr>
+        <tr>
+            <td>canBeApplied(Date, Menus):  선택한 메뉴들이 10000원 이상이면서 방문일이 별달린 날인지 반환<br>
+          			amount(Date, Menus): 적용 가능한 특별 할인 금액 반환</td>
+        </tr>        <tr>
+            <td rowspan=2>Giveaway</td>            
+            <td>증정 이벤트를 추상화한 클래스</td>
+        </tr>
+        <tr>
+            <td>canBeApplied(Date, Menus):  선택한 메뉴들이 120000원 이상인지 반환<br>
+          			amount(Date, Menus): 적용가능한 증정품 금액을 반환<br>
+  					giveGiveaway(Date, Menus): 적용가능한 증정품과 증정품 금액을 반환</td>
+        </tr>
+    </tbody>
+</table>

리뷰: 기능이 세세하고 주요 클래스 정리되어 있어서 이해하기 편했습니다.
프로젝트 구조가 어떻게 이루어져있는지도 작성해주시면 더 이해하기 좋을것 같네요! 😀