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

[영화예매] 반선호 과제 제출합니다. #33

Closed
wants to merge 18 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
34 changes: 34 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
## 오프라인 코딩 테스트 - 영화예매

## 기능 구현 목록
1. [예약]예매 가능한 목록을 출력해주고 예매할 영화를 입력해주는 기능
* [예외처리] 상영목록에 없는 영화를 선택한 경우
* [예외처리] 숫자가 아닌 수를 입력한 경우

1. [예약]예약할 시간표를 묻는 기능경우
* [예외처리] 선택한 영화가 기존에 예매한 영화와 시간들과 1시간 이내가 아닌
* [예외처리] 상영 시작 시간이 이미 지난 영화를 선택하는 경우
* [예외처리] 스케줄에 없는 번호를 입력하였을 때 (O)

1. [예약]예약할 인원을 묻는 기능
* [예외처리] 예약 가능한 인원을 초과하였을 때
* [예외처리] 예약 인원이 0명 이하일 때

1. [예약]예약 목록에 추가 기능
* 해당 스케줄 예매 인원 감소 -> 0명이면 스케줄 삭제

1. [예약]추가 예매 여부를 묻는 기능
* 추가예매를 안 할 경우 -> 예매한 목록을 보여 줌
* 추가예매를 할 경우 -> 1번으로 돌아감

1. [예약]같은 영화를 다시 예매 했을 때 합치는 기능

1. [결제]포인트 사용 금액을 입력받는 기능
* [예외처리] 입력한 포인트가 0 미만인 경우
* [예외처리] 입력한 포인트가 결제 금액을 넘을 경우

1. [결제]신용카드, 현금 여부를 묻는 기능
* [예외처리] 1,2번이 아닌 다른 번호를 입력한 경우

[TO_DO_LIST]
1, 한시간 이내의 영화가 없을 경우 뒤로가기
14 changes: 10 additions & 4 deletions src/main/java/MovieApplication.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
import domain.Movie;
import domain.MovieRepository;
import payment.PaymentMain;
import reservation.MovieReservation;
import reservation.ReservationMain;
import view.InputView;
import view.OutputView;

Expand All @@ -8,10 +11,13 @@
public class MovieApplication {
public static void main(String[] args) {
List<Movie> movies = MovieRepository.getMovies();
OutputView.printMovies(movies);
MovieReservation reservations = new MovieReservation();

int movieId = InputView.inputMovieId();

// TODO 구현 진행
do{
OutputView.printMovies(movies);
ReservationMain.reservationRun(reservations);
} while(InputView.InputContinueReservation());
reservations.printResult();
PaymentMain.paymentrun(reservations);
}
}
32 changes: 31 additions & 1 deletion src/main/java/domain/Movie.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,40 @@ public class Movie {

private List<PlaySchedule> playSchedules = new ArrayList<>();

public Movie(int id, String name, int price) {
Movie(int id, String name, int price) {
this.id = id;
this.name = name;
this.price = price;
}

public int getId() {
return id;
}

public String getName() {
return name;
}

public int getPrice() {
return price;
}

void addPlaySchedule(PlaySchedule playSchedule) {
playSchedules.add(playSchedule);
}

boolean contains(int movieId) {
return this.id == movieId;
}

public PlaySchedule checkVaildSchedule(int scheduleId) {
try {
return playSchedules.get(scheduleId - 1);
} catch (IndexOutOfBoundsException e) {
throw new IllegalArgumentException();
}
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
Expand All @@ -31,4 +55,10 @@ public String toString() {
return id + " - " + name + ", " + price + "원" + NEW_LINE
+ sb.toString();
}

void reduceCapacity(PlaySchedule schedule, int reservePeopleNum) {
if (playSchedules.get(playSchedules.indexOf(schedule)).reduce(reservePeopleNum)) {
playSchedules.remove(playSchedules.indexOf(schedule));
}
}
}
17 changes: 17 additions & 0 deletions src/main/java/domain/MovieRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import static utils.DateTimeUtils.createDateTime;

Expand Down Expand Up @@ -42,4 +43,20 @@ public class MovieRepository {
public static List<Movie> getMovies() {
return movies;
}

public static Movie getPlaySchedule(int movieId) {
return movies.stream()
.filter(movie -> movie.contains(movieId))
.findFirst()
.get();
}

public static boolean contain(int movieId) {
return movies.stream()
.anyMatch(movie -> movie.contains(movieId));
}

public static void reduceCapacity(Movie selectedMovie, PlaySchedule schedule, int reservePeopleNum) {
selectedMovie.reduceCapacity(schedule,reservePeopleNum);
}
}
27 changes: 27 additions & 0 deletions src/main/java/domain/PlaySchedule.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import static utils.DateTimeUtils.format;

public class PlaySchedule {
private static final int MIN_RESERVATION_NUM = 0;
private final LocalDateTime startDateTime;
private int capacity;

Expand All @@ -13,8 +14,34 @@ public PlaySchedule(LocalDateTime startDateTime, int capacity) {
this.capacity = capacity;
}

public LocalDateTime getStartDateTime() {
return startDateTime;
}

public int getCapacity() {
return capacity;
}

public int checkValidReservation(int reservePeopleNum) {
if ((this.capacity >= reservePeopleNum) &&
(reservePeopleNum > MIN_RESERVATION_NUM)) {
return reservePeopleNum;
}
throw new IllegalArgumentException();
}

boolean reduce(int peopleNum) {
capacity -= peopleNum;
if (capacity == 0) {
return true;
}
return false;
}

@Override
public String toString() {
return "시작시간: " + format(startDateTime) + " 예약가능인원: " + capacity + "\n";
}


}
30 changes: 30 additions & 0 deletions src/main/java/domain/ReservationMovie.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package domain;


import utils.DateTimeUtils;

public class ReservationMovie extends Movie{
private final ReservationSchedule schedule;

public ReservationMovie(int id, String name, int price, ReservationSchedule schedule) {
super(id,name,price);
this.schedule = schedule;
}

public boolean checkTime(PlaySchedule schedule) {
return DateTimeUtils.isOneHourWithinRange(this.schedule.getStartDateTime(),
schedule.getStartDateTime());
}

public int getCapacity(){
return schedule.getCapacity();
}

@Override
public String toString() {
StringBuilder sb = new StringBuilder();
sb.append(schedule);
return super.getId() + " - " + super.getName() + ", " + super.getPrice() + "원" + "\n"
+ sb.toString();
}
}
18 changes: 18 additions & 0 deletions src/main/java/domain/ReservationSchedule.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package domain;

import java.time.LocalDateTime;

import static utils.DateTimeUtils.format;

public class ReservationSchedule extends PlaySchedule {

public ReservationSchedule(LocalDateTime startDateTime, int capacity) {
super(startDateTime, capacity);
}

@Override
public String toString() {
return "시작시간: " + format(super.getStartDateTime()) + "\n예약 인원 : " + super.getCapacity() + "\n";
}

}
45 changes: 45 additions & 0 deletions src/main/java/domain/ResultPay.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package domain;

public class ResultPay {
private static final int CARD = 1;
private static final int MONEY = 2;
private static final double CARD_RATIO = 0.95;
private static final double MONEY_RATIO = 0.98;
private static final int MIN_POINT = 0;
int pay;
int point;
int paymentMethod;

public ResultPay(int pay, int point, int paymentMethod) {
this.paymentMethod = paymentMethod;
this.point = point;
if (paymentMethod == CARD) {
this.pay = (int) (pay * CARD_RATIO) - point;
}
if (paymentMethod == MONEY) {
this.pay = (int) (pay * MONEY_RATIO) - point;
}
if(this.pay < 0){
this.pay = 0;
}
}

public static int checkPoint(int point) {
if (point < MIN_POINT) {
throw new IllegalArgumentException();
}
return point;
}

public static int checkPaymentMethod(int paymentMethod) {
if (paymentMethod == CARD || paymentMethod == MONEY) {
return paymentMethod;
}
throw new IllegalArgumentException();
}

public void printResult() {
System.out.println("최종 결제 금액은 " + pay + "입니다.");
System.out.println("예매를 완료했습니다. 즐거운 영화 관람되세요.");
}
}
18 changes: 18 additions & 0 deletions src/main/java/payment/PaymentMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package payment;

import domain.ResultPay;
import reservation.MovieReservation;
import view.InputView;
import view.OutputView;

public class PaymentMain {
public static void paymentrun(MovieReservation reservations) {
OutputView.PaymentStart();
ResultPay resultPay;
int point = InputView.InputPoint();
int pay = reservations.getPay();
int paymentMethod = InputView.selectPaymentMethod();
resultPay = new ResultPay(pay, point, paymentMethod);
resultPay.printResult();
}
}
48 changes: 48 additions & 0 deletions src/main/java/reservation/MovieReservation.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package reservation;

import domain.*;

import java.util.ArrayList;

public class MovieReservation {
private ArrayList<ReservationMovie> reservations = new ArrayList<>();

public static int checkExistList(int movieId) {
if (!MovieRepository.contain(movieId)) {
throw new IllegalArgumentException();
}
return movieId;
}

public static PlaySchedule checkExistSchedule(Movie selectedMovie, int ScheduleId) {
return selectedMovie.checkVaildSchedule(ScheduleId);
}

boolean checkVaildSchedule(PlaySchedule schedule) {
if (!reservations.stream()
.allMatch(reservation -> reservation.checkTime(schedule))) {
System.out.println("기존 예매 목록과 한시간 이상 차이가 납니다.");
return false;
}
return true;
}

void insertReserrvation(Movie selectedMovie, PlaySchedule schedule, int reservePeopleNum) {
reservations.add(new ReservationMovie(selectedMovie.getId(), selectedMovie.getName(), selectedMovie.getPrice(),
new ReservationSchedule(schedule.getStartDateTime(), reservePeopleNum)));
}

public void printResult() {
for (ReservationMovie reservationMovie : reservations) {
System.out.println(reservationMovie);
}
}

public int getPay() {
int pay = 0;
for (ReservationMovie reservationMovie : reservations) {
pay += reservationMovie.getPrice() * reservationMovie.getCapacity();
}
return pay;
}
}
24 changes: 24 additions & 0 deletions src/main/java/reservation/ReservationCreater.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package reservation;

import domain.Movie;
import domain.PlaySchedule;
import view.InputView;
import view.OutputView;

class ReservationCreater {
static Movie inputMovie(int movieId) {
return OutputView.printPlaySchedule(movieId);
}

static PlaySchedule inputSchedule(MovieReservation reservations, Movie selectedMovie) {
PlaySchedule schedule;
do {
schedule = InputView.inputPlaySchedule(selectedMovie);
} while (!reservations.checkVaildSchedule(schedule));
return schedule;
}

static int inputReserveNum(PlaySchedule schedule) {
return InputView.inputReservationPeople(schedule);
}
}
20 changes: 20 additions & 0 deletions src/main/java/reservation/ReservationMain.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package reservation;

import domain.Movie;
import domain.MovieRepository;
import domain.PlaySchedule;
import view.InputView;

public class ReservationMain {
public static MovieReservation reservationRun(MovieReservation reservations) {
int reservePeopleNum;
int movieId = InputView.inputMovieId();

Movie selectedMovie = ReservationCreater.inputMovie(movieId);
PlaySchedule schedule = ReservationCreater.inputSchedule(reservations, selectedMovie);
reservePeopleNum = ReservationCreater.inputReserveNum(schedule);
reservations.insertReserrvation(selectedMovie, schedule, reservePeopleNum);
MovieRepository.reduceCapacity(selectedMovie, schedule, reservePeopleNum);
return reservations;
}
}
Loading