Skip to content
Open
70 changes: 69 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1,69 @@
# java-chicken-2019
# 🚀 미션 - 치킨집 POS

치킨집 사장님이 사용하는 간단한 포스(POS) 프로그램을 구현한다.
주문 등록, 결제하기, 프로그램 종료 기능을 가진다.

# 📈 기능 목록

## 구현 기능 목록

### ✅ 입력

- [x] 메인화면 원하는 기능을 입력(1 - 주문등록 2 - 결제하기 3 - 프로그램 종료)
- [x] 테이블 입력
- [x] 주문할 메뉴 입력
- [x] 메뉴의 수량 입력
- [x] 결제 방식 입력(신용 카드는 1번, 현금은 2번)

### ✅ 주문등록 기능

- [x] 테이블 선택
- [x] [예외] 테이블 레포 안 숫자에 해당하지 않는 경우
- [x] 주문메뉴 받기
- [x] [예외] 메뉴 레포 숫자 중에 없는 경우
- [x] 메뉴 수량 받기
- [x] [예외] 0 이하 숫자인 경우
- [x] [예외] 100 이상 숫자인 경우
- [x] 선택된 테이블이 비었을 경우 : 유저 생성, 메뉴 정보 넣기
- [x] 선택된 테이블이 비지 않았을 경우 : 해당유저 메뉴 정보 추가

### ✅ 결제하기 기능

- [x] 테이블 선택
- [x] [예외] 선택된 테이블이 차있지 않은 경우
- [x] 금액계산
- [x] 메뉴마다 수량 10개 단위마다 만원 할인
- [x] 결제방식 저장
- [x] [예외] 해당 숫자중에 없는 경우
- [x] 현금결제 5% 할인
- [x] 최종 결제금액 출력
- [x] 해당 테이블 유저 제거

### ✅ 출력

- [x] 메인화면 출력
- [x] 테이블목록 출력
- [x] 메뉴 출력
- [x] 결제방식 출력

### ✅ 과정

- [x] 반복
- [x] 메인화면 입력 받기
- [x] [예외] 해당 숫자 중에 없는 경우
- [x] 프로그램 종료 입력 시 종료
- [x] 이외 : 주문등록/결제하기 수행

---

## 🔍구현 로직

- ### Main diagram


- ### Util diagram


- ### View diagram

---
22 changes: 4 additions & 18 deletions src/main/java/Application.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,7 @@
import domain.Menu;
import domain.MenuRepository;
import domain.Table;
import domain.TableRepository;
import view.InputView;
import view.OutputView;

import java.util.List;
import controller.SystemController;

public class Application {
// TODO 구현 진행
public static void main(String[] args) {
final List<Table> tables = TableRepository.tables();
OutputView.printTables(tables);

final int tableNumber = InputView.inputTableNumber();

final List<Menu> menus = MenuRepository.menus();
OutputView.printMenus(menus);
}
public static void main(String[] args) {
new SystemController();
}
}
32 changes: 32 additions & 0 deletions src/main/java/controller/SystemController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package controller;

import controller.run.OrderController;
import controller.run.PaymentController;
import controller.view.InputController;
import domain.repository.TableRepository;
import view.OutputView;

public class SystemController {
public static final int ORDER_NUM = 1;
public static final int PAY_NUM = 2;
public static final int QUIT_NUM = 3;

public SystemController() {
run();
}

private void run() {
OutputView.printMainList();
int mainNumber = InputController.getMainNumber();
if (mainNumber == ORDER_NUM) {
new OrderController().run();
}
if (mainNumber == PAY_NUM) {
new PaymentController().run();
}
if (mainNumber == QUIT_NUM) {
return;
}
run();
}
}
15 changes: 15 additions & 0 deletions src/main/java/controller/run/CalculateController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package controller.run;

import domain.repository.TableRepository;

public class CalculateController {
public static final double DISCOUNT_RATE = 0.95;

public static int getDiscountPay(int tableNum) {
return TableRepository.getUser(tableNum).getNoDiscountPay();
}

public static int getCashPay(int tableNum) {
return (int)(getDiscountPay(tableNum) * DISCOUNT_RATE);
}
}
40 changes: 40 additions & 0 deletions src/main/java/controller/run/OrderController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package controller.run;

import controller.view.InputController;
import domain.User;
import domain.repository.MenuRepository;
import domain.repository.TableRepository;
import view.OutputView;

public class OrderController {
public void run() {
try {
setTable(getTableNumber(), getMenuNumber(), getMenuCount());
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
run();
}
}

private void setTable(int tableNumber, int menuNumber, int menuCount) {
if (TableRepository.isUserEmpty(tableNumber)) {
TableRepository.initiateTableUser(tableNumber, new User(menuNumber, menuCount));
return;
}
TableRepository.getUser(tableNumber).addMenu(menuNumber, menuCount);
}

private int getTableNumber() {
OutputView.printTables(TableRepository.tables());
return InputController.getTableNumber();
}

private int getMenuNumber() {
OutputView.printMenus(MenuRepository.menus());
return InputController.getMenuNumber();
}

private int getMenuCount() {
return InputController.getMenuCount();
}
}
35 changes: 35 additions & 0 deletions src/main/java/controller/run/PaymentController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package controller.run;

import java.util.Arrays;

import controller.view.InputController;
import domain.repository.TableRepository;
import utils.Constants;
import view.OutputView;

public class PaymentController {
public void run() {
if (Arrays.stream(TableRepository.TABLE_NUMS).allMatch(TableRepository::isUserEmpty)) {
OutputView.printError(Constants.ERROR_NO_USER);
return;
}
int tableNumber = getPayTableNumber();
OutputView.printTableMenus(tableNumber);
printPay(tableNumber, InputController.getPayNumber());
TableRepository.deleteTableState(tableNumber);
}

private int getPayTableNumber() {
OutputView.printTables(TableRepository.tables());
return InputController.getPayTableNumber();
}

private void printPay(int tableNumber, int payNumber) {
if (payNumber == Constants.PAY_CARD) {
OutputView.printPayMoney(CalculateController.getDiscountPay(tableNumber));
}
if (payNumber == Constants.PAY_CASH) {
OutputView.printPayMoney(CalculateController.getCashPay(tableNumber));
}
}
}
79 changes: 79 additions & 0 deletions src/main/java/controller/view/InputController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package controller.view;

import utils.Converter;
import utils.validator.MainNumberValidator;
import utils.validator.MenuCountValidator;
import utils.validator.MenuNumberValidator;
import utils.validator.PayNumberValidator;
import utils.validator.TableNumberValidator;
import utils.validator.TablePayNumberValidator;
import view.InputView;
import view.OutputView;

public class InputController {
public static int getMainNumber() {
try {
String numString = InputView.inputMainNumber();
new MainNumberValidator(numString);
return Converter.getInt(numString);
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
return getMainNumber();
}
}

public static int getPayNumber() {
try {
String numString = InputView.inputPayNumber();
new PayNumberValidator(numString);
return Converter.getInt(numString);
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
return getPayNumber();
}
}

public static int getTableNumber() {
try {
String numString = InputView.inputTableNumber();
new TableNumberValidator(numString);
return Converter.getInt(numString);
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
return getTableNumber();
}
}

public static int getPayTableNumber() {
try {
String numString = InputView.inputTableNumber();
new TablePayNumberValidator(numString);
return Converter.getInt(numString);
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
return getPayTableNumber();
}
}

public static int getMenuNumber() {
try {
String numString = InputView.inputMenuNumber();
new MenuNumberValidator(numString);
return Converter.getInt(numString);
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
return getMenuNumber();
}
}

public static int getMenuCount() {
try {
String numString = InputView.inputMenuCountNumber();
new MenuCountValidator(numString);
return Converter.getInt(numString);
} catch (IllegalArgumentException e) {
OutputView.printError(e.getMessage());
return getMenuCount();
}
}
}
20 changes: 10 additions & 10 deletions src/main/java/domain/Category.java
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
package domain;

public enum Category {
CHICKEN("치킨"),
BEVERAGE("음료");
CHICKEN("치킨"),
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 + "]";
}
}
44 changes: 30 additions & 14 deletions src/main/java/domain/Menu.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,36 @@
package domain;

public class Menu {
private final int number;
private final String name;
private final Category category;
private final int 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 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;
}

@Override
public String toString() {
return category + " " + number + " - " + name + " : " + price + "원";
}
public int getNumber() {
return number;
}

public int getPrice() {
return price;
}

public String getName() {
return name;
}

public Category getCategory() {
return category;
}

@Override
public String toString() {
return category + " " + number + " - " + name + " : " + price + "원";
}
}
Loading