From 692f06143928e35b664d4f3521a7bb668926cc3f Mon Sep 17 00:00:00 2001 From: Habin Kim Date: Tue, 25 Feb 2025 12:00:21 +0900 Subject: [PATCH 1/4] =?UTF-8?q?docs:=20=EB=A6=AC=EB=93=9C=EB=AF=B8=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/README.md b/README.md index d54f268..c3112d2 100644 --- a/README.md +++ b/README.md @@ -1 +1,24 @@ # java-convenience-store-precourse + +## 출력 + +- 보유재고 출력 +- 영수증 출력 + +## 입력 + +- 구매할 상품명 및 수량 입력 +- 프로모션 적용 가능 시, 적용 여부 입력 +- 프로모션 재고 부족 시, 정가 결제 여부 입력 +- 멤버십 할인 여부 입력 +- 추가 구매 여부 입력 + +## 연산 + +- 최신 재고 유지 연산 +- 프로모션 적용 연산 +- 멤버십 할인 적용 연산 + +## 예외 + +- 입력 포맷 이상 \ No newline at end of file From 651cc84c3b4200b07cc00c9350e4f0ccbecd7eda Mon Sep 17 00:00:00 2001 From: Habin Kim Date: Sun, 2 Mar 2025 18:25:40 +0900 Subject: [PATCH 2/4] =?UTF-8?q?docs:=20=ED=94=84=EB=A1=9C=EB=AA=A8?= =?UTF-8?q?=EC=85=98=20=ED=8C=8C=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/promotions.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/promotions.md b/src/main/resources/promotions.md index d89887c..128b576 100644 --- a/src/main/resources/promotions.md +++ b/src/main/resources/promotions.md @@ -1,4 +1,4 @@ name,buy,get,start_date,end_date -탄산2+1,2,1,2024-01-01,2024-12-31 -MD추천상품,1,1,2024-01-01,2024-12-31 -반짝할인,1,1,2024-11-01,2024-11-30 +탄산2+1,2,1,2024-01-01,2025-03-08 +MD추천상품,1,1,2024-01-01,2025-03-08 +반짝할인,1,1,2024-11-01,2025-04-10 From 4d4521bb9456e1ad947608e7f02423356d07ce25 Mon Sep 17 00:00:00 2001 From: Habin Kim Date: Mon, 3 Mar 2025 20:42:51 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat:=20Product=EC=99=80=20Promotion=20?= =?UTF-8?q?=EB=AA=A8=EB=8D=B8=20=EB=B0=8F=20=EB=A0=88=ED=8C=8C=EC=A7=80?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EC=84=A4=EA=B3=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/model/Product.java | 17 +++++ src/main/java/store/model/Promotion.java | 22 ++++++ .../store/repository/ProductRepository.java | 67 ++++++++++++++++++ .../store/repository/PromotionRepository.java | 70 +++++++++++++++++++ 4 files changed, 176 insertions(+) create mode 100644 src/main/java/store/model/Product.java create mode 100644 src/main/java/store/model/Promotion.java create mode 100644 src/main/java/store/repository/ProductRepository.java create mode 100644 src/main/java/store/repository/PromotionRepository.java diff --git a/src/main/java/store/model/Product.java b/src/main/java/store/model/Product.java new file mode 100644 index 0000000..161607a --- /dev/null +++ b/src/main/java/store/model/Product.java @@ -0,0 +1,17 @@ +package store.model; + +import java.lang.String; + +public class Product { + private String name; + private int price; + private int quantity; + private String promotion; + + public Product(String name, int price, int quantity, String promotion) { + this.name = name; + this.price = price; + this.quantity = quantity; + this.promotion = promotion; + } +} diff --git a/src/main/java/store/model/Promotion.java b/src/main/java/store/model/Promotion.java new file mode 100644 index 0000000..aa9be74 --- /dev/null +++ b/src/main/java/store/model/Promotion.java @@ -0,0 +1,22 @@ +package store.model; + +import java.lang.String; +import camp.nextstep.edu.missionutils.DateTimes; + +// name,buy,get,start_date,end_date + +public class Promotion { + private String name; + private int buy; + private int get; + private String startDate; + private String endDate; + + public Promotion(String name, int buy, int get, String startDate, String endDate) { + this.name = name; + this.buy = buy; + this.get = get; + this.startDate = startDate; + this.endDate = endDate; + } +} diff --git a/src/main/java/store/repository/ProductRepository.java b/src/main/java/store/repository/ProductRepository.java new file mode 100644 index 0000000..aa94e03 --- /dev/null +++ b/src/main/java/store/repository/ProductRepository.java @@ -0,0 +1,67 @@ +package store.repository; + +import store.model.Product; + +import java.io.IOException; +import java.io.InputStream; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.List; +import java.util.ArrayList; + +public class ProductRepository { + private List products = new ArrayList<>(); + + public ProductRepository() { + loadProducts(); + } + + // 파일 읽어오기 + private void loadProducts() { + InputStream inputStream = getClass().getClassLoader().getResourceAsStream("products.md"); + + // 파일 존재 않을 시 예외처리 + if (inputStream == null) { + throw new RuntimeException("[ERROR] 'products.md' file not found"); + } + + try(BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + boolean firstLine = true; + + while ((line = reader.readLine()) != null) { + + // 첫 줄 건너뛰기 + if (firstLine) { + firstLine = false; + continue; + } + + // 한 줄씩 파싱 후 products 리스트에 저장 + Product product = parseProduct(line); + if (product != null) { + products.add(product); + } + } + } + catch (IOException e) { + throw new RuntimeException("[ERROR] IO error reading products file"); + } + + } + + // 문자 분리하기 + private Product parseProduct(String line) { + String[] parts = line.split(","); + if (parts.length != 4) { + return null; + } + + String name = parts[0].trim(); + int price = Integer.parseInt(parts[1].trim()); + int quantity = Integer.parseInt(parts[2].trim()); + String promotion = parts[3].trim(); + + return new Product(name, price, quantity, promotion); + } +} diff --git a/src/main/java/store/repository/PromotionRepository.java b/src/main/java/store/repository/PromotionRepository.java new file mode 100644 index 0000000..5595884 --- /dev/null +++ b/src/main/java/store/repository/PromotionRepository.java @@ -0,0 +1,70 @@ +package store.repository; + +import camp.nextstep.edu.missionutils.DateTimes; +import store.model.Product; +import store.model.Promotion; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.List; +import java.util.ArrayList; + +public class PromotionRepository { + private List promotions = new ArrayList<>(); + + public PromotionRepository() { + loadPromotions(); + } + + // 파일 읽어오기 + private void loadPromotions() { + InputStream inputStream = getClass().getClassLoader().getResourceAsStream("promotions.md"); + + // 파일 존재 않을 시 예외처리 + if (inputStream == null) { + throw new RuntimeException("[ERROR] 'promotions.md' file not found"); + } + + try(BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String line; + boolean firstLine = true; + + while ((line = reader.readLine()) != null) { + + // 첫 줄 건너뛰기 + if (firstLine) { + firstLine = false; + continue; + } + + // 한 줄씩 파싱 후 promotions 리스트에 저장 + Promotion promotion = parsePromotion(line); + if (promotion != null) { + promotions.add(promotion); + } + } + } + catch (IOException e) { + throw new RuntimeException("[ERROR] IO error reading promotions file"); + } + + } + + // 문자 분리하기 + private Promotion parsePromotion(String line) { + String[] parts = line.split(","); + if (parts.length != 5) { + return null; + } + + String name = parts[0].trim(); + int buy = Integer.parseInt(parts[1].trim()); + int get = Integer.parseInt(parts[2].trim()); + String startDate = parts[3].trim(); + String endDate = parts[4].trim(); + + return new Promotion(name, buy, get, startDate, endDate); + } +} From 6a157c3f69e2c7b9c3c882b475d0fe9c95ea3f3e Mon Sep 17 00:00:00 2001 From: Habin Kim Date: Tue, 4 Mar 2025 14:55:48 +0900 Subject: [PATCH 4/4] =?UTF-8?q?update:=20promotion=EC=9D=98=20date?= =?UTF-8?q?=EA=B0=92=EC=9D=98=20=ED=98=95=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/store/model/Promotion.java | 8 +++---- .../store/repository/PromotionRepository.java | 24 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/main/java/store/model/Promotion.java b/src/main/java/store/model/Promotion.java index aa9be74..8fc72ab 100644 --- a/src/main/java/store/model/Promotion.java +++ b/src/main/java/store/model/Promotion.java @@ -1,7 +1,7 @@ package store.model; import java.lang.String; -import camp.nextstep.edu.missionutils.DateTimes; +import java.util.Date; // name,buy,get,start_date,end_date @@ -9,10 +9,10 @@ public class Promotion { private String name; private int buy; private int get; - private String startDate; - private String endDate; + private Date startDate; + private Date endDate; - public Promotion(String name, int buy, int get, String startDate, String endDate) { + public Promotion(String name, int buy, int get, Date startDate, Date endDate) { this.name = name; this.buy = buy; this.get = get; diff --git a/src/main/java/store/repository/PromotionRepository.java b/src/main/java/store/repository/PromotionRepository.java index 5595884..11cc9a1 100644 --- a/src/main/java/store/repository/PromotionRepository.java +++ b/src/main/java/store/repository/PromotionRepository.java @@ -1,7 +1,5 @@ package store.repository; -import camp.nextstep.edu.missionutils.DateTimes; -import store.model.Product; import store.model.Promotion; import java.io.BufferedReader; @@ -10,6 +8,9 @@ import java.io.InputStreamReader; import java.util.List; import java.util.ArrayList; +import java.util.Date; +import java.text.DateFormat; +import java.text.SimpleDateFormat; public class PromotionRepository { private List promotions = new ArrayList<>(); @@ -54,17 +55,24 @@ private void loadPromotions() { // 문자 분리하기 private Promotion parsePromotion(String line) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + String[] parts = line.split(","); if (parts.length != 5) { return null; } - String name = parts[0].trim(); - int buy = Integer.parseInt(parts[1].trim()); - int get = Integer.parseInt(parts[2].trim()); - String startDate = parts[3].trim(); - String endDate = parts[4].trim(); + try { + String name = parts[0].trim(); + int buy = Integer.parseInt(parts[1].trim()); + int get = Integer.parseInt(parts[2].trim()); + Date startDate = df.parse(parts[3].trim()); + Date endDate = df.parse(parts[4].trim()); - return new Promotion(name, buy, get, startDate, endDate); + return new Promotion(name, buy, get, startDate, endDate); + } + catch (Exception e) { + throw new RuntimeException("[ERROR] Text file format error"); + } } }