Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
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
84 changes: 84 additions & 0 deletions docs/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# Christmas

### 프로그램 구성

#### 메뉴

```
<애피타이저>
양송이수프(6,000), 타파스(5,500), 시저샐러드(8,000)

<메인>
티본스테이크(55,000), 바비큐립(54,000), 해산물파스타(35,000), 크리스마스파스타(25,000)

<디저트>
초코케이크(15,000), 아이스크림(5,000)

<음료>
제로콜라(3,000), 레드와인(60,000), 샴페인(25,000)
```

#### 달력

![](../image.png)

#### 12월 이벤트 계획

- 크리스마스 디데이 할인
- [x] 이벤트 기간: 2023.12.1 ~ 2023.12.25
- [x] 1,000원으로 시작하여 크리스마스가 다가올수록 날마다 할인 금액이 100원씩 증가
- [x] 총주문 금액에서 해당 금액만큼 할인
(e.g. 시작일인 12월 1일에 1,000원, 2일에 1,100원, ..., 25일엔 3,400원 할인)
- [x] 평일 할인(일요일~목요일): 평일에는 디저트 메뉴를 메뉴 1개당 2,023원 할인
- [x] 주말 할인(금요일, 토요일): 주말에는 메인 메뉴를 메뉴 1개당 2,023원 할인
- [x] 특별 할인: 이벤트 달력에 별이 있으면 총주문 금액에서 1,000원 할인
- [ ] 증정 이벤트: 할인 전 총주문 금액이 12만 원 이상일 때, 샴페인 1개 증정
- [x] 이벤트 기간: '크리스마스 디데이 할인'을 제외한 다른 이벤트는 2023.12.1 ~ 2023.12.31 동안 적용

#### 혜택 금액에 따른 12월 이벤트 배지 부여

- [x] 총혜택 금액에 따라 다른 이벤트 배지를 부여
- 5천 원 이상: 별
- 1만 원 이상: 트리
- 2만 원 이상: 산타

#### 고객에게 안내할 이벤트 주의 사항

- [] 총주문 금액 10,000원 이상부터 이벤트가 적용
- [x] 음료만 주문 시, 주문 불가
- [x] 메뉴는 한 번에 최대 20개까지만 주문 가능
(e.g. 시저샐러드-1, 티본스테이크-1, 크리스마스파스타-1, 제로콜라-3, 아이스크림-1의 총개수는 7개)


### 프로그램 Work Flow

- [x] 이벤트 플래너 안내 문구 출력
- [x] 예상 방문 날짜 입력 안내 문구 출력
- [ ] 올바르지 않은 값 입력 시 에러 메세지 출력 후 재입력 받음
- [x] 방문할 날짜는 1 이상 31 이하의 숫자로만 입력받
- [x] 1 이상 31 이하의 숫자가 아닌 경우, "[ERROR] 유효하지 않은 날짜입니다. 다시 입력해 주세요."라는 에러 메시지 출력
- [x] 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성

- [x] 입력값에 따른 ```EventReservation``` 객체 생성

- [x] 주문할 메뉴와 개수 입력 안내 문구 출력
- [ ] 올바르지 않은 값 입력 시 에러 메세지 출력 후 재입력 받음
- [x] 고객이 메뉴판에 없는 메뉴를 입력하는 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
- [x] 메뉴의 개수는 1 이상의 숫자만 입력. 이외의 입력값은 "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
- [x] 메뉴 형식이 예시와 다른 경우, "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
- [x] 중복 메뉴를 입력한 경우(e.g. 시저샐러드-1,시저샐러드-1), "[ERROR] 유효하지 않은 주문입니다. 다시 입력해 주세요."라는 에러 메시지 출력
- [x] 모든 에러 메시지는 "[ERROR]"로 시작하도록 작성


- [x] 주문 결과 출력
- [x] 미리보기 안내문 출력
- [x] 주문 메뉴 종류 및 갯수 출력
- [x] 할인 전 총 주문금액 출력
- [x] 증정 메뉴 출력
- [x] 없을 시 "없음" 출력
- [x] 혜택 내역 출력
- [x] 없을 시 "없음" 출력
- [x] 총혜택 금액 출력
- [x] 할인 후 예상 결제 금액 출력
- [x] 12월 이벤트 배지 출력

7 changes: 6 additions & 1 deletion src/main/java/christmas/Application.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package christmas;

import christmas.config.AppConfig;
import christmas.controller.EventController;

public class Application {
public static void main(String[] args) {
// TODO: 프로그램 구현
EventController eventController = AppConfig.getEventController();
eventController.run();

}
}
76 changes: 76 additions & 0 deletions src/main/java/christmas/config/AppConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package christmas.config;

import christmas.controller.EventController;
import christmas.domain.event.DiscountProcessor;
import christmas.domain.event.EventProcessor;
import christmas.domain.event.Gift;
import christmas.domain.event.impl.BadgeGift;
import christmas.domain.event.impl.ChampagneGift;
import christmas.domain.event.impl.DDayDiscount;
import christmas.domain.event.impl.SpecialDiscount;
import christmas.domain.event.impl.TotalEventProcessor;
import christmas.domain.event.impl.WeekdaysDiscount;
import christmas.domain.event.impl.WeekendDiscount;
import christmas.domain.reservation.Order;
import christmas.domain.reservation.Reservation;
import christmas.repository.ReservationRepository;
import christmas.repository.SingleRepository;
import christmas.service.AcceptReservationService;
import christmas.service.AcceptReservationServiceImpl;
import christmas.service.ProcessEventService;
import christmas.service.ProcessEventServiceImpl;
import christmas.utils.InputParser;
import christmas.utils.InputValidator;
import christmas.utils.impl.DateToVisitParser;
import christmas.utils.impl.DateToVisitValidator;
import christmas.utils.impl.OrdersParser;
import christmas.utils.impl.OrdersValidator;
import christmas.view.InputView;
import christmas.view.OutputView;
import christmas.view.impl.ConsoleInputView;
import christmas.view.impl.ConsoleOutputView;
import java.time.LocalDate;
import java.util.List;

public class AppConfig {

private final static OutputView consoleOutputView = new ConsoleOutputView();
private final static InputView consoleInputView = new ConsoleInputView();

private final static SingleRepository<Reservation> reservationRepository = new ReservationRepository();

private final static InputValidator dateToVisitValidator = new DateToVisitValidator();
private final static InputValidator ordersValidator = new OrdersValidator();

private final static InputParser<LocalDate> dateToVisitParser = new DateToVisitParser(dateToVisitValidator);
private final static InputParser<List<Order>> ordersParser = new OrdersParser(ordersValidator);

private final static DiscountProcessor<LocalDate> dDayDiscount = new DDayDiscount();
private final static DiscountProcessor<LocalDate> specialDiscount = new SpecialDiscount();
private final static DiscountProcessor<List<Order>> weekdaysDiscount = new WeekdaysDiscount();
private final static DiscountProcessor<List<Order>> weekendDiscount = new WeekendDiscount();

private final static Gift<String> badgeGift = new BadgeGift();
private final static Gift<Boolean> champagneGift = new ChampagneGift();

private final static EventProcessor totalEventProcessor = new TotalEventProcessor(dDayDiscount,
specialDiscount,
weekdaysDiscount,
weekendDiscount,
champagneGift
,badgeGift);

private final static AcceptReservationService acceptReservationServiceImpl = new AcceptReservationServiceImpl(reservationRepository,
ordersParser,
dateToVisitParser);
private final static ProcessEventService processEventService = new ProcessEventServiceImpl(reservationRepository, totalEventProcessor);

private final static EventController eventController = new EventController(consoleInputView,
consoleOutputView,
acceptReservationServiceImpl,
processEventService);

public static EventController getEventController() {
return eventController;
}
}
36 changes: 36 additions & 0 deletions src/main/java/christmas/controller/EventController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package christmas.controller;

import christmas.dto.ReceiptDTO;
import christmas.service.AcceptReservationService;
import christmas.service.ProcessEventService;
import christmas.view.InputView;
import christmas.view.OutputView;

public class EventController {
private final InputView inputView;
private final OutputView outputView;
private final AcceptReservationService acceptReservationService;
private final ProcessEventService processEventService;

public EventController(InputView inputView,
OutputView outputView,
AcceptReservationService acceptReservationService,
ProcessEventService processEventService) {

this.inputView = inputView;
this.outputView = outputView;
this.acceptReservationService = acceptReservationService;
this.processEventService = processEventService;
}

public void run(){
outputView.printWelcomeMessage();

acceptReservationService.buildDateToVisit(inputView.readDate());
acceptReservationService.buildOrders(inputView.readOrders());
acceptReservationService.buildReservations();

ReceiptDTO receiptDTO = processEventService.sendReceipt();
outputView.printReceipt(receiptDTO);
}
}
5 changes: 5 additions & 0 deletions src/main/java/christmas/domain/event/DiscountProcessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package christmas.domain.event;

public interface DiscountProcessor<Type> {
int processDiscount(Type input);
}
9 changes: 9 additions & 0 deletions src/main/java/christmas/domain/event/EventProcessor.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package christmas.domain.event;

import christmas.domain.reservation.Order;
import java.time.LocalDate;
import java.util.List;

public interface EventProcessor {
String getEventResult(List<Order> orders, LocalDate date, int totalPrice);
}
5 changes: 5 additions & 0 deletions src/main/java/christmas/domain/event/Gift.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package christmas.domain.event;

public interface Gift<Type> {
Type getGiftOrNot(int amount);
}
19 changes: 19 additions & 0 deletions src/main/java/christmas/domain/event/impl/BadgeGift.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package christmas.domain.event.impl;

import christmas.domain.event.Gift;

public class BadgeGift implements Gift<String> {
@Override
public String getGiftOrNot(int discountAmount) {
if (discountAmount >= 20000) {
return "산타";
}
if (discountAmount >= 10000) {
return "트리";
}
if (discountAmount >= 5000) {
return "별";
}
return "없음";
}
}
14 changes: 14 additions & 0 deletions src/main/java/christmas/domain/event/impl/ChampagneGift.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package christmas.domain.event.impl;

import christmas.domain.event.Gift;

public class ChampagneGift implements Gift<Boolean> {
@Override
public Boolean getGiftOrNot(int totalAmount) {
if (totalAmount >= 120000) {
return true;
}
return false;

}
}
18 changes: 18 additions & 0 deletions src/main/java/christmas/domain/event/impl/DDayDiscount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package christmas.domain.event.impl;

import christmas.domain.event.DiscountProcessor;
import java.time.LocalDate;

public class DDayDiscount implements DiscountProcessor<LocalDate> {
private static final LocalDate CHRISTMAS =LocalDate.of(2023,12,25);
@Override
public int processDiscount(LocalDate reservationDate) {
if (reservationDate.isAfter(CHRISTMAS)) {
return 0;
}
int discount = 1000;
discount += 100 * (reservationDate.getDayOfMonth() - 1);

return discount;
}
}
18 changes: 18 additions & 0 deletions src/main/java/christmas/domain/event/impl/SpecialDiscount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package christmas.domain.event.impl;

import christmas.domain.event.DiscountProcessor;
import java.time.LocalDate;
import java.util.List;

public class SpecialDiscount implements DiscountProcessor<LocalDate> {
private static final List<Integer> specialDays = List.of(3,10,17,24,25,31);

@Override
public int processDiscount(LocalDate reservationDate) {
int discount = 0;
if (specialDays.contains(reservationDate.getDayOfWeek())) {
discount +=1000;
}
return discount;
}
}
Loading