diff --git a/src/main/java/Application.java b/src/main/java/Application.java index 5f5f542..6011e2f 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -1,66 +1,70 @@ -import domain.Menu; -//import jdk.internal.util.xml.impl.Input; -import repository.MenuRepository; -import domain.Table; -import repository.OrderRepository; -import repository.TableRepository; +import java.util.NoSuchElementException; + +import domain.Bill; +import domain.PayType; import service.CafeOrderService; import view.InputView; import view.OutputView; -import java.util.List; - public class Application { - // TODO 구현 진행 - public static void main(String[] args) { - OutputView.printMain(); - final CafeOrderService cafeOrderService = new CafeOrderService(new OrderRepository()); - final List tables = TableRepository.tables(); - int func = InputView.inputFunction(); + final static int ORDER = 1; + final static int PAY = 2; + final static int STOP = 3; + + // TODO 구현 진행 + public static void main(String[] args) { + OutputView.printMain(); + final CafeOrderService cafeOrderService = new CafeOrderService(); + int selectedFunction = InputView.inputFunction(); - while(func!=3) - { - if(func == 1) - { - orderMenu(tables, cafeOrderService); - } - if(func == 2) - { - payOrders(tables, cafeOrderService); - } - OutputView.printMain(); - func = InputView.inputFunction(); - } - } + while (selectedFunction != STOP) { + if (selectedFunction == ORDER) { + orderMenu(cafeOrderService); + } + if (selectedFunction == PAY) { + payOrders(cafeOrderService); + } + if (!cafeOrderService.isValidFunction(selectedFunction, STOP, ORDER)) { + throw new NoSuchElementException("해당 기능은 존재하지 않습니다."); + } + OutputView.printMain(); + selectedFunction = InputView.inputFunction(); + } + } - private static void payOrders(List
tables, CafeOrderService cafeOrderService) { - OutputView.printTables(tables, cafeOrderService); - int tableNum = InputView.inputPayTableNumber(); - OutputView.printOrders(cafeOrderService, tableNum); - } + private static void payOrders(CafeOrderService cafeOrderService) { + OutputView.printTables(cafeOrderService); + int tableNumber = InputView.inputPayTableNumber(); + if (!cafeOrderService.checkOrderedTable(tableNumber)) { + OutputView.printNoOrder(); + return; + } + Bill bill = cafeOrderService.getBillByTable(tableNumber); + OutputView.printBill(bill); + OutputView.printPayMessage(tableNumber); + int payTypeNumber = InputView.inputPayType(); + PayType payType = cafeOrderService.findPayType(payTypeNumber); + long amountOfPayment = cafeOrderService.getAmountOfPayment(bill, payType); + OutputView.printAmountOfPayment(amountOfPayment); + } - private static void orderMenu(List
tables, CafeOrderService cafeOrderService) - { - OutputView.printTables(tables, cafeOrderService); - int tableNum = InputView.inputTableNumber(); - boolean isValidTblNum = cafeOrderService.isValidTableNum(tableNum); - if(isValidTblNum==false){ - orderMenu(tables, cafeOrderService); - } - final List menus = MenuRepository.menus(); - OutputView.printMenus(menus); - int menuNum = InputView.inputMenu(); - boolean isValidMenuNum = cafeOrderService.checkMenuNum(menuNum); - if(isValidMenuNum==false){ - OutputView.printMenuAlert(); - orderMenu(tables, cafeOrderService); - } - int menuCount = InputView.inputCount(); - boolean isValidMenuCount = cafeOrderService.canOrderMenu(tableNum, menuNum, menuCount); - if(isValidMenuCount==false){ - OutputView.printMaxAlert(); - return; - } - cafeOrderService.orderMenu(menuNum, menuCount, tableNum); - } + private static void orderMenu(CafeOrderService cafeOrderService) { + OutputView.printTables(cafeOrderService); + int tableNumber = InputView.inputTableNumber(); + if (!cafeOrderService.isValidTableNumber(tableNumber)) { + orderMenu(cafeOrderService); + } + OutputView.printMenus(); + int menuNumber = InputView.inputMenu(); + if (!cafeOrderService.isValidMenuNumber(menuNumber)) { + OutputView.printMenuAlert(); + orderMenu(cafeOrderService); + } + int menuCount = InputView.inputCount(); + if (!cafeOrderService.checkMaximumCount(tableNumber, menuNumber, menuCount)) { + OutputView.printMaxAlert(); + return; + } + cafeOrderService.orderMenu(tableNumber, menuNumber, menuCount); + } } diff --git a/src/main/java/domain/Bill.java b/src/main/java/domain/Bill.java new file mode 100644 index 0000000..091e2b5 --- /dev/null +++ b/src/main/java/domain/Bill.java @@ -0,0 +1,92 @@ +package domain; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import repository.MenuRepository; +import repository.OrderRepository; + +//주문 메뉴와 수량을 알고있는 객체. 계산과 관련된 것을 책임진다. +public class Bill { + private static final int DISCOUNT_FOR_CAKES = 3; + private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; + private static final int MAX_NUMBER_PER_MENU = 30; + + private final int tableNumber; + private Map orderedMenus; + + public Bill(int tableNumber) { + this.tableNumber = tableNumber; + this.orderedMenus = Collections.emptyMap(); + } + + //생성 + public Bill(OrderRepository orderRepository, int tableNumber) { + List orders = orderRepository.findByTableNumber(tableNumber); + Map orderedMenus = orders.stream() + .filter(order -> order.getTableNumber() == tableNumber) + .collect(Collectors.toMap(order -> MenuRepository.findByNumber(order.getMenuNumber()), + order -> order.getMenuCount(), (c1, c2) -> c1 + c2)); + + this.tableNumber = tableNumber; + this.orderedMenus = orderedMenus; + } + + public int getTableNumber() { + return tableNumber; + } + + public Map getOrderedMenus() { + return this.orderedMenus; + } + + //최대수량 검사 + public boolean checkMaximumPerMenu(int menuNumber, int menuCount) { + int existedMenusCount = this.countMenusNumber(menuNumber); + return existedMenusCount + menuCount <= MAX_NUMBER_PER_MENU; + } + + //해당 테이블에서 주문한 해당 메뉴의 수량을 return한다. + public int countMenusNumber(int menuNumber) { + int menuCount = 0; + for (Menu key : orderedMenus.keySet()) { + if (key.getNumber() != menuNumber) + continue; + menuCount = orderedMenus.get(key); + break; + } + return menuCount; + } + + //해당 테이블의 bill을 통해 주문한 케익의 갯수를 계산한다. + public int getNumberOfCakes() { + int numberOfCakes = 0; + for (Map.Entry entry : this.orderedMenus.entrySet()) { + numberOfCakes += entry.getKey().isThisCake() ? entry.getValue() : 0; + } + return numberOfCakes; + } + + //해당 테이블의 bill을 통해 주문한 메뉴들 가격의 총 합을 계산한다. + public long getSumOfPayment() { + long totalSumOfPayment = 0; + for (Map.Entry entry : this.orderedMenus.entrySet()) { + totalSumOfPayment += entry.getKey().getPrice() * entry.getValue(); + } + return totalSumOfPayment; + } + + //할인을 적용한 최종 금액을 계산한다. + public long getDiscountedPayment(int discountRate) { + long totalSumOfPayment = this.getSumOfPayment(); + int numberOfCakes = this.getNumberOfCakes(); + if (numberOfCakes >= DISCOUNT_FOR_CAKES) { + totalSumOfPayment -= DISCOUNT_MONEY_PER_NUM_OF_CAKES * (numberOfCakes / 3); + } + totalSumOfPayment = (long)(totalSumOfPayment - totalSumOfPayment * ((float)discountRate / 100)); + return totalSumOfPayment; + } + +} diff --git a/src/main/java/domain/Category.java b/src/main/java/domain/Category.java index e0469f8..d3da92e 100644 --- a/src/main/java/domain/Category.java +++ b/src/main/java/domain/Category.java @@ -1,17 +1,17 @@ package domain; public enum Category { - CAKE("케이크"), - BEVERAGE("음료"); + CAKE("케이크"), + BEVERAGE("음료"); - private final String name; + private final String name; - Category(final String name) { - this.name = name; - } + Category(final String name) { + this.name = name; + } - @Override - public String toString() { - return "[" + name + "]"; - } + @Override + public String toString() { + return "[" + name + "]"; + } } diff --git a/src/main/java/domain/Menu.java b/src/main/java/domain/Menu.java index dfe44e9..c6d0c3a 100644 --- a/src/main/java/domain/Menu.java +++ b/src/main/java/domain/Menu.java @@ -1,36 +1,44 @@ package domain; public class Menu { - private final int number; - private final String name; - private final Category category; - private final int price; - - public Menu(final int number, final String name, final Category category, final int price) { - this.number = number; - this.name = name; - this.category = category; - this.price = price; - } - - public int getNumber() { - return number; - } - - public String getName() { - return name; - } - - public Category getCategory() { - return category; - } - - public int getPrice() { - return price; - } - - @Override - public String toString() { - return category + " " + number + " - " + name + " : " + price + "원"; - } + private final int number; + private final String name; + private final Category category; + private final int price; + + public Menu(final int number, final String name, final Category category, final int price) { + this.number = number; + this.name = name; + this.category = category; + this.price = price; + } + + public int getNumber() { + return number; + } + + public String getName() { + return name; + } + + public Category getCategory() { + return category; + } + + public int getPrice() { + return price; + } + + public boolean isEqualNumber(int number) { + return this.number == number; + } + + public boolean isThisCake() { + return this.category == Category.CAKE; + } + + @Override + public String toString() { + return category + " " + number + " - " + name + " : " + price + "원"; + } } diff --git a/src/main/java/domain/Order.java b/src/main/java/domain/Order.java index dce9ed6..59fc121 100644 --- a/src/main/java/domain/Order.java +++ b/src/main/java/domain/Order.java @@ -1,23 +1,33 @@ package domain; public class Order { - private final int menuNum; - private final int tableNum; + private final int tableNumber; + private final int menuNumber; + private final int menuCount; - public Order(int menuNum, int tableNum) { - this.menuNum = menuNum; - this.tableNum = tableNum; - } + public Order(int tableNumber, int menuNumber, int menuCount) { + this.tableNumber = tableNumber; + this.menuNumber = menuNumber; + this.menuCount = menuCount; + } - public int getMenuNum() { - return this.menuNum; - } + public int getMenuNumber() { + return this.menuNumber; + } - public int getTableNum() { - return tableNum; - } + public int getTableNumber() { + return this.tableNumber; + } - public boolean isEqualTable(int tableNum){ - return this.tableNum == tableNum; - } + public int getMenuCount() { + return this.menuCount; + } + + public boolean isEqualTable(int tableNumber) { + return this.tableNumber == tableNumber; + } + + public boolean isEqualMenuNumber(int menuNumber) { + return this.menuNumber == menuNumber; + } } diff --git a/src/main/java/domain/PayType.java b/src/main/java/domain/PayType.java new file mode 100644 index 0000000..f69a551 --- /dev/null +++ b/src/main/java/domain/PayType.java @@ -0,0 +1,21 @@ +package domain; + +//지불 수단 +public class PayType { + private final int number; + private final int discountRate; + + public PayType(int number, int discountRate) { + this.number = number; + this.discountRate = discountRate; + } + + public boolean isEqualPayType(int number) { + return this.number == number; + } + + public int getDiscountRate() { + return this.discountRate; + } + +} diff --git a/src/main/java/domain/Table.java b/src/main/java/domain/Table.java index 0b0474c..d19f51d 100644 --- a/src/main/java/domain/Table.java +++ b/src/main/java/domain/Table.java @@ -1,18 +1,22 @@ package domain; public class Table { - private final int number; + private final int number; - public Table(final int number) { - this.number = number; - } + public Table(final int number) { + this.number = number; + } - public int getNumber() { - return number; - } + public int getNumber() { + return number; + } - @Override - public String toString() { - return Integer.toString(number); - } + public boolean isEqualNumber(int tableNumber) { + return this.number == tableNumber; + } + + @Override + public String toString() { + return Integer.toString(number); + } } diff --git a/src/main/java/repository/MenuRepository.java b/src/main/java/repository/MenuRepository.java index a6359a4..c0e4ed5 100644 --- a/src/main/java/repository/MenuRepository.java +++ b/src/main/java/repository/MenuRepository.java @@ -1,42 +1,50 @@ package repository; -import domain.Category; -import domain.Menu; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; +import domain.Category; +import domain.Menu; + public class MenuRepository { - private static final List menus = new ArrayList<>(); - - static { - menus.add(new Menu(1, "가나슈", Category.CAKE, 7000)); - menus.add(new Menu(2, "당근 케이크", Category.CAKE, 6500)); - menus.add(new Menu(3, "아이스 박스", Category.CAKE, 8000)); - menus.add(new Menu(4, "티라미수", Category.CAKE, 5500)); - menus.add(new Menu(5, "치즈 케이크", Category.CAKE, 7000)); - menus.add(new Menu(6, "얼그레이 케이크", Category.CAKE, 7000)); - menus.add(new Menu(21, "아메리카노", Category.BEVERAGE, 4500)); - menus.add(new Menu(22, "에스프레소", Category.BEVERAGE, 4000)); - menus.add(new Menu(23, "카푸치노", Category.BEVERAGE, 5000)); - menus.add(new Menu(24, "그린티 라떼", Category.BEVERAGE, 6000)); - } - - public static Menu findByNumber(int number){ - return menus.stream() - .filter(menu -> menu.getNumber()==number) - .findFirst() - .orElseThrow(IllegalAccessError::new); - } - - public Optional findByName(String name){ - return menus.stream() - .filter(menu -> menu.getName().equals(name)) - .findAny(); - } - public static List menus() { - return Collections.unmodifiableList(menus); - } + private static final List menus = new ArrayList<>(); + + static { + menus.add(new Menu(1, "가나슈", Category.CAKE, 7000)); + menus.add(new Menu(2, "당근 케이크", Category.CAKE, 6500)); + menus.add(new Menu(3, "아이스 박스", Category.CAKE, 8000)); + menus.add(new Menu(4, "티라미수", Category.CAKE, 5500)); + menus.add(new Menu(5, "치즈 케이크", Category.CAKE, 7000)); + menus.add(new Menu(6, "얼그레이 케이크", Category.CAKE, 7000)); + menus.add(new Menu(21, "아메리카노", Category.BEVERAGE, 4500)); + menus.add(new Menu(22, "에스프레소", Category.BEVERAGE, 4000)); + menus.add(new Menu(23, "카푸치노", Category.BEVERAGE, 5000)); + menus.add(new Menu(24, "그린티 라떼", Category.BEVERAGE, 6000)); + } + + //해당 숫자에 해당하는 메뉴 객체를 return한다. + public static Menu findByNumber(int number) { + return menus.stream() + .filter(menu -> menu.isEqualNumber(number)) + .findFirst() + .orElseThrow(IllegalAccessError::new); + } + + //입력된 숫자에 해당하는 메뉴가 있는지 검사한다. + public static boolean checkMenuNumber(int number) { + Menu menu = findByNumber(number); + return menu.isEqualNumber(number); + } + + public static List menus() { + return Collections.unmodifiableList(menus); + } + + public Optional findByName(String name) { + return menus.stream() + .filter(menu -> menu.getName().equals(name)) + .findAny(); + } } diff --git a/src/main/java/repository/OrderRepository.java b/src/main/java/repository/OrderRepository.java index e5ef8d2..1d91874 100644 --- a/src/main/java/repository/OrderRepository.java +++ b/src/main/java/repository/OrderRepository.java @@ -1,96 +1,32 @@ package repository; -import domain.Menu; -import domain.Order; - -import java.util.*; -import java.util.stream.Collectors; -import java.util.stream.Stream; - import static java.util.stream.Collectors.*; -public class OrderRepository { - private static final int MAX_NUMBER_PER_MENU = 30; - private final List orders = new ArrayList<>(); - - public void addOrder(final Order order) - { - orders.add(order); - } - - public int countOrders(){ - return orders.size(); - } - - public int countMenusPerTable(int tableNum) - { - return (int)orders.stream() - .filter(order-> order.isEqualTable(tableNum)) - .count(); - } - - public int countMenusNumber(int tableNum, int menuNum){ - int count= (int)orders.stream() - .filter(order->order.isEqualTable(tableNum)) - .filter(order->menuNum==order.getMenuNum()) - .count(); - return count; - } - - //가장 수량이 많은 메뉴의 수량을 체크하는 메서드 - //need to edit - public int countNumberPerMenu(int tableNum) - { - List orders = findByTableNumber(tableNum); - if(orders.isEmpty()){ - return 0; - } - Map bill = orders.stream() - .map(order -> MenuRepository.findByNumber(order.getMenuNum())) - .collect(Collectors.groupingBy(order->order,HashMap::new, counting())); - List> entryList = new LinkedList(bill.entrySet()); - entryList.sort(Map.Entry.comparingByValue()); - - System.out.println(entryList.get(0).getValue().intValue()); - return entryList.get(0).getValue().intValue(); - } - - public boolean canOrder(int tableNum) - { - if(countNumberPerMenu(tableNum)<=MAX_NUMBER_PER_MENU){ - return true; - }else{ - return false; - } - } - - public boolean canOrder(int tableNum, int menuNum, int menuCount){ - int existedMenusNum = countMenusNumber(tableNum, menuNum); - if(existedMenusNum+menuCount<=MAX_NUMBER_PER_MENU){ - return true; - }else{ - return false; - } - } - - public List findByTableNumber(int tableNum) - { - return - orders.stream() - .filter(order-> order.isEqualTable(tableNum)) - .collect(toList()); - } - - //해당 테이블에서 해당 메뉴의 수량을 출력하는 메소드 - public Map getBill(int tableNum){ - List orders = findByTableNumber(tableNum); - Map bill = orders.stream() - .map(order -> MenuRepository.findByNumber(order.getMenuNum())) - .collect(Collectors.groupingBy(order->order,HashMap::new, counting())); - - return bill; - } +import java.util.ArrayList; +import java.util.List; +import domain.Order; +//주문 정보들을 저장하고, 정보를 제공해준다. +public class OrderRepository { + private final List orders = new ArrayList<>(); + + //주문을 받는다. + public void addOrder(final Order order) { + orders.add(order); + } + + //해당 테이블에서 주문한 것들을 모두 return한다. + public List findByTableNumber(int tableNumber) { + return + orders.stream() + .filter(order -> order.isEqualTable(tableNumber)) + .collect(toList()); + } + + //지불이 완료되면 해당 테이블의 주문을 모두 삭제한다. + public void finishedPayment(int tableNumber) { + orders.removeIf(order -> order.isEqualTable(tableNumber)); + } } \ No newline at end of file diff --git a/src/main/java/repository/PayTypeRepository.java b/src/main/java/repository/PayTypeRepository.java new file mode 100644 index 0000000..8dbe2d9 --- /dev/null +++ b/src/main/java/repository/PayTypeRepository.java @@ -0,0 +1,22 @@ +package repository; + +import java.util.ArrayList; +import java.util.List; + +import domain.PayType; + +public class PayTypeRepository { + public static final List payTypes = new ArrayList<>(); + + static { + payTypes.add(new PayType(1, 0)); + payTypes.add(new PayType(2, 10)); + } + + public static PayType findByNumber(int number) { + return payTypes.stream() + .filter(payType -> payType.isEqualPayType(number)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException("결제 수단은 카드(1)와 현금(2)만 존재합니다.")); + } +} diff --git a/src/main/java/repository/TableRepository.java b/src/main/java/repository/TableRepository.java index 0e44b90..d9af50b 100644 --- a/src/main/java/repository/TableRepository.java +++ b/src/main/java/repository/TableRepository.java @@ -1,29 +1,34 @@ package repository; -import domain.Table; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Optional; +import domain.Table; + public class TableRepository { - private static final List
tables = new ArrayList<>(); + private static final List
tables = new ArrayList<>(); - static { - tables.add(new Table(1)); - tables.add(new Table(2)); - tables.add(new Table(3)); - tables.add(new Table(5)); - tables.add(new Table(6)); - tables.add(new Table(8)); - } + static { + tables.add(new Table(1)); + tables.add(new Table(2)); + tables.add(new Table(3)); + tables.add(new Table(5)); + tables.add(new Table(6)); + tables.add(new Table(8)); + } - public Optional
findByNumber(int number) { - return Optional.ofNullable(tables.get(number)); //Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 - } + //nubmer에 해당하는 Table을 return한다. + public static Optional
findByNumber(int number) { + return Optional.ofNullable(tables.stream() + .filter(table -> table.isEqualNumber(number)) + .findFirst() + .orElseThrow(() -> new IllegalArgumentException( + number + "번 테이블은 존재하지 않는 테이블입니다.")));//Optional로 감싸줌으로써, Null이더라도 반환해서 클라이언트 단에서 처리해줄 수 있도록 + } - public static List
tables() { - return Collections.unmodifiableList(tables); - } + public static List
getTables() { + return Collections.unmodifiableList(tables); + } } diff --git a/src/main/java/service/CafeOrderService.java b/src/main/java/service/CafeOrderService.java index 720c2bf..1421c0e 100644 --- a/src/main/java/service/CafeOrderService.java +++ b/src/main/java/service/CafeOrderService.java @@ -1,67 +1,73 @@ package service; +import java.util.Map; + +import domain.Bill; import domain.Menu; import domain.Order; +import domain.PayType; import repository.MenuRepository; import repository.OrderRepository; +import repository.PayTypeRepository; +import repository.TableRepository; -import java.util.List; -import java.util.Map; -import java.util.Optional; +//카페의 주문과 관련된 서비스를 제공하는 클래스 +public class CafeOrderService { + private final OrderRepository orderRepository; -import static java.util.stream.Collectors.toList; + public CafeOrderService() { + this.orderRepository = new OrderRepository(); + } -public class CafeOrderService { - private static final int DISCOUNT_FOR_CAKES = 3; - private static final int DISCOUNT_MONEY_PER_NUM_OF_CAKES = 3000; - - private final OrderRepository orderRepository; - - public CafeOrderService(OrderRepository orderRepository) { - this.orderRepository = orderRepository; - } - - public boolean isValidTableNum(int tableNum) - { - if(tableNum<0||tableNum==7||tableNum>9){ - System.out.println("## 존재하지 않는 테이블입니다. \n테이블을 다시 선택하세요\n"); - return false; - } - else{ - return true; - } - } - - public boolean canOrderMenu(int tableNum, int menuNum, int menuCount) - { - return orderRepository.canOrder(tableNum, menuNum, menuCount); - } - - public void orderMenu(int menuNum, int count, int tableNum) - { - for(int i=0;i getOrdersByTable(int tableNum) { - return orderRepository.getBill(tableNum); - } - - public boolean isOrderedTable(int tableNum){ - if(orderRepository.getBill(tableNum).isEmpty()){ - return false; - }else{ - return true; - } - } - - public boolean checkMenuNum(int menuNum) { - try{ - return MenuRepository.findByNumber(menuNum) instanceof Menu; - }catch (Exception e){ - return false; - } - } + //사용자가 선택한 기능이 valid한지 검사한다. + public static boolean isValidFunction(int selectedFunction, int STOP, int ORDER) { + return selectedFunction <= STOP || selectedFunction >= ORDER; + } + + //payType을 return한다. + public static PayType findPayType(int payTypenumber){ + return PayTypeRepository.findByNumber(payTypenumber); + } + + + //해당 테이블이 존재하는 테이블인지 검사한다. + public boolean isValidTableNumber(int tableNumber) { + return TableRepository.findByNumber(tableNumber).isPresent() ? true : false; + } + + //주문하려는 메뉴의 수량이 누적 30개가 넘는지 확인한다. + public boolean checkMaximumCount(int tableNumber, int menuNumber, int menuCount) { + return new Bill(orderRepository, tableNumber).checkMaximumPerMenu(menuNumber, menuCount); + } + + // 주문을 추가한다. + public void orderMenu(int tableNumber, int menuNumber, int menuCount) { + orderRepository.addOrder(new Order(tableNumber, menuNumber, menuCount)); + } + + //해당 테이블에서 주문한 것들에 대한 영수증을 return한다. + public Bill getBillByTable(int tableNumber) { + return new Bill(orderRepository, tableNumber); + } + + //OrderedTable이면 return true + public boolean checkOrderedTable(int tableNumber) { + Map orderedMenus = getBillByTable(tableNumber).getOrderedMenus(); + + return orderedMenus != null && !orderedMenus.isEmpty(); + } + + //입력된 메뉴가 존재하는 메뉴인지 검사한다. + public boolean isValidMenuNumber(int menuNumber) { + return MenuRepository.checkMenuNumber(menuNumber) ? true : false; + } + + //최종 금액을 return 하고, orderRepository에서 주문을 삭제한다. + public long getAmountOfPayment(Bill bill, PayType payType) { + long discountedPayment = bill.getDiscountedPayment(payType.getDiscountRate()); + orderRepository.finishedPayment(bill.getTableNumber()); + + return discountedPayment; + } } diff --git a/src/main/java/view/InputView.java b/src/main/java/view/InputView.java index be872d9..3923d0b 100644 --- a/src/main/java/view/InputView.java +++ b/src/main/java/view/InputView.java @@ -2,31 +2,37 @@ import java.util.Scanner; +//사용자의 입력과 관련된 모든 일을 담당하는 클래스 public class InputView { - private static final Scanner scanner = new Scanner(System.in); - - public static int inputFunction(){ - System.out.println("## 기능 선택"); - return scanner.nextInt(); - } - - public static int inputTableNumber() { - System.out.println("## 주문할 테이블을 선택하세요."); - return scanner.nextInt(); - } - - public static int inputPayTableNumber(){ - System.out.println("## 테이블 선택"); - return scanner.nextInt(); - } - - public static int inputMenu(){ - System.out.println("## 메뉴 선택"); - return scanner.nextInt(); - } - - public static int inputCount(){ - System.out.println("## 수량 선택"); - return scanner.nextInt(); - } + private static final Scanner scanner = new Scanner(System.in); + + public static int inputFunction() { + System.out.println("\n## 기능 선택"); + return scanner.nextInt(); + } + + public static int inputTableNumber() { + System.out.println("## 주문할 테이블을 선택하세요."); + return scanner.nextInt(); + } + + public static int inputPayTableNumber() { + System.out.println("\n## 테이블 선택"); + return scanner.nextInt(); + } + + public static int inputMenu() { + System.out.println("\n## 메뉴 선택"); + return scanner.nextInt(); + } + + public static int inputCount() { + System.out.println("\n## 수량 선택"); + return scanner.nextInt(); + } + + public static int inputPayType() { + System.out.println("## 신용카드는 1번, 현금 결제는 2번"); + return scanner.nextInt(); + } } diff --git a/src/main/java/view/OutputView.java b/src/main/java/view/OutputView.java index 0b8aac4..a7a0aa9 100644 --- a/src/main/java/view/OutputView.java +++ b/src/main/java/view/OutputView.java @@ -1,82 +1,99 @@ package view; +import java.util.List; + +import domain.Bill; import domain.Menu; import domain.Table; -import repository.OrderRepository; +import repository.MenuRepository; +import repository.TableRepository; import service.CafeOrderService; -import java.util.List; -import java.util.Map; -import java.util.Optional; - +//출력과 관련된 모든 일을 담당하는 클래스 public class OutputView { - private static final String TOP_LINE = "┌ ─ ┐"; - private static final String TABLE_FORMAT = "| %s |"; - private static final String BOTTOM_LINE = "└ ─ ┘"; - private static final String BOTTOM_LINE_ORDERED_TBL= "└ \\$ ┘"; - - public static void printMain() - { - System.out.println("## 메인화면"); - System.out.println("1 - 주문등록"); - System.out.println("2 - 결제하기"); - System.out.println("3 - 종료"); - } - - public static void printTables(final List
tables, final CafeOrderService cafeOrderService) { - System.out.println("## 테이블 목록"); - final int size = tables.size(); - printLine(TOP_LINE, size); - printTableNumbers(tables); - printLine(BOTTOM_LINE, tables, cafeOrderService); - } - - public static void printMenus(final List menus) { - for (final Menu menu : menus) { - System.out.println(menu); - } - } - - private static void printLine(final String line, final int count) { - for (int index = 0; index < count; index++) { - System.out.print(line); - } - System.out.println(); - } - - private static void printLine(final String line, final List
tables, CafeOrderService cafeOrderService){ - for(final Table table : tables) { - if (cafeOrderService.isOrderedTable(table.getNumber())) { - System.out.print(BOTTOM_LINE_ORDERED_TBL); - } else { - System.out.print(BOTTOM_LINE); - } - } - System.out.println(); - } - - private static void printTableNumbers(final List
tables) { - for (final Table table : tables) { - System.out.printf(TABLE_FORMAT, table); - } - System.out.println(); - } - - public static void printOrders(CafeOrderService cafeOrderService, int tableNum) { - System.out.println("## 주문 내역"); - System.out.println("메뉴 수량 금액"); - Map bill = cafeOrderService.getOrdersByTable(tableNum); - bill.forEach((key, value)->{ - System.out.println(key.getName()+" "+value+" "+key.getPrice()*value); - }); - } - - public static void printMaxAlert() - { - System.out.println("## 한 테이블에 주문 할 수 있는 한 메뉴의 수량은 최대 30개입니다."); - } - public static void printMenuAlert() - { - System.out.println("## 해당 메뉴는 존재하지 않는 메뉴입니다"); - } + private static final String TOP_LINE = "┌ ─ ┐"; + private static final String TABLE_FORMAT = "| %s |"; + private static final String BOTTOM_LINE = "└ ─ ┘"; + private static final String BOTTOM_LINE_ORDERED_TBL = "└ \\$ ┘"; + + public static void printMain() { + System.out.println("## 메인화면"); + System.out.println("1 - 주문등록"); + System.out.println("2 - 결제하기"); + System.out.println("3 - 종료"); + } + + public static void printTables(final CafeOrderService cafeOrderService) { + System.out.println("## 테이블 목록"); + final List
tables = TableRepository.getTables(); + final int size = tables.size(); + printLine(TOP_LINE, size); + printTableNumbers(tables); + printLine(BOTTOM_LINE, tables, cafeOrderService); + } + + public static void printMenus() { + final List menus = MenuRepository.menus(); + for (final Menu menu : menus) { + System.out.println(menu); + } + } + + private static void printLine(final String line, final int count) { + for (int index = 0; index < count; index++) { + System.out.print(line); + } + System.out.println(); + } + + private static void printLine(final String line, final List
tables, CafeOrderService cafeOrderService) { + for (final Table table : tables) { + if (cafeOrderService.checkOrderedTable(table.getNumber())) { + System.out.print(BOTTOM_LINE_ORDERED_TBL); + continue; + } + System.out.print(BOTTOM_LINE); + } + System.out.println(); + } + + private static void printTableNumbers(final List
tables) { + for (final Table table : tables) { + System.out.printf(TABLE_FORMAT, table); + } + System.out.println(); + } + + public static void printBill(Bill bill) { + System.out.println("\n## 주문 내역"); + System.out.println("메뉴 수량 금액"); + bill.getOrderedMenus().forEach((key, value) -> { + System.out.println(key.getName() + " " + value + " " + key.getPrice() * value); + }); + } + + public static void printMaxAlert() { + System.out.println("\n## 한 테이블에 주문 할 수 있는 한 메뉴의 수량은 최대 30개입니다."); + } + + public static void printMenuAlert() { + System.out.println("\n## 해당 메뉴는 존재하지 않는 메뉴입니다"); + } + + public static void printPayMessage(int tableNum) { + System.out.println("\n## " + tableNum + "번 테이블의 결제를 진행합니다."); + } + + public static void printAmountOfPayment(long amountOfPayment) { + System.out.println("## 최종 결제 금액"); + System.out.println(amountOfPayment); + } + + public static void printNoOrder() { + System.out.println("주문 정보가 없는 테이블입니다.\n"); + } + + public static void printNoTableAlert() { + System.out.println("## 존재하지 않는 테이블입니다. \n테이블을 다시 선택하세요\n"); + } }