From 615bf4ff7951b5143a9a3f18f65671da11c37c9f Mon Sep 17 00:00:00 2001
From: 023-dev <0_2_3@naver.com>
Date: Wed, 27 Nov 2024 18:16:58 +0900
Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=ED=81=AC=EB=A6=AC=EC=8A=A4?=
=?UTF-8?q?=EB=A7=88=EC=8A=A4=20=EB=AF=B8=EC=85=98=20=EC=A0=9C=EC=B6=9C?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
src/main/java/christmas/Application.java | 7 +-
src/main/java/christmas/config/AppConfig.java | 18 +++
.../java/christmas/config/MenuConfig.java | 21 +++
.../christmas/controller/EventController.java | 115 +++++++++++++++++
.../java/christmas/model/domain/Badge.java | 28 ++++
.../java/christmas/model/domain/Menu.java | 25 ++++
.../java/christmas/model/domain/Order.java | 22 ++++
.../christmas/repository/MenuRepository.java | 17 +++
.../christmas/service/DiscountCalculator.java | 53 ++++++++
src/main/java/christmas/view/InputView.java | 98 ++++++++++++++
src/main/java/christmas/view/OutputView.java | 121 ++++++++++++++++++
11 files changed, 523 insertions(+), 2 deletions(-)
create mode 100644 src/main/java/christmas/config/AppConfig.java
create mode 100644 src/main/java/christmas/config/MenuConfig.java
create mode 100644 src/main/java/christmas/controller/EventController.java
create mode 100644 src/main/java/christmas/model/domain/Badge.java
create mode 100644 src/main/java/christmas/model/domain/Menu.java
create mode 100644 src/main/java/christmas/model/domain/Order.java
create mode 100644 src/main/java/christmas/repository/MenuRepository.java
create mode 100644 src/main/java/christmas/service/DiscountCalculator.java
create mode 100644 src/main/java/christmas/view/InputView.java
create mode 100644 src/main/java/christmas/view/OutputView.java
diff --git a/src/main/java/christmas/Application.java b/src/main/java/christmas/Application.java
index b9ba6a2..5b9d4f3 100644
--- a/src/main/java/christmas/Application.java
+++ b/src/main/java/christmas/Application.java
@@ -1,7 +1,10 @@
package christmas;
+import christmas.config.AppConfig;
+
public class Application {
public static void main(String[] args) {
- // TODO: 프로그램 구현
+ AppConfig app = new AppConfig();
+ app.run();
}
-}
+}
\ No newline at end of file
diff --git a/src/main/java/christmas/config/AppConfig.java b/src/main/java/christmas/config/AppConfig.java
new file mode 100644
index 0000000..5b7d22f
--- /dev/null
+++ b/src/main/java/christmas/config/AppConfig.java
@@ -0,0 +1,18 @@
+package christmas.config;
+
+import christmas.controller.EventController;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+
+public class AppConfig {
+ private final EventController eventController;
+
+ public AppConfig() {
+ this.eventController = new EventController(new InputView(), new OutputView());
+ }
+
+ public void run() {
+ eventController.init();
+ eventController.run();
+ }
+}
diff --git a/src/main/java/christmas/config/MenuConfig.java b/src/main/java/christmas/config/MenuConfig.java
new file mode 100644
index 0000000..c85ef34
--- /dev/null
+++ b/src/main/java/christmas/config/MenuConfig.java
@@ -0,0 +1,21 @@
+package christmas.config;
+
+import christmas.model.domain.Menu;
+import christmas.repository.MenuRepository;
+
+public class MenuConfig {
+ public static void initMenus() {
+ MenuRepository.addMenu(new Menu("양송이수프", 6_000, "애피타이저"));
+ MenuRepository.addMenu(new Menu("타파스", 5_500, "애피타이저"));
+ MenuRepository.addMenu(new Menu("시저샐러드", 8_000, "애피타이저"));
+ MenuRepository.addMenu(new Menu("티본스테이크", 55_000, "메인"));
+ MenuRepository.addMenu(new Menu("바비큐립", 54_000, "메인"));
+ MenuRepository.addMenu(new Menu("해산물파스타", 35_000, "메인"));
+ MenuRepository.addMenu(new Menu("크리스마스파스타", 25_000, "메인"));
+ MenuRepository.addMenu(new Menu("초코케이크", 15_000, "디저트"));
+ MenuRepository.addMenu(new Menu("아이스크림", 5_000, "디저트"));
+ MenuRepository.addMenu(new Menu("제로콜라", 3_000, "음료"));
+ MenuRepository.addMenu(new Menu("레드와인", 60_000, "음료"));
+ MenuRepository.addMenu(new Menu("샴페인", 25_000, "음료"));
+ }
+}
diff --git a/src/main/java/christmas/controller/EventController.java b/src/main/java/christmas/controller/EventController.java
new file mode 100644
index 0000000..4cb7170
--- /dev/null
+++ b/src/main/java/christmas/controller/EventController.java
@@ -0,0 +1,115 @@
+package christmas.controller;
+
+import christmas.config.MenuConfig;
+import christmas.model.domain.*;
+import christmas.repository.MenuRepository;
+import christmas.service.DiscountCalculator;
+import christmas.view.InputView;
+import christmas.view.OutputView;
+
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+
+public class EventController {
+
+ private static final String GIFT_CHAMPAGNE = "샴페인 1개"; // 증정 메뉴 상수
+ private static final String NO_GIFT = "없음"; // 증정 메뉴가 없을 때
+ private static final String ORDER_DELIMITER = ","; // 주문 항목 구분자
+ private static final String DETAIL_DELIMITER = "-"; // 메뉴명-개수 구분자
+
+ private final InputView inputView;
+ private final OutputView outputView;
+ private final DiscountCalculator discountCalculator;
+
+ public EventController(InputView inputView, OutputView outputView) {
+ this.inputView = inputView;
+ this.outputView = outputView;
+ this.discountCalculator = new DiscountCalculator();
+ }
+
+ public void init() {
+ MenuConfig.initMenus();
+ }
+
+ public void run() {
+ try {
+ int visitDay = readValidVisitDate();
+ LocalDate visitDate = LocalDate.of(2023, 12, visitDay);
+
+ Order order = createOrderFromInput();
+ processOrder(order, visitDay, visitDate); // LocalDate 전달
+ } catch (IllegalArgumentException e) {
+ outputView.printError(e.getMessage());
+ }
+ }
+
+ private int readValidVisitDate() {
+ while (true) {
+ try {
+ return inputView.readVisitDate();
+ } catch (IllegalArgumentException e) {
+ outputView.printError(e.getMessage());
+ }
+ }
+ }
+
+ private Order createOrderFromInput() {
+ Order order = new Order();
+ String[] orderDetails = readValidOrderDetails();
+ for (String detail : orderDetails) {
+ String[] parts = detail.split(DETAIL_DELIMITER);
+ Menu menu = MenuRepository.findByName(parts[0].trim());
+ int quantity = Integer.parseInt(parts[1].trim());
+ order.addMenu(menu, quantity);
+ }
+ return order;
+ }
+
+ private String[] readValidOrderDetails() {
+ while (true) {
+ try {
+ return inputView.readOrderDetails().split(ORDER_DELIMITER);
+ } catch (IllegalArgumentException e) {
+ outputView.printError(e.getMessage());
+ }
+ }
+ }
+
+ private void processOrder(Order order, int visitDay, LocalDate visitDate) {
+ int totalPrice = order.calculateTotalPrice();
+
+ int dailyDiscount = discountCalculator.calculateDailyDiscount(visitDay);
+ int categoryDiscount = discountCalculator.calculateCategoryDiscount(order, visitDate); // LocalDate 사용
+ int specialDayDiscount = discountCalculator.calculateSpecialDayDiscount(visitDate);
+
+ boolean eligibleForGift = discountCalculator.isEligibleForGift(totalPrice);
+ String gift = getGiftBasedOnEligibility(eligibleForGift);
+
+ int totalDiscount = calculateTotalDiscount(dailyDiscount, categoryDiscount, specialDayDiscount, eligibleForGift);
+ int discountPrice = calculateDiscount(dailyDiscount, categoryDiscount, specialDayDiscount);
+ int finalPrice = totalPrice - discountPrice;
+
+ String badge = Badge.getBadgeByBenefit(totalDiscount).getName();
+
+ outputView.printOrderSummary(order, totalPrice, totalDiscount, finalPrice, gift, dailyDiscount, categoryDiscount, specialDayDiscount, badge);
+ }
+
+ private String getGiftBasedOnEligibility(boolean eligibleForGift) {
+ if (eligibleForGift) {
+ return GIFT_CHAMPAGNE;
+ }
+ return NO_GIFT;
+ }
+
+ private int calculateDiscount(int dailyDiscount, int categoryDiscount, int specialDayDiscount) {
+ return dailyDiscount + categoryDiscount + specialDayDiscount;
+ }
+
+ private int calculateTotalDiscount(int dailyDiscount, int categoryDiscount, int specialDayDiscount, boolean eligibleForGift) {
+ int giftDiscount = 0;
+ if (eligibleForGift) {
+ giftDiscount = 25000;
+ }
+ return dailyDiscount + categoryDiscount + specialDayDiscount + giftDiscount;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/christmas/model/domain/Badge.java b/src/main/java/christmas/model/domain/Badge.java
new file mode 100644
index 0000000..cda2c6c
--- /dev/null
+++ b/src/main/java/christmas/model/domain/Badge.java
@@ -0,0 +1,28 @@
+package christmas.model.domain;
+import java.util.Arrays;
+
+public enum Badge {
+ SANTA("산타", 20000),
+ TREE("트리", 10000),
+ STAR("별", 5000),
+ NONE("없음", 0);
+
+ private final String name;
+ private final int minBenefit;
+
+ Badge(String name, int minBenefit) {
+ this.name = name;
+ this.minBenefit = minBenefit;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public static Badge getBadgeByBenefit(int totalBenefit) {
+ return Arrays.stream(values())
+ .filter(badge -> totalBenefit >= badge.minBenefit)
+ .findFirst()
+ .orElse(NONE);
+ }
+}
diff --git a/src/main/java/christmas/model/domain/Menu.java b/src/main/java/christmas/model/domain/Menu.java
new file mode 100644
index 0000000..5bc071d
--- /dev/null
+++ b/src/main/java/christmas/model/domain/Menu.java
@@ -0,0 +1,25 @@
+package christmas.model.domain;
+
+public class Menu {
+ private final String name;
+ private final int price;
+ private final String category;
+
+ public Menu(String name, int price, String category) {
+ this.name = name;
+ this.price = price;
+ this.category = category;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public int getPrice() {
+ return price;
+ }
+
+ public String getCategory() {
+ return category;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/christmas/model/domain/Order.java b/src/main/java/christmas/model/domain/Order.java
new file mode 100644
index 0000000..68b8063
--- /dev/null
+++ b/src/main/java/christmas/model/domain/Order.java
@@ -0,0 +1,22 @@
+package christmas.model.domain;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class Order {
+ private final Map