Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[크리스마스 프로모션] 강승구 미션 제출합니다. #4

Open
wants to merge 91 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
91 commits
Select commit Hold shift + click to select a range
c3f9264
[Docs]: 요구사항 정리
Win-9 Nov 12, 2023
4fe1e27
[Feat]: Enum타입 정리
Win-9 Nov 13, 2023
576565a
[Feat]: 음식객체 추가
Win-9 Nov 13, 2023
394bca7
[Feat]: 음식타입 분리
Win-9 Nov 13, 2023
e5c9586
[Feat]: 주문객체 생성
Win-9 Nov 13, 2023
dea672c
[Refactor]: 사용하지 않는 메소드 삭제
Win-9 Nov 13, 2023
eb56905
[Feat]: 사용자 객체 추가
Win-9 Nov 13, 2023
e69e31f
[Feat]: 날짜 입력 검증로직 추가
Win-9 Nov 13, 2023
987bc6e
[Feat]: 입출력 역할 분리
Win-9 Nov 13, 2023
60f17cd
[Chore]: 패키지명 변경
Win-9 Nov 13, 2023
21161bf
[Feat]: 날짜입력 서비스로직 구현
Win-9 Nov 13, 2023
461b519
[Feat]: 날짜입력 서비스로직 사용
Win-9 Nov 13, 2023
f8358c0
[Feat]: 메뉴입력 분리
Win-9 Nov 13, 2023
f879945
[Feat]: 메뉴 입력
Win-9 Nov 13, 2023
1fda319
[Feat]: textType 변경
Win-9 Nov 13, 2023
e5e17fb
[Feat]: textType 변경
Win-9 Nov 13, 2023
9374637
[Feat]: 미리보기 콘솔로직 추가
Win-9 Nov 13, 2023
1b26ecd
[Feat]: 주문메뉴 보여주는 로직 구현
Win-9 Nov 13, 2023
ceed351
[Feat]: 총 계산 금액 로직 추가
Win-9 Nov 13, 2023
81ee659
[Feat]: 할인 전 금액 출력 로직 구현
Win-9 Nov 13, 2023
643f8e4
[Feat]: 날짜별로의 타입 추가
Win-9 Nov 14, 2023
b8cfe27
[Feat]: 크리스마스 이벤트 할인금액 로직 구현
Win-9 Nov 14, 2023
6458382
[Feat]: 없음 텍스트 추가
Win-9 Nov 14, 2023
63655ed
[Feat]: 혜택 Enum 추가
Win-9 Nov 14, 2023
b77d429
[Feat]: 혜택 내역 출력 로직 구현
Win-9 Nov 14, 2023
c6eb2e5
[Feat]: 구매하지 않는 품목은 제외하도록 변경
Win-9 Nov 14, 2023
522b615
[Feat]: 혜택내역 출력 로직 구현
Win-9 Nov 14, 2023
438b7ba
[Feat]: 혜택 리스트 종합 로직 구현
Win-9 Nov 14, 2023
e12ecdb
[Feat]: 혜택 리스트 종합 메소드 분리
Win-9 Nov 14, 2023
85ba505
[Feat]: controller 흐름 정리
Win-9 Nov 14, 2023
449903d
[Fix]: 출력이 되지 않는 오류 수정
Win-9 Nov 14, 2023
8264aff
[Feat]: 출력양식문 추가
Win-9 Nov 14, 2023
89ef41c
[Fix]: 문법오류 수정
Win-9 Nov 14, 2023
191846b
[Refactor]: 상수 정리
Win-9 Nov 14, 2023
5cf0207
[Refactor]: 상수 정리
Win-9 Nov 14, 2023
7e364b1
[Feat]: 메소드 순서 변경
Win-9 Nov 14, 2023
52aed5d
[Feat]: 에러타입 추가
Win-9 Nov 14, 2023
df2fecd
[Feat]: 에러출력 메소드 추가
Win-9 Nov 14, 2023
a0858ba
[Fix]: 존재여부값 부정 변경
Win-9 Nov 14, 2023
6b30665
[Feat]: 메뉴 추가
Win-9 Nov 14, 2023
08f6226
[Fix]: 내역이 보이지 않는 오류 수정
Win-9 Nov 14, 2023
b4d7a19
[Fix]: 입력형식 수정
Win-9 Nov 14, 2023
9c12a86
[Feat]: 메소드 순서 변경
Win-9 Nov 14, 2023
0e6d819
[Feat]: 메뉴 가격 수정
Win-9 Nov 14, 2023
fe4b936
[Fix]: 갯수반영이 되지 않는 오류 수정
Win-9 Nov 14, 2023
bf216cb
[Refactor]: 총 가격 로직 분리
Win-9 Nov 14, 2023
ff13c08
[Fix]: 증정메뉴가 바뀌지 않는 오류 수정
Win-9 Nov 14, 2023
29d31f2
[Feat]: 크리스마스 할인 로직 변경
Win-9 Nov 14, 2023
1ea8561
[Fix]: 특별, 일반 할인을 구별하지 못하는 오류 수정
Win-9 Nov 14, 2023
054a43b
[Feat]: 특별, 평일, 주말할인 구별
Win-9 Nov 14, 2023
20e879d
[Feat]: 특별, 평일, 주말할인 구별
Win-9 Nov 14, 2023
ce018d7
[Feat]: 특별, 평일, 주말할인 구별
Win-9 Nov 14, 2023
835ff6d
[Feat]: 혜택금액, 할인금액 구분과 이에따른 메소드 이름 변경
Win-9 Nov 14, 2023
99820f0
[Fix]: 한칸이 더 띄어지는 오류 수정
Win-9 Nov 14, 2023
cf78efe
[Fix]: 혜택이 아닌 할인 기준으로 배지를 선정하는 오류 수정
Win-9 Nov 14, 2023
e7acf3e
[Feat]: 날짜에 대한 에러 추가
Win-9 Nov 15, 2023
2550c4d
[Feat]: 주문검사 로직 변경
Win-9 Nov 15, 2023
0b5d5b4
[Refactor]: 정규식을 상수이용으로 변경
Win-9 Nov 15, 2023
26af20c
[Feat]: 메뉴 잘못 입력시 사용자 에러 추가
Win-9 Nov 15, 2023
d887c28
[Feat]: 날짜에 대한 에러 추가
Win-9 Nov 15, 2023
ef98aeb
[Feat]: 메뉴 검증 에러로직 구현
Win-9 Nov 15, 2023
34815b6
[Refactor]: 역할 분리로 메소드 이동
Win-9 Nov 15, 2023
9c0af5e
[Refactor]: 역할 분리로 메소드 이동
Win-9 Nov 15, 2023
caf4942
[Feat]: 중복메뉴 입력 처리로직 구현
Win-9 Nov 15, 2023
e353a1f
[Feat]: 1미만의 메뉴입력 에러처리로직과 메소드 분리
Win-9 Nov 15, 2023
1e23a23
[Feat]: 메소드 분리 및 20개 초과 주문시 에러 발생
Win-9 Nov 15, 2023
ec5fb87
[Feat]: 메소드 분리 및 20개 초과 주문과 음료만 주문시 에러 발생
Win-9 Nov 15, 2023
bdc3638
[Feat]: 모든 할인은 10000원 이상시 적용되도록 변경
Win-9 Nov 15, 2023
e09fd15
[Refactor]: Map으로 변경하는 로직 변경
Win-9 Nov 15, 2023
1df700a
[Feat]: 에러를 보여주도록 변경
Win-9 Nov 15, 2023
97a7f3d
[Test]: 날짜 입력 테스트 구현
Win-9 Nov 15, 2023
5870982
[Test]: 음식 주문에 대한 테스트 구현
Win-9 Nov 15, 2023
d848240
[Refactor]: 메소드 분리로 접근제한 변경
Win-9 Nov 15, 2023
992b7a2
[Feat]: 각은 객체를 참조하도록 변경
Win-9 Nov 15, 2023
51e426c
[Test]: 주문 정상입력 테스트 추가
Win-9 Nov 15, 2023
c933198
[Test]: 혜택 금액 테스트 추가
Win-9 Nov 15, 2023
c9a71d1
[Test]: 날짜 입력 오류 수정
Win-9 Nov 15, 2023
4347c6f
[Test]: 혜택, 할인 테스트 분리
Win-9 Nov 15, 2023
20fa69d
[Test]: 날짜 입력 예외 테스트 추가
Win-9 Nov 15, 2023
742acd7
[Test]: 날짜 입력 예외 테스트 추가
Win-9 Nov 15, 2023
d38ce51
[Test]: 주문입력 예외 테스트 추가
Win-9 Nov 15, 2023
09dbe85
[Test]: 주문입력 출력 테스트 구현
Win-9 Nov 15, 2023
72f9264
[Fix]: 음료 검증 로직 변경
Win-9 Nov 15, 2023
74958ac
[Test]: 음료 주문 예외테스트 구현
Win-9 Nov 15, 2023
716ab96
[Test]: 금액에 따른 출력 테스트 구현
Win-9 Nov 15, 2023
23a1d6b
[Test]: 금액에 따른 배지 출력 추가
Win-9 Nov 15, 2023
79da06a
[Test]: 컨벤션에 따라 정리
Win-9 Nov 15, 2023
ff90411
[Docs]: 요구사항 체크
Win-9 Nov 15, 2023
1f59d1a
[Test]: 혜택이 없는 테스트 구현
Win-9 Nov 15, 2023
398be70
[Style]: 코드 포맷팅 수정
Win-9 Nov 15, 2023
a8aa605
[Style]: 상수 정리, 사용하지 않는 파라미터 정리
Win-9 Nov 15, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions docs/요구사항.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
## 이벤트 요구 사항

- [ X ] 크리스마스 디데이 할인 기간은 12.1 ~ 12.25 이다.
- [ X ] 1,000원으로 시작하여 크리스마스가 다가올수록 날마다 할인 금액이 100원씩 증가한다.
- [ X ] 총주문 금액에서 해당 금액만큼 할인된다.
- [ X ] 평일 할인은 일요일 ~ 목요일이다.
- [ X ] 디저트 메뉴를 1개당 2023원 할인한다.
- [ X ] 주말 할인은 금요일, 토요일이다.
- [ X ] 메인 메뉴를 2023원 할인한다.
- [ X ] 특별 할인은 이벤트 달력에 별이 있으면 총 주문금액에서 1000원 할인한다.
- [ X ] 증정이벤트는 할인 전 총 주문금액이 12만원 이상일 시 샴페인을 1개 증정한다.
- [ X ] 크리스마스 디데이 할인을 제외한 다른 이벤트는 12월 모두 적용이다.


## 배지

- [ X ] 5천원 이상은 별이다.
- [ X ] 만원 이상은 트리이다.
- [ X ] 2만원 이상은 산타이다.

## 주의사항

- [ X ] 총 주문 금액 만원부터 이벤트를 적용한다.
- [ X ] 음료만 주문은 불가능하다.
- [ X ] 주문은 한번에 최대 20개이다.


## 개발 요청사항
- [ X ] 고객들이 식당에 방문할 날짜와 메뉴를 미리 선택하면 이벤트 플래너가 주문 메뉴, 할인 전 총주문 금액, 증정 메뉴, 혜택 내역, 총혜택 금액, 할인 후 예상 결제 금액, 12월 이벤트 배지 내용을 보여준다.
- [ X ] 모든 에러 메시지는 "[ERROR]"로 시작한다.
- [ X ] 잘못된 값을 입력시 그 지점부터 재입력을 받는다.
- [ X ] 주문 메뉴의 출력 순서는 자유롭게 출력한다.
- [ X ] 총혜택 금액에 따라 이벤트 배지의 이름을 다르게 보여 준다.
- [ X ] 총혜택 금액 = 할인 금액의 합계 + 증정 메뉴의 가격이다.
- [ X ] 할인 후 예상 결제 금액 = 할인 전 총주문 금액 - 할인 금액이다.

### 방문날짜
- [ X ] 방문한 날짜는 1이상 31이하의 숫자만 받는다.
- [ X ] 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지를 보여준다.

### 주문
- [ X ] 고객이 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여준다.
- [ X ] 메뉴의 개수는 1 이상의 숫자만 입력되도록 해주세요. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여준다.
- [ X ] 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여준다.
- [ X ] 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지를 보여준다.

### 증정메뉴
- [ X ] 증정 이벤트에 해당하지 않는 경우, 증정 메뉴 "없음"으로 보여 준다.

### 혜택내역
- [ X ] 고객에게 적용된 이벤트 내역만 보여 준다.
- [ X ] 적용된 이벤트가 하나도 없다면 혜택 내역 "없음"으로 보여준다.
- [ X ] 혜택 내역에 여러 개의 이벤트가 적용된 경우, 출력 순서는 자유롭게 출력한다.

### 배지 출력
-[ X ]이벤트 배지가 부여되지 않는 경우, "없음"으로 보여준다.
4 changes: 4 additions & 0 deletions src/main/java/christmas/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package christmas;

import christmas.controller.PlannerController;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
PlannerController plannerController = new PlannerController();
plannerController.run();
}
}
83 changes: 83 additions & 0 deletions src/main/java/christmas/controller/PlannerController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package christmas.controller;

import christmas.domain.Customer;
import christmas.domain.Order;
import christmas.service.PlannerService;
import christmas.view.InputView;
import christmas.view.OutputView;

import java.util.HashMap;
import java.util.Map;

public class PlannerController {
private PlannerService plannerService = new PlannerService(new Order());

public void run() {
Customer customer = dateInit();
menuInit();
showBenefits(customer.getVisitedDate());
showTotalPrice();
showPresent();
showBenefitsContent(customer.getVisitedDate());
showTotalBenefitPrice();
showResultPrice();
showEventBadge();
}

private void showEventBadge() {
int totalBenefit = plannerService.getTotalBenefit();
OutputView.printBadgeOutputMessage(totalBenefit);
}

private void showResultPrice() {
int totalDiscount = plannerService.getTotalDiscount();
int totalPrice = plannerService.getTotalPrice();
OutputView.printResultPriceOutputMessage(totalPrice - totalDiscount);
}

private void showTotalBenefitPrice() {
int totalDiscount = plannerService.getTotalBenefit();
OutputView.printTotalBenefitPriceOutputMessage(totalDiscount);
}

private void showPresent() {
OutputView.printPresentOutputMessage(plannerService.isBiggerThanPricePresent());
}

private void showBenefitsContent(int date) {
Map<String, Integer> discountMap = plannerService.calculateDiscount(date);
OutputView.printBenefitsOutputMessage(discountMap);
}

private void showTotalPrice() {
int totalPrice = plannerService.getTotalPrice();
OutputView.printTotalPriceMessage(totalPrice);
}

private void showBenefits(int date) {
OutputView.printPreviewOutputMessage(date);
HashMap<String, Integer> orderMap = plannerService.getOrder();
OutputView.printOrderMenuOutputMessage(orderMap);
}

private Customer dateInit() {
OutputView.printStartMessageOutputMessage();
try {
int date = InputView.printVisitedDateInputMessage();
return plannerService.setVisitedDate(date);
} catch (IllegalArgumentException e) {
OutputView.printError(e);
return dateInit();
}
}

private void menuInit() {
try {
Map<String, Integer> menuMap = InputView.printMenuInitInputMessage();
plannerService.setOrder(menuMap);
} catch (IllegalArgumentException e) {
OutputView.printError(e);
menuInit();
}
}
}
64 changes: 64 additions & 0 deletions src/main/java/christmas/domain/Customer.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package christmas.domain;

import christmas.utils.Validator;

public class Customer {
private int visitedDate;
private boolean isGiven = false;
private Discount discount = new Discount();

public Customer(int visitedDate) {
validate(visitedDate);
this.visitedDate = visitedDate;
}

public int getVisitedDate() {
return visitedDate;
}

public int getTotalBenefitPrice() {
return discount.getChristmasDiscount() + discount.getNormalDiscount() + discount.getWeekDiscount()
+ discount.getSpecialDiscount() + discount.getGivingEventDiscount();
}

public int getTotalDiscountPrice() {
return discount.getChristmasDiscount() + discount.getNormalDiscount() + discount.getWeekDiscount()
+ discount.getSpecialDiscount();
}

private void validate(int visitedDate) {
Validator.checkDateValid(visitedDate);
}

public void setChristmasDiscountPrice(int money) {
discount.setChristmasDiscount(money);
}

public void setSpecialDiscountPrice(int money) {
discount.setSpecialDiscount(money);
}

public void setNormalDiscountPrice(int money) {
discount.setNormalDiscount(money);
}

public void setWeekDiscountPrice(int money) {
discount.setWeekDiscount(money);
}

public void setGivingEventDiscount(int price) {
discount.setGivingEventDiscount(price);
}

public Discount getDiscount() {
return discount;
}

public void changeIsGiven() {
isGiven = !isGiven;
}

public boolean isGiven() {
return isGiven;
}
}
49 changes: 49 additions & 0 deletions src/main/java/christmas/domain/Discount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package christmas.domain;

public class Discount {
private int christmasDiscount = 0;
private int normalDiscount = 0;
private int weekDiscount = 0;
private int specialDiscount = 0;
private int givingEventDiscount = 0;

public void setChristmasDiscount(int christmasDiscount) {
this.christmasDiscount = christmasDiscount;
}

public void setNormalDiscount(int normalDiscount) {
this.normalDiscount = normalDiscount;
}

public void setSpecialDiscount(int specialDiscount) {
this.specialDiscount = specialDiscount;
}

public void setGivingEventDiscount(int givingEventDiscount) {
this.givingEventDiscount = givingEventDiscount;
}

public int getWeekDiscount() {
return weekDiscount;
}

public void setWeekDiscount(int weekDiscount) {
this.weekDiscount = weekDiscount;
}

public int getChristmasDiscount() {
return christmasDiscount;
}

public int getNormalDiscount() {
return normalDiscount;
}

public int getSpecialDiscount() {
return specialDiscount;
}

public int getGivingEventDiscount() {
return givingEventDiscount;
}
}
23 changes: 23 additions & 0 deletions src/main/java/christmas/domain/Food.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package christmas.domain;

import christmas.type.MenuType;

import java.util.Arrays;

public class Food {
private String foodName;
private int count;

public Food(String foodName, int count) {
this.foodName = foodName;
this.count = count;
}

public String getFoodName() {
return foodName;
}

public int getCount() {
return count;
}
}
76 changes: 76 additions & 0 deletions src/main/java/christmas/domain/Order.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package christmas.domain;

import christmas.type.FoodType;
import christmas.type.MenuType;
import christmas.utils.Parser;
import christmas.utils.Validator;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import static christmas.type.MenuType.getPriceByName;

public class Order {
private List<Food> appetizerFoods = new ArrayList<>();
private List<Food> mainFoods = new ArrayList<>();
private List<Food> dessertFoods = new ArrayList<>();
private List<Food> drinkFoods = new ArrayList<>();

private int totalPrice = 0;

public void addOrder(String foodName, int count) {
validate(foodName);
FoodType foodType = MenuType.findFoodType(foodName);
distributeFood(foodName, count, foodType);
addTotalPrice(foodName, count);
}

private void addTotalPrice(String foodName, int count) {
totalPrice += getPriceByName(foodName) * count;
}

public HashMap<String, Integer> getTotalOrder() {
HashMap<String, Integer> orderMap = new HashMap<>();
Parser.convertListToMap(orderMap, appetizerFoods);
Parser.convertListToMap(orderMap, mainFoods);
Parser.convertListToMap(orderMap, dessertFoods);
Parser.convertListToMap(orderMap, drinkFoods);
return orderMap;
}

private void distributeFood(String foodName, int count, FoodType foodType) {
if (foodType.equals(FoodType.APPETIZER)) {
appetizerFoods.add(new Food(foodName, count));
}

if (foodType.equals(FoodType.MAIN)) {
mainFoods.add(new Food(foodName, count));
}

if (foodType.equals(FoodType.DESSERT)) {
dessertFoods.add(new Food(foodName, count));
}

if (foodType.equals(FoodType.DRINK)) {
drinkFoods.add(new Food(foodName, count));
}
}


private void validate(String foodName) {
Validator.checkFoodValid(foodName);
}

public int getTotalPrice() {
return totalPrice;
}

public List<Food> getMainFoods() {
return mainFoods;
}

public List<Food> getDessertFoods() {
return dessertFoods;
}
}
28 changes: 28 additions & 0 deletions src/main/java/christmas/dto/DiscountInfoDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package christmas.dto;

import christmas.domain.Discount;
import christmas.type.DiscountType;

import java.util.HashMap;
import java.util.Map;

public class DiscountInfoDto {

public static Map<String, Integer> of(Discount discount) {
Map<String, Integer> discountMap = new HashMap<>();
Map<String, Integer> discountValues = new HashMap<>();

discountValues.put(DiscountType.CHRISTMAS_DISCOUNT.getDiscountText(), discount.getChristmasDiscount());
discountValues.put(DiscountType.NORMAL_DISCOUNT.getDiscountText(), discount.getNormalDiscount());
discountValues.put(DiscountType.WEEK_DISCOUNT.getDiscountText(), discount.getWeekDiscount());
discountValues.put(DiscountType.SPECIAL_DISCOUNT.getDiscountText(), discount.getSpecialDiscount());
discountValues.put(DiscountType.GIVING_DISCOUNT.getDiscountText(), discount.getGivingEventDiscount());

for (Map.Entry<String, Integer> entry : discountValues.entrySet()) {
if (entry.getValue() != 0) {
discountMap.put(entry.getKey(), entry.getValue());
}
}
return discountMap;
}
}
Loading