From 2d002a7e4bdef27de45b99a8ee1a2793a3680d8b Mon Sep 17 00:00:00 2001 From: fxe025 <110606445+fxe025@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:22:25 +0800 Subject: [PATCH 001/421] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f82e2494b7..67e53e06f3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Duke project template +# Stock Master This is a project template for a greenfield Java project. It's named after the Java mascot _Duke_. Given below are instructions on how to use it. From 875036697d7bd7cfca5f8f7e5c946a0b214fbda6 Mon Sep 17 00:00:00 2001 From: fxe025 <110606445+fxe025@users.noreply.github.com> Date: Thu, 7 Mar 2024 15:39:37 +0800 Subject: [PATCH 002/421] Update README.md --- docs/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/README.md b/docs/README.md index bbcc99c1e7..8cd7858a66 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ -# Duke +# Stock Master -{Give product intro here} +StockMaster helps small business owners manage inventory of their business. It is optimized for CLI users so that frequent tasks can be done faster by typing in commands. Useful links: * [User Guide](UserGuide.md) From 50cb8004c6b73fd5b73b36ff80b676e71e8d5e9b Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 7 Mar 2024 16:03:38 +0800 Subject: [PATCH 003/421] Add Shu Hong Profile --- docs/AboutUs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..0bc152b127 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:--------:|:--------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Shu Hong | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From a157fc0b1ebf3faab2fdf48fff41bad62b35c444 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 7 Mar 2024 16:05:37 +0800 Subject: [PATCH 004/421] about us --- docs/AboutUs.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..e3cc593e72 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: +Display | Name | Github Profile | Portfolio +--------|:--------:|:-----------------------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Joel Lim | joellimjr | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 5fa7dc74746358d915ac5006ed06144f38de8169 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 7 Mar 2024 16:06:33 +0800 Subject: [PATCH 005/421] Edit AboutUs --- docs/AboutUs.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..7bcdf18cb6 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: +Display | Name | Github Profile | Portfolio +--------|:--------:|:--------------:|:---------: ![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) ![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Fu Xueer | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From 682dcedafbe5eb5b45f5c519903090c7a5601aaa Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 7 Mar 2024 16:12:37 +0800 Subject: [PATCH 006/421] Edit AboutUs.md --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 0f072953ea..9de11834c8 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:----:|:--------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:------------:|:---------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Low Tjun Lym | [Github(https://github.com/LowTL) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | John Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) From c62c699d924e3100c60fe908b5a17fca6cd03468 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 11 Mar 2024 14:20:39 +0800 Subject: [PATCH 007/421] Create Storage package --- src/main/java/Storage/Storage.java | 74 ++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/main/java/Storage/Storage.java diff --git a/src/main/java/Storage/Storage.java b/src/main/java/Storage/Storage.java new file mode 100644 index 0000000000..a9575324fa --- /dev/null +++ b/src/main/java/Storage/Storage.java @@ -0,0 +1,74 @@ +package Storage; + +import java.io.File; +import java.io.FileNotFoundException; +import java.util.Scanner; +import java.io.FileWriter; +import java.io.IOException; + +/** + * Represents an add command where a new task is added to the existing list of task. + * String FILENAME represents the designated relative file path for the file. + * File dukeData represents the File object created to be updated. + */ +public class Storage { + private static final String FILENAME = "./StockMasterData.txt"; + private static File StockMaster; + + /** + * Write contents to the file. + * + * @param filePath File path where the file is located. + * @param textToAdd The line of text to write to the file. + * @param ifAppend Indicate if append the text at the end of the file (true) + * or overwrite the file (false). + * @throws IOException If file is not found at the indicated file path. + */ + private static void writeToFile(String filePath, String textToAdd, boolean ifAppend) throws IOException { + FileWriter writer = new FileWriter(filePath, ifAppend); + writer.write(textToAdd); + writer.close(); + } + + public static void updateFile(String inputText, boolean ifAppend) { + try { + writeToFile(FILENAME, inputText, ifAppend); + } catch (IOException e) { + System.out.println("IOExceptions occurred"); + } + } + + /** + * Returns the private File dukeData. + */ + public static File getFile() { + return StockMaster; + } + + /** + * Read lines from the file and identify tasks written inside. + * Add the identified tasks into a list of existing tasks. + * + * @param fileToRead The file to read from. + */ + public static void readFromFile(File fileToRead) { + try { + Scanner scanner = new Scanner(fileToRead); + while (scanner.hasNext()) { + String lineSkipped = scanner.nextLine(); + } + } catch(FileNotFoundException e){ + System.out.println("File does not exist."); + } + } + + public static void main (String[]args){ + StockMaster = new File(FILENAME); + try { + writeToFile(StockMaster.getPath(), "", true); + } catch (IOException e) { + System.out.println("File does not exist."); + } + } +} + From 952bbfec97dcab2e1d7c9fa3bfbe70d725c9e242 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 15 Mar 2024 12:18:31 +0800 Subject: [PATCH 008/421] Add TextUi class --- src/main/java/seedu/duke/TextUi.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/seedu/duke/TextUi.java diff --git a/src/main/java/seedu/duke/TextUi.java b/src/main/java/seedu/duke/TextUi.java new file mode 100644 index 0000000000..2396e635c4 --- /dev/null +++ b/src/main/java/seedu/duke/TextUi.java @@ -0,0 +1,26 @@ +package seedu.duke; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public class TextUi { + + private final Scanner in; + private final PrintStream out; + + public TextUi() { + this(System.in, System.out); + } + + public TextUi(InputStream in, PrintStream out) { + this.in = new Scanner(in); + this.out = out; + } + + public String getUserCommand() {return null;} + + public void showWelcomeMessage() {} + + public void showGoodByeMessage() {} +} From ce61e663fe0adf86a158778a207987b07947d0a1 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 15 Mar 2024 12:18:55 +0800 Subject: [PATCH 009/421] Create Parser class --- src/main/java/Parser.java | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/main/java/Parser.java diff --git a/src/main/java/Parser.java b/src/main/java/Parser.java new file mode 100644 index 0000000000..11ddc81dec --- /dev/null +++ b/src/main/java/Parser.java @@ -0,0 +1,10 @@ +public class Parser { + public String userInput; + + public void parseInput(String userInput){ + + } + +} + + From 7b4152388ff0f66977231d86785f381d2eb26420 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 15 Mar 2024 12:22:01 +0800 Subject: [PATCH 010/421] Revert "Add TextUi class" This reverts commit 952bbfec97dcab2e1d7c9fa3bfbe70d725c9e242. --- src/main/java/seedu/duke/TextUi.java | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 src/main/java/seedu/duke/TextUi.java diff --git a/src/main/java/seedu/duke/TextUi.java b/src/main/java/seedu/duke/TextUi.java deleted file mode 100644 index 2396e635c4..0000000000 --- a/src/main/java/seedu/duke/TextUi.java +++ /dev/null @@ -1,26 +0,0 @@ -package seedu.duke; - -import java.io.InputStream; -import java.io.PrintStream; -import java.util.Scanner; - -public class TextUi { - - private final Scanner in; - private final PrintStream out; - - public TextUi() { - this(System.in, System.out); - } - - public TextUi(InputStream in, PrintStream out) { - this.in = new Scanner(in); - this.out = out; - } - - public String getUserCommand() {return null;} - - public void showWelcomeMessage() {} - - public void showGoodByeMessage() {} -} From be51ada874f7ad2b3fbea141fd941ed33a27124f Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 15 Mar 2024 12:23:27 +0800 Subject: [PATCH 011/421] Create Parser package --- src/main/java/{ => Parser}/Parser.java | 2 ++ 1 file changed, 2 insertions(+) rename src/main/java/{ => Parser}/Parser.java (86%) diff --git a/src/main/java/Parser.java b/src/main/java/Parser/Parser.java similarity index 86% rename from src/main/java/Parser.java rename to src/main/java/Parser/Parser.java index 11ddc81dec..6d1a562609 100644 --- a/src/main/java/Parser.java +++ b/src/main/java/Parser/Parser.java @@ -1,3 +1,5 @@ +package Parser; + public class Parser { public String userInput; From 790b26eaa881e467c7b4eac69905816d82c92988 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 15 Mar 2024 12:33:32 +0800 Subject: [PATCH 012/421] Add TextUi Class --- src/main/java/seedu/duke/TextUi.java | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/main/java/seedu/duke/TextUi.java diff --git a/src/main/java/seedu/duke/TextUi.java b/src/main/java/seedu/duke/TextUi.java new file mode 100644 index 0000000000..fc6d43614a --- /dev/null +++ b/src/main/java/seedu/duke/TextUi.java @@ -0,0 +1,26 @@ +package seedu.duke; + +import java.io.InputStream; +import java.io.PrintStream; +import java.util.Scanner; + +public class TextUi { + + private final Scanner in; + private final PrintStream out; + + public TextUi() { + this(System.in, System.out); + } + + public TextUi(InputStream in, PrintStream out) { + this.in = new Scanner(in); + this.out = out; + } + + public String getUserCommand() {return null;} + + public void showWelcomeMessage() {} + + public void showGoodByeMessage() {} +} \ No newline at end of file From d0e09a9caa31c59606d4e9f16939c3afc1b25f66 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 15 Mar 2024 12:35:11 +0800 Subject: [PATCH 013/421] Create ParserTest --- src/main/java/Parser/ParserTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/java/Parser/ParserTest.java diff --git a/src/main/java/Parser/ParserTest.java b/src/main/java/Parser/ParserTest.java new file mode 100644 index 0000000000..08b2a77202 --- /dev/null +++ b/src/main/java/Parser/ParserTest.java @@ -0,0 +1,4 @@ +package Parser; + +public class ParserTest { +} From e2ca0e06e2388f4be1ab05ac6675825e0dd16a42 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 15 Mar 2024 12:39:56 +0800 Subject: [PATCH 014/421] Create ParserTest --- src/main/java/Parser/ParserTest.java | 4 ---- src/test/java/Parser/ParserTest.java | 22 ++++++++++++++++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) delete mode 100644 src/main/java/Parser/ParserTest.java create mode 100644 src/test/java/Parser/ParserTest.java diff --git a/src/main/java/Parser/ParserTest.java b/src/main/java/Parser/ParserTest.java deleted file mode 100644 index 08b2a77202..0000000000 --- a/src/main/java/Parser/ParserTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package Parser; - -public class ParserTest { -} diff --git a/src/test/java/Parser/ParserTest.java b/src/test/java/Parser/ParserTest.java new file mode 100644 index 0000000000..eff54a1bb5 --- /dev/null +++ b/src/test/java/Parser/ParserTest.java @@ -0,0 +1,22 @@ +package Parser; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class ParserTest { + private Parser parser; + + @BeforeEach + public void setUp() { + parser = new Parser(); + } + + /* + * Note how the names of the test methods does not follow the normal naming convention. + * That is because our coding standard allows a different naming convention for test methods. + */ + + @Test + public void parse_emptyInput_returnsIncorrect() { + } +} From 709e06c49d7953b6262810a05ded0f02e68b3ca9 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 15 Mar 2024 13:03:22 +0800 Subject: [PATCH 015/421] Add TextUi Test --- src/test/java/seedu/duke/TextUiTest.java | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/test/java/seedu/duke/TextUiTest.java diff --git a/src/test/java/seedu/duke/TextUiTest.java b/src/test/java/seedu/duke/TextUiTest.java new file mode 100644 index 0000000000..1642c22cf2 --- /dev/null +++ b/src/test/java/seedu/duke/TextUiTest.java @@ -0,0 +1,4 @@ +package seedu.duke; + +public class TextUiTest { +} From e65233e78da5dbb0d0455f1fb962c7d931590510 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 15 Mar 2024 13:24:37 +0800 Subject: [PATCH 016/421] Update AboutUs --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index e3cc593e72..8e0359bc56 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:--------:|:-----------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | John Doe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Joe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Ron John | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Joel Lim | joellimjr | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Don Roe | [Github](https://github.com/) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:--------:|:---------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Low Tjun Lym | [Github(https://github.com/LowTL) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Fu Xueer | [Github](https://github.com/fxe025) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Heng Shu Hong | [Github(https://github.com/HengShuHong) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Joel Lim | [Github(https://github.com/joellimjr) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Min Guanlin | [Github(https://github.com/Fureimi) | [Portfolio](docs/team/johndoe.md) From a0331912acdb4dc82f8c5367263002423b82535d Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 15 Mar 2024 13:43:11 +0800 Subject: [PATCH 017/421] Correct Indentation --- src/main/java/Storage/Storage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/Storage/Storage.java b/src/main/java/Storage/Storage.java index a9575324fa..25c7a88b48 100644 --- a/src/main/java/Storage/Storage.java +++ b/src/main/java/Storage/Storage.java @@ -58,8 +58,8 @@ public static void readFromFile(File fileToRead) { String lineSkipped = scanner.nextLine(); } } catch(FileNotFoundException e){ - System.out.println("File does not exist."); - } + System.out.println("File does not exist."); + } } public static void main (String[]args){ From 830d5ca700d3aa02bafab18ae96ae22f6f765f5c Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 15 Mar 2024 13:44:25 +0800 Subject: [PATCH 018/421] Fix Code to follow coding style --- src/main/java/seedu/duke/TextUi.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/seedu/duke/TextUi.java b/src/main/java/seedu/duke/TextUi.java index fc6d43614a..a1d8111f4b 100644 --- a/src/main/java/seedu/duke/TextUi.java +++ b/src/main/java/seedu/duke/TextUi.java @@ -18,9 +18,11 @@ public TextUi(InputStream in, PrintStream out) { this.out = out; } - public String getUserCommand() {return null;} + public String getUserCommand() { + return null; + } public void showWelcomeMessage() {} public void showGoodByeMessage() {} -} \ No newline at end of file +} From 3ab7a4f9be9648a6c78b9fca712151e0cfa38dc6 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 15 Mar 2024 15:17:40 +0800 Subject: [PATCH 019/421] Create StorageTest --- src/test/java/Storage/StorageTest.java | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 src/test/java/Storage/StorageTest.java diff --git a/src/test/java/Storage/StorageTest.java b/src/test/java/Storage/StorageTest.java new file mode 100644 index 0000000000..c3a0219588 --- /dev/null +++ b/src/test/java/Storage/StorageTest.java @@ -0,0 +1,2 @@ +package Storage;public class StorageTest { +} From b0a7a88e6492669a142186f4e68556f52f46ec96 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 15 Mar 2024 15:18:05 +0800 Subject: [PATCH 020/421] Create StorageTest --- src/test/java/Storage/StorageTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/test/java/Storage/StorageTest.java b/src/test/java/Storage/StorageTest.java index c3a0219588..b16da29ce5 100644 --- a/src/test/java/Storage/StorageTest.java +++ b/src/test/java/Storage/StorageTest.java @@ -1,2 +1,12 @@ -package Storage;public class StorageTest { +package Storage; + +import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.io.FileNotFoundException; +public class StorageTest { + @Test + public void fileToReadNotFound() { + } } From 2d5fb443e3aed335293ffb849d33a007bd723982 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 15 Mar 2024 16:17:47 +0800 Subject: [PATCH 021/421] Remove unused import --- src/test/java/Storage/StorageTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/test/java/Storage/StorageTest.java b/src/test/java/Storage/StorageTest.java index b16da29ce5..414a111b9f 100644 --- a/src/test/java/Storage/StorageTest.java +++ b/src/test/java/Storage/StorageTest.java @@ -1,10 +1,11 @@ package Storage; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; +//import static org.junit.jupiter.api.Assertions.assertEquals; +//import static org.junit.jupiter.api.Assertions.fail; + +//import java.io.FileNotFoundException; -import java.io.FileNotFoundException; public class StorageTest { @Test public void fileToReadNotFound() { From 32d06eb9ead426c6656b4ab19c52f9f50fdc96a1 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 17 Mar 2024 15:07:00 +0800 Subject: [PATCH 022/421] Create package for TextUi --- src/main/java/{seedu/duke => Ui}/TextUi.java | 2 +- src/test/java/{seedu/duke => Ui}/TextUiTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/{seedu/duke => Ui}/TextUi.java (96%) rename src/test/java/{seedu/duke => Ui}/TextUiTest.java (59%) diff --git a/src/main/java/seedu/duke/TextUi.java b/src/main/java/Ui/TextUi.java similarity index 96% rename from src/main/java/seedu/duke/TextUi.java rename to src/main/java/Ui/TextUi.java index a1d8111f4b..d5f30ab76a 100644 --- a/src/main/java/seedu/duke/TextUi.java +++ b/src/main/java/Ui/TextUi.java @@ -1,4 +1,4 @@ -package seedu.duke; +package Ui; import java.io.InputStream; import java.io.PrintStream; diff --git a/src/test/java/seedu/duke/TextUiTest.java b/src/test/java/Ui/TextUiTest.java similarity index 59% rename from src/test/java/seedu/duke/TextUiTest.java rename to src/test/java/Ui/TextUiTest.java index 1642c22cf2..21742ac88c 100644 --- a/src/test/java/seedu/duke/TextUiTest.java +++ b/src/test/java/Ui/TextUiTest.java @@ -1,4 +1,4 @@ -package seedu.duke; +package Ui; public class TextUiTest { } From 9bd70847b3269461fc0331fa1a2ddaec98014e30 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 17 Mar 2024 16:37:20 +0800 Subject: [PATCH 023/421] Add Welcome and Goodbye Message --- src/main/java/Ui/TextUi.java | 45 ++++++++++++++++++++++++++++-------- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/main/java/Ui/TextUi.java b/src/main/java/Ui/TextUi.java index d5f30ab76a..3ba4e4fc96 100644 --- a/src/main/java/Ui/TextUi.java +++ b/src/main/java/Ui/TextUi.java @@ -1,28 +1,55 @@ package Ui; +import Storage.Storage; + import java.io.InputStream; import java.io.PrintStream; import java.util.Scanner; public class TextUi { + public static final String DIVIDER = "----------------"; + + public static final String WELCOME_MESSAGE = "Welcome to StockMaster, where you can master the knowledge on your " + + "Stock!"; + + public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; private final Scanner in; - private final PrintStream out; public TextUi() { - this(System.in, System.out); + this.in = new Scanner(System.in); } - public TextUi(InputStream in, PrintStream out) { - this.in = new Scanner(in); - this.out = out; + public String getUserCommand() { + System.out.println("Enter Command: "); + Scanner in = new Scanner(System.in); + return in.nextLine(); } - public String getUserCommand() { - return null; + public void showWelcomeMessage(String version, String StorageFilePath) { + replyToUser( + DIVIDER, + version, + DIVIDER, + "Data is being extracted from: " + StorageFilePath, + WELCOME_MESSAGE + ); } - public void showWelcomeMessage() {} + public void showGoodByeMessage(String StorageFilePath) { + replyToUser( + DIVIDER, + "Data is being saved to :" + StorageFilePath, + DIVIDER, + GOODBYE_MESSAGE + ); + } - public void showGoodByeMessage() {} + public void replyToUser(String...message) { + for (String m : message) { + System.out.println(m + "\n"); + } + } } + + From 799ef0f67fac0b83b2c510086901cbf306cc05da Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 17 Mar 2024 16:57:33 +0800 Subject: [PATCH 024/421] Add more Methods for Ui --- src/main/java/Ui/TextUi.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/Ui/TextUi.java b/src/main/java/Ui/TextUi.java index 3ba4e4fc96..2841794155 100644 --- a/src/main/java/Ui/TextUi.java +++ b/src/main/java/Ui/TextUi.java @@ -4,6 +4,7 @@ import java.io.InputStream; import java.io.PrintStream; +import java.util.ArrayList; import java.util.Scanner; public class TextUi { @@ -20,12 +21,20 @@ public TextUi() { this.in = new Scanner(System.in); } - public String getUserCommand() { + public String getUserInput() { System.out.println("Enter Command: "); Scanner in = new Scanner(System.in); + String userInput = in.nextLine(); + if (shouldIgnore(userInput)) { + return "Invalid Command"; //Might want to change this with Exceptions + } return in.nextLine(); } + public boolean shouldIgnore(String userInput) { + return userInput.trim().isEmpty(); + } + public void showWelcomeMessage(String version, String StorageFilePath) { replyToUser( DIVIDER, @@ -50,6 +59,16 @@ public void replyToUser(String...message) { System.out.println(m + "\n"); } } + + /*Waiting for ArrayList before implementing final code + private void showInventoryList(ArrayList arrayList) { + for (int i = 0; i < arrayList.size(); i++) { + if (arrayList.get(i) == null) { + break; + } + replyToUser(arrayList.get(i)); + } + }*/ } From 7980038423b09d64a19c2bf91e969307136ef748 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 17 Mar 2024 17:02:24 +0800 Subject: [PATCH 025/421] Edit coding style --- src/main/java/{Ui => ui}/TextUi.java | 15 +++++---------- src/test/java/{Ui => ui}/TextUiTest.java | 2 +- 2 files changed, 6 insertions(+), 11 deletions(-) rename src/main/java/{Ui => ui}/TextUi.java (81%) rename src/test/java/{Ui => ui}/TextUiTest.java (70%) diff --git a/src/main/java/Ui/TextUi.java b/src/main/java/ui/TextUi.java similarity index 81% rename from src/main/java/Ui/TextUi.java rename to src/main/java/ui/TextUi.java index 2841794155..d465ed07d5 100644 --- a/src/main/java/Ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,10 +1,5 @@ -package Ui; +package ui; -import Storage.Storage; - -import java.io.InputStream; -import java.io.PrintStream; -import java.util.ArrayList; import java.util.Scanner; public class TextUi { @@ -35,20 +30,20 @@ public boolean shouldIgnore(String userInput) { return userInput.trim().isEmpty(); } - public void showWelcomeMessage(String version, String StorageFilePath) { + public void showWelcomeMessage(String version, String storageFilePath) { replyToUser( DIVIDER, version, DIVIDER, - "Data is being extracted from: " + StorageFilePath, + "Data is being extracted from: " + storageFilePath, WELCOME_MESSAGE ); } - public void showGoodByeMessage(String StorageFilePath) { + public void showGoodByeMessage(String storageFilePath) { replyToUser( DIVIDER, - "Data is being saved to :" + StorageFilePath, + "Data is being saved to :" + storageFilePath, DIVIDER, GOODBYE_MESSAGE ); diff --git a/src/test/java/Ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java similarity index 70% rename from src/test/java/Ui/TextUiTest.java rename to src/test/java/ui/TextUiTest.java index 21742ac88c..005d6ebde6 100644 --- a/src/test/java/Ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -1,4 +1,4 @@ -package Ui; +package ui; public class TextUiTest { } From 297358f48463a43480005eb009e26be700f7e617 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 00:51:15 +0800 Subject: [PATCH 026/421] Update main file --- src/main/java/seedu/duke/Duke.java | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 5c74e68d59..63adcb164d 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,8 +1,13 @@ package seedu.duke; +import Parser.Parser; + +import java.io.IOException; import java.util.Scanner; public class Duke { + private final TextUi ui = new TextUi(); + private final Parser parser = new Parser(); /** * Main entry-point for the java.duke.Duke application. */ @@ -13,9 +18,18 @@ public static void main(String[] args) { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); + } + + public void run() throws IOException { + ui.showWelcomeMessage(); + this + } - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); + private void normalOperation() throws IOException { + String userInput; + do { + userInput = ui.getUserCommand(); + parser.parseInput(userInput); + } while (!userInput.equals("done")); } } From 06b2dbbd7baf6f203a29109e4051f2c3756e6670 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 15:34:35 +0800 Subject: [PATCH 027/421] Fix incomplete function --- src/main/java/seedu/duke/Duke.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 63adcb164d..72513637a2 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -22,7 +22,8 @@ public static void main(String[] args) { public void run() throws IOException { ui.showWelcomeMessage(); - this + this.normalOperation(); + ui.showGoodByeMessage(); } private void normalOperation() throws IOException { From f40deaae7930571aa2ae0d759240214f44f60159 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 17:13:57 +0800 Subject: [PATCH 028/421] Remove unnecessary import --- src/main/java/seedu/duke/Duke.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 72513637a2..9976b53971 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -3,7 +3,6 @@ import Parser.Parser; import java.io.IOException; -import java.util.Scanner; public class Duke { private final TextUi ui = new TextUi(); From 0120870769f40780bc5488a0cb64c0e649ee4d50 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 17:19:14 +0800 Subject: [PATCH 029/421] Revert main file --- src/main/java/seedu/duke/Duke.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 9976b53971..6e19f83a64 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -3,6 +3,7 @@ import Parser.Parser; import java.io.IOException; +import java.util.Scanner; public class Duke { private final TextUi ui = new TextUi(); @@ -17,6 +18,10 @@ public static void main(String[] args) { + "| |_| | |_| | < __/\n" + "|____/ \\__,_|_|\\_\\___|\n"; System.out.println("Hello from\n" + logo); + System.out.println("What is your name?"); + + Scanner in = new Scanner(System.in); + System.out.println("Hello " + in.nextLine()); } public void run() throws IOException { From 42adacd05b4afe84ca3549e2eb965749052247be Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 17:23:16 +0800 Subject: [PATCH 030/421] Add Item class --- src/main/java/item/Item.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/item/Item.java diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java new file mode 100644 index 0000000000..5b3938b722 --- /dev/null +++ b/src/main/java/item/Item.java @@ -0,0 +1,28 @@ +package item; + +public class Item { + private final String itemName; + private int quantity; + private String UOM; + + public static int numberOfItems; + + public Item(String name, int quantity, String uom) { + this.itemName = name; + this.quantity = quantity; + this.UOM = uom; + numberOfItems++; + } + + public String getItemName() { + return this.itemName; + } + + public int getQuantity() { + return this.quantity; + } + + public void setQuantity(int newQuantity) { + this.quantity = newQuantity; + } +} From 12417b64b730e65a4ea77fc58af6e76334c5518d Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 17:41:05 +0800 Subject: [PATCH 031/421] Change declaration order --- src/main/java/item/Item.java | 3 +-- src/main/java/{Parser => parser}/Parser.java | 0 src/main/java/{Storage => storage}/Storage.java | 0 src/test/java/{Parser => parser}/ParserTest.java | 0 src/test/java/{Storage => storage}/StorageTest.java | 0 5 files changed, 1 insertion(+), 2 deletions(-) rename src/main/java/{Parser => parser}/Parser.java (100%) rename src/main/java/{Storage => storage}/Storage.java (100%) rename src/test/java/{Parser => parser}/ParserTest.java (100%) rename src/test/java/{Storage => storage}/StorageTest.java (100%) diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 5b3938b722..ee17366a0d 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,12 +1,11 @@ package item; public class Item { + public static int numberOfItems; private final String itemName; private int quantity; private String UOM; - public static int numberOfItems; - public Item(String name, int quantity, String uom) { this.itemName = name; this.quantity = quantity; diff --git a/src/main/java/Parser/Parser.java b/src/main/java/parser/Parser.java similarity index 100% rename from src/main/java/Parser/Parser.java rename to src/main/java/parser/Parser.java diff --git a/src/main/java/Storage/Storage.java b/src/main/java/storage/Storage.java similarity index 100% rename from src/main/java/Storage/Storage.java rename to src/main/java/storage/Storage.java diff --git a/src/test/java/Parser/ParserTest.java b/src/test/java/parser/ParserTest.java similarity index 100% rename from src/test/java/Parser/ParserTest.java rename to src/test/java/parser/ParserTest.java diff --git a/src/test/java/Storage/StorageTest.java b/src/test/java/storage/StorageTest.java similarity index 100% rename from src/test/java/Storage/StorageTest.java rename to src/test/java/storage/StorageTest.java From db0b57b268ffa9b4db8bf1e02d10ad41ea0251d3 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 17:41:24 +0800 Subject: [PATCH 032/421] Refactor package names --- src/main/java/parser/Parser.java | 2 +- src/main/java/seedu/duke/Duke.java | 2 +- src/main/java/storage/Storage.java | 2 +- src/test/java/parser/ParserTest.java | 2 +- src/test/java/storage/StorageTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 6d1a562609..4cb13f05f2 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,4 +1,4 @@ -package Parser; +package parser; public class Parser { public String userInput; diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 6e19f83a64..7b8e99b727 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,6 +1,6 @@ package seedu.duke; -import Parser.Parser; +import parser.Parser; import java.io.IOException; import java.util.Scanner; diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 25c7a88b48..e1ddfa05e9 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,4 +1,4 @@ -package Storage; +package storage; import java.io.File; import java.io.FileNotFoundException; diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index eff54a1bb5..bc9d35cf6b 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -1,4 +1,4 @@ -package Parser; +package parser; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 414a111b9f..353e52a205 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,4 +1,4 @@ -package Storage; +package storage; import org.junit.jupiter.api.Test; //import static org.junit.jupiter.api.Assertions.assertEquals; From bcb2f6d471fb2771ad9fdc6053e6e88462d845ea Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 19:38:16 +0800 Subject: [PATCH 033/421] Add exceptions package --- .../java/exception/StockMasterException.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/exception/StockMasterException.java diff --git a/src/main/java/exception/StockMasterException.java b/src/main/java/exception/StockMasterException.java new file mode 100644 index 0000000000..2411a374fd --- /dev/null +++ b/src/main/java/exception/StockMasterException.java @@ -0,0 +1,31 @@ +package exception; +public class StockMasterException extends Exception { + protected String description; + protected String type; + + public StockMasterException(String description, String type) { + this.description = description; + this.type = type; + } + + public StockMasterException() { + this.description = null; + this.type = null; + } + + public void printException() { + switch (this.type) { + case "EMPTY": + if (description.equals("description")) { + System.out.println("The item name cannot be left blank."); + } + break; + case "OUT_OF_BOUNDS": + System.out.println("The index you're accessing is out of bounds."); + break; + default: + System.out.println("Unrecognised error."); + break; + } + } +} From 4778b5e78058b7e6ecb863a0b15a20c808706a0c Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Mon, 18 Mar 2024 23:17:22 +0800 Subject: [PATCH 034/421] add itemlist class --- src/main/java/Itemlist/Itemlist.java | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 src/main/java/Itemlist/Itemlist.java diff --git a/src/main/java/Itemlist/Itemlist.java b/src/main/java/Itemlist/Itemlist.java new file mode 100644 index 0000000000..3c3492d82c --- /dev/null +++ b/src/main/java/Itemlist/Itemlist.java @@ -0,0 +1,6 @@ +package Itemlist; +import java.util.ArrayList; + +public class Itemlist { + +} From 1700a71b8a57c5c4d72d3ca7f83ed61a36f4e395 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 18 Mar 2024 23:40:03 +0800 Subject: [PATCH 035/421] Tidy up Code --- build.gradle | 2 +- src/main/java/ui/TextUi.java | 7 ++++--- src/test/java/ui/TextUiTest.java | 22 ++++++++++++++++++++-- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index ea82051fab..9fee860f5d 100644 --- a/build.gradle +++ b/build.gradle @@ -43,4 +43,4 @@ checkstyle { run{ standardInput = System.in -} +} \ No newline at end of file diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index d465ed07d5..4c6471b9cb 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,5 +1,6 @@ package ui; +import java.io.ByteArrayInputStream; import java.util.Scanner; public class TextUi { @@ -16,17 +17,17 @@ public TextUi() { this.in = new Scanner(System.in); } - public String getUserInput() { + public static String getUserInput() { System.out.println("Enter Command: "); Scanner in = new Scanner(System.in); String userInput = in.nextLine(); if (shouldIgnore(userInput)) { return "Invalid Command"; //Might want to change this with Exceptions } - return in.nextLine(); + return userInput; } - public boolean shouldIgnore(String userInput) { + public static boolean shouldIgnore(String userInput) { return userInput.trim().isEmpty(); } diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 005d6ebde6..9d96330e56 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -1,4 +1,22 @@ -package ui; +/*package ui; + +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayInputStream; + +import static org.junit.jupiter.api.Assertions.*; public class TextUiTest { -} + + @Test + public void testValidInput() { + + provideInput("add Item"); + assertEquals("add Item", TextUi.getUserInput()); + } + + void provideInput(String input) { + ByteArrayInputStream testIn = new ByteArrayInputStream(input.getBytes()); + System.setIn(testIn); + } +}*/ \ No newline at end of file From 65997b872c1abb4ed1849db6fdb644d98e3bad5a Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 18 Mar 2024 23:40:48 +0800 Subject: [PATCH 036/421] Update UserGuide --- docs/UserGuide.md | 82 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 69 insertions(+), 13 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index abd9fbe891..d9cbd084b8 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,41 +2,97 @@ ## Introduction -{Give a product intro} +StockMaster is a platform aimed at helping SMEs track and organise their inventory. ## Quick Start {Give steps to get started quickly} 1. Ensure that you have Java 11 or above installed. -1. Down the latest version of `Duke` from [here](http://link.to/duke). +2. Download the latest version of `StockMaster` from [here](http://link.to/duke). +3. ## Features {Give detailed description of each feature} -### Adding a todo: `todo` -Adds a new item to the list of todo items. +### Adding an item: `add` +Adds a new item to the list of items. -Format: `todo n/TODO_NAME d/DEADLINE` +Format: `add ITEM_NAME qty/ITEM_QUANTITY [cat/CATEGORY]` -* The `DEADLINE` can be in a natural language format. -* The `TODO_NAME` cannot contain punctuation. +* `CATEGORY` is an optional field. If blank, it will default to `N/A`. Example of usage: +``` +add Apples qty/50 +add Phone qty/5 cat/Electronics +``` -`todo n/Write the rest of the User Guide d/next week` +### Deleting an item: `del` +Deletes the item from the list of items. -`todo n/Refactor the User Guide to remove passive voice d/13/04/2020` +Format: `del ITEM_NAME` + +Example of usage: +``` +del Apples +``` + +### Editing an item: `edit` +Edits the quantity of the item. + +Format: `edit ITEM_NAME qty/NEW_QUANTITY` + +Example of usage: +``` +edit Apples qty/10 +edit Phone qty/0 +``` + +### Listing all items: `list` +Lists all stored items. + +Format: `list [cat/CATEGORY]` + +* `CATEGORY` is an optional field. By default, it will list all the stored items. + +Example of usage: +``` +list +list Electronics +``` + +### List all available commands: `help` +Lists all commands as per the command summary below. + +Format: `help [c/COMMAND]` + +* `COMMAND` is optional. Specifying the command will give a more comprehensive + description of the command. + +Example of usage: +``` +help +help c/add +``` + + +### Closing the app: `exit` +Saves and closes the app safely. + +Format: `exit` ## FAQ **Q**: How do I transfer my data to another computer? -**A**: {your answer here} +**A**: Simply copy and paste the saved folder that is created upon launch of +the application. ## Command Summary -{Give a 'cheat sheet' of commands here} - -* Add todo `todo n/TODO_NAME d/DEADLINE` +* Add new item: `add Apples qty/10 cat/Food` +* Delete an item: `delete Apples` +* List all items: `list` +* List all commands: `help` \ No newline at end of file From 48d85b83b02bd85f925f4524a7c1488fd253effc Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 18 Mar 2024 23:45:14 +0800 Subject: [PATCH 037/421] Edit coding style --- src/main/java/ui/TextUi.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 4c6471b9cb..1c03e6fa9d 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,6 +1,5 @@ package ui; -import java.io.ByteArrayInputStream; import java.util.Scanner; public class TextUi { From 467943328edbc136b331a3e2c5c93aa8fc27568d Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 18 Mar 2024 23:51:41 +0800 Subject: [PATCH 038/421] Format code --- src/main/java/{Parser => parser}/Parser.java | 2 +- src/main/java/{Storage => storage}/Storage.java | 10 +++++----- src/test/java/{Parser => parser}/ParserTest.java | 2 +- src/test/java/{Storage => storage}/StorageTest.java | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename src/main/java/{Parser => parser}/Parser.java (87%) rename src/main/java/{Storage => storage}/Storage.java (92%) rename src/test/java/{Parser => parser}/ParserTest.java (96%) rename src/test/java/{Storage => storage}/StorageTest.java (94%) diff --git a/src/main/java/Parser/Parser.java b/src/main/java/parser/Parser.java similarity index 87% rename from src/main/java/Parser/Parser.java rename to src/main/java/parser/Parser.java index 6d1a562609..4cb13f05f2 100644 --- a/src/main/java/Parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,4 +1,4 @@ -package Parser; +package parser; public class Parser { public String userInput; diff --git a/src/main/java/Storage/Storage.java b/src/main/java/storage/Storage.java similarity index 92% rename from src/main/java/Storage/Storage.java rename to src/main/java/storage/Storage.java index 25c7a88b48..269145dc6c 100644 --- a/src/main/java/Storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,4 +1,4 @@ -package Storage; +package storage; import java.io.File; import java.io.FileNotFoundException; @@ -13,7 +13,7 @@ */ public class Storage { private static final String FILENAME = "./StockMasterData.txt"; - private static File StockMaster; + private static File stockMaster; /** * Write contents to the file. @@ -42,7 +42,7 @@ public static void updateFile(String inputText, boolean ifAppend) { * Returns the private File dukeData. */ public static File getFile() { - return StockMaster; + return stockMaster; } /** @@ -63,9 +63,9 @@ public static void readFromFile(File fileToRead) { } public static void main (String[]args){ - StockMaster = new File(FILENAME); + stockMaster = new File(FILENAME); try { - writeToFile(StockMaster.getPath(), "", true); + writeToFile(stockMaster.getPath(), "", true); } catch (IOException e) { System.out.println("File does not exist."); } diff --git a/src/test/java/Parser/ParserTest.java b/src/test/java/parser/ParserTest.java similarity index 96% rename from src/test/java/Parser/ParserTest.java rename to src/test/java/parser/ParserTest.java index eff54a1bb5..bc9d35cf6b 100644 --- a/src/test/java/Parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -1,4 +1,4 @@ -package Parser; +package parser; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/Storage/StorageTest.java b/src/test/java/storage/StorageTest.java similarity index 94% rename from src/test/java/Storage/StorageTest.java rename to src/test/java/storage/StorageTest.java index 414a111b9f..353e52a205 100644 --- a/src/test/java/Storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,4 +1,4 @@ -package Storage; +package storage; import org.junit.jupiter.api.Test; //import static org.junit.jupiter.api.Assertions.assertEquals; From e1446455f564e63dd61997dbf174a0f3e08f03a4 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 20 Mar 2024 12:24:17 +0800 Subject: [PATCH 039/421] Update Storage --- src/main/java/storage/Storage.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index e1ddfa05e9..14f86c1970 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -24,7 +24,7 @@ public class Storage { * or overwrite the file (false). * @throws IOException If file is not found at the indicated file path. */ - private static void writeToFile(String filePath, String textToAdd, boolean ifAppend) throws IOException { + public static void writeToFile(String filePath, String textToAdd, boolean ifAppend) throws IOException { FileWriter writer = new FileWriter(filePath, ifAppend); writer.write(textToAdd); writer.close(); @@ -49,11 +49,10 @@ public static File getFile() { * Read lines from the file and identify tasks written inside. * Add the identified tasks into a list of existing tasks. * - * @param fileToRead The file to read from. */ - public static void readFromFile(File fileToRead) { + public static void readFromFile(File fileName) { try { - Scanner scanner = new Scanner(fileToRead); + Scanner scanner = new Scanner(fileName); while (scanner.hasNext()) { String lineSkipped = scanner.nextLine(); } From b6998e919a8f5d7e298c42b70631aa9613d1c3e4 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 20 Mar 2024 12:29:45 +0800 Subject: [PATCH 040/421] Update StorageTest --- src/test/java/storage/StorageTest.java | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 353e52a205..f763ff065e 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,13 +1,30 @@ package storage; import org.junit.jupiter.api.Test; -//import static org.junit.jupiter.api.Assertions.assertEquals; -//import static org.junit.jupiter.api.Assertions.fail; -//import java.io.FileNotFoundException; +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; public class StorageTest { @Test - public void fileToReadNotFound() { + public void testReadFile_FileNotFound() { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + + String directory = "./testFile.txt"; + File testFile = new File(directory); + try { + Storage.writeToFile(directory, "Created", true); + testFile.delete(); + Storage.readFromFile(testFile); + assertEquals("File does not exist." + System.lineSeparator(), outputStream.toString()); + } catch (IOException e) { + fail("failed to create a file."); + } } } From 95652d5ba577918f30bce2d5f1689df08d145f02 Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Wed, 20 Mar 2024 14:38:52 +0800 Subject: [PATCH 041/421] edit item class and add new itemlist class object --- src/main/java/Itemlist/Itemlist.java | 24 +++++++++++++++++++++++- src/main/java/item/Item.java | 22 +++++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/main/java/Itemlist/Itemlist.java b/src/main/java/Itemlist/Itemlist.java index 3c3492d82c..bb144f848c 100644 --- a/src/main/java/Itemlist/Itemlist.java +++ b/src/main/java/Itemlist/Itemlist.java @@ -1,6 +1,28 @@ package Itemlist; +import item.Item; + import java.util.ArrayList; public class Itemlist { - + private final ArrayList items = new ArrayList<>(); + + public Itemlist() { + } + + public void addItem(Item item) { + items.add(item); + } + + public void deleteItem(int index) { + items.remove(index); + } + + public void editQuantity(int index, int newQuantity) { + items.get(index).setQuantity(newQuantity); + if (newQuantity == 0) { + items.get(index).markOOS(); + } else if (newQuantity > 1) { + items.get(index).unmarkOOS(); + } + } } diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index ee17366a0d..fcde5356cb 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -5,11 +5,23 @@ public class Item { private final String itemName; private int quantity; private String UOM; + private String category; + private boolean isOOS; - public Item(String name, int quantity, String uom) { + public Item(String name, int quantity, String uom, String category) { this.itemName = name; this.quantity = quantity; this.UOM = uom; + if (category.isEmpty()) { + this.category = "NA"; + } else { + this.category = category; + } + if (quantity == 0) { + this.isOOS = true; + } else { + this.isOOS = false; + } numberOfItems++; } @@ -24,4 +36,12 @@ public int getQuantity() { public void setQuantity(int newQuantity) { this.quantity = newQuantity; } + + public void markOOS() { + this.isOOS = true; + } + + public void unmarkOOS() { + this.isOOS = false; + } } From b7b2dbf2ec9a3b8f1c3714a76e60b3ab88fa70db Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Wed, 20 Mar 2024 15:13:48 +0800 Subject: [PATCH 042/421] no message --- src/main/java/seedu/duke/Duke.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 7b8e99b727..8554213393 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,6 +1,7 @@ package seedu.duke; import parser.Parser; +import Itemlist.Itemlist; import java.io.IOException; import java.util.Scanner; @@ -8,6 +9,7 @@ public class Duke { private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); + private Itemlist itemlist = new Itemlist(); /** * Main entry-point for the java.duke.Duke application. */ From 90a078eccfc200a327d14fbae1abc5672ac88008 Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Wed, 20 Mar 2024 15:31:18 +0800 Subject: [PATCH 043/421] change textui, item and itemlist --- src/main/java/Itemlist/Itemlist.java | 2 +- src/main/java/item/Item.java | 4 ++-- src/main/java/seedu/duke/Duke.java | 9 +++++---- src/main/java/ui/TextUi.java | 4 +--- 4 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/Itemlist/Itemlist.java b/src/main/java/Itemlist/Itemlist.java index bb144f848c..0cf9b4166a 100644 --- a/src/main/java/Itemlist/Itemlist.java +++ b/src/main/java/Itemlist/Itemlist.java @@ -1,4 +1,4 @@ -package Itemlist; +package itemlist; import item.Item; import java.util.ArrayList; diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index fcde5356cb..f91202c5c1 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -4,14 +4,14 @@ public class Item { public static int numberOfItems; private final String itemName; private int quantity; - private String UOM; + private String uom; private String category; private boolean isOOS; public Item(String name, int quantity, String uom, String category) { this.itemName = name; this.quantity = quantity; - this.UOM = uom; + this.uom = uom; if (category.isEmpty()) { this.category = "NA"; } else { diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 8554213393..6c9d5b9713 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,7 +1,8 @@ package seedu.duke; import parser.Parser; -import Itemlist.Itemlist; +import ui.TextUi; +import itemlist.Itemlist; import java.io.IOException; import java.util.Scanner; @@ -27,15 +28,15 @@ public static void main(String[] args) { } public void run() throws IOException { - ui.showWelcomeMessage(); + ui.showWelcomeMessage("1.0", "./StockMasterData.txt"); this.normalOperation(); - ui.showGoodByeMessage(); + ui.showGoodByeMessage("./StockMasterData.txt"); } private void normalOperation() throws IOException { String userInput; do { - userInput = ui.getUserCommand(); + userInput = ui.getUserInput(); parser.parseInput(userInput); } while (!userInput.equals("done")); } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 1c03e6fa9d..203354bec9 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -16,7 +16,7 @@ public TextUi() { this.in = new Scanner(System.in); } - public static String getUserInput() { + public String getUserInput() { System.out.println("Enter Command: "); Scanner in = new Scanner(System.in); String userInput = in.nextLine(); @@ -65,5 +65,3 @@ private void showInventoryList(ArrayList arrayList) { } }*/ } - - From b35a17624d17ab8be94f6551fe6c2e161cb1789a Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Wed, 20 Mar 2024 15:37:07 +0800 Subject: [PATCH 044/421] fix issues regarding checkstyle --- README.md | 4 ++-- src/test/java/itemlist/ItemlistTest.java | 4 ++++ src/test/java/ui/TextUiTest.java | 2 +- text-ui-test/runtest.bat | 4 ++-- 4 files changed, 9 insertions(+), 5 deletions(-) create mode 100644 src/test/java/itemlist/ItemlistTest.java diff --git a/README.md b/README.md index 67e53e06f3..a179be9e90 100644 --- a/README.md +++ b/README.md @@ -35,11 +35,11 @@ Prerequisites: JDK 11 (use the exact version), update Intellij to the most recen ### I/O redirection tests -* To run _I/O redirection_ tests (aka _Text UI tests_), navigate to the `text-ui-test` and run the `runtest(.bat/.sh)` script. +* To run _I/O redirection_ tests (aka _Text UI tests_), navigate to the `text-ui-itemlist` and run the `runtest(.bat/.sh)` script. ### JUnit tests -* A skeleton JUnit test (`src/test/java/seedu/duke/DukeTest.java`) is provided with this project template. +* A skeleton JUnit itemlist (`src/itemlist/java/seedu/duke/DukeTest.java`) is provided with this project template. * If you are new to JUnit, refer to the [JUnit Tutorial at se-education.org/guides](https://se-education.org/guides/tutorials/junit.html). ## Checkstyle diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java new file mode 100644 index 0000000000..bca85bff37 --- /dev/null +++ b/src/test/java/itemlist/ItemlistTest.java @@ -0,0 +1,4 @@ +package itemlist; + +public class ItemlistTest { +} diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 9d96330e56..5217fdd93e 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -19,4 +19,4 @@ void provideInput(String input) { ByteArrayInputStream testIn = new ByteArrayInputStream(input.getBytes()); System.setIn(testIn); } -}*/ \ No newline at end of file +}*/ diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 25ac7a2989..0db3b772b5 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -12,8 +12,8 @@ for /f "tokens=*" %%a in ( set jarloc=%%a ) -java -jar %jarloc% < ..\..\text-ui-test\input.txt > ..\..\text-ui-test\ACTUAL.TXT +java -jar %jarloc% < ..\..\text-ui-itemlist\input.txt > ..\..\text-ui-itemlist\ACTUAL.TXT -cd ..\..\text-ui-test +cd ..\..\text-ui-itemlist FC ACTUAL.TXT EXPECTED.TXT >NUL && ECHO Test passed! || Echo Test failed! From f2088d915f5ce18afe2c342ea66a4c9a1ada199b Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 20 Mar 2024 16:15:55 +0800 Subject: [PATCH 045/421] Add temporary parameters for methods --- src/main/java/seedu/duke/Duke.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 7b8e99b727..f846805ccc 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,6 +1,7 @@ package seedu.duke; import parser.Parser; +import ui.TextUi; import java.io.IOException; import java.util.Scanner; @@ -25,15 +26,15 @@ public static void main(String[] args) { } public void run() throws IOException { - ui.showWelcomeMessage(); + ui.showWelcomeMessage("Version 1.0", "Storage File Path"); //Replace with variable this.normalOperation(); - ui.showGoodByeMessage(); + ui.showGoodByeMessage("Storage File Path"); //Replace with variable } private void normalOperation() throws IOException { String userInput; do { - userInput = ui.getUserCommand(); + userInput = ui.getUserInput(); parser.parseInput(userInput); } while (!userInput.equals("done")); } From 749f542484b9a3b14656f17e6282a0a1fd0af9ca Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 20 Mar 2024 17:54:13 +0800 Subject: [PATCH 046/421] Add Command Class --- src/main/java/command/AddCommand.java | 33 +++++++++++++++++++++++++++ src/main/java/command/Command.java | 6 +++++ src/main/java/item/Item.java | 4 ++-- 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 src/main/java/command/AddCommand.java create mode 100644 src/main/java/command/Command.java diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java new file mode 100644 index 0000000000..5dbbabab9d --- /dev/null +++ b/src/main/java/command/AddCommand.java @@ -0,0 +1,33 @@ +package command; + +import item.Item; + +public class AddCommand extends Command { + + public static final String MESSAGE_SUCCESS = "added: "; + protected String itemName; + protected int quantity; + protected String uom; + private final Item toAdd; + + public AddCommand(String itemName, int quantity, String uom) { + this.toAdd = new Item(itemName, quantity, uom); + } + + public String getItemNam() { + return itemName; + } + + public int getQuantity() { + return quantity; + } + + public String getUom() { + return uom; + } + @Override + public void execute() { + //itemList.add(toAdd); + System.out.println(MESSAGE_SUCCESS + getItemNam() + "(Qty: " + getQuantity() + ")"); + } +} diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java new file mode 100644 index 0000000000..41649ed097 --- /dev/null +++ b/src/main/java/command/Command.java @@ -0,0 +1,6 @@ +package command; + +public abstract class Command { + + public abstract void execute(); +} diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index ee17366a0d..919ff89a78 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -4,12 +4,12 @@ public class Item { public static int numberOfItems; private final String itemName; private int quantity; - private String UOM; + private String uOM; public Item(String name, int quantity, String uom) { this.itemName = name; this.quantity = quantity; - this.UOM = uom; + this.uOM = uom; numberOfItems++; } From 67692a212b1d60456bedb14d9002ef2fd09ab6ff Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 20 Mar 2024 18:05:25 +0800 Subject: [PATCH 047/421] Add parser functions, command format exceptions, command types and messages --- src/main/java/common/Messages.java | 20 +++ .../exceptions/CommandFormatException.java | 29 ++++ src/main/java/parser/CommandType.java | 10 ++ src/main/java/parser/Parser.java | 130 +++++++++++++++++- src/main/java/seedu/duke/Duke.java | 3 +- 5 files changed, 189 insertions(+), 3 deletions(-) create mode 100644 src/main/java/common/Messages.java create mode 100644 src/main/java/exceptions/CommandFormatException.java create mode 100644 src/main/java/parser/CommandType.java diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java new file mode 100644 index 0000000000..79c1c27ec0 --- /dev/null +++ b/src/main/java/common/Messages.java @@ -0,0 +1,20 @@ +package common; + +public class Messages { + public static final String DIVIDER = "----------------"; + public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; + public static final String HELP = "Commands: ...."; + public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT]'"; + public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; + public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + + "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; + public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + + "Stock!"; + public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; + +// public static final String MESSAGE_ =""; + + + +} diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java new file mode 100644 index 0000000000..5ad265f05c --- /dev/null +++ b/src/main/java/exceptions/CommandFormatException.java @@ -0,0 +1,29 @@ +package exceptions; + +import parser.CommandType; +import common.Messages; + +public class CommandFormatException extends Exception{ + public CommandFormatException(CommandType command){ + + switch (command) { + + case ADD: + System.out.println(Messages.INVALID_ADD_FORMAT); + break; + case DELETE: + System.out.println(Messages.INVALID_DELETE_FORMAT); + break; + case EDIT: + System.out.println(Messages.INVALID_EDIT_FORMAT); + break; + case HELP: + System.out.println(Messages.HELP); + break; + default: + System.out.println(Messages.INVALID_COMMAND); + break; + } + + } +} diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java new file mode 100644 index 0000000000..7f55035d7a --- /dev/null +++ b/src/main/java/parser/CommandType.java @@ -0,0 +1,10 @@ +package parser; + +public enum CommandType { + EXIT, + LIST, + HELP, + ADD, + DELETE, + EDIT +} diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 4cb13f05f2..ce2bfb98bd 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,12 +1,138 @@ package parser; +import common.Messages; +import exceptions.CommandFormatException; +import item.Item; +import storage.Storage; +import ui.TextUi; + +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class Parser { - public String userInput; + public boolean isExitCommandDetected = false; + public static final Pattern ADD_COMMAND_FORMAT = + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); + + public static final Pattern DELETE_COMMAND_FORMAT = + Pattern.compile("del (?[^/]+)"); + + public static final Pattern EDIT_COMMAND_FORMAT = + Pattern.compile("edit (?[^/]+) qty/(?\\d+)"); + + public static final Pattern BASIC_COMMAND_FORMAT = + Pattern.compile("(?\\S+)(?.*)"); + - public void parseInput(String userInput){ + public void parseInput(String userInput) { + final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); + if (!matcher.matches()) { + System.out.println(Messages.INVALID_COMMAND); + System.out.println(Messages.HELP); + } + + final CommandType userCommand = CommandType.valueOf(matcher.group("commandWord").toUpperCase()); + final String arguments = matcher.group("arguments"); + + + switch (userCommand) { + case EXIT: +// storage.saveItems(items); //(COMMAND FROM STORAGE TO SAVE ITEMLIST) +// ui.closeScanner(); //(COMMAND FROM TEXTUI TO CLOSE SCANNER) + isExitCommandDetected = true; + return; + case HELP: + System.out.println(Messages.HELP); + break; + case LIST: +// ui.listItems(items); //(COMMAND FROM TEXTUI TO PRINT ITEMS) + break; + + case ADD: +// try { +// prepareAdd(arguments); +// } catch (CommandFormatException e) { +// break; +// } + break; + case DELETE: +// try { +// prepareDelete(arguments); +// } catch (CommandFormatException e) { +// break; +// } + break; + case EDIT: +// try { +// prepareEdit(arguments); +// } catch (CommandFormatException e) { +// break; +// } + break; + default: + System.out.println(Messages.INVALID_COMMAND); + break; + } } + +// private Command prepareAdd(String args) throws CommandFormatException{ +// final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); +// // Validate arg string format +// if (!matcher.matches()) { +// throw new CommandFormatException(CommandType.ADD); +// return IncorrectCommand; +// } +// try { +// return new AddCommand( +// matcher.group("itemName"), +// matcher.group("quantity"), +// matcher.group("uom") +// ); +// +// } catch (CommandFormatException e) { +// throw new CommandFormatException(CommandType.ADD); +// return IncorrectCommand; +// } +// } +// +// private Command prepareDelete(String args) throws CommandFormatException{ +// final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); +// // Validate arg string format +// if (!matcher.matches()) { +// throw new CommandFormatException(CommandType.DELETE); +// return IncorrectCommand; +// } +// try { +// return new DeleteCommand(matcher.group("itemName"); +// +// } catch (CommandFormatException e) { +// throw new CommandFormatException(CommandType.DELETE); +// return IncorrectCommand; +// } +// } +// +// private Command prepareEdit(String args) throws CommandFormatException{ +// final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); +// // Validate arg string format +// if (!matcher.matches()) { +// throw new CommandFormatException(CommandType.EDIT); +// return IncorrectCommand; +// } +// try { +// return new EditCommand( +// matcher.group("itemName"), +// matcher.group("newQuantity") +// ); +// +// } catch (CommandFormatException e) { +// throw new CommandFormatException(CommandType.EDIT); +// return IncorrectCommand; +// } +// } } + diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 7b8e99b727..eca64fca0e 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,6 +1,7 @@ package seedu.duke; import parser.Parser; +import ui.TextUi; import java.io.IOException; import java.util.Scanner; @@ -35,6 +36,6 @@ private void normalOperation() throws IOException { do { userInput = ui.getUserCommand(); parser.parseInput(userInput); - } while (!userInput.equals("done")); + } while (!parser.isExitCommandDetected); } } From d2ecd7000b7d31a21c06cbc86de2975857214a0c Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 20 Mar 2024 19:38:45 +0800 Subject: [PATCH 048/421] Import ui.TextUi in Duke --- src/main/java/seedu/duke/Duke.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 7b8e99b727..c6e7a9d507 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,6 +1,7 @@ package seedu.duke; import parser.Parser; +import ui.TextUi; import java.io.IOException; import java.util.Scanner; From 771893a69e418ee031043b961d13ce0e2b89c97e Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 20 Mar 2024 21:10:28 +0800 Subject: [PATCH 049/421] Add writeToFile test in StorageTest --- src/test/java/storage/StorageTest.java | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index f763ff065e..2cefbdfd99 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -9,10 +9,11 @@ import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.util.Scanner; public class StorageTest { @Test - public void testReadFile_FileNotFound() { + public void readFromFile_fileNotFound() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); @@ -27,4 +28,21 @@ public void testReadFile_FileNotFound() { fail("failed to create a file."); } } + + @Test + public void writeToFile_aLine_writeSuccessful() { + String directory = "./testFile.txt"; + File testFile = new File(directory); + String aLine = "A line"; + try { + Storage.writeToFile(directory, aLine, true); + Scanner scanner = new Scanner(testFile); + String lineSkipped = scanner.nextLine(); + scanner.close(); + testFile.delete(); + assertEquals(aLine, lineSkipped); + } catch (IOException e) { + fail("File not found"); + } + } } From 8286060cc9f0d734e6b03a8afde17a67f3cd69c9 Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Wed, 20 Mar 2024 21:27:21 +0800 Subject: [PATCH 050/421] make minor change to commenting --- src/main/java/common/Messages.java | 5 +- src/main/java/parser/Parser.java | 108 ++++++++++++++--------------- 2 files changed, 55 insertions(+), 58 deletions(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 79c1c27ec0..7703d87d0e 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -12,9 +12,6 @@ public class Messages { public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; - -// public static final String MESSAGE_ =""; - - +/*// public static final String MESSAGE_ ="";*/ } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index ce2bfb98bd..77a4f50eb6 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -78,60 +78,60 @@ public void parseInput(String userInput) { } -// private Command prepareAdd(String args) throws CommandFormatException{ -// final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); -// // Validate arg string format -// if (!matcher.matches()) { -// throw new CommandFormatException(CommandType.ADD); -// return IncorrectCommand; -// } -// try { -// return new AddCommand( -// matcher.group("itemName"), -// matcher.group("quantity"), -// matcher.group("uom") -// ); -// -// } catch (CommandFormatException e) { -// throw new CommandFormatException(CommandType.ADD); -// return IncorrectCommand; -// } -// } -// -// private Command prepareDelete(String args) throws CommandFormatException{ -// final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); -// // Validate arg string format -// if (!matcher.matches()) { -// throw new CommandFormatException(CommandType.DELETE); -// return IncorrectCommand; -// } -// try { -// return new DeleteCommand(matcher.group("itemName"); -// -// } catch (CommandFormatException e) { -// throw new CommandFormatException(CommandType.DELETE); -// return IncorrectCommand; -// } -// } -// -// private Command prepareEdit(String args) throws CommandFormatException{ -// final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); -// // Validate arg string format -// if (!matcher.matches()) { -// throw new CommandFormatException(CommandType.EDIT); -// return IncorrectCommand; -// } -// try { -// return new EditCommand( -// matcher.group("itemName"), -// matcher.group("newQuantity") -// ); -// -// } catch (CommandFormatException e) { -// throw new CommandFormatException(CommandType.EDIT); -// return IncorrectCommand; -// } -// } +/* private Command prepareAdd(String args) throws CommandFormatException{ + final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.ADD); + return IncorrectCommand; + } + try { + return new AddCommand( + matcher.group("itemName"), + matcher.group("quantity"), + matcher.group("uom") + ); + + } catch (CommandFormatException e) { + throw new CommandFormatException(CommandType.ADD); + return IncorrectCommand; + } + } + + private Command prepareDelete(String args) throws CommandFormatException{ + final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.DELETE); + return IncorrectCommand; + } + try { + return new DeleteCommand(matcher.group("itemName"); + + } catch (CommandFormatException e) { + throw new CommandFormatException(CommandType.DELETE); + return IncorrectCommand; + } + } + + private Command prepareEdit(String args) throws CommandFormatException{ + final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.EDIT); + return IncorrectCommand; + } + try { + return new EditCommand( + matcher.group("itemName"), + matcher.group("newQuantity") + ); + + } catch (CommandFormatException e) { + throw new CommandFormatException(CommandType.EDIT); + return IncorrectCommand; + } + }*/ } From b86a0ac4705bf21a9d23a41504f1c1e087f787f6 Mon Sep 17 00:00:00 2001 From: LowTL Date: Wed, 20 Mar 2024 21:44:05 +0800 Subject: [PATCH 051/421] Add general classes --- .../java/calculation/profitCalculator.java | 4 +++ .../java/calculation/quantityCalculator.java | 35 +++++++++++++++++++ src/main/java/constants/UOM.java | 9 +++++ src/main/java/constants/uomList.java | 4 +++ src/main/java/item/Item.java | 22 +++++++++--- 5 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 src/main/java/calculation/profitCalculator.java create mode 100644 src/main/java/calculation/quantityCalculator.java create mode 100644 src/main/java/constants/UOM.java create mode 100644 src/main/java/constants/uomList.java diff --git a/src/main/java/calculation/profitCalculator.java b/src/main/java/calculation/profitCalculator.java new file mode 100644 index 0000000000..96c8a307db --- /dev/null +++ b/src/main/java/calculation/profitCalculator.java @@ -0,0 +1,4 @@ +package calculation; + +public class profitCalculator { +} diff --git a/src/main/java/calculation/quantityCalculator.java b/src/main/java/calculation/quantityCalculator.java new file mode 100644 index 0000000000..46cf5f7b41 --- /dev/null +++ b/src/main/java/calculation/quantityCalculator.java @@ -0,0 +1,35 @@ +package calculation; + +import constants.UOM; +import constants.uomList; +import item.Item; +public class quantityCalculator { + + public int convertUOM(UOM uom) { + int value = 0; + switch (uom) { + case EA: + //fallthrough + case PIECE: + value = 1; + break; + case BOX: + value = 6; + break; + case DOZEN: + value = 12; + break; + case CTN: + value = 24; + break; + default: + break; + } + + return value; + } + + public void updateQty(Item item) { + item.setQuantity(item.getQuantity() + convertUOM(item.getUom())); + } +} diff --git a/src/main/java/constants/UOM.java b/src/main/java/constants/UOM.java new file mode 100644 index 0000000000..7482ac6def --- /dev/null +++ b/src/main/java/constants/UOM.java @@ -0,0 +1,9 @@ +package constants; + +public enum UOM { + PIECE, + EA, + DOZEN, + CTN, + BOX +} diff --git a/src/main/java/constants/uomList.java b/src/main/java/constants/uomList.java new file mode 100644 index 0000000000..8f7b74814f --- /dev/null +++ b/src/main/java/constants/uomList.java @@ -0,0 +1,4 @@ +package constants; + +public class uomList { +} diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index ee17366a0d..d72e58321f 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,15 +1,21 @@ package item; +import constants.UOM; public class Item { public static int numberOfItems; - private final String itemName; - private int quantity; - private String UOM; + protected final String itemName; + protected int quantity; + protected UOM uom; + protected int uomQty; + protected float costPrice; + protected float salePrice; - public Item(String name, int quantity, String uom) { + + public Item(String name, int quantity, UOM uom, int uomQty) { this.itemName = name; this.quantity = quantity; - this.UOM = uom; + this.uom = uom; + this.uomQty = uomQty; numberOfItems++; } @@ -24,4 +30,10 @@ public int getQuantity() { public void setQuantity(int newQuantity) { this.quantity = newQuantity; } + public UOM getUom() { + return this.uom; + } + public void setUomQty(int newQty) { + this.uomQty = newQty; + } } From 351997fb874e049151cc34c58a5d04e598548987 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 20 Mar 2024 22:25:08 +0800 Subject: [PATCH 052/421] Update Storage --- src/main/java/storage/Storage.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 07c8ace5f4..cd6f369e85 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -48,6 +48,13 @@ public static File getFile() { } + /** + * Set the private File dukeData. + */ + public static File setFile() { + return new File(FILENAME); + } + /** * Read lines from the file and identify tasks written inside. * Add the identified tasks into a list of existing tasks. @@ -65,7 +72,7 @@ public static void readFromFile(File fileName) { } public static void main (String[]args){ - stockMaster = new File(FILENAME); + stockMaster = setFile(); try { writeToFile(stockMaster.getPath(), "", true); } catch (IOException e) { From 4f50ffc4971cf4335be359dec6c2f82508550e51 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 20 Mar 2024 23:06:10 +0800 Subject: [PATCH 053/421] Edit AddCommand Class --- src/main/java/command/AddCommand.java | 13 ++++++++++--- src/main/java/{Itemlist => itemlist}/Itemlist.java | 4 ++-- 2 files changed, 12 insertions(+), 5 deletions(-) rename src/main/java/{Itemlist => itemlist}/Itemlist.java (81%) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 5dbbabab9d..ba6a7f901c 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -1,6 +1,7 @@ package command; import item.Item; +import itemlist.Itemlist; public class AddCommand extends Command { @@ -8,10 +9,11 @@ public class AddCommand extends Command { protected String itemName; protected int quantity; protected String uom; + protected String category = "NA"; private final Item toAdd; - public AddCommand(String itemName, int quantity, String uom) { - this.toAdd = new Item(itemName, quantity, uom); + public AddCommand(String itemName, int quantity, String uom, String category) { + this.toAdd = new Item(itemName, quantity, uom, category); } public String getItemNam() { @@ -22,12 +24,17 @@ public int getQuantity() { return quantity; } + public String getCategory() { return category; } + public String getUom() { return uom; } @Override public void execute() { - //itemList.add(toAdd); + Itemlist.addItem(toAdd); System.out.println(MESSAGE_SUCCESS + getItemNam() + "(Qty: " + getQuantity() + ")"); + if (!category.equals("NA")) { + System.out.println("to " + getCategory()); + } } } diff --git a/src/main/java/Itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java similarity index 81% rename from src/main/java/Itemlist/Itemlist.java rename to src/main/java/itemlist/Itemlist.java index 0cf9b4166a..757209c767 100644 --- a/src/main/java/Itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -4,12 +4,12 @@ import java.util.ArrayList; public class Itemlist { - private final ArrayList items = new ArrayList<>(); + private static final ArrayList items = new ArrayList<>(); public Itemlist() { } - public void addItem(Item item) { + public static void addItem(Item item) { items.add(item); } From c6f79cd6e4e7220596341e9be45143d83e3c7835 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 20 Mar 2024 23:27:47 +0800 Subject: [PATCH 054/421] Edit Coding Style --- src/main/java/command/AddCommand.java | 5 ++++- src/main/java/common/Messages.java | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index ba6a7f901c..2e13684911 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -24,11 +24,14 @@ public int getQuantity() { return quantity; } - public String getCategory() { return category; } + public String getCategory() { + return category; + } public String getUom() { return uom; } + @Override public void execute() { Itemlist.addItem(toAdd); diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 7703d87d0e..3508014c38 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -12,6 +12,7 @@ public class Messages { public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; -/*// public static final String MESSAGE_ ="";*/ + + /* public static final String MESSAGE_ ="";*/ } From 747426b95f215df32ff4b25b3277a846d2bcc26b Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 21 Mar 2024 01:01:45 +0800 Subject: [PATCH 055/421] Update Storage --- src/main/java/storage/Storage.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index cd6f369e85..462ecf19a4 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -41,11 +41,10 @@ public static void updateFile(String inputText, boolean ifAppend) { } /** - * Returns the private File dukeData. + * Returns the private file directory of storage. */ - public static File getFile() { - return stockMaster; - + public static String getFileDirectory() { + return FILENAME; } /** From b2299880f49f31ec35666f02e9f7b2a23cb45a58 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 01:10:47 +0800 Subject: [PATCH 056/421] add category param for addcommand format --- src/main/java/common/Messages.java | 4 ++-- src/main/java/parser/Parser.java | 9 ++++++--- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 7703d87d0e..8da2019f39 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -11,7 +11,7 @@ public class Messages { "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; - public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; -/*// public static final String MESSAGE_ ="";*/ + public static final String GOODBYE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; +// public static final String MESSAGE_ =""; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 77a4f50eb6..322649c7af 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -13,7 +13,7 @@ public class Parser { public boolean isExitCommandDetected = false; public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: cat/(?[^/]+))?"); public static final Pattern DELETE_COMMAND_FORMAT = Pattern.compile("del (?[^/]+)"); @@ -86,10 +86,13 @@ public void parseInput(String userInput) { return IncorrectCommand; } try { + String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + int quantity = Integer.parseInt(matcher.group("quantity")); return new AddCommand( matcher.group("itemName"), - matcher.group("quantity"), - matcher.group("uom") + quantity, + matcher.group("uom"), + category ); } catch (CommandFormatException e) { From c2d7b0a3641716cb0756f25fbd5ebce8ba96014d Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 02:12:50 +0800 Subject: [PATCH 057/421] add incorrectcommand class --- src/main/java/command/IncorrectCommand.java | 11 +++++++++++ src/main/java/common/Messages.java | 1 - 2 files changed, 11 insertions(+), 1 deletion(-) create mode 100644 src/main/java/command/IncorrectCommand.java diff --git a/src/main/java/command/IncorrectCommand.java b/src/main/java/command/IncorrectCommand.java new file mode 100644 index 0000000000..238b1d71f8 --- /dev/null +++ b/src/main/java/command/IncorrectCommand.java @@ -0,0 +1,11 @@ +package command; + + +public class IncorrectCommand extends Command { + + + @Override + public void execute() { + } + +} diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 8da2019f39..b09ea782c3 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -12,6 +12,5 @@ public class Messages { public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; public static final String GOODBYE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; -// public static final String MESSAGE_ =""; } From 67f35c8cfcc9482b2b321aa032306aaac315d84c Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 02:23:39 +0800 Subject: [PATCH 058/421] edit prepareAdd function --- src/main/java/parser/Parser.java | 39 +++++++++++++++----------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 322649c7af..2472b195c8 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,5 +1,8 @@ package parser; +import command.AddCommand; +import command.Command; +import command.IncorrectCommand; import common.Messages; import exceptions.CommandFormatException; import item.Item; @@ -51,11 +54,11 @@ public void parseInput(String userInput) { break; case ADD: -// try { -// prepareAdd(arguments); -// } catch (CommandFormatException e) { -// break; -// } + try { + prepareAdd(arguments); + } catch (CommandFormatException e) { + break; + } break; case DELETE: // try { @@ -78,29 +81,23 @@ public void parseInput(String userInput) { } -/* private Command prepareAdd(String args) throws CommandFormatException{ + private Command prepareAdd(String args) throws CommandFormatException{ final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); - return IncorrectCommand; } - try { - String category = matcher.group("category") != null ? matcher.group("category") : "NA"; - int quantity = Integer.parseInt(matcher.group("quantity")); - return new AddCommand( - matcher.group("itemName"), - quantity, - matcher.group("uom"), - category - ); + String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + int quantity = Integer.parseInt(matcher.group("quantity")); + return new AddCommand( + matcher.group("itemName"), + quantity, + matcher.group("uom"), + category + ); - } catch (CommandFormatException e) { - throw new CommandFormatException(CommandType.ADD); - return IncorrectCommand; - } } - +/* private Command prepareDelete(String args) throws CommandFormatException{ final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format From 00e118f654e5fa6d1dd59bb0a69832719f5cf704 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 02:30:25 +0800 Subject: [PATCH 059/421] edit checkstyle --- src/main/java/command/AddCommand.java | 8 +++++--- src/main/java/parser/Parser.java | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index ba6a7f901c..ef990afe19 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -16,7 +16,7 @@ public AddCommand(String itemName, int quantity, String uom, String category) { this.toAdd = new Item(itemName, quantity, uom, category); } - public String getItemNam() { + public String getItemName() { return itemName; } @@ -24,7 +24,9 @@ public int getQuantity() { return quantity; } - public String getCategory() { return category; } + public String getCategory() { + return category; + } public String getUom() { return uom; @@ -32,7 +34,7 @@ public String getUom() { @Override public void execute() { Itemlist.addItem(toAdd); - System.out.println(MESSAGE_SUCCESS + getItemNam() + "(Qty: " + getQuantity() + ")"); + System.out.println(MESSAGE_SUCCESS + getItemName() + "(Qty: " + getQuantity() + ")"); if (!category.equals("NA")) { System.out.println("to " + getCategory()); } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 2472b195c8..ab07fde847 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -97,7 +97,7 @@ private Command prepareAdd(String args) throws CommandFormatException{ ); } -/* + /* private Command prepareDelete(String args) throws CommandFormatException{ final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format From 2c9160ae3da9d461b670f0ea178bc8b8bbd260b0 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 02:41:23 +0800 Subject: [PATCH 060/421] edit delete and edit function --- src/main/java/parser/Parser.java | 25 ++++++------------------- 1 file changed, 6 insertions(+), 19 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index ab07fde847..b71dd32ee0 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -103,15 +103,8 @@ private Command prepareDelete(String args) throws CommandFormatException{ // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.DELETE); - return IncorrectCommand; - } - try { - return new DeleteCommand(matcher.group("itemName"); - - } catch (CommandFormatException e) { - throw new CommandFormatException(CommandType.DELETE); - return IncorrectCommand; } + return new DeleteCommand(matcher.group("itemName")); } private Command prepareEdit(String args) throws CommandFormatException{ @@ -119,18 +112,12 @@ private Command prepareEdit(String args) throws CommandFormatException{ // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); - return IncorrectCommand; - } - try { - return new EditCommand( - matcher.group("itemName"), - matcher.group("newQuantity") - ); - - } catch (CommandFormatException e) { - throw new CommandFormatException(CommandType.EDIT); - return IncorrectCommand; } + int newQuantity = Integer.parseInt(matcher.group("newQuantity")); + return new EditCommand( + matcher.group("itemName"), + newQuantity + ); }*/ } From 87271f54768d8c88ea678b87abd79d23bc9cf911 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 21 Mar 2024 02:55:29 +0800 Subject: [PATCH 061/421] Add more Command Class --- src/main/java/command/AddCommand.java | 4 +-- src/main/java/command/DeleteCommand.java | 29 +++++++++++++++ src/main/java/command/EditCommand.java | 33 +++++++++++++++++ src/main/java/command/ExitCommand.java | 19 ++++++++++ src/main/java/command/FindCommand.java | 28 +++++++++++++++ src/main/java/command/HelpCommand.java | 11 ++++++ src/main/java/command/ListCommand.java | 19 ++++++++++ src/main/java/itemlist/Itemlist.java | 12 +++++-- src/main/java/parser/Parser.java | 46 ++++++++++++------------ src/main/java/ui/TextUi.java | 18 ++++++---- 10 files changed, 185 insertions(+), 34 deletions(-) create mode 100644 src/main/java/command/DeleteCommand.java create mode 100644 src/main/java/command/EditCommand.java create mode 100644 src/main/java/command/ExitCommand.java create mode 100644 src/main/java/command/FindCommand.java create mode 100644 src/main/java/command/HelpCommand.java create mode 100644 src/main/java/command/ListCommand.java diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 2e13684911..f5c580c4f3 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -16,7 +16,7 @@ public AddCommand(String itemName, int quantity, String uom, String category) { this.toAdd = new Item(itemName, quantity, uom, category); } - public String getItemNam() { + public String getItemName() { return itemName; } @@ -35,7 +35,7 @@ public String getUom() { @Override public void execute() { Itemlist.addItem(toAdd); - System.out.println(MESSAGE_SUCCESS + getItemNam() + "(Qty: " + getQuantity() + ")"); + System.out.println(MESSAGE_SUCCESS + getItemName() + "(Qty: " + getQuantity() + ")"); if (!category.equals("NA")) { System.out.println("to " + getCategory()); } diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java new file mode 100644 index 0000000000..7a444ab708 --- /dev/null +++ b/src/main/java/command/DeleteCommand.java @@ -0,0 +1,29 @@ +package command; + +import item.Item; +import itemlist.Itemlist; + +public class DeleteCommand { + + protected String itemName; + + public DeleteCommand(String itemName) { + this.itemName = itemName; + } + + public void execute() { + int index = -1; + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + index = Itemlist.getItems().indexOf(item); + break; + } + } + if (index == -1) { + //throw exception; + } + else { + Itemlist.deleteItem(index); + } + } +} diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java new file mode 100644 index 0000000000..2a12460d0f --- /dev/null +++ b/src/main/java/command/EditCommand.java @@ -0,0 +1,33 @@ +package command; + +import item.Item; +import itemlist.Itemlist; + +public class EditCommand extends Command { + + protected String itemName; + + protected int newQuantity; + + public EditCommand (String itemName, int newQuantity) { + this.itemName = itemName; + this.newQuantity = newQuantity; + } + + @Override + public void execute() { + int index = -1; + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + index = Itemlist.getItems().indexOf(item); + break; + } + } + if (index == -1) { + //throw exception; + } + else { + Itemlist.editQuantity(index, newQuantity); + } + } +} diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java new file mode 100644 index 0000000000..fc3d5600a9 --- /dev/null +++ b/src/main/java/command/ExitCommand.java @@ -0,0 +1,19 @@ +package command; + +public class ExitCommand extends Command{ + + protected boolean isExit = false; + + public ExitCommand(boolean isExit) { + this.isExit = isExit; + } + + public boolean getIsExit() { + return isExit; + } + + @Override + public void execute() { + + } +} diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java new file mode 100644 index 0000000000..99e9ddad84 --- /dev/null +++ b/src/main/java/command/FindCommand.java @@ -0,0 +1,28 @@ +package command; + +import item.Item; +import itemlist.Itemlist; + +import java.util.ArrayList; + +public class FindCommand extends Command{ + + protected String itemName; + + public FindCommand(String itemName) { + this.itemName = itemName; + } + + @Override + public void execute() { + ArrayList searchList = new ArrayList<>(); + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().contains(itemName)) { + int index = Itemlist.getItems().indexOf(item); + String itemNameWithIndex = index + ". " + item.getItemName(); + searchList.add(itemNameWithIndex); + } + } + //displayList(searchList); + } +} diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java new file mode 100644 index 0000000000..597948b929 --- /dev/null +++ b/src/main/java/command/HelpCommand.java @@ -0,0 +1,11 @@ +package command; + +import common.Messages; + +public class HelpCommand extends Command{ + + @Override + public void execute() { + System.out.println(Messages.HELP); + } +} diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java new file mode 100644 index 0000000000..b46e923ba8 --- /dev/null +++ b/src/main/java/command/ListCommand.java @@ -0,0 +1,19 @@ +package command; + +import ui.TextUi; + +import java.util.ArrayList; + +public class ListCommand extends Command{ + + protected ArrayList arrayList; + + public ListCommand(ArrayList arrayList) { + this.arrayList = arrayList; + } + + public void execute() { + TextUi.showInventoryList(arrayList); + } +} + diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 757209c767..e8b4fd08c6 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -13,11 +13,11 @@ public static void addItem(Item item) { items.add(item); } - public void deleteItem(int index) { + public static void deleteItem(int index) { items.remove(index); } - public void editQuantity(int index, int newQuantity) { + public static void editQuantity(int index, int newQuantity) { items.get(index).setQuantity(newQuantity); if (newQuantity == 0) { items.get(index).markOOS(); @@ -25,4 +25,12 @@ public void editQuantity(int index, int newQuantity) { items.get(index).unmarkOOS(); } } + + public static ArrayList getItems() { + return items; + } + + public static int getIndex(Item item) { + return items.indexOf(item); + } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 77a4f50eb6..2c49912965 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,8 +1,10 @@ package parser; +import command.*; import common.Messages; import exceptions.CommandFormatException; import item.Item; +import itemlist.Itemlist; import storage.Storage; import ui.TextUi; @@ -11,7 +13,6 @@ import java.util.regex.Pattern; public class Parser { - public boolean isExitCommandDetected = false; public static final Pattern ADD_COMMAND_FORMAT = Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); @@ -25,7 +26,7 @@ public class Parser { Pattern.compile("(?\\S+)(?.*)"); - public void parseInput(String userInput) { + public Command parseInput(String userInput) { final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); if (!matcher.matches()) { @@ -41,35 +42,34 @@ public void parseInput(String userInput) { case EXIT: // storage.saveItems(items); //(COMMAND FROM STORAGE TO SAVE ITEMLIST) // ui.closeScanner(); //(COMMAND FROM TEXTUI TO CLOSE SCANNER) - isExitCommandDetected = true; - return; + return new ExitCommand(true); case HELP: - System.out.println(Messages.HELP); + return new HelpCommand(); break; case LIST: -// ui.listItems(items); //(COMMAND FROM TEXTUI TO PRINT ITEMS) + return new ListCommand<>(Itemlist.getItems()); break; case ADD: -// try { -// prepareAdd(arguments); -// } catch (CommandFormatException e) { -// break; -// } + try { + return prepareAdd(arguments); + } catch (CommandFormatException e) { + break; + } break; case DELETE: -// try { -// prepareDelete(arguments); -// } catch (CommandFormatException e) { -// break; -// } + try { + return prepareDelete(arguments); + } catch (CommandFormatException e) { + break; + } break; case EDIT: -// try { -// prepareEdit(arguments); -// } catch (CommandFormatException e) { -// break; -// } + try { + return prepareEdit(arguments); + } catch (CommandFormatException e) { + break; + } break; default: System.out.println(Messages.INVALID_COMMAND); @@ -78,7 +78,7 @@ public void parseInput(String userInput) { } -/* private Command prepareAdd(String args) throws CommandFormatException{ + private Command prepareAdd(String args) throws CommandFormatException{ final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { @@ -131,7 +131,7 @@ private Command prepareEdit(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.EDIT); return IncorrectCommand; } - }*/ + } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 203354bec9..9eeb1aa36d 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,5 +1,8 @@ package ui; +import item.Item; + +import java.util.ArrayList; import java.util.Scanner; public class TextUi { @@ -49,19 +52,20 @@ public void showGoodByeMessage(String storageFilePath) { ); } - public void replyToUser(String...message) { + public static void replyToUser(String... message) { for (String m : message) { System.out.println(m + "\n"); } } - /*Waiting for ArrayList before implementing final code - private void showInventoryList(ArrayList arrayList) { - for (int i = 0; i < arrayList.size(); i++) { - if (arrayList.get(i) == null) { + public static void showInventoryList(ArrayList arrayList) { + for (T item : arrayList) { + if (item == null) { break; } - replyToUser(arrayList.get(i)); + replyToUser( + "List:", + String.valueOf(item)); } - }*/ + } } From b22153d9ab2935c235166ad3ee89aa1606d648d7 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 21 Mar 2024 03:20:01 +0800 Subject: [PATCH 062/421] Edit checkstyle and integrate all classes --- src/main/java/command/DeleteCommand.java | 3 +-- src/main/java/command/EditCommand.java | 3 +-- src/main/java/command/ExitCommand.java | 6 +++--- src/main/java/parser/Parser.java | 22 +++++++++++----------- src/main/java/seedu/duke/Duke.java | 10 +++++++--- src/main/java/ui/TextUi.java | 2 -- 6 files changed, 23 insertions(+), 23 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 5ecc179fe2..21d3482996 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -21,8 +21,7 @@ public void execute() { } if (index == -1) { //throw exception; - } - else { + } else { Itemlist.deleteItem(index); } } diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 2a12460d0f..e56f98e0c0 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -25,8 +25,7 @@ public void execute() { } if (index == -1) { //throw exception; - } - else { + } else { Itemlist.editQuantity(index, newQuantity); } } diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java index fc3d5600a9..6430aaffa1 100644 --- a/src/main/java/command/ExitCommand.java +++ b/src/main/java/command/ExitCommand.java @@ -2,13 +2,13 @@ public class ExitCommand extends Command{ - protected boolean isExit = false; + protected static boolean isExit = false; public ExitCommand(boolean isExit) { - this.isExit = isExit; + ExitCommand.isExit = isExit; } - public boolean getIsExit() { + public static boolean getIsExit() { return isExit; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index b09470ae63..32420740b2 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,6 +1,13 @@ package parser; -import command.*; +import command.Command; +import command.DeleteCommand; +import command.AddCommand; +import command.ListCommand; +import command.IncorrectCommand; +import command.ExitCommand; +import command.HelpCommand; +import command.EditCommand; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; @@ -40,11 +47,8 @@ public Command parseInput(String userInput) { return new ExitCommand(true); case HELP: return new HelpCommand(); - break; case LIST: return new ListCommand<>(Itemlist.getItems()); - break; - case ADD: try { return prepareAdd(arguments); @@ -52,25 +56,23 @@ public Command parseInput(String userInput) { } catch (CommandFormatException e) { break; } - break; case DELETE: try { return prepareDelete(arguments); } catch (CommandFormatException e) { break; } - break; case EDIT: - try { - return prepareEdit(arguments); + try { + return prepareEdit(arguments); } catch (CommandFormatException e) { break; } - break; default: System.out.println(Messages.INVALID_COMMAND); break; } + return new IncorrectCommand(); } @@ -88,7 +90,6 @@ private Command prepareAdd(String args) throws CommandFormatException{ matcher.group("uom"), category ); - } private Command prepareDelete(String args) throws CommandFormatException{ @@ -106,7 +107,6 @@ private Command prepareEdit(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); } - int newQuantity = Integer.parseInt(matcher.group("newQuantity")); return new EditCommand( matcher.group("itemName"), diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 17e61ab8e6..808fa3aa1b 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -1,5 +1,7 @@ package seedu.duke; +import command.Command; +import command.ExitCommand; import parser.Parser; import ui.TextUi; @@ -15,7 +17,7 @@ public class Duke { /** * Main entry-point for the java.duke.Duke application. */ - public static void main(String[] args) { + public static void main(String[] args) throws IOException { String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" @@ -26,6 +28,7 @@ public static void main(String[] args) { Scanner in = new Scanner(System.in); System.out.println("Hello " + in.nextLine()); + new Duke().run(); } public void run() throws IOException { @@ -38,7 +41,8 @@ private void normalOperation() throws IOException { String userInput; do { userInput = ui.getUserInput(); - parser.parseInput(userInput); - } while (!parser.isExitCommandDetected); + Command command = parser.parseInput(userInput); + command.execute(); + } while (!ExitCommand.getIsExit()); } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 9eeb1aa36d..80eeb1a770 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,7 +1,5 @@ package ui; -import item.Item; - import java.util.ArrayList; import java.util.Scanner; From fd66cb10daa4dd02b997fcbda3c9e4bd7a0aa039 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 04:36:34 +0800 Subject: [PATCH 063/421] fix bug in parser formatting --- src/main/java/command/AddCommand.java | 8 ++++++++ src/main/java/parser/Parser.java | 17 +++++++++-------- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index f5c580c4f3..e49c449bac 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -13,6 +13,14 @@ public class AddCommand extends Command { private final Item toAdd; public AddCommand(String itemName, int quantity, String uom, String category) { + System.out.println(itemName); + System.out.println(quantity); + System.out.println(uom); + System.out.println(category); + this.itemName = itemName; + this.quantity = quantity; + this.uom = uom; + this.category = category; this.toAdd = new Item(itemName, quantity, uom, category); } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 32420740b2..14aec74ed3 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -18,7 +18,8 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: cat/(?[^/]+))?"); + //Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+) (?: cat/(?[^/]+))?"); + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); public static final Pattern DELETE_COMMAND_FORMAT = Pattern.compile("del (?[^/]+)"); @@ -39,7 +40,6 @@ public Command parseInput(String userInput) { } final CommandType userCommand = CommandType.valueOf(matcher.group("commandWord").toUpperCase()); - final String arguments = matcher.group("arguments"); switch (userCommand) { @@ -51,20 +51,20 @@ public Command parseInput(String userInput) { return new ListCommand<>(Itemlist.getItems()); case ADD: try { - return prepareAdd(arguments); + return prepareAdd(userInput); } catch (CommandFormatException e) { break; } case DELETE: try { - return prepareDelete(arguments); + return prepareDelete(userInput); } catch (CommandFormatException e) { break; } case EDIT: try { - return prepareEdit(arguments); + return prepareEdit(userInput); } catch (CommandFormatException e) { break; } @@ -78,17 +78,18 @@ public Command parseInput(String userInput) { private Command prepareAdd(String args) throws CommandFormatException{ final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); } - String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + //String category = matcher.group("category") != null ? matcher.group("category") : "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); return new AddCommand( matcher.group("itemName"), quantity, - matcher.group("uom"), - category + matcher.group("uom"), "test cat" + //category ); } From 01af1758f8ece4839a7da72d7e82fdbd47d67240 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 21 Mar 2024 10:51:05 +0800 Subject: [PATCH 064/421] Fix Checkstyle Rule Violation --- src/main/java/parser/Parser.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 14aec74ed3..fa2a6fac35 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -18,7 +18,8 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - //Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+) (?: cat/(?[^/]+))?"); + //Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+) + // (?: cat/(?[^/]+))?"); Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); public static final Pattern DELETE_COMMAND_FORMAT = @@ -89,7 +90,7 @@ private Command prepareAdd(String args) throws CommandFormatException{ matcher.group("itemName"), quantity, matcher.group("uom"), "test cat" - //category + //category ); } From 987ce9d548d72d7c1a9e93a9c32a6b99dfb93838 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 16:34:46 +0800 Subject: [PATCH 065/421] fix category formatting in parser --- src/main/java/common/Messages.java | 2 +- src/main/java/parser/Parser.java | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 4cbfe1fb8d..f7cf078755 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -5,7 +5,7 @@ public class Messages { public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; public static final String HELP = "Commands: ...."; public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT]'"; + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY]'"; public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 14aec74ed3..6f31282ae6 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -18,8 +18,7 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - //Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+) (?: cat/(?[^/]+))?"); - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: cat/(?[^/]+))?"); public static final Pattern DELETE_COMMAND_FORMAT = Pattern.compile("del (?[^/]+)"); @@ -83,13 +82,14 @@ private Command prepareAdd(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); } - //String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + String category = matcher.group("category") != null ? matcher.group("category") : "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); return new AddCommand( matcher.group("itemName"), quantity, - matcher.group("uom"), "test cat" - //category + matcher.group("uom"), + //"test cat" + category ); } From 350fe56910078e480cd14eeca745e9140ba15362 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 17:37:02 +0800 Subject: [PATCH 066/421] fix parser bug to allow handling of blank and garbage inputs --- src/main/java/parser/Parser.java | 18 +++++++++++------- src/main/java/seedu/duke/Duke.java | 1 + 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 6f31282ae6..89d8824950 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -30,16 +30,21 @@ public class Parser { Pattern.compile("(?\\S+)(?.*)"); - public Command parseInput(String userInput) { - + public Command parseInput(String userInput){ + final CommandType userCommand; final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); if (!matcher.matches()) { System.out.println(Messages.INVALID_COMMAND); System.out.println(Messages.HELP); + return new IncorrectCommand(); + } + String commandWord = matcher.group("commandWord").toUpperCase(); + try { + userCommand = CommandType.valueOf(commandWord); + } catch (IllegalArgumentException e){ + System.out.println(Messages.INVALID_COMMAND); + return new IncorrectCommand(); } - - final CommandType userCommand = CommandType.valueOf(matcher.group("commandWord").toUpperCase()); - switch (userCommand) { case EXIT: @@ -69,7 +74,7 @@ public Command parseInput(String userInput) { } default: System.out.println(Messages.INVALID_COMMAND); - break; + return new IncorrectCommand(); } return new IncorrectCommand(); } @@ -88,7 +93,6 @@ private Command prepareAdd(String args) throws CommandFormatException{ matcher.group("itemName"), quantity, matcher.group("uom"), - //"test cat" category ); } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 808fa3aa1b..1a9e0b177f 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -2,6 +2,7 @@ import command.Command; import command.ExitCommand; +import exceptions.CommandFormatException; import parser.Parser; import ui.TextUi; From 0ca172a219c99aa174d0889cd3be14a027c2946d Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 21 Mar 2024 17:49:31 +0800 Subject: [PATCH 067/421] resolve merge conflicts --- src/main/java/storage/Storage.java | 26 +++++++++------- src/test/java/storage/StorageTest.java | 43 +++++++++++++++++++++++--- 2 files changed, 54 insertions(+), 15 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 820330c889..7b6164d46d 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -13,7 +13,7 @@ */ public class Storage { private static final String FILENAME = "./StockMasterData.txt"; - + private static File stockMaster; @@ -26,7 +26,7 @@ public class Storage { * or overwrite the file (false). * @throws IOException If file is not found at the indicated file path. */ - private static void writeToFile(String filePath, String textToAdd, boolean ifAppend) throws IOException { + public static void writeToFile(String filePath, String textToAdd, boolean ifAppend) throws IOException { FileWriter writer = new FileWriter(filePath, ifAppend); writer.write(textToAdd); writer.close(); @@ -41,22 +41,27 @@ public static void updateFile(String inputText, boolean ifAppend) { } /** - * Returns the private File dukeData. + * Returns the private file directory of storage. */ - public static File getFile() { - return stockMaster; + public static String getFileDirectory() { + return FILENAME; + } + /** + * Set the private File dukeData. + */ + public static File setFile() { + return new File(FILENAME); } /** * Read lines from the file and identify tasks written inside. * Add the identified tasks into a list of existing tasks. * - * @param fileToRead The file to read from. */ - public static void readFromFile(File fileToRead) { + public static void readFromFile(File fileName) { try { - Scanner scanner = new Scanner(fileToRead); + Scanner scanner = new Scanner(fileName); while (scanner.hasNext()) { String lineSkipped = scanner.nextLine(); } @@ -66,12 +71,11 @@ public static void readFromFile(File fileToRead) { } public static void main (String[]args){ - stockMaster = new File(FILENAME); + stockMaster = setFile(); try { writeToFile(stockMaster.getPath(), "", true); } catch (IOException e) { System.out.println("File does not exist."); } } -} - +} \ No newline at end of file diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 353e52a205..2cefbdfd99 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,13 +1,48 @@ package storage; import org.junit.jupiter.api.Test; -//import static org.junit.jupiter.api.Assertions.assertEquals; -//import static org.junit.jupiter.api.Assertions.fail; -//import java.io.FileNotFoundException; +import java.io.File; +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.Scanner; public class StorageTest { @Test - public void fileToReadNotFound() { + public void readFromFile_fileNotFound() { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + + String directory = "./testFile.txt"; + File testFile = new File(directory); + try { + Storage.writeToFile(directory, "Created", true); + testFile.delete(); + Storage.readFromFile(testFile); + assertEquals("File does not exist." + System.lineSeparator(), outputStream.toString()); + } catch (IOException e) { + fail("failed to create a file."); + } + } + + @Test + public void writeToFile_aLine_writeSuccessful() { + String directory = "./testFile.txt"; + File testFile = new File(directory); + String aLine = "A line"; + try { + Storage.writeToFile(directory, aLine, true); + Scanner scanner = new Scanner(testFile); + String lineSkipped = scanner.nextLine(); + scanner.close(); + testFile.delete(); + assertEquals(aLine, lineSkipped); + } catch (IOException e) { + fail("File not found"); + } } } From 5099538b29e9223d2d33c5d36e439dedba4c2ee2 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 21 Mar 2024 20:34:13 +0800 Subject: [PATCH 068/421] Add addToFile in Storage --- src/main/java/command/AddCommand.java | 2 ++ src/main/java/seedu/duke/Duke.java | 4 +++- src/main/java/storage/Storage.java | 14 ++++++++++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index e49c449bac..b9e0499164 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -2,6 +2,7 @@ import item.Item; import itemlist.Itemlist; +import storage.Storage; public class AddCommand extends Command { @@ -44,6 +45,7 @@ public String getUom() { public void execute() { Itemlist.addItem(toAdd); System.out.println(MESSAGE_SUCCESS + getItemName() + "(Qty: " + getQuantity() + ")"); + Storage.addToFile(Itemlist.getItems(), true); if (!category.equals("NA")) { System.out.println("to " + getCategory()); } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 1a9e0b177f..36fda6cd98 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -2,8 +2,9 @@ import command.Command; import command.ExitCommand; -import exceptions.CommandFormatException; +//import exceptions.CommandFormatException; import parser.Parser; +import storage.Storage; import ui.TextUi; import itemlist.Itemlist; @@ -29,6 +30,7 @@ public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); System.out.println("Hello " + in.nextLine()); + Storage.main(args); new Duke().run(); } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 7b6164d46d..a30909c34f 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,7 +1,10 @@ package storage; +import item.Item; + import java.io.File; import java.io.FileNotFoundException; +import java.util.ArrayList; import java.util.Scanner; import java.io.FileWriter; import java.io.IOException; @@ -34,7 +37,7 @@ public static void writeToFile(String filePath, String textToAdd, boolean ifAppe public static void updateFile(String inputText, boolean ifAppend) { try { - writeToFile(FILENAME, inputText, ifAppend); + writeToFile(getFileDirectory(), inputText, ifAppend); } catch (IOException e) { System.out.println("IOExceptions occurred"); } @@ -70,6 +73,13 @@ public static void readFromFile(File fileName) { } } + public static void addToFile(ArrayList items, boolean ifAppend) { + Item lastItem = items.get(items.size() - 1); + String descriptionAdded = items.size() + " | " + lastItem.getItemName() + + " | " + lastItem.getQuantity() + "\n"; + updateFile(descriptionAdded, ifAppend); + } + public static void main (String[]args){ stockMaster = setFile(); try { @@ -78,4 +88,4 @@ public static void main (String[]args){ System.out.println("File does not exist."); } } -} \ No newline at end of file +} From f777932f363e2add69c2411afb2048037d5f69c2 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 21 Mar 2024 20:46:27 +0800 Subject: [PATCH 069/421] Edit TexiUi getUserInput() --- src/main/java/ui/TextUi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 80eeb1a770..3b7a209494 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -20,7 +20,7 @@ public TextUi() { public String getUserInput() { System.out.println("Enter Command: "); Scanner in = new Scanner(System.in); - String userInput = in.nextLine(); + String userInput = in.hasNextLine() ? in.nextLine() : ""; if (shouldIgnore(userInput)) { return "Invalid Command"; //Might want to change this with Exceptions } From 4b86ad3ffe15f5c24166ebbeca8dd245a700c4f8 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 21 Mar 2024 21:46:11 +0800 Subject: [PATCH 070/421] Add overwriteFile in Storage --- src/main/java/command/DeleteCommand.java | 2 ++ src/main/java/command/EditCommand.java | 5 ++++- src/main/java/storage/Storage.java | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 21d3482996..1e3ae425c6 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -2,6 +2,7 @@ import item.Item; import itemlist.Itemlist; +import storage.Storage; public class DeleteCommand extends Command { @@ -24,5 +25,6 @@ public void execute() { } else { Itemlist.deleteItem(index); } + Storage.overwriteFile(Itemlist.getItems(), false); } } diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index e56f98e0c0..8a8925a333 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -2,6 +2,7 @@ import item.Item; import itemlist.Itemlist; +import storage.Storage; public class EditCommand extends Command { @@ -18,15 +19,17 @@ public EditCommand (String itemName, int newQuantity) { public void execute() { int index = -1; for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { + if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { index = Itemlist.getItems().indexOf(item); break; } } if (index == -1) { //throw exception; + System.out.println("item not found!"); } else { Itemlist.editQuantity(index, newQuantity); } + Storage.overwriteFile(Itemlist.getItems(), false); } } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index a30909c34f..3570e96f08 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -75,11 +75,24 @@ public static void readFromFile(File fileName) { public static void addToFile(ArrayList items, boolean ifAppend) { Item lastItem = items.get(items.size() - 1); - String descriptionAdded = items.size() + " | " + lastItem.getItemName() + + String descriptionAdded = (items.size() - 1) + " | " + lastItem.getItemName() + " | " + lastItem.getQuantity() + "\n"; updateFile(descriptionAdded, ifAppend); } + public static void overwriteFile(ArrayList items, boolean ifAppend) { + int length = items.size(); + for (int index = 0; index < length; index++) { + String descriptionAdded = index + " | " + items.get(index).getItemName() + + " | " + items.get(index).getQuantity() + "\n"; + if (index == 0) { + updateFile(descriptionAdded, ifAppend); + } else { + updateFile(descriptionAdded, !ifAppend); + } + } + } + public static void main (String[]args){ stockMaster = setFile(); try { From 756a75a99ae5c0bddd201c1d6191df8232510bf2 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 22 Mar 2024 10:42:05 +0800 Subject: [PATCH 071/421] Add assertions --- src/main/java/storage/Storage.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 3570e96f08..ab202853fd 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -74,6 +74,7 @@ public static void readFromFile(File fileName) { } public static void addToFile(ArrayList items, boolean ifAppend) { + assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); String descriptionAdded = (items.size() - 1) + " | " + lastItem.getItemName() + " | " + lastItem.getQuantity() + "\n"; @@ -81,6 +82,7 @@ public static void addToFile(ArrayList items, boolean ifAppend) { } public static void overwriteFile(ArrayList items, boolean ifAppend) { + assert items != null : "Items cannot be null."; int length = items.size(); for (int index = 0; index < length; index++) { String descriptionAdded = index + " | " + items.get(index).getItemName() + From ab774366727e60a3a07c3023f870eeaecfa29123 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 22 Mar 2024 12:16:51 +0800 Subject: [PATCH 072/421] Test Code --- src/main/java/command/IncorrectCommand.java | 1 - src/main/java/item/Item.java | 4 ++++ src/main/java/parser/Parser.java | 12 ++++++------ src/main/java/ui/TextUi.java | 5 ++--- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/command/IncorrectCommand.java b/src/main/java/command/IncorrectCommand.java index 238b1d71f8..d142382994 100644 --- a/src/main/java/command/IncorrectCommand.java +++ b/src/main/java/command/IncorrectCommand.java @@ -3,7 +3,6 @@ public class IncorrectCommand extends Command { - @Override public void execute() { } diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 874b5dac8f..77f8b9452b 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -45,4 +45,8 @@ public void markOOS() { public void unmarkOOS() { this.isOOS = false; } + + public String toString() { + return "Item: " + getItemName() + " (Qty " + getQuantity() + ")"; + } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 14aec74ed3..5824cefe9e 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -18,8 +18,8 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - //Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+) (?: cat/(?[^/]+))?"); - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+) (?: cat/(?[^/]+))?"); + //Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)"); public static final Pattern DELETE_COMMAND_FORMAT = Pattern.compile("del (?[^/]+)"); @@ -78,18 +78,18 @@ public Command parseInput(String userInput) { private Command prepareAdd(String args) throws CommandFormatException{ final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); - + System.out.println(matcher); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); } - //String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + String category = matcher.group("category") != null ? matcher.group("category") : "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); return new AddCommand( matcher.group("itemName"), quantity, - matcher.group("uom"), "test cat" - //category + matcher.group("uom"), + category ); } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 80eeb1a770..9df5d90eaa 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -57,13 +57,12 @@ public static void replyToUser(String... message) { } public static void showInventoryList(ArrayList arrayList) { + replyToUser("List: "); for (T item : arrayList) { if (item == null) { break; } - replyToUser( - "List:", - String.valueOf(item)); + replyToUser(String.valueOf(item)); } } } From 3bca401b93d87029213eeadb60bca89014f45fe1 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 22 Mar 2024 13:07:50 +0800 Subject: [PATCH 073/421] Fix List Command --- src/main/java/command/AddCommand.java | 8 ++------ src/main/java/item/Item.java | 17 +++++++++++++++-- src/main/java/parser/Parser.java | 1 - src/main/java/ui/TextUi.java | 5 ++++- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index e49c449bac..a619bff1e5 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -13,10 +13,6 @@ public class AddCommand extends Command { private final Item toAdd; public AddCommand(String itemName, int quantity, String uom, String category) { - System.out.println(itemName); - System.out.println(quantity); - System.out.println(uom); - System.out.println(category); this.itemName = itemName; this.quantity = quantity; this.uom = uom; @@ -43,9 +39,9 @@ public String getUom() { @Override public void execute() { Itemlist.addItem(toAdd); - System.out.println(MESSAGE_SUCCESS + getItemName() + "(Qty: " + getQuantity() + ")"); + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + ")"); if (!category.equals("NA")) { - System.out.println("to " + getCategory()); + System.out.println(" to " + getCategory()); } } } diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 77f8b9452b..9a02a37dfc 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,5 +1,7 @@ package item; +import itemlist.Itemlist; + public class Item { public static int numberOfItems; private final String itemName; @@ -7,7 +9,7 @@ public class Item { private String uom; private String category; private boolean isOOS; - + public Item(String name, int quantity, String uom, String category) { this.itemName = name; @@ -26,10 +28,20 @@ public Item(String name, int quantity, String uom, String category) { numberOfItems++; } + public String getCategory() { + if (this.category.equals("NA")) { + return null; + } else { + return this.category; + } + } public String getItemName() { return this.itemName; } + public String getUom() { + return uom; + } public int getQuantity() { return this.quantity; } @@ -47,6 +59,7 @@ public void unmarkOOS() { } public String toString() { - return "Item: " + getItemName() + " (Qty " + getQuantity() + ")"; + String categoryString = (getCategory() != null) ? " to " + getCategory() : ""; // Check if category is null + return (getItemName() + " (Qty " + getQuantity() + " " + getUom() + ")" + categoryString); } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index c766f7865e..5b383cb460 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -83,7 +83,6 @@ public Command parseInput(String userInput){ private Command prepareAdd(String args) throws CommandFormatException{ final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); - System.out.println(matcher); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 9df5d90eaa..71c0530fe2 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,5 +1,8 @@ package ui; +import item.Item; +import itemlist.Itemlist; + import java.util.ArrayList; import java.util.Scanner; @@ -62,7 +65,7 @@ public static void showInventoryList(ArrayList arrayList) { if (item == null) { break; } - replyToUser(String.valueOf(item)); + replyToUser(arrayList.indexOf(item) + 1 +". " + item); } } } From e235a2fafed4336709474ca14d16933f56a7509d Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 22 Mar 2024 13:10:14 +0800 Subject: [PATCH 074/421] Fix checkstyle --- src/main/java/item/Item.java | 2 -- src/main/java/seedu/duke/Duke.java | 1 - src/main/java/storage/Storage.java | 2 +- src/main/java/ui/TextUi.java | 3 --- 4 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 9a02a37dfc..ef36256760 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,7 +1,5 @@ package item; -import itemlist.Itemlist; - public class Item { public static int numberOfItems; private final String itemName; diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 1a9e0b177f..808fa3aa1b 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -2,7 +2,6 @@ import command.Command; import command.ExitCommand; -import exceptions.CommandFormatException; import parser.Parser; import ui.TextUi; diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 7b6164d46d..f7f9c775e0 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -78,4 +78,4 @@ public static void main (String[]args){ System.out.println("File does not exist."); } } -} \ No newline at end of file +} diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 71c0530fe2..b5451b2888 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,8 +1,5 @@ package ui; -import item.Item; -import itemlist.Itemlist; - import java.util.ArrayList; import java.util.Scanner; From 6541ecbd4e601625287da6ce6f8a486dce3e3647 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 22 Mar 2024 13:24:28 +0800 Subject: [PATCH 075/421] Add assertion --- src/main/java/command/AddCommand.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index a619bff1e5..b20d58fee1 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -39,9 +39,12 @@ public String getUom() { @Override public void execute() { Itemlist.addItem(toAdd); - System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + ")"); + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUom() + ")"); if (!category.equals("NA")) { System.out.println(" to " + getCategory()); + } else { + System.out.println(); + assert category.equals("NA"); } } } From b12b324965ed9be595427ebfcd920fa3e03ff69f Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 22 Mar 2024 15:12:11 +0800 Subject: [PATCH 076/421] fix io redirection test --- src/main/java/seedu/duke/Duke.java | 24 ++++++++---------------- src/main/java/ui/TextUi.java | 2 +- text-ui-test/EXPECTED.TXT | 28 +++++++++++++++++++--------- text-ui-test/input.txt | 2 +- text-ui-test/runtest.bat | 4 ++-- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 808fa3aa1b..bcefcfe7ad 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -14,22 +14,6 @@ public class Duke { private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); private Itemlist itemlist = new Itemlist(); - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) throws IOException { - String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); - new Duke().run(); - } public void run() throws IOException { ui.showWelcomeMessage("1.0", "./StockMasterData.txt"); @@ -45,4 +29,12 @@ private void normalOperation() throws IOException { command.execute(); } while (!ExitCommand.getIsExit()); } + + /** + * Main entry-point for the java.duke.Duke application. + */ + public static void main(String[] args) throws IOException { + new Duke().run(); + } + } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 80eeb1a770..ad43361cbc 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -18,7 +18,7 @@ public TextUi() { } public String getUserInput() { - System.out.println("Enter Command: "); + System.out.println("Enter Command:"); Scanner in = new Scanner(System.in); String userInput = in.nextLine(); if (shouldIgnore(userInput)) { diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 892cb6cae7..5e375dd539 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,9 +1,19 @@ -Hello from - ____ _ -| _ \ _ _| | _____ -| | | | | | | |/ / _ \ -| |_| | |_| | < __/ -|____/ \__,_|_|\_\___| - -What is your name? -Hello James Gosling +---------------- + +1.0 + +---------------- + +Data is being extracted from: ./StockMasterData.txt + +Welcome to StockMaster, where you can master the knowledge on your Stock! + +Enter Command: +---------------- + +Data is being saved to :./StockMasterData.txt + +---------------- + +Thank you for using StockMaster, hope we have helped your lazy ass! + diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index f6ec2e9f95..07e3a224b1 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -James Gosling \ No newline at end of file +EXIT \ No newline at end of file diff --git a/text-ui-test/runtest.bat b/text-ui-test/runtest.bat index 0db3b772b5..25ac7a2989 100644 --- a/text-ui-test/runtest.bat +++ b/text-ui-test/runtest.bat @@ -12,8 +12,8 @@ for /f "tokens=*" %%a in ( set jarloc=%%a ) -java -jar %jarloc% < ..\..\text-ui-itemlist\input.txt > ..\..\text-ui-itemlist\ACTUAL.TXT +java -jar %jarloc% < ..\..\text-ui-test\input.txt > ..\..\text-ui-test\ACTUAL.TXT -cd ..\..\text-ui-itemlist +cd ..\..\text-ui-test FC ACTUAL.TXT EXPECTED.TXT >NUL && ECHO Test passed! || Echo Test failed! From 5f082124ab6c55c37ce074de629cb352a70eea61 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 22 Mar 2024 15:23:28 +0800 Subject: [PATCH 077/421] fix io rediretion test --- StockMasterData.txt | 0 src/main/java/seedu/duke/Duke.java | 11 ++--------- text-ui-test/input.txt | 2 +- 3 files changed, 3 insertions(+), 10 deletions(-) create mode 100644 StockMasterData.txt diff --git a/StockMasterData.txt b/StockMasterData.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index c276074c50..a3051ef764 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -20,7 +20,7 @@ public class Duke { * Main entry-point for the java.duke.Duke application. */ public static void main(String[] args) throws IOException { - String logo = " ____ _ \n" +/* String logo = " ____ _ \n" + "| _ \\ _ _| | _____ \n" + "| | | | | | | |/ / _ \\\n" + "| |_| | |_| | < __/\n" @@ -30,7 +30,7 @@ public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); System.out.println("Hello " + in.nextLine()); - Storage.main(args); + Storage.main(args);*/ new Duke().run(); } @@ -49,11 +49,4 @@ private void normalOperation() throws IOException { } while (!ExitCommand.getIsExit()); } - /** - * Main entry-point for the java.duke.Duke application. - */ - public static void main(String[] args) throws IOException { - new Duke().run(); - } - } diff --git a/text-ui-test/input.txt b/text-ui-test/input.txt index 07e3a224b1..ae3bc0a936 100644 --- a/text-ui-test/input.txt +++ b/text-ui-test/input.txt @@ -1 +1 @@ -EXIT \ No newline at end of file +exit \ No newline at end of file From c40336f41b660008500a866c9d6f29bd6e10c309 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 22 Mar 2024 15:25:58 +0800 Subject: [PATCH 078/421] fix to meet checkstyle errors --- src/main/java/seedu/duke/Duke.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index a3051ef764..9af6f9d0f9 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -3,13 +3,11 @@ import command.Command; import command.ExitCommand; import parser.Parser; -import storage.Storage; import ui.TextUi; import itemlist.Itemlist; import java.io.IOException; -import java.util.Scanner; public class Duke { private final TextUi ui = new TextUi(); @@ -20,17 +18,6 @@ public class Duke { * Main entry-point for the java.duke.Duke application. */ public static void main(String[] args) throws IOException { -/* String logo = " ____ _ \n" - + "| _ \\ _ _| | _____ \n" - + "| | | | | | | |/ / _ \\\n" - + "| |_| | |_| | < __/\n" - + "|____/ \\__,_|_|\\_\\___|\n"; - System.out.println("Hello from\n" + logo); - System.out.println("What is your name?"); - - Scanner in = new Scanner(System.in); - System.out.println("Hello " + in.nextLine()); - Storage.main(args);*/ new Duke().run(); } From 272d6e1d4bd2551da5cf1205427fce3570dbba2c Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 22 Mar 2024 17:03:28 +0800 Subject: [PATCH 079/421] add output to edit function --- StockMasterData.txt | 1 + src/main/java/command/EditCommand.java | 3 +++ src/main/java/common/Messages.java | 1 - src/main/java/itemlist/Itemlist.java | 5 ++++- src/main/java/ui/TextUi.java | 7 +++++++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..7454c5aec6 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1 @@ +0 | food | 50 diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 8a8925a333..5a2c3a31d3 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -3,6 +3,7 @@ import item.Item; import itemlist.Itemlist; import storage.Storage; +import itemlist.Itemlist; public class EditCommand extends Command { @@ -21,6 +22,7 @@ public void execute() { for (Item item : Itemlist.getItems()) { if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { index = Itemlist.getItems().indexOf(item); + item = Itemlist.getItems().get(index); break; } } @@ -28,6 +30,7 @@ public void execute() { //throw exception; System.out.println("item not found!"); } else { + ui.TextUi.showEditMessage(itemName, Itemlist.getItem(index).getQuantity(), newQuantity ); Itemlist.editQuantity(index, newQuantity); } Storage.overwriteFile(Itemlist.getItems(), false); diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index f7cf078755..475ebc001d 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -13,5 +13,4 @@ public class Messages { "Stock!"; public static final String GOODBYE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; - } diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index e8b4fd08c6..a7b0aacaa5 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -8,7 +8,6 @@ public class Itemlist { public Itemlist() { } - public static void addItem(Item item) { items.add(item); } @@ -30,6 +29,10 @@ public static ArrayList getItems() { return items; } + public static Item getItem(int index) { + return items.get(index); + } + public static int getIndex(Item item) { return items.indexOf(item); } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 1eb2151414..1c92ce9a76 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Scanner; +import item.Item; public class TextUi { @@ -65,4 +66,10 @@ public static void showInventoryList(ArrayList arrayList) { replyToUser(arrayList.indexOf(item) + 1 +". " + item); } } + + public static void showEditMessage(String item, int oldQuantity, int newQuantity) { + replyToUser("\n" + + "Changed quantity of " + item + " from " + oldQuantity + " to " + newQuantity + ); + } } From 1e54a359995984c375cf2f08fcd6f98c37f67007 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 22 Mar 2024 17:05:04 +0800 Subject: [PATCH 080/421] fix checkstyle errors --- src/main/java/command/EditCommand.java | 1 - src/main/java/ui/TextUi.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 5a2c3a31d3..c94274ab43 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -3,7 +3,6 @@ import item.Item; import itemlist.Itemlist; import storage.Storage; -import itemlist.Itemlist; public class EditCommand extends Command { diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 1c92ce9a76..e58c027e1e 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Scanner; -import item.Item; public class TextUi { From 4d0822ecd941615602c14d37da0cf30dd9f8dffb Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 22 Mar 2024 20:47:04 +0800 Subject: [PATCH 081/421] fix case naming for del command --- StockMasterData.txt | 1 - src/main/java/command/DeleteCommand.java | 1 + src/main/java/exceptions/CommandFormatException.java | 2 +- src/main/java/parser/CommandType.java | 2 +- src/main/java/parser/Parser.java | 5 ++--- 5 files changed, 5 insertions(+), 6 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 7454c5aec6..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +0,0 @@ -0 | food | 50 diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 1e3ae425c6..2da1c3483d 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -25,6 +25,7 @@ public void execute() { } else { Itemlist.deleteItem(index); } + System.out.println(itemName + " has been successfully deleted."); Storage.overwriteFile(Itemlist.getItems(), false); } } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 5ad265f05c..94c211da5e 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -11,7 +11,7 @@ public CommandFormatException(CommandType command){ case ADD: System.out.println(Messages.INVALID_ADD_FORMAT); break; - case DELETE: + case DEL: System.out.println(Messages.INVALID_DELETE_FORMAT); break; case EDIT: diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index 7f55035d7a..afc96dcde1 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -5,6 +5,6 @@ public enum CommandType { LIST, HELP, ADD, - DELETE, + DEL, EDIT } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 5b383cb460..a959482c61 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -57,11 +57,10 @@ public Command parseInput(String userInput){ case ADD: try { return prepareAdd(userInput); - } catch (CommandFormatException e) { break; } - case DELETE: + case DEL: try { return prepareDelete(userInput); } catch (CommandFormatException e) { @@ -101,7 +100,7 @@ private Command prepareDelete(String args) throws CommandFormatException{ final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { - throw new CommandFormatException(CommandType.DELETE); + throw new CommandFormatException(CommandType.DEL); } return new DeleteCommand(matcher.group("itemName")); } From d388d5a29a090734aca74e64cbf7848527ff2286 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 22 Mar 2024 21:37:18 +0800 Subject: [PATCH 082/421] add assertions --- src/main/java/parser/Parser.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index a959482c61..75dc6c5311 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -88,6 +88,7 @@ private Command prepareAdd(String args) throws CommandFormatException{ } String category = matcher.group("category") != null ? matcher.group("category") : "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); + assert quantity >= 0 : "Quantity should not be negative."; return new AddCommand( matcher.group("itemName"), quantity, @@ -112,6 +113,7 @@ private Command prepareEdit(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.EDIT); } int newQuantity = Integer.parseInt(matcher.group("newQuantity")); + assert newQuantity >= 0 : "New quantity should not be negative."; return new EditCommand( matcher.group("itemName"), newQuantity From 97fe372a0d8cf903269ac49e1254d5002d509ca0 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 25 Mar 2024 22:09:25 +0800 Subject: [PATCH 083/421] Change exception handling --- .../java/calculation/profitCalculator.java | 4 --- .../java/calculation/quantityCalculator.java | 35 ------------------- src/main/java/command/Command.java | 6 ++-- src/main/java/command/DeleteCommand.java | 5 ++- src/main/java/seedu/duke/Duke.java | 7 ++-- 5 files changed, 12 insertions(+), 45 deletions(-) delete mode 100644 src/main/java/calculation/profitCalculator.java delete mode 100644 src/main/java/calculation/quantityCalculator.java diff --git a/src/main/java/calculation/profitCalculator.java b/src/main/java/calculation/profitCalculator.java deleted file mode 100644 index 96c8a307db..0000000000 --- a/src/main/java/calculation/profitCalculator.java +++ /dev/null @@ -1,4 +0,0 @@ -package calculation; - -public class profitCalculator { -} diff --git a/src/main/java/calculation/quantityCalculator.java b/src/main/java/calculation/quantityCalculator.java deleted file mode 100644 index 46cf5f7b41..0000000000 --- a/src/main/java/calculation/quantityCalculator.java +++ /dev/null @@ -1,35 +0,0 @@ -package calculation; - -import constants.UOM; -import constants.uomList; -import item.Item; -public class quantityCalculator { - - public int convertUOM(UOM uom) { - int value = 0; - switch (uom) { - case EA: - //fallthrough - case PIECE: - value = 1; - break; - case BOX: - value = 6; - break; - case DOZEN: - value = 12; - break; - case CTN: - value = 24; - break; - default: - break; - } - - return value; - } - - public void updateQty(Item item) { - item.setQuantity(item.getQuantity() + convertUOM(item.getUom())); - } -} diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 41649ed097..a71e7f8779 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,6 +1,8 @@ package command; -public abstract class Command { +import exceptions.CommandFormatException; - public abstract void execute(); +public abstract class Command { + + public abstract void execute() throws CommandFormatException; } diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 2da1c3483d..7ce9312919 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -1,7 +1,9 @@ package command; +import exceptions.CommandFormatException; import item.Item; import itemlist.Itemlist; +import parser.CommandType; import storage.Storage; public class DeleteCommand extends Command { @@ -12,7 +14,7 @@ public DeleteCommand(String itemName) { this.itemName = itemName; } - public void execute() { + public void execute() throws CommandFormatException { int index = -1; for (Item item : Itemlist.getItems()) { if (item.getItemName().toLowerCase().equals(itemName)) { @@ -22,6 +24,7 @@ public void execute() { } if (index == -1) { //throw exception; + throw new CommandFormatException(CommandType.DEL); } else { Itemlist.deleteItem(index); } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 9af6f9d0f9..8d14fe25b9 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -2,6 +2,7 @@ import command.Command; import command.ExitCommand; +import exceptions.CommandFormatException; import parser.Parser; import ui.TextUi; @@ -17,17 +18,17 @@ public class Duke { /** * Main entry-point for the java.duke.Duke application. */ - public static void main(String[] args) throws IOException { + public static void main(String[] args) throws IOException, CommandFormatException { new Duke().run(); } - public void run() throws IOException { + public void run() throws IOException, CommandFormatException { ui.showWelcomeMessage("1.0", "./StockMasterData.txt"); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); } - private void normalOperation() throws IOException { + private void normalOperation() throws IOException, CommandFormatException { String userInput; do { userInput = ui.getUserInput(); From d86d422ded91c00deb3949def1a6b5d5d08848f0 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 25 Mar 2024 22:10:28 +0800 Subject: [PATCH 084/421] Remove duplicate exceptions folder --- .../java/exception/StockMasterException.java | 31 ------------------- 1 file changed, 31 deletions(-) delete mode 100644 src/main/java/exception/StockMasterException.java diff --git a/src/main/java/exception/StockMasterException.java b/src/main/java/exception/StockMasterException.java deleted file mode 100644 index 2411a374fd..0000000000 --- a/src/main/java/exception/StockMasterException.java +++ /dev/null @@ -1,31 +0,0 @@ -package exception; -public class StockMasterException extends Exception { - protected String description; - protected String type; - - public StockMasterException(String description, String type) { - this.description = description; - this.type = type; - } - - public StockMasterException() { - this.description = null; - this.type = null; - } - - public void printException() { - switch (this.type) { - case "EMPTY": - if (description.equals("description")) { - System.out.println("The item name cannot be left blank."); - } - break; - case "OUT_OF_BOUNDS": - System.out.println("The index you're accessing is out of bounds."); - break; - default: - System.out.println("Unrecognised error."); - break; - } - } -} From ca90efe1baf104db75db6a4e648eb8e37b805edc Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 25 Mar 2024 22:28:17 +0800 Subject: [PATCH 085/421] Add command testing --- src/test/java/command/CommandTest.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 src/test/java/command/CommandTest.java diff --git a/src/test/java/command/CommandTest.java b/src/test/java/command/CommandTest.java new file mode 100644 index 0000000000..e740812c25 --- /dev/null +++ b/src/test/java/command/CommandTest.java @@ -0,0 +1,13 @@ +package command; + +import org.junit.jupiter.api.Test; + +public class CommandTest { + private Command command; + + @Test + public void command_invalidCommand_throwsError() { + + } + +} From d49ed14d9a6283ec52305506a63784aed66c6031 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 25 Mar 2024 22:33:41 +0800 Subject: [PATCH 086/421] Remove constants folder --- src/main/java/constants/UOM.java | 9 --------- src/main/java/constants/uomList.java | 4 ---- src/main/java/item/Item.java | 1 - 3 files changed, 14 deletions(-) delete mode 100644 src/main/java/constants/UOM.java delete mode 100644 src/main/java/constants/uomList.java diff --git a/src/main/java/constants/UOM.java b/src/main/java/constants/UOM.java deleted file mode 100644 index 7482ac6def..0000000000 --- a/src/main/java/constants/UOM.java +++ /dev/null @@ -1,9 +0,0 @@ -package constants; - -public enum UOM { - PIECE, - EA, - DOZEN, - CTN, - BOX -} diff --git a/src/main/java/constants/uomList.java b/src/main/java/constants/uomList.java deleted file mode 100644 index 8f7b74814f..0000000000 --- a/src/main/java/constants/uomList.java +++ /dev/null @@ -1,4 +0,0 @@ -package constants; - -public class uomList { -} diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 7ccfb401f4..ef36256760 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,5 +1,4 @@ package item; -import constants.UOM; public class Item { public static int numberOfItems; From 590e6af42539aa2c72e1e658dd2baefc5003b523 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 25 Mar 2024 22:50:40 +0800 Subject: [PATCH 087/421] Add assertion --- src/main/java/command/DeleteCommand.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 7ce9312919..1d27f1b483 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -30,5 +30,6 @@ public void execute() throws CommandFormatException { } System.out.println(itemName + " has been successfully deleted."); Storage.overwriteFile(Itemlist.getItems(), false); + assert(!Itemlist.getItem(index).getItemName().equals(itemName)); } } From 63f94703f4b6d76c30697cb9160d1c2783617daa Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 27 Mar 2024 14:32:50 +0800 Subject: [PATCH 088/421] add buy and sell prices to add function --- StockMasterData.txt | 2 ++ src/main/java/command/AddCommand.java | 20 ++++++++++++++------ src/main/java/common/Messages.java | 2 +- src/main/java/item/Item.java | 20 ++++++++++++++++---- src/main/java/parser/Parser.java | 9 +++++++-- 5 files changed, 40 insertions(+), 13 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..6303a76ffa 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1,2 @@ +0 | apple | 5 +0 | apple | 5 diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 0803fd5291..ed9cfb65d4 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -11,36 +11,44 @@ public class AddCommand extends Command { protected int quantity; protected String uom; protected String category = "NA"; + protected int buyPrice; + protected int sellPrice; private final Item toAdd; - public AddCommand(String itemName, int quantity, String uom, String category) { + public AddCommand(String itemName, int quantity, String uom, String category, int buyPrice, int sellPrice) { this.itemName = itemName; this.quantity = quantity; this.uom = uom; this.category = category; - this.toAdd = new Item(itemName, quantity, uom, category); + this.buyPrice = buyPrice; + this.sellPrice = sellPrice; + this.toAdd = new Item(itemName, quantity, uom, category, buyPrice, sellPrice); } public String getItemName() { return itemName; } - public int getQuantity() { return quantity; } - public String getCategory() { return category; } - public String getUom() { return uom; } + public int getBuyPrice() { + return buyPrice; + } + public int getSellPrice() { + return sellPrice; + } @Override public void execute() { Itemlist.addItem(toAdd); - System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUom() + ")"); + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + getUom() + + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); Storage.addToFile(Itemlist.getItems(), true); if (!category.equals("NA")) { System.out.println(" to " + getCategory()); diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 475ebc001d..cf32a65153 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -5,7 +5,7 @@ public class Messages { public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; public static final String HELP = "Commands: ...."; public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY]'"; + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]'"; public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index ef36256760..8999cf4b8a 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -4,12 +4,14 @@ public class Item { public static int numberOfItems; private final String itemName; private int quantity; - private String uom; - private String category; + private final String uom; + private final String category; + private int buyPrice; + private int sellPrice; private boolean isOOS; - public Item(String name, int quantity, String uom, String category) { + public Item(String name, int quantity, String uom, String category, int buyPrice, int sellPrice) { this.itemName = name; this.quantity = quantity; this.uom = uom; @@ -18,6 +20,8 @@ public Item(String name, int quantity, String uom, String category) { } else { this.category = category; } + this.buyPrice = buyPrice; + this.sellPrice = sellPrice; if (quantity == 0) { this.isOOS = true; } else { @@ -48,6 +52,13 @@ public void setQuantity(int newQuantity) { this.quantity = newQuantity; } + public int getBuyPrice() { + return buyPrice; + } + public int getSellPrice() { + return sellPrice; + } + public void markOOS() { this.isOOS = true; } @@ -58,6 +69,7 @@ public void unmarkOOS() { public String toString() { String categoryString = (getCategory() != null) ? " to " + getCategory() : ""; // Check if category is null - return (getItemName() + " (Qty " + getQuantity() + " " + getUom() + ")" + categoryString); + return (getItemName() + " (Qty " + getQuantity() + getUom() + + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")" + categoryString); } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 75dc6c5311..1d5455c21b 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -18,7 +18,8 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: cat/(?[^/]+))?"); + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: " + + "cat/(?[^/]+))? buy/(?\\d+) sell/(?\\d+)"); public static final Pattern DELETE_COMMAND_FORMAT = @@ -88,12 +89,16 @@ private Command prepareAdd(String args) throws CommandFormatException{ } String category = matcher.group("category") != null ? matcher.group("category") : "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); + int buyPrice = Integer.parseInt(matcher.group("buyPrice")); + int sellPrice = Integer.parseInt(matcher.group("sellPrice")); assert quantity >= 0 : "Quantity should not be negative."; return new AddCommand( matcher.group("itemName"), quantity, matcher.group("uom"), - category + category, + buyPrice, + sellPrice ); } From 7d8a2c651133bbe069bd6e650265ad63f490d49a Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 27 Mar 2024 15:13:37 +0800 Subject: [PATCH 089/421] format storage to include buy and sell price --- StockMasterData.txt | 2 -- src/main/java/storage/Storage.java | 6 +++--- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 6303a76ffa..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +0,0 @@ -0 | apple | 5 -0 | apple | 5 diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index ab202853fd..ce003ff915 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -77,7 +77,7 @@ public static void addToFile(ArrayList items, boolean ifAppend) { assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); String descriptionAdded = (items.size() - 1) + " | " + lastItem.getItemName() + - " | " + lastItem.getQuantity() + "\n"; + " | " + lastItem.getQuantity() + " | " + lastItem.getBuyPrice() + " | " + lastItem.getSellPrice() +"\n"; updateFile(descriptionAdded, ifAppend); } @@ -85,8 +85,8 @@ public static void overwriteFile(ArrayList items, boolean ifAppend) { assert items != null : "Items cannot be null."; int length = items.size(); for (int index = 0; index < length; index++) { - String descriptionAdded = index + " | " + items.get(index).getItemName() + - " | " + items.get(index).getQuantity() + "\n"; + String descriptionAdded = index + " | " + items.get(index).getItemName() + " | " + items.get(index).getQuantity() + + " | " + items.get(index).getBuyPrice() + " | " + items.get(index).getSellPrice() + "\n"; if (index == 0) { updateFile(descriptionAdded, ifAppend); } else { From 80b9ef2951245397873970c430aeec31b32b4efe Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 27 Mar 2024 15:36:22 +0800 Subject: [PATCH 090/421] edit checkstyle --- src/main/java/common/Messages.java | 5 +++-- src/main/java/storage/Storage.java | 9 +++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index cf32a65153..08c1c26784 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -4,8 +4,9 @@ public class Messages { public static final String DIVIDER = "----------------"; public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; public static final String HELP = "Commands: ...."; - public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]'"; + public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'"; public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index ce003ff915..91f0c29b45 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -76,8 +76,8 @@ public static void readFromFile(File fileName) { public static void addToFile(ArrayList items, boolean ifAppend) { assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); - String descriptionAdded = (items.size() - 1) + " | " + lastItem.getItemName() + - " | " + lastItem.getQuantity() + " | " + lastItem.getBuyPrice() + " | " + lastItem.getSellPrice() +"\n"; + String descriptionAdded = (items.size() - 1) + " | " + lastItem.getItemName() + " | " + lastItem.getQuantity() + + " | " + lastItem.getBuyPrice() + " | " + lastItem.getSellPrice() + "\n"; updateFile(descriptionAdded, ifAppend); } @@ -85,8 +85,9 @@ public static void overwriteFile(ArrayList items, boolean ifAppend) { assert items != null : "Items cannot be null."; int length = items.size(); for (int index = 0; index < length; index++) { - String descriptionAdded = index + " | " + items.get(index).getItemName() + " | " + items.get(index).getQuantity() - + " | " + items.get(index).getBuyPrice() + " | " + items.get(index).getSellPrice() + "\n"; + String descriptionAdded = index + " | " + items.get(index).getItemName() + " | " + + items.get(index).getQuantity() + " | " + items.get(index).getBuyPrice() + " | " + + items.get(index).getSellPrice() + "\n"; if (index == 0) { updateFile(descriptionAdded, ifAppend); } else { From a5543ecb7244ea74089db3d82e3f992dc880c500 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 16:25:17 +0800 Subject: [PATCH 091/421] Edit readFromFile() --- src/main/java/seedu/duke/Duke.java | 2 + src/main/java/storage/Storage.java | 57 +++++++++++++++++--------- src/test/java/storage/StorageTest.java | 5 +-- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 8d14fe25b9..02ddb90af3 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -4,6 +4,7 @@ import command.ExitCommand; import exceptions.CommandFormatException; import parser.Parser; +import storage.Storage; import ui.TextUi; import itemlist.Itemlist; @@ -23,6 +24,7 @@ public static void main(String[] args) throws IOException, CommandFormatExceptio } public void run() throws IOException, CommandFormatException { + Storage.readFromFile("./StockMasterData.txt"); ui.showWelcomeMessage("1.0", "./StockMasterData.txt"); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index ab202853fd..175862c424 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,6 +1,10 @@ package storage; +import command.Command; +import exceptions.CommandFormatException; import item.Item; +import itemlist.Itemlist; +import parser.Parser; import java.io.File; import java.io.FileNotFoundException; @@ -17,9 +21,6 @@ public class Storage { private static final String FILENAME = "./StockMasterData.txt"; - private static File stockMaster; - - /** * Write contents to the file. * @@ -62,11 +63,36 @@ public static File setFile() { * Add the identified tasks into a list of existing tasks. * */ - public static void readFromFile(File fileName) { + public static void readFromFile(String fileName) { + Parser parser = new Parser(); try { - Scanner scanner = new Scanner(fileName); + Scanner scanner = new Scanner(new File(fileName)); while (scanner.hasNext()) { - String lineSkipped = scanner.nextLine(); + String fileLine = "add" + scanner.nextLine(); + String[] keyCommands = fileLine.split(" \\| "); + String commandQty = ""; + String commandCat = ""; + String commandUom = ""; + String commandName = ""; + for (String keyCommand : keyCommands) { + if (keyCommand.contains(".")) { + //do nothing. + } + else if (keyCommand.contains("Qty: ")) { + String[] commandQtyUnit = keyCommand.replace("Qty: ", "").split(" "); + assert commandQtyUnit.length == 2 : "length not 2!"; + commandQty = commandQtyUnit[0]; + commandUom = commandQtyUnit[1]; + } + else if (keyCommand.contains("Cat: ")) { + commandCat = keyCommand.replace("Cat: ", ""); + } + else { + commandName = keyCommand; + } + } + Item toAdd = new Item(commandName, Integer.parseInt(commandQty), commandUom, commandCat); + Itemlist.addItem(toAdd); } } catch(FileNotFoundException e){ System.out.println("File does not exist."); @@ -76,8 +102,9 @@ public static void readFromFile(File fileName) { public static void addToFile(ArrayList items, boolean ifAppend) { assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); - String descriptionAdded = (items.size() - 1) + " | " + lastItem.getItemName() + - " | " + lastItem.getQuantity() + "\n"; + String descriptionAdded = (items.size()) + "." + " | " + lastItem.getItemName() + + " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUom() + " | " + "Cat: " + + lastItem.getCategory() + "\n"; updateFile(descriptionAdded, ifAppend); } @@ -85,8 +112,9 @@ public static void overwriteFile(ArrayList items, boolean ifAppend) { assert items != null : "Items cannot be null."; int length = items.size(); for (int index = 0; index < length; index++) { - String descriptionAdded = index + " | " + items.get(index).getItemName() + - " | " + items.get(index).getQuantity() + "\n"; + String descriptionAdded = (index + 1) + "." + " | " + items.get(index).getItemName() + + " | " + "Qty: " + items.get(index).getQuantity() + " " + items.get(index).getUom() + + " | " + "Cat: " + items.get(index).getCategory() + "\n"; if (index == 0) { updateFile(descriptionAdded, ifAppend); } else { @@ -94,13 +122,4 @@ public static void overwriteFile(ArrayList items, boolean ifAppend) { } } } - - public static void main (String[]args){ - stockMaster = setFile(); - try { - writeToFile(stockMaster.getPath(), "", true); - } catch (IOException e) { - System.out.println("File does not exist."); - } - } } diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 2cefbdfd99..6dddf25857 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,5 +1,6 @@ package storage; +import itemlist.Itemlist; import org.junit.jupiter.api.Test; import java.io.File; @@ -18,11 +19,9 @@ public void readFromFile_fileNotFound() { System.setOut(new PrintStream(outputStream)); String directory = "./testFile.txt"; - File testFile = new File(directory); try { Storage.writeToFile(directory, "Created", true); - testFile.delete(); - Storage.readFromFile(testFile); + Storage.readFromFile(directory); assertEquals("File does not exist." + System.lineSeparator(), outputStream.toString()); } catch (IOException e) { fail("failed to create a file."); From 64d8d8d7b169056a409ba58c6b6ad8657a781ace Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 27 Mar 2024 16:27:41 +0800 Subject: [PATCH 092/421] Add FindCommand feature --- StockMasterData.txt | 13 +++++++++ src/main/java/command/FindCommand.java | 7 ++--- src/main/java/common/Messages.java | 2 ++ .../exceptions/CommandFormatException.java | 2 ++ src/main/java/parser/CommandType.java | 3 +- src/main/java/parser/Parser.java | 29 +++++++++++++------ src/main/java/ui/TextUi.java | 16 ++++++---- 7 files changed, 52 insertions(+), 20 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..77a6a6c7f7 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1,13 @@ +0 | apples | 5 +0 | apples | 50 +0 | apples | 50 +0 | apples | 50 +0 | apples | 50 +1 | phones | 100 +0 | apples | 50 +0 | apples | 50 +1 | apples | 50 +2 | pear | 50 +3 | pear | 50 +0 | apples | 50 +1 | apple Iphone | 10 diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 99e9ddad84..721839cc1e 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -2,6 +2,7 @@ import item.Item; import itemlist.Itemlist; +import ui.TextUi; import java.util.ArrayList; @@ -18,11 +19,9 @@ public void execute() { ArrayList searchList = new ArrayList<>(); for (Item item : Itemlist.getItems()) { if (item.getItemName().toLowerCase().contains(itemName)) { - int index = Itemlist.getItems().indexOf(item); - String itemNameWithIndex = index + ". " + item.getItemName(); - searchList.add(itemNameWithIndex); + searchList.add(String.valueOf(item)); } } - //displayList(searchList); + TextUi.showInventoryList(searchList); } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 475ebc001d..71b6d9cc30 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -9,6 +9,8 @@ public class Messages { public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; + + public static final String INVALID_FIND_FORMAT ="Invalid command format. Please use format: 'find [ITEM_NAME]'"; public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 94c211da5e..cc3c26b67c 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -17,6 +17,8 @@ public CommandFormatException(CommandType command){ case EDIT: System.out.println(Messages.INVALID_EDIT_FORMAT); break; + case FIND: + System.out.println(Messages.INVALID_FIND_FORMAT); case HELP: System.out.println(Messages.HELP); break; diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index afc96dcde1..d7cf60de7d 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -6,5 +6,6 @@ public enum CommandType { HELP, ADD, DEL, - EDIT + EDIT, + FIND } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 75dc6c5311..d4c815d44d 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,13 +1,6 @@ package parser; -import command.Command; -import command.DeleteCommand; -import command.AddCommand; -import command.ListCommand; -import command.IncorrectCommand; -import command.ExitCommand; -import command.HelpCommand; -import command.EditCommand; +import command.*; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; @@ -18,7 +11,7 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: cat/(?[^/]+))?"); + Pattern.compile("add (?[^/]+( [^/]+)*) qty/(?\\d+) /(?[^/]+)(?: cat/(?[^/]+))?"); public static final Pattern DELETE_COMMAND_FORMAT = @@ -27,6 +20,9 @@ public class Parser { public static final Pattern EDIT_COMMAND_FORMAT = Pattern.compile("edit (?[^/]+) qty/(?\\d+)"); + public static final Pattern FIND_COMMAND_FORMAT = + Pattern.compile("find (?[^/]+)"); + public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); @@ -72,6 +68,12 @@ public Command parseInput(String userInput){ } catch (CommandFormatException e) { break; } + case FIND: + try { + return prepareFind(userInput); + } catch (CommandFormatException e) { + break; + } default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -119,6 +121,15 @@ private Command prepareEdit(String args) throws CommandFormatException{ newQuantity ); } + + private Command prepareFind(String args) throws CommandFormatException{ + final Matcher matcher = FIND_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.FIND); + } + return new FindCommand(matcher.group("itemName")); + } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index e58c027e1e..7478e0636c 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -52,17 +52,21 @@ public void showGoodByeMessage(String storageFilePath) { public static void replyToUser(String... message) { for (String m : message) { - System.out.println(m + "\n"); + System.out.println(m); } } public static void showInventoryList(ArrayList arrayList) { - replyToUser("List: "); - for (T item : arrayList) { - if (item == null) { - break; + if (arrayList.isEmpty()) { + replyToUser("There is nothing here! Time to spend some money and stock em up!"); + } else { + replyToUser("List: "); + for (T item : arrayList) { + if (item == null) { + break; + } + replyToUser(arrayList.indexOf(item) + 1 + ". " + item); } - replyToUser(arrayList.indexOf(item) + 1 +". " + item); } } From 3f2e0fca892ab1a61b354f7318f839b7d24577bc Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 27 Mar 2024 17:14:20 +0800 Subject: [PATCH 093/421] Improve add function --- StockMasterData.txt | 14 +------------ src/main/java/command/AddCommand.java | 20 +++++++++++-------- src/main/java/command/DeleteCommand.java | 4 ++-- .../exceptions/CommandFormatException.java | 1 + src/main/java/itemlist/Itemlist.java | 8 ++++++++ src/main/java/parser/Parser.java | 10 +++++++++- 6 files changed, 33 insertions(+), 24 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 77a6a6c7f7..1a2d975a65 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,13 +1 @@ -0 | apples | 5 -0 | apples | 50 -0 | apples | 50 -0 | apples | 50 -0 | apples | 50 -1 | phones | 100 -0 | apples | 50 -0 | apples | 50 -1 | apples | 50 -2 | pear | 50 -3 | pear | 50 -0 | apples | 50 -1 | apple Iphone | 10 +0 | apple iphone | 10 | 100 | 500 diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index ed9cfb65d4..1cda196bc1 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -46,15 +46,19 @@ public int getSellPrice() { @Override public void execute() { - Itemlist.addItem(toAdd); - System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + getUom() + - ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); - Storage.addToFile(Itemlist.getItems(), true); - if (!category.equals("NA")) { - System.out.println(" to " + getCategory()); + if (Itemlist.itemIsExist(itemName)) { + System.out.println("Item already exists. To increase the quantity, please use the edit command"); } else { - System.out.println(); - assert category.equals("NA"); + Itemlist.addItem(toAdd); + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + getUom() + + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); + Storage.addToFile(Itemlist.getItems(), true); + if (!category.equals("NA")) { + System.out.println(" to " + getCategory()); + } else { + System.out.println(); + assert category.equals("NA"); + } } } } diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 7ce9312919..57c72b4cad 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -27,8 +27,8 @@ public void execute() throws CommandFormatException { throw new CommandFormatException(CommandType.DEL); } else { Itemlist.deleteItem(index); + System.out.println(itemName + " has been successfully deleted."); + Storage.overwriteFile(Itemlist.getItems(), false); } - System.out.println(itemName + " has been successfully deleted."); - Storage.overwriteFile(Itemlist.getItems(), false); } } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index cc3c26b67c..166f7c73cb 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -19,6 +19,7 @@ public CommandFormatException(CommandType command){ break; case FIND: System.out.println(Messages.INVALID_FIND_FORMAT); + break; case HELP: System.out.println(Messages.HELP); break; diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index a7b0aacaa5..da6f42f883 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -25,6 +25,14 @@ public static void editQuantity(int index, int newQuantity) { } } + public static boolean itemIsExist(String itemName) { + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + return true; + } + } + return false; + } public static ArrayList getItems() { return items; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 3ea2f25a45..4c46486fc0 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,6 +1,14 @@ package parser; -import command.*; +import command.AddCommand; +import command.Command; +import command.DeleteCommand; +import command.EditCommand; +import command.ExitCommand; +import command.FindCommand; +import command.HelpCommand; +import command.IncorrectCommand; +import command.ListCommand; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; From 8ae6989654f3ad59de429b552ea6e3e6bc4cb19a Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 27 Mar 2024 17:40:26 +0800 Subject: [PATCH 094/421] Fix IO redirection test --- text-ui-test/EXPECTED.TXT | 9 --------- 1 file changed, 9 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 5e375dd539..8fae712c9f 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,19 +1,10 @@ ---------------- - 1.0 - ---------------- - Data is being extracted from: ./StockMasterData.txt - Welcome to StockMaster, where you can master the knowledge on your Stock! - Enter Command: ---------------- - Data is being saved to :./StockMasterData.txt - ---------------- - Thank you for using StockMaster, hope we have helped your lazy ass! - From 0386314f5569b65c1547881e50093a6bd443ca60 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 18:24:00 +0800 Subject: [PATCH 095/421] remove StockMasterData --- StockMasterData.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 StockMasterData.txt diff --git a/StockMasterData.txt b/StockMasterData.txt deleted file mode 100644 index e69de29bb2..0000000000 From 5871277c2aa4824641631412fc460c640f2624f0 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 27 Mar 2024 19:32:29 +0800 Subject: [PATCH 096/421] Update DG --- StockMasterData.txt | 2 +- docs/DeveloperGuide.md | 12 ++++++++++-- src/main/java/seedu/duke/Duke.java | 2 +- src/main/java/ui/TextUi.java | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 1a2d975a65..8b13789179 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1 @@ -0 | apple iphone | 10 | 100 | 500 + diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 64e1f0ed2b..6213e00622 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -12,11 +12,19 @@ ## Product scope ### Target user profile -{Describe the target user profile} +Small Business Owners who: +* has a need to manage a significant number of inventory products +* able to track revenue/loss of the business +* prefer desktop apps over other types +* can type fast +* prefers typing to mouse interactions +* is reasonably comfortable using CLI apps ### Value proposition -{Describe the value proposition: what problem does it solve?} +Help small business owners organise and better manage their inventory faster than +a typical mouse/GUI driven app + ## User Stories diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 8d14fe25b9..c15aa8a17d 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -23,7 +23,7 @@ public static void main(String[] args) throws IOException, CommandFormatExceptio } public void run() throws IOException, CommandFormatException { - ui.showWelcomeMessage("1.0", "./StockMasterData.txt"); + ui.showWelcomeMessage("StockMaster v2.0", "./StockMasterData.txt"); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 7478e0636c..cb2e52f4b9 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,7 +1,9 @@ package ui; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Scanner; +import java.time.LocalDateTime; public class TextUi { From 08464fa7ad83b3d24b67805acb9a06ada51e57ee Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 27 Mar 2024 19:36:17 +0800 Subject: [PATCH 097/421] Fix Checkstyle error --- src/main/java/ui/TextUi.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index cb2e52f4b9..7478e0636c 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,9 +1,7 @@ package ui; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Scanner; -import java.time.LocalDateTime; public class TextUi { From ba0104d03b3e8d0c884bf6d1b5e0c541ab170286 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 27 Mar 2024 19:43:29 +0800 Subject: [PATCH 098/421] Fix IO redirection test --- text-ui-test/EXPECTED.TXT | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 8fae712c9f..bdcc943dd4 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -1,5 +1,5 @@ ---------------- -1.0 +StockMaster v2.0 ---------------- Data is being extracted from: ./StockMasterData.txt Welcome to StockMaster, where you can master the knowledge on your Stock! From 1f2069ecda7d95a65a437df24c1776b833caf801 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 19:54:27 +0800 Subject: [PATCH 099/421] Remove unnecessary import --- src/main/java/storage/Storage.java | 2 -- src/test/java/storage/StorageTest.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 536f2965b9..d647d87de3 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -2,7 +2,6 @@ import item.Item; import itemlist.Itemlist; -import parser.Parser; import java.io.File; import java.io.FileNotFoundException; @@ -10,7 +9,6 @@ import java.util.Scanner; import java.io.FileWriter; import java.io.IOException; -import java.util.regex.Pattern; /** * Represents an add command where a new task is added to the existing list of task. diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 6dddf25857..6ec4dc4f46 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,6 +1,5 @@ package storage; -import itemlist.Itemlist; import org.junit.jupiter.api.Test; import java.io.File; From 07ed12b12e57e1bf87d59730720049668fba1454 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 20:07:52 +0800 Subject: [PATCH 100/421] Fix StorageTest methods --- src/test/java/storage/StorageTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 6ec4dc4f46..e8b57a402b 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -16,10 +16,11 @@ public class StorageTest { public void readFromFile_fileNotFound() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); - - String directory = "./testFile.txt"; + String directory = "./testFile1.txt"; + File testFile = new File(directory); try { - Storage.writeToFile(directory, "Created", true); + Storage.writeToFile(directory, "", true); + testFile.delete(); Storage.readFromFile(directory); assertEquals("File does not exist." + System.lineSeparator(), outputStream.toString()); } catch (IOException e) { @@ -29,7 +30,7 @@ public void readFromFile_fileNotFound() { @Test public void writeToFile_aLine_writeSuccessful() { - String directory = "./testFile.txt"; + String directory = "./testFile2.txt"; File testFile = new File(directory); String aLine = "A line"; try { From 0fe724319f26371b6c89b1332a37a823eba90500 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 20:17:13 +0800 Subject: [PATCH 101/421] Fix I/O redirection test --- StockMasterData.txt | 1 + src/main/java/seedu/duke/Duke.java | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 StockMasterData.txt diff --git a/StockMasterData.txt b/StockMasterData.txt new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/StockMasterData.txt @@ -0,0 +1 @@ + diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index ebdbc34c65..196a5b308f 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -26,7 +26,6 @@ public static void main(String[] args) throws IOException, CommandFormatExceptio public void run() throws IOException, CommandFormatException { ui.showWelcomeMessage("StockMaster v2.0", "./StockMasterData.txt"); Storage.readFromFile("./StockMasterData.txt"); - ui.showWelcomeMessage("1.0", "./StockMasterData.txt"); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); } From 5e3aaf0679af789b2d2a6e4629a9993b07a712e4 Mon Sep 17 00:00:00 2001 From: LowTL Date: Wed, 27 Mar 2024 20:37:36 +0800 Subject: [PATCH 102/421] Update DG --- docs/DeveloperGuide.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6213e00622..1a2eb7183a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -28,10 +28,13 @@ a typical mouse/GUI driven app ## User Stories -|Version| As a ... | I want to ... | So that I can ...| -|--------|----------|---------------|------------------| -|v1.0|new user|see usage instructions|refer to them when I forget how to use the application| -|v2.0|user|find a to-do item by name|locate a to-do without having to go through the entire list| +|Version| As a ... | I want to ... | So that I can ... | +|--------|----------|-----------------------------|------------------------------------------------------------| +|v1.0|new user| see usage instructions | refer to them when I forget how to use the application | +|v1.0|user| add new items | | +|v1.0|user| make changes to added items | change details about items such as quantity or price | +|v1.0|user| search for specific items || +|v2.0|user| find a to-do item by name | locate a to-do without having to go through the entire list | ## Non-Functional Requirements @@ -39,7 +42,8 @@ a typical mouse/GUI driven app ## Glossary -* *glossary item* - Definition +* *CLI* - Command Line Interface, where the user types commands rather than clicking options. +* *Item* - Item to be sold at the shop, with key information such as quantity, buying/selling price, description etc. ## Instructions for manual testing From 8d0a2dbdf9e6288647125af717427858380af578 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 20:39:47 +0800 Subject: [PATCH 103/421] Remove unused method --- src/main/java/storage/Storage.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index d647d87de3..2977eb3d87 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -135,13 +135,4 @@ public static void overwriteFile(ArrayList items, boolean ifAppend) { } } } - - public static void main (String[]args){ - stockMaster = setFile(); - try { - writeToFile(stockMaster.getPath(), "", true); - } catch (IOException e) { - System.out.println("File does not exist."); - } - } } From 187669c35374c1c84ad2b45675d0e6fbadd0997b Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 20:45:00 +0800 Subject: [PATCH 104/421] no message --- src/main/java/storage/Storage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 2977eb3d87..0f0f8d0b18 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -103,9 +103,9 @@ else if (keyCommand.contains("SellPrice: $")) { Itemlist.addItem(toAdd); } } catch(FileNotFoundException e) { - System.out.println("File does not exist."); + //System.out.println("File does not exist."); } catch(NumberFormatException e) { - System.out.println("Invalid numbers found."); + //System.out.println("Invalid numbers found."); } } From dda12ddb43f866cdc1525ad626f73187d5e7b4f5 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 20:53:42 +0800 Subject: [PATCH 105/421] no message --- src/main/java/storage/Storage.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 0f0f8d0b18..2977eb3d87 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -103,9 +103,9 @@ else if (keyCommand.contains("SellPrice: $")) { Itemlist.addItem(toAdd); } } catch(FileNotFoundException e) { - //System.out.println("File does not exist."); + System.out.println("File does not exist."); } catch(NumberFormatException e) { - //System.out.println("Invalid numbers found."); + System.out.println("Invalid numbers found."); } } From 3e86d57f252eb3f33d3250314f417d037a048b6b Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 21:00:22 +0800 Subject: [PATCH 106/421] Fix I/O redirection errored test --- src/main/java/seedu/duke/Duke.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 196a5b308f..a440aca2e2 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -25,6 +25,7 @@ public static void main(String[] args) throws IOException, CommandFormatExceptio public void run() throws IOException, CommandFormatException { ui.showWelcomeMessage("StockMaster v2.0", "./StockMasterData.txt"); + Storage.updateFile("", true); Storage.readFromFile("./StockMasterData.txt"); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); From f0a8919180866c7e6a5dbab47248d895c3776de1 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 27 Mar 2024 23:24:06 +0800 Subject: [PATCH 107/421] Enable Assertions --- build.gradle | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle b/build.gradle index 9fee860f5d..8ce350294f 100644 --- a/build.gradle +++ b/build.gradle @@ -43,4 +43,5 @@ checkstyle { run{ standardInput = System.in + enableAssertions = true } \ No newline at end of file From 896b07b81d9adfb63e959bfd81e8f944d0c556f4 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 28 Mar 2024 00:21:58 +0800 Subject: [PATCH 108/421] add sell command --- src/main/java/command/SellCommand.java | 43 +++++++++++++++++++ src/main/java/common/Messages.java | 3 ++ .../exceptions/CommandFormatException.java | 17 ++++++++ src/main/java/parser/CommandType.java | 3 +- src/main/java/parser/Parser.java | 42 +++++++++++++++--- src/main/java/ui/TextUi.java | 6 +++ 6 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/main/java/command/SellCommand.java diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java new file mode 100644 index 0000000000..14d988f3b0 --- /dev/null +++ b/src/main/java/command/SellCommand.java @@ -0,0 +1,43 @@ +package command; + +import item.Item; +import itemlist.Itemlist; +import storage.Storage; + + +public class SellCommand extends Command { + + protected String itemName; + protected int sellQuantity; + protected int sellPrice; + + public SellCommand (String itemName, int quantity, int price) { + this.itemName = itemName; + this.sellQuantity = quantity; + this.sellPrice = price; + } + + @Override + public void execute() { + int index = -1; + for (Item item : Itemlist.getItems()) { + if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { + index = Itemlist.getItems().indexOf(item); + item = Itemlist.getItems().get(index); + break; + } + } + int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; + int sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); + if (index == -1) { + //throw exception; + System.out.println("Item not found!"); + } else if (remainingQuantity < 0) { + System.out.println("There is insufficient stock!"); + } else { + ui.TextUi.showSellMessage(itemName, sellQuantity, remainingQuantity, sellPrice); + Itemlist.editQuantity(index, remainingQuantity); + } + Storage.overwriteFile(Itemlist.getItems(), false); + } +} diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 08c1c26784..c138a58465 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -10,6 +10,9 @@ public class Messages { public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; + public static final String INVALID_SELL_FORMAT ="Invalid command format. Please use format: " + + "'sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]'"; + public static final String INVALID_SELL_PRICE ="Price cannot be negative!"; public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 94c211da5e..a5c7f2915d 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -17,6 +17,9 @@ public CommandFormatException(CommandType command){ case EDIT: System.out.println(Messages.INVALID_EDIT_FORMAT); break; + case SELL: + System.out.println(Messages.INVALID_SELL_FORMAT); + break; case HELP: System.out.println(Messages.HELP); break; @@ -25,5 +28,19 @@ public CommandFormatException(CommandType command){ break; } + } + + public CommandFormatException(String error) { + switch (error) { + + case "SELL_PRICE": + System.out.println(Messages.INVALID_SELL_PRICE); + break; + default: + System.out.println("Error Detected"); + } + + + } } diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index afc96dcde1..bddaf26994 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -6,5 +6,6 @@ public enum CommandType { HELP, ADD, DEL, - EDIT + EDIT, + SELL } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 1d5455c21b..9c7d852f19 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,13 +1,14 @@ package parser; +import command.AddCommand; import command.Command; import command.DeleteCommand; -import command.AddCommand; -import command.ListCommand; -import command.IncorrectCommand; +import command.EditCommand; import command.ExitCommand; import command.HelpCommand; -import command.EditCommand; +import command.IncorrectCommand; +import command.ListCommand; +import command.SellCommand; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; @@ -18,8 +19,8 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)(?: " + - "cat/(?[^/]+))? buy/(?\\d+) sell/(?\\d+)"); + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + + "(?: cat/(?[^/]+))? buy/(?\\d+) sell/(?\\d+)"); public static final Pattern DELETE_COMMAND_FORMAT = @@ -28,6 +29,9 @@ public class Parser { public static final Pattern EDIT_COMMAND_FORMAT = Pattern.compile("edit (?[^/]+) qty/(?\\d+)"); + public static final Pattern SELL_COMMAND_FORMAT = + Pattern.compile("sell (?[^/]+) qty/(?\\d+)(?: price/(?[^/]+))?"); + public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); @@ -73,6 +77,12 @@ public Command parseInput(String userInput){ } catch (CommandFormatException e) { break; } + case SELL: + try { + return prepareSell(userInput); + } catch (CommandFormatException e) { + break; + } default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -124,6 +134,26 @@ private Command prepareEdit(String args) throws CommandFormatException{ newQuantity ); } + + private Command prepareSell(String args) throws CommandFormatException{ + final Matcher matcher = SELL_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.SELL); + } + int sellQuantity = Integer.parseInt(matcher.group("sellQuantity").trim()); + boolean sellPriceIsPresent = matcher.group("sellPrice") != null; + int inputPrice = (sellPriceIsPresent) ? Integer.parseInt(matcher.group("sellPrice")): 0; + if (sellPriceIsPresent && inputPrice < 0) { + throw new CommandFormatException("SELL_PRICE"); + } + int sellPrice = sellPriceIsPresent ? inputPrice : -1; + return new SellCommand( + matcher.group("itemName"), + sellQuantity, + sellPrice + ); + } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index e58c027e1e..91193ea4ae 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -71,4 +71,10 @@ public static void showEditMessage(String item, int oldQuantity, int newQuantity "Changed quantity of " + item + " from " + oldQuantity + " to " + newQuantity ); } + + public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, int sellPrice) { + replyToUser("Quantity of " + item + " sold: " + sellQuantity + ", for: $" + sellPrice + "\n" + + "Quantity remaining: " + remainingQuantity + ); + } } From be181159d5d572f48cbba3a9c7c712fc170769b4 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 28 Mar 2024 00:28:45 +0800 Subject: [PATCH 109/421] resolve checkstyle warnings --- src/main/java/storage/Storage.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 2977eb3d87..122086294e 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -78,23 +78,18 @@ public static void readFromFile(String fileName) { for (String keyCommand : keyCommands) { if (keyCommand.contains(".")) { //do nothing. - } - else if (keyCommand.contains("Qty: ")) { + } else if (keyCommand.contains("Qty: ")) { String[] commandQtyUnit = keyCommand.replace("Qty: ", "").split(" "); assert commandQtyUnit.length == 2 : "length not 2!"; commandQty = commandQtyUnit[0]; commandUom = commandQtyUnit[1]; - } - else if (keyCommand.contains("Cat: ")) { + } else if (keyCommand.contains("Cat: ")) { commandCat = keyCommand.replace("Cat: ", ""); - } - else if (keyCommand.contains("BuyPrice: $")) { + } else if (keyCommand.contains("BuyPrice: $")) { commandBuy = keyCommand.replace("BuyPrice: $", ""); - } - else if (keyCommand.contains("SellPrice: $")) { + } else if (keyCommand.contains("SellPrice: $")) { commandSell = keyCommand.replace("SellPrice: $", ""); - } - else { + } else { commandName = keyCommand; } } From ba48fd84cee905f1ca750e2aaca03f29c78c0ed6 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 28 Mar 2024 11:25:46 +0800 Subject: [PATCH 110/421] Create Class TransactionLogs --- src/main/java/storage/Storage.java | 3 -- src/main/java/storage/TransactionLogs.java | 55 ++++++++++++++++++++++ 2 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/main/java/storage/TransactionLogs.java diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 2977eb3d87..9df84c2eea 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -18,9 +18,6 @@ public class Storage { private static final String FILENAME = "./StockMasterData.txt"; - private static File stockMaster; - - /** * Write contents to the file. * diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java new file mode 100644 index 0000000000..102a034d49 --- /dev/null +++ b/src/main/java/storage/TransactionLogs.java @@ -0,0 +1,55 @@ +package storage; + +import item.Item; + +import java.io.IOException; +import java.util.ArrayList; + +import static storage.Storage.writeToFile; + +public class TransactionLogs extends Storage { +// LocalDateTime currentTime = LocalDateTime.now(); +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); +// String formattedDateTime = currentTime.format(formatter); +// System.out.println(formattedDateTime); + private static final String LOGNAME = "./TransactionLogs.txt"; + private static String dateTime; + public static void setDateTime(String startDateTime) { + dateTime = startDateTime; + } + + /** + * Returns the private file directory of TransactionLogs. + */ + public static String getLogDirectory() { + return LOGNAME; + } + + public static void addToLog(ArrayList items, boolean ifAppend) { + assert items != null : "Items cannot be null."; + Item lastItem = items.get(items.size() - 1); + String descriptionAdded = (items.size()) + "." + " | " + lastItem.getItemName() + + " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUom() + + " | " + "Cat: " + lastItem.getCategory() + " | " + "BuyPrice: $" + + lastItem.getBuyPrice() + " | " + "SellPrice: $" + lastItem.getSellPrice() + "\n"; + updateFile(descriptionAdded, ifAppend); + } + + public static void overwriteLog(ArrayList items, boolean ifAppend) { + assert items != null : "Items cannot be null."; + int length = items.size(); + for (int index = 0; index < length; index++) { + String descriptionAdded = (index + 1) + "." + " | " + items.get(index).getItemName() + + " | " + "Qty: " + items.get(index).getQuantity() + " " + items.get(index).getUom() + + " | " + "Cat: " + items.get(index).getCategory() + " | " + "BuyPrice: $" + + items.get(index).getBuyPrice() + " | " + "SellPrice: $" + + items.get(index).getSellPrice() + "\n"; + if (index == 0) { + updateFile(descriptionAdded, ifAppend); + } else { + updateFile(descriptionAdded, !ifAppend); + } + } + } + +} From bcfaa3b31da229ef0fc5a77379d4429fb25c3ee5 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 28 Mar 2024 19:04:40 +0800 Subject: [PATCH 111/421] Create Cashier & Transaction & TransactionLogs --- src/main/java/command/AddCommand.java | 2 +- src/main/java/command/DeleteCommand.java | 2 +- src/main/java/command/EditCommand.java | 2 +- src/main/java/command/SellCommand.java | 2 +- src/main/java/item/Transaction.java | 34 ++++++++++++ src/main/java/itemlist/Cashier.java | 20 +++++++ src/main/java/storage/Storage.java | 10 ++-- src/main/java/storage/TransactionLogs.java | 64 ++++++++++------------ 8 files changed, 93 insertions(+), 43 deletions(-) create mode 100644 src/main/java/item/Transaction.java create mode 100644 src/main/java/itemlist/Cashier.java diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 1cda196bc1..ed244ebcca 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -52,7 +52,7 @@ public void execute() { Itemlist.addItem(toAdd); System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + getUom() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); - Storage.addToFile(Itemlist.getItems(), true); + Storage.addToFile(Itemlist.getItems()); if (!category.equals("NA")) { System.out.println(" to " + getCategory()); } else { diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 1a034f33e7..c7bc6fbace 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -28,7 +28,7 @@ public void execute() throws CommandFormatException { } else { Itemlist.deleteItem(index); System.out.println(itemName + " has been successfully deleted."); - Storage.overwriteFile(Itemlist.getItems(), false); + Storage.overwriteFile(Itemlist.getItems()); assert(!Itemlist.getItem(index).getItemName().equals(itemName)); } } diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index c94274ab43..be4e9d55c2 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -32,6 +32,6 @@ public void execute() { ui.TextUi.showEditMessage(itemName, Itemlist.getItem(index).getQuantity(), newQuantity ); Itemlist.editQuantity(index, newQuantity); } - Storage.overwriteFile(Itemlist.getItems(), false); + Storage.overwriteFile(Itemlist.getItems()); } } diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 14d988f3b0..624f4562b6 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -38,6 +38,6 @@ public void execute() { ui.TextUi.showSellMessage(itemName, sellQuantity, remainingQuantity, sellPrice); Itemlist.editQuantity(index, remainingQuantity); } - Storage.overwriteFile(Itemlist.getItems(), false); + Storage.overwriteFile(Itemlist.getItems()); } } diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java new file mode 100644 index 0000000000..9d29a65b8d --- /dev/null +++ b/src/main/java/item/Transaction.java @@ -0,0 +1,34 @@ +package item; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class Transaction extends Item { + private String dateTime; + private int totalPrice; + private int profit; + public Transaction(String name, int quantity, String uom, String category, int buyPrice, int sellPrice) { + super(name, quantity, uom, category, buyPrice, sellPrice); + setDateTime(); + totalPrice = sellPrice * quantity; + profit = totalPrice - buyPrice * quantity; + } + + public String getDateTime() { + return this.dateTime; + } + + public int getTotalPrice() { + return this.totalPrice; + } + + public int getProfit() { + return this.profit; + } + + public void setDateTime() { + LocalDateTime currentTime = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + this.dateTime = currentTime.format(formatter); + } +} diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java new file mode 100644 index 0000000000..d05c84b79a --- /dev/null +++ b/src/main/java/itemlist/Cashier.java @@ -0,0 +1,20 @@ +package itemlist; + +import item.Item; +import item.Transaction; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +public class Cashier extends Itemlist { + private static final ArrayList transactions = new ArrayList<>(); + + public static void addItem(Transaction transaction) { + transactions.add(transaction); + } + + public static void deleteItem(int index) { + transactions.remove(index); + } +} diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index e4ba1e2905..0b1c949dc0 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -101,17 +101,17 @@ public static void readFromFile(String fileName) { } } - public static void addToFile(ArrayList items, boolean ifAppend) { + public static void addToFile(ArrayList items) { assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); String descriptionAdded = (items.size()) + "." + " | " + lastItem.getItemName() + " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUom() + " | " + "Cat: " + lastItem.getCategory() + " | " + "BuyPrice: $" + lastItem.getBuyPrice() + " | " + "SellPrice: $" + lastItem.getSellPrice() + "\n"; - updateFile(descriptionAdded, ifAppend); + updateFile(descriptionAdded, true); } - public static void overwriteFile(ArrayList items, boolean ifAppend) { + public static void overwriteFile(ArrayList items) { assert items != null : "Items cannot be null."; int length = items.size(); for (int index = 0; index < length; index++) { @@ -121,9 +121,9 @@ public static void overwriteFile(ArrayList items, boolean ifAppend) { items.get(index).getBuyPrice() + " | " + "SellPrice: $" + items.get(index).getSellPrice() + "\n"; if (index == 0) { - updateFile(descriptionAdded, ifAppend); + updateFile(descriptionAdded, false); } else { - updateFile(descriptionAdded, !ifAppend); + updateFile(descriptionAdded, true); } } } diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 102a034d49..fd2b3509c0 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -1,55 +1,51 @@ package storage; -import item.Item; +import item.Transaction; +import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; -import static storage.Storage.writeToFile; - public class TransactionLogs extends Storage { -// LocalDateTime currentTime = LocalDateTime.now(); -// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); -// String formattedDateTime = currentTime.format(formatter); -// System.out.println(formattedDateTime); private static final String LOGNAME = "./TransactionLogs.txt"; - private static String dateTime; - public static void setDateTime(String startDateTime) { - dateTime = startDateTime; - } - /** - * Returns the private file directory of TransactionLogs. - */ - public static String getLogDirectory() { + public static String getFileDirectory() { return LOGNAME; } - public static void addToLog(ArrayList items, boolean ifAppend) { - assert items != null : "Items cannot be null."; - Item lastItem = items.get(items.size() - 1); - String descriptionAdded = (items.size()) + "." + " | " + lastItem.getItemName() + - " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUom() + - " | " + "Cat: " + lastItem.getCategory() + " | " + "BuyPrice: $" + - lastItem.getBuyPrice() + " | " + "SellPrice: $" + lastItem.getSellPrice() + "\n"; - updateFile(descriptionAdded, ifAppend); + public static void addToLog(ArrayList transactions) { + assert transactions != null : "Transactions cannot be null."; + Transaction lastTransaction = transactions.get(transactions.size() - 1); + String descriptionAdded = ""; + descriptionAdded += "Date: " + lastTransaction.getDateTime() + "\n"; + descriptionAdded += "Transaction ID: " + transactions.size() + "\n"; + descriptionAdded += "Item Name: " + lastTransaction.getItemName() + "\n"; + descriptionAdded += "Quantity: " + lastTransaction.getQuantity() + "\n"; + descriptionAdded += "Unit Price: " + lastTransaction.getSellPrice() + "\n"; + descriptionAdded += "Total Price: " + lastTransaction.getTotalPrice() + "\n"; + descriptionAdded += "Profit: " + lastTransaction.getProfit() + "\n"; + descriptionAdded += "\n"; + updateFile(descriptionAdded, true); } - public static void overwriteLog(ArrayList items, boolean ifAppend) { - assert items != null : "Items cannot be null."; - int length = items.size(); + public static void overwriteLog(ArrayList transactions) { + assert transactions != null : "Items cannot be null."; + int length = transactions.size(); for (int index = 0; index < length; index++) { - String descriptionAdded = (index + 1) + "." + " | " + items.get(index).getItemName() + - " | " + "Qty: " + items.get(index).getQuantity() + " " + items.get(index).getUom() + - " | " + "Cat: " + items.get(index).getCategory() + " | " + "BuyPrice: $" + - items.get(index).getBuyPrice() + " | " + "SellPrice: $" + - items.get(index).getSellPrice() + "\n"; + String descriptionAdded = ""; + descriptionAdded += "Date: " + transactions.get(index).getDateTime() + "\n"; + descriptionAdded += "Transaction ID: " + transactions.get(index + 1) + "\n"; + descriptionAdded += "Item Name: " + transactions.get(index).getItemName() + "\n"; + descriptionAdded += "Quantity: " + transactions.get(index).getQuantity() + "\n"; + descriptionAdded += "Unit Price: " + transactions.get(index).getSellPrice() + "\n"; + descriptionAdded += "Total Price: " + transactions.get(index).getTotalPrice() + "\n"; + descriptionAdded += "Profit: " + transactions.get(index).getProfit() + "\n"; + descriptionAdded += "\n"; if (index == 0) { - updateFile(descriptionAdded, ifAppend); + updateFile(descriptionAdded, false); } else { - updateFile(descriptionAdded, !ifAppend); + updateFile(descriptionAdded, true); } } } - } From eccf779b098739367d0a76c77f2f0df3a7d69921 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 28 Mar 2024 19:27:43 +0800 Subject: [PATCH 112/421] Update DG, Create Class TransactionLogs --- docs/DeveloperGuide.md | 7 +++++++ src/main/java/storage/TransactionLogs.java | 4 ---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1a2eb7183a..135c9301ab 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,6 +7,13 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +### Exception +### Itemlist +### Parser +### Storage +Storage class contains methods to write description of items to the file `./StockMasterData.txt`, +and retrieve information from the file when program restarts. +### UI ## Product scope diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 102a034d49..b157b60e56 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -8,10 +8,6 @@ import static storage.Storage.writeToFile; public class TransactionLogs extends Storage { -// LocalDateTime currentTime = LocalDateTime.now(); -// DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); -// String formattedDateTime = currentTime.format(formatter); -// System.out.println(formattedDateTime); private static final String LOGNAME = "./TransactionLogs.txt"; private static String dateTime; public static void setDateTime(String startDateTime) { From 3f14647ca0a8ade92a33f8965613fa1d4645cf6b Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 28 Mar 2024 19:32:30 +0800 Subject: [PATCH 113/421] Remove unused imports --- src/main/java/storage/TransactionLogs.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index b157b60e56..1edb865e59 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -2,11 +2,8 @@ import item.Item; -import java.io.IOException; import java.util.ArrayList; -import static storage.Storage.writeToFile; - public class TransactionLogs extends Storage { private static final String LOGNAME = "./TransactionLogs.txt"; private static String dateTime; From fcef80bf776ff2b4afa2cf60ea35873634dcea5d Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 28 Mar 2024 19:45:47 +0800 Subject: [PATCH 114/421] Remove unused imports --- src/main/java/itemlist/Cashier.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index d05c84b79a..976efe6039 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,10 +1,7 @@ package itemlist; -import item.Item; import item.Transaction; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; public class Cashier extends Itemlist { From 03fb2600d7f753c772a94d84e1a03e4cddc9134a Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 29 Mar 2024 00:44:02 +0800 Subject: [PATCH 115/421] TransactionLogs --- TransactionLogs.txt | 0 src/main/java/command/SellCommand.java | 11 +++- src/main/java/item/Transaction.java | 36 ++++++++++++-- src/main/java/itemlist/Cashier.java | 5 ++ src/main/java/seedu/duke/Duke.java | 3 ++ src/main/java/storage/Storage.java | 1 + src/main/java/storage/TransactionLogs.java | 58 ++++++++++++++++++++++ 7 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 TransactionLogs.txt diff --git a/TransactionLogs.txt b/TransactionLogs.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 624f4562b6..292f311ea7 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -1,8 +1,11 @@ package command; import item.Item; +import item.Transaction; +import itemlist.Cashier; import itemlist.Itemlist; import storage.Storage; +import storage.TransactionLogs; public class SellCommand extends Command { @@ -20,10 +23,11 @@ public SellCommand (String itemName, int quantity, int price) { @Override public void execute() { int index = -1; + Item toSell = Itemlist.getItems().get(0); for (Item item : Itemlist.getItems()) { if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { index = Itemlist.getItems().indexOf(item); - item = Itemlist.getItems().get(index); + toSell = item; break; } } @@ -32,12 +36,17 @@ public void execute() { if (index == -1) { //throw exception; System.out.println("Item not found!"); + return; } else if (remainingQuantity < 0) { System.out.println("There is insufficient stock!"); + return; } else { ui.TextUi.showSellMessage(itemName, sellQuantity, remainingQuantity, sellPrice); Itemlist.editQuantity(index, remainingQuantity); } Storage.overwriteFile(Itemlist.getItems()); + Transaction newTransaction = new Transaction(itemName, sellQuantity, toSell.getBuyPrice(), sellPrice); + Cashier.addItem(newTransaction); + TransactionLogs.addToLog(Cashier.getTransactions()); } } diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 9d29a65b8d..0e6b64f6bc 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -3,17 +3,47 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -public class Transaction extends Item { +public class Transaction { private String dateTime; private int totalPrice; private int profit; - public Transaction(String name, int quantity, String uom, String category, int buyPrice, int sellPrice) { - super(name, quantity, uom, category, buyPrice, sellPrice); + private String itemName; + private int quantity; + private int buyPrice; + private int sellPrice; + + public Transaction(String name, int inputQty, int inputBuy, int inputSell) { setDateTime(); + itemName = name; + quantity = inputQty; + buyPrice = inputBuy; + sellPrice = inputSell; + totalPrice = sellPrice * quantity; + profit = totalPrice - buyPrice * quantity; + } + + public Transaction(String name, int inputQty, int inputBuy, int inputSell, String storedTime) { + dateTime = storedTime; + itemName = name; + quantity = inputQty; + buyPrice = inputBuy; + sellPrice = inputSell; totalPrice = sellPrice * quantity; profit = totalPrice - buyPrice * quantity; } + public String getItemName() { + return this.itemName; + } + + public int getQuantity() { + return this.quantity; + } + + public int getSellPrice() { + return this.sellPrice; + } + public String getDateTime() { return this.dateTime; } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 976efe6039..e78b3e6db5 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,5 +1,6 @@ package itemlist; +import item.Item; import item.Transaction; import java.util.ArrayList; @@ -14,4 +15,8 @@ public static void addItem(Transaction transaction) { public static void deleteItem(int index) { transactions.remove(index); } + + public static ArrayList getTransactions() { + return transactions; + } } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index a440aca2e2..3c31f27076 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -5,6 +5,7 @@ import exceptions.CommandFormatException; import parser.Parser; import storage.Storage; +import storage.TransactionLogs; import ui.TextUi; import itemlist.Itemlist; @@ -27,6 +28,8 @@ public void run() throws IOException, CommandFormatException { ui.showWelcomeMessage("StockMaster v2.0", "./StockMasterData.txt"); Storage.updateFile("", true); Storage.readFromFile("./StockMasterData.txt"); + TransactionLogs.updateFile("", true); + TransactionLogs.readFromFile("./TransactionLogs.txt"); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 0b1c949dc0..228834cdc3 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -94,6 +94,7 @@ public static void readFromFile(String fileName) { Integer.parseInt(commandBuy), Integer.parseInt(commandSell)); Itemlist.addItem(toAdd); } + scanner.close(); } catch(FileNotFoundException e) { System.out.println("File does not exist."); } catch(NumberFormatException e) { diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 5eb86d5dd9..2747b8ee7c 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -1,8 +1,15 @@ package storage; +import item.Item; import item.Transaction; +import itemlist.Cashier; +import itemlist.Itemlist; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; import java.util.ArrayList; +import java.util.Scanner; public class TransactionLogs extends Storage { private static final String LOGNAME = "./TransactionLogs.txt"; @@ -11,6 +18,57 @@ public static String getFileDirectory() { return LOGNAME; } + public static void updateFile(String inputText, boolean ifAppend) { + try { + writeToFile(getFileDirectory(), inputText, ifAppend); + } catch (IOException e) { + System.out.println("IOExceptions occurred"); + } + } + + public static void readFromFile(String fileName) { + System.out.println("start..."); + try { + System.out.println("try blk"); + Scanner scanner = new Scanner(new File(fileName)); + System.out.println("File created"); + String commandQty = ""; + String commandProfit = ""; + String commandTotalSell = ""; + String commandSell = ""; + String commandName = ""; + String commandDate = ""; + while (scanner.hasNext()) { + String fileLine = scanner.nextLine(); + System.out.println(fileLine); + if (fileLine.contains("Quantity: ")) { + commandQty = fileLine.replace("Quantity: ", ""); + } else if (fileLine.contains("Date: ")) { + commandDate = fileLine.replace("Date: ", ""); + } else if (fileLine.contains("Unit Price: ")) { + commandSell = fileLine.replace("Unit Price: ", ""); + } else if (fileLine.contains("Total Price: ")) { + commandTotalSell = fileLine.replace("Total Price: ", ""); + } else if (fileLine.contains("Item Name: ")){ + commandName = fileLine.replace("Item Name: ", ""); + } else if (fileLine.contains("Profit: ")) { + commandProfit = fileLine.replace("Profit: ", ""); + int quantityAsInt = Integer.parseInt(commandQty); + int buyAsInt = (Integer.parseInt(commandTotalSell) - Integer.parseInt(commandProfit)) + / quantityAsInt; + Transaction toAdd = new Transaction(commandName, quantityAsInt, + buyAsInt, Integer.parseInt(commandSell), commandDate); + Cashier.addItem(toAdd); + } + } + scanner.close(); + } catch(FileNotFoundException e) { + System.out.println("File does not exist."); + } catch(NumberFormatException e) { + System.out.println("Invalid numbers found"); + } + } + public static void addToLog(ArrayList transactions) { assert transactions != null : "Transactions cannot be null."; Transaction lastTransaction = transactions.get(transactions.size() - 1); From 3baaa4b4bfa0a44d779c6a6bce5f0667fbe4b680 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 29 Mar 2024 00:46:31 +0800 Subject: [PATCH 116/421] Remove unused imports --- src/main/java/itemlist/Cashier.java | 1 - src/main/java/storage/TransactionLogs.java | 2 -- 2 files changed, 3 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index e78b3e6db5..5b786d9544 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,6 +1,5 @@ package itemlist; -import item.Item; import item.Transaction; import java.util.ArrayList; diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 2747b8ee7c..8f77c34808 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -1,9 +1,7 @@ package storage; -import item.Item; import item.Transaction; import itemlist.Cashier; -import itemlist.Itemlist; import java.io.File; import java.io.FileNotFoundException; From f94b09a051dad9b16fbf8acaf08638c7e32a035e Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 29 Mar 2024 00:48:55 +0800 Subject: [PATCH 117/421] Remove print statements --- src/main/java/storage/TransactionLogs.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 8f77c34808..a2ad736d52 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -25,11 +25,8 @@ public static void updateFile(String inputText, boolean ifAppend) { } public static void readFromFile(String fileName) { - System.out.println("start..."); try { - System.out.println("try blk"); Scanner scanner = new Scanner(new File(fileName)); - System.out.println("File created"); String commandQty = ""; String commandProfit = ""; String commandTotalSell = ""; From f2c4b5df425ce95368153754c550462aae20e49c Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 29 Mar 2024 11:21:59 +0800 Subject: [PATCH 118/421] Edit TextUi --- src/main/java/ui/TextUi.java | 2 +- src/test/java/ui/TextUiTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 7478e0636c..0f4c5e3b1e 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -17,7 +17,7 @@ public TextUi() { this.in = new Scanner(System.in); } - public String getUserInput() { + public static String getUserInput() { System.out.println("Enter Command:"); Scanner in = new Scanner(System.in); String userInput = in.hasNextLine() ? in.nextLine() : ""; diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 5217fdd93e..cc9de16a48 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -1,4 +1,4 @@ -/*package ui; +package ui; import org.junit.jupiter.api.Test; @@ -19,4 +19,4 @@ void provideInput(String input) { ByteArrayInputStream testIn = new ByteArrayInputStream(input.getBytes()); System.setIn(testIn); } -}*/ +} From fe0eb14cb9e4d6303fdb8a76755ff07e7d7de21e Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 29 Mar 2024 15:41:25 +0800 Subject: [PATCH 119/421] edit DG --- docs/DeveloperGuide.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 135c9301ab..c09f7f9e91 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -10,6 +10,8 @@ ### Exception ### Itemlist ### Parser +Parser class processes user inputs and sieves out relevant details before calling the relevant methods. +It contains command formats that must be adhered to for the methods to be called. ### Storage Storage class contains methods to write description of items to the file `./StockMasterData.txt`, and retrieve information from the file when program restarts. @@ -17,6 +19,16 @@ and retrieve information from the file when program restarts. ## Product scope +StockMaster allows users to use the following commands: +* add: add an item, quantity, category, buy price and sell price +* del: delete an item +* edit: edit the quantity of an item +* sell: sell a certain quantity of an item at a stated price +* find: find a specific item using a keyword +* list: list all items in the inventory +* help: list all commands +* exit: exit StockMaster + ### Target user profile Small Business Owners who: From 69942817e783b6d283d61d2ccd29a17a87d96090 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 29 Mar 2024 19:39:25 +0800 Subject: [PATCH 120/421] Fix JUnit Test for TextUi --- src/test/java/ui/TextUiTest.java | 36 ++++++++++++++++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index cc9de16a48..89b14bb1e8 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -1,18 +1,50 @@ package ui; +import item.Item; import org.junit.jupiter.api.Test; import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertLinesMatch; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static ui.TextUi.getUserInput; +import static ui.TextUi.showInventoryList; public class TextUiTest { + @Test public void testValidInput() { provideInput("add Item"); - assertEquals("add Item", TextUi.getUserInput()); + assertEquals("add Item", getUserInput()); + + provideInput(" "); + assertEquals("Invalid Command", getUserInput()); + } + + @Test + public void testShowInventoryList() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStreamCaptor)); + ArrayList itemList = new ArrayList<>(); + itemList.add("test 1"); + itemList.add("test 2"); + showInventoryList(itemList); + String[] output = outputStreamCaptor.toString().split("\\r?\\n"); + String line1 = "List: "; + String line2 = "1. test 1"; + String line3 = "2. test 2"; + List expectedOutput = Arrays.asList(line1, line2, line3); + assertLinesMatch(expectedOutput, Arrays.asList(output)); } void provideInput(String input) { From 26180e33296614390c31ca862e6ec949b1407458 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 29 Mar 2024 20:05:04 +0800 Subject: [PATCH 121/421] Add Empty arraylist test case --- StockMasterData.txt | 1 + src/test/java/ui/TextUiTest.java | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8b13789179..b6152015f9 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,2 @@ +0 | apple | 50 | 4 | 5 diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 89b14bb1e8..65b8e9fae6 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -1,19 +1,14 @@ package ui; -import item.Item; import org.junit.jupiter.api.Test; - import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.List; - import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertLinesMatch; -import static org.junit.jupiter.api.Assertions.assertTrue; import static ui.TextUi.getUserInput; import static ui.TextUi.showInventoryList; @@ -47,6 +42,19 @@ public void testShowInventoryList() { assertLinesMatch(expectedOutput, Arrays.asList(output)); } + @Test + public void testShowEmptyInventoryList() { //only test for empty arrayList as parser will trim away empty inputs + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + PrintStream originalOut = System.out; + System.setOut(new PrintStream(outputStreamCaptor)); + ArrayList itemList = new ArrayList<>(); //empty arrayList + showInventoryList(itemList); + String[] output = outputStreamCaptor.toString().split("\\r?\\n"); + String line = "There is nothing here! Time to spend some money and stock em up!"; + List expectedOutput = List.of(line); + assertLinesMatch(expectedOutput, Arrays.asList(output)); + } + void provideInput(String input) { ByteArrayInputStream testIn = new ByteArrayInputStream(input.getBytes()); System.setIn(testIn); From 431fe06704668a57cc4599457a357902e0c757f8 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 22:11:24 +0800 Subject: [PATCH 122/421] Add try-catch for DeleteCommanD --- src/main/java/command/DeleteCommand.java | 33 ++++++++++++++---------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index c7bc6fbace..a83b53be1a 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -11,25 +11,30 @@ public class DeleteCommand extends Command { protected String itemName; public DeleteCommand(String itemName) { - this.itemName = itemName; + this.itemName = itemName.toLowerCase(); //for checking later } public void execute() throws CommandFormatException { int index = -1; - for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { - index = Itemlist.getItems().indexOf(item); - break; + try { + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + index = Itemlist.getItems().indexOf(item); + break; + } } - } - if (index == -1) { - //throw exception; - throw new CommandFormatException(CommandType.DEL); - } else { - Itemlist.deleteItem(index); - System.out.println(itemName + " has been successfully deleted."); - Storage.overwriteFile(Itemlist.getItems()); - assert(!Itemlist.getItem(index).getItemName().equals(itemName)); + if (index == -1) { + //throw exception; + throw new CommandFormatException(CommandType.DEL); + } else { + Itemlist.deleteItem(index); + System.out.println(itemName + " has been successfully deleted."); + Storage.overwriteFile(Itemlist.getItems()); + assert(!Itemlist.getItem(index).getItemName().equals(itemName)); + + } + } catch (CommandFormatException e) { + System.out.println("Unable to delete Item. Did you misspell it?"); } } } From ee6e94b4b3e012821a1a0407aec7b1015736e2ae Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 29 Mar 2024 22:38:37 +0800 Subject: [PATCH 123/421] Add JUnit Test for ExitCommand and HelpCommand --- src/main/java/command/ExitCommand.java | 1 - src/test/java/command/ExitCommandTest.java | 21 +++++++++++++++++++++ src/test/java/command/HelpCommandTest.java | 21 +++++++++++++++++++++ src/test/java/ui/TextUiTest.java | 1 - 4 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/test/java/command/ExitCommandTest.java create mode 100644 src/test/java/command/HelpCommandTest.java diff --git a/src/main/java/command/ExitCommand.java b/src/main/java/command/ExitCommand.java index 6430aaffa1..7d8a3f3d1b 100644 --- a/src/main/java/command/ExitCommand.java +++ b/src/main/java/command/ExitCommand.java @@ -14,6 +14,5 @@ public static boolean getIsExit() { @Override public void execute() { - } } diff --git a/src/test/java/command/ExitCommandTest.java b/src/test/java/command/ExitCommandTest.java new file mode 100644 index 0000000000..2e2c051341 --- /dev/null +++ b/src/test/java/command/ExitCommandTest.java @@ -0,0 +1,21 @@ +package command; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ExitCommandTest { + @Test + public void testGetIsExit() { + ExitCommand exitCommand = new ExitCommand(true); + assertTrue(ExitCommand.getIsExit()); + } + + @Test + public void testExecute() { + ExitCommand exitCommand = new ExitCommand(false); + exitCommand.execute(); + assertFalse(ExitCommand.getIsExit()); + } +} diff --git a/src/test/java/command/HelpCommandTest.java b/src/test/java/command/HelpCommandTest.java new file mode 100644 index 0000000000..731cb135d9 --- /dev/null +++ b/src/test/java/command/HelpCommandTest.java @@ -0,0 +1,21 @@ +package command; + +import common.Messages; +import org.junit.jupiter.api.Test; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class HelpCommandTest { + @Test + public void testExecute() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + HelpCommand helpCommand = new HelpCommand(); + helpCommand.execute(); + String expectedOutput = Messages.HELP + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } +} diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 65b8e9fae6..3ea8bbb68c 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -28,7 +28,6 @@ public void testValidInput() { @Test public void testShowInventoryList() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); - PrintStream originalOut = System.out; System.setOut(new PrintStream(outputStreamCaptor)); ArrayList itemList = new ArrayList<>(); itemList.add("test 1"); From 6d3059caa7e79a6b40bdd7c1f5c4d61167f74a0a Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 23:05:56 +0800 Subject: [PATCH 124/421] Change DeleteCommand error handling --- src/main/java/command/DeleteCommand.java | 32 +++++++++++------------- 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index a83b53be1a..db8f1cf2f5 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -14,27 +14,23 @@ public DeleteCommand(String itemName) { this.itemName = itemName.toLowerCase(); //for checking later } - public void execute() throws CommandFormatException { + public void execute() { int index = -1; - try { - for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { - index = Itemlist.getItems().indexOf(item); - break; - } + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + index = Itemlist.getItems().indexOf(item); + break; } - if (index == -1) { - //throw exception; - throw new CommandFormatException(CommandType.DEL); - } else { - Itemlist.deleteItem(index); - System.out.println(itemName + " has been successfully deleted."); - Storage.overwriteFile(Itemlist.getItems()); - assert(!Itemlist.getItem(index).getItemName().equals(itemName)); + } + if (index == -1) { + //throw exception; + System.out.println("Item does not exist."); + } else { + Itemlist.deleteItem(index); + System.out.println(itemName + " has been successfully deleted."); + Storage.overwriteFile(Itemlist.getItems()); + assert(!Itemlist.getItem(index).getItemName().equals(itemName)); - } - } catch (CommandFormatException e) { - System.out.println("Unable to delete Item. Did you misspell it?"); } } } From ec3ba21bd49aa0d39f0f51db0af0b69447896714 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 23:07:20 +0800 Subject: [PATCH 125/421] Add AddCommandTest --- src/test/java/command/AddCommandTest.java | 27 +++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/test/java/command/AddCommandTest.java diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java new file mode 100644 index 0000000000..9003956d47 --- /dev/null +++ b/src/test/java/command/AddCommandTest.java @@ -0,0 +1,27 @@ +package command; + +import exceptions.CommandFormatException; +import item.Item; +import itemlist.Itemlist; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.fail; + +public class AddCommandTest { + + @Test + public void addItemTest() throws CommandFormatException { + try { + Command addCommandTest1 = new AddCommand("testItem", 1, "EA", + "NA", 1, 10); + Command addCommandTest2 = new AddCommand("testItem", 7, "EA", + "NA", 1, 10); + addCommandTest1.execute(); + assert(Itemlist.itemIsExist("testItem")); + addCommandTest2.execute(); + } catch (CommandFormatException e) { + fail("Unable to add item."); + } + } + +} From 231b2bbcd01ccea88b40a430fb7549191bbebcd4 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 23:21:39 +0800 Subject: [PATCH 126/421] Add DeleteCommandTest --- src/test/java/command/DeleteCommandTest.java | 26 ++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 src/test/java/command/DeleteCommandTest.java diff --git a/src/test/java/command/DeleteCommandTest.java b/src/test/java/command/DeleteCommandTest.java new file mode 100644 index 0000000000..3873c8b3d1 --- /dev/null +++ b/src/test/java/command/DeleteCommandTest.java @@ -0,0 +1,26 @@ +package command; + +import exceptions.CommandFormatException; +import itemlist.Itemlist; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.fail; + +public class DeleteCommandTest { + Command addCommandTest1 = new AddCommand("testItem", 1, "EA", + "NA", 1, 10); + Command deleteCommand = new DeleteCommand("testItem"); + + @Test + public void delCommandTest_success() throws CommandFormatException { + try { + addCommandTest1.execute(); + deleteCommand.execute(); + assert(!Itemlist.itemIsExist("testItem")); + deleteCommand.execute(); + } catch (CommandFormatException e) { + fail("Unable to delete."); + } + + } +} From 4bcc137d93b35f2949c7c43d53e55df04a4c7050 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 23:46:40 +0800 Subject: [PATCH 127/421] Change deleteTest and add FindCommandTest --- src/main/java/command/DeleteCommand.java | 2 -- src/test/java/command/DeleteCommandTest.java | 4 +++- src/test/java/command/FindCommandTest.java | 25 ++++++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 src/test/java/command/FindCommandTest.java diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index db8f1cf2f5..5b436cbf26 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -1,9 +1,7 @@ package command; -import exceptions.CommandFormatException; import item.Item; import itemlist.Itemlist; -import parser.CommandType; import storage.Storage; public class DeleteCommand extends Command { diff --git a/src/test/java/command/DeleteCommandTest.java b/src/test/java/command/DeleteCommandTest.java index 3873c8b3d1..2918969c3a 100644 --- a/src/test/java/command/DeleteCommandTest.java +++ b/src/test/java/command/DeleteCommandTest.java @@ -4,6 +4,7 @@ import itemlist.Itemlist; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.fail; public class DeleteCommandTest { @@ -16,8 +17,9 @@ public void delCommandTest_success() throws CommandFormatException { try { addCommandTest1.execute(); deleteCommand.execute(); - assert(!Itemlist.itemIsExist("testItem")); + assertFalse(Itemlist.itemIsExist("testItem")); deleteCommand.execute(); + fail("Item does not exist"); } catch (CommandFormatException e) { fail("Unable to delete."); } diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java new file mode 100644 index 0000000000..b54b17a724 --- /dev/null +++ b/src/test/java/command/FindCommandTest.java @@ -0,0 +1,25 @@ +package command; + +import exceptions.CommandFormatException; +import itemlist.Itemlist; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.fail; + +public class FindCommandTest { + + @Test + public void findCommandTest() throws CommandFormatException { + Command addCommandTest1 = new AddCommand("testItem", 1, "EA", + "NA", 1, 10); + Command findCommand = new FindCommand("testItem"); + Command findCommand2 = new FindCommand("failFindCommand"); + + addCommandTest1.execute(); + findCommand.execute(); + assert(Itemlist.itemIsExist("testItem")); + assert(!Itemlist.itemIsExist("failFindCommand")); + findCommand2.execute(); + fail("Item failFindCommand does not exist."); + } +} From 2c57f8dfbb713806675d4037c70505116b9f0d4a Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 23:48:51 +0800 Subject: [PATCH 128/421] Remove unnecessary imports --- src/test/java/command/AddCommandTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index 9003956d47..73e8d49f72 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -1,7 +1,6 @@ package command; import exceptions.CommandFormatException; -import item.Item; import itemlist.Itemlist; import org.junit.jupiter.api.Test; From eb39528ad6258f01a8a752373383b8ac2316e2ae Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 29 Mar 2024 23:55:33 +0800 Subject: [PATCH 129/421] Add DeleteCommand exception handling --- src/main/java/command/DeleteCommand.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 5b436cbf26..3c400fa260 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -14,6 +14,7 @@ public DeleteCommand(String itemName) { public void execute() { int index = -1; + try { for (Item item : Itemlist.getItems()) { if (item.getItemName().toLowerCase().equals(itemName)) { index = Itemlist.getItems().indexOf(item); @@ -30,5 +31,8 @@ public void execute() { assert(!Itemlist.getItem(index).getItemName().equals(itemName)); } + } catch (IndexOutOfBoundsException e) { + System.out.println("Itemlist is empty."); + } } } From 6262b4cb2ed557af2cd20e7127a87f9fbe8d758f Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 30 Mar 2024 00:01:12 +0800 Subject: [PATCH 130/421] Fix indentation --- src/main/java/command/DeleteCommand.java | 28 ++++++++++---------- src/test/java/command/AddCommandTest.java | 1 - src/test/java/command/DeleteCommandTest.java | 1 - src/test/java/command/FindCommandTest.java | 5 ++-- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 3c400fa260..8ae8629e34 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -15,22 +15,22 @@ public DeleteCommand(String itemName) { public void execute() { int index = -1; try { - for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { - index = Itemlist.getItems().indexOf(item); - break; + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + index = Itemlist.getItems().indexOf(item); + break; + } } - } - if (index == -1) { - //throw exception; - System.out.println("Item does not exist."); - } else { - Itemlist.deleteItem(index); - System.out.println(itemName + " has been successfully deleted."); - Storage.overwriteFile(Itemlist.getItems()); - assert(!Itemlist.getItem(index).getItemName().equals(itemName)); + if (index == -1) { + //throw exception; + System.out.println("Item does not exist."); + } else { + Itemlist.deleteItem(index); + System.out.println(itemName + " has been successfully deleted."); + Storage.overwriteFile(Itemlist.getItems()); + assert(!Itemlist.getItem(index).getItemName().equals(itemName)); - } + } } catch (IndexOutOfBoundsException e) { System.out.println("Itemlist is empty."); } diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index 73e8d49f72..9e7acddcc3 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -16,7 +16,6 @@ public void addItemTest() throws CommandFormatException { Command addCommandTest2 = new AddCommand("testItem", 7, "EA", "NA", 1, 10); addCommandTest1.execute(); - assert(Itemlist.itemIsExist("testItem")); addCommandTest2.execute(); } catch (CommandFormatException e) { fail("Unable to add item."); diff --git a/src/test/java/command/DeleteCommandTest.java b/src/test/java/command/DeleteCommandTest.java index 2918969c3a..62e8fecf94 100644 --- a/src/test/java/command/DeleteCommandTest.java +++ b/src/test/java/command/DeleteCommandTest.java @@ -19,7 +19,6 @@ public void delCommandTest_success() throws CommandFormatException { deleteCommand.execute(); assertFalse(Itemlist.itemIsExist("testItem")); deleteCommand.execute(); - fail("Item does not exist"); } catch (CommandFormatException e) { fail("Unable to delete."); } diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index b54b17a724..173fc8bfe2 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -4,6 +4,7 @@ import itemlist.Itemlist; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.fail; public class FindCommandTest { @@ -17,9 +18,7 @@ public void findCommandTest() throws CommandFormatException { addCommandTest1.execute(); findCommand.execute(); - assert(Itemlist.itemIsExist("testItem")); - assert(!Itemlist.itemIsExist("failFindCommand")); findCommand2.execute(); - fail("Item failFindCommand does not exist."); + assertFalse(Itemlist.itemIsExist("failFindCommand")); } } From de045a8f3a2a012d36d54bf29d47962a8562bf63 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 30 Mar 2024 00:02:48 +0800 Subject: [PATCH 131/421] Remove unused imports --- src/test/java/command/AddCommandTest.java | 1 - src/test/java/command/FindCommandTest.java | 1 - 2 files changed, 2 deletions(-) diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index 9e7acddcc3..f307cbbed8 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -1,7 +1,6 @@ package command; import exceptions.CommandFormatException; -import itemlist.Itemlist; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.fail; diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 173fc8bfe2..8b61401cb1 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.fail; public class FindCommandTest { From c51f5d2f6818a293587ac093b484219bce0bfc04 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 30 Mar 2024 17:48:17 +0800 Subject: [PATCH 132/421] edit DG itemlist and item --- docs/DeveloperGuide.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c09f7f9e91..7bfd081572 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -9,6 +9,11 @@ {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} ### Exception ### Itemlist +Itemlist class is an object which contains items to be added to the stock inventory list. Able to add items, remove functions, edit items inside +the list. +### Item +Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, +quantity of item, and others. ### Parser Parser class processes user inputs and sieves out relevant details before calling the relevant methods. It contains command formats that must be adhered to for the methods to be called. From 0fce83f8f4bf02b1aff2d8b797191a7ac85f6dcd Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 30 Mar 2024 17:57:56 +0800 Subject: [PATCH 133/421] change noofitems to be in itemllist rather than item --- src/main/java/item/Item.java | 5 +++-- src/main/java/itemlist/Itemlist.java | 1 + 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 8999cf4b8a..8829e26852 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,7 +1,8 @@ package item; +import itemlist.Itemlist; + public class Item { - public static int numberOfItems; private final String itemName; private int quantity; private final String uom; @@ -27,7 +28,7 @@ public Item(String name, int quantity, String uom, String category, int buyPrice } else { this.isOOS = false; } - numberOfItems++; + Itemlist.noOfItems++; } public String getCategory() { diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index da6f42f883..76f6e391dd 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -5,6 +5,7 @@ public class Itemlist { private static final ArrayList items = new ArrayList<>(); + public static int noOfItems; public Itemlist() { } From da767004f6caafbbdf6fa3672d273a9401b01fa3 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 30 Mar 2024 18:00:14 +0800 Subject: [PATCH 134/421] edit to fix checkstyle error --- src/main/java/itemlist/Itemlist.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 76f6e391dd..4777701691 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -4,8 +4,8 @@ import java.util.ArrayList; public class Itemlist { - private static final ArrayList items = new ArrayList<>(); public static int noOfItems; + private static final ArrayList items = new ArrayList<>(); public Itemlist() { } From 33b5a6af5f1bd40e7a15cfe957bd7709461eed92 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 30 Mar 2024 18:12:37 +0800 Subject: [PATCH 135/421] commit temp to pull again --- src/main/java/command/EditCommand.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index be4e9d55c2..d9463550f2 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -4,13 +4,13 @@ import itemlist.Itemlist; import storage.Storage; -public class EditCommand extends Command { +public class EditCommand extends Command{ protected String itemName; protected int newQuantity; - public EditCommand (String itemName, int newQuantity) { + public EditCommand(String itemName, int newQuantity) { this.itemName = itemName; this.newQuantity = newQuantity; } From 2e32fc39088a0d479dc61fd552746e349d0838de Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sat, 30 Mar 2024 19:43:44 +0800 Subject: [PATCH 136/421] Add documentation --- src/main/java/storage/Storage.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 228834cdc3..723abe4f48 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -59,6 +59,7 @@ public static File setFile() { * Read lines from the file and identify tasks written inside. * Add the identified tasks into a list of existing tasks. * + * @param fileName Name of the file to read from. */ public static void readFromFile(String fileName) { try { @@ -102,6 +103,11 @@ public static void readFromFile(String fileName) { } } + /** + * Writes to the indicated file without overwriting the previous information. + * + * @param items List of items with relevant details to write. + */ public static void addToFile(ArrayList items) { assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); @@ -112,6 +118,11 @@ public static void addToFile(ArrayList items) { updateFile(descriptionAdded, true); } + /** + * Writes to the indicated file and overwrite previous data. + * + * @param items List of items with relevant details to write. + */ public static void overwriteFile(ArrayList items) { assert items != null : "Items cannot be null."; int length = items.size(); From 97ac2ece97f0c6923a0cd706d95c4dc34dc9cc1b Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Sun, 31 Mar 2024 16:12:06 +0800 Subject: [PATCH 137/421] change list to list all parameters assosiated to the item add list [CATEGORY] to list items of that category only --- StockMasterData.txt | 17 +++++++++++++++++ src/main/java/command/ListCommand.java | 13 ++++++++++--- src/main/java/item/Item.java | 9 +++++++-- src/main/java/parser/Parser.java | 18 +++++++++++++++++- src/main/java/ui/TextUi.java | 20 ++++++++++++++++++++ 5 files changed, 71 insertions(+), 6 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8b13789179..6059f45a69 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,18 @@ +1. | test | Qty: 10 cans | Cat: food | BuyPrice: $10 | SellPrice: $12 +1. | test | Qty: 10 cans | Cat: food | BuyPrice: $10 | SellPrice: $12 +1. | item | Qty: 10 dog | Cat: food | BuyPrice: $10 | SellPrice: $12 +2. | item2 | Qty: 10 dog | Cat: food | BuyPrice: $10 | SellPrice: $12 +3. | item3 | Qty: 10 dog | Cat: null | BuyPrice: $10 | SellPrice: $12 +4. | item5 | Qty: 10 dog | Cat: null | BuyPrice: $10 | SellPrice: $12 +1. | test | Qty: 10 cans | Cat: dog | BuyPrice: $10 | SellPrice: $12 +1. | item | Qty: 10 cans | Cat: dog | BuyPrice: $10 | SellPrice: $12 +1. | item | Qty: 10 cans | Cat: dog | BuyPrice: $10 | SellPrice: $12 +1. | item | Qty: 20 dog | Cat: dog | BuyPrice: $10 | SellPrice: $20 +1. | item | Qty: 20 dog | Cat: dog | BuyPrice: $10 | SellPrice: $20 +1. | item | Qty: 20 dog | Cat: dog | BuyPrice: $10 | SellPrice: $20 +1. | test | Qty: 10 dogs | Cat: food | BuyPrice: $10 | SellPrice: $12 +1. | test | Qty: 10 dogs | Cat: food | BuyPrice: $10 | SellPrice: $12 +2. | test2 | Qty: 10 test | Cat: food | BuyPrice: $10 | SellPrice: $12 +3. | test3 | Qty: 10 dogs | Cat: notfood | BuyPrice: $10 | SellPrice: $12 +1. | test3 | Qty: 10 dogs | Cat: notfood | BuyPrice: $10 | SellPrice: $12 diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index b46e923ba8..d63a2e2a30 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -1,19 +1,26 @@ package command; +import item.Item; import ui.TextUi; import java.util.ArrayList; public class ListCommand extends Command{ - protected ArrayList arrayList; + protected ArrayList arrayList; + protected String category; - public ListCommand(ArrayList arrayList) { + public ListCommand(ArrayList arrayList, String category) { this.arrayList = arrayList; + this.category = category; } public void execute() { - TextUi.showInventoryList(arrayList); + if (!category.equals("NA")) { + TextUi.showCategoryList(arrayList, category); + } else { + TextUi.showInventoryList(arrayList); + } } } diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 8829e26852..4545f1145c 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -68,9 +68,14 @@ public void unmarkOOS() { this.isOOS = false; } - public String toString() { +/* public String toString() { String categoryString = (getCategory() != null) ? " to " + getCategory() : ""; // Check if category is null return (getItemName() + " (Qty " + getQuantity() + getUom() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")" + categoryString); - } + }*/ + public String toString() { + String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; // Check if category is null + return (getItemName() + " (Qty: " + getQuantity() + getUom() + + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); +} } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 78a5bb28bd..a4384e784b 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -39,6 +39,8 @@ public class Parser { public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); + public static final Pattern LIST_COMMAND_FORMAT = + Pattern.compile("list(?: (?[^/]+))?"); public Command parseInput(String userInput){ final CommandType userCommand; @@ -62,7 +64,11 @@ public Command parseInput(String userInput){ case HELP: return new HelpCommand(); case LIST: - return new ListCommand<>(Itemlist.getItems()); + try { + return prepareList(userInput); + } catch (CommandFormatException e) { + break; + } case ADD: try { return prepareAdd(userInput); @@ -173,6 +179,16 @@ private Command prepareFind(String args) throws CommandFormatException{ } return new FindCommand(matcher.group("itemName")); } + + private Command prepareList(String args) throws CommandFormatException { + final Matcher matcher = LIST_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.LIST); + } + String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + return new ListCommand<>(Itemlist.getItems(), category); + } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 405d7b4b6f..ed378164a1 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,7 +1,9 @@ package ui; +import javax.print.attribute.standard.MediaSize; import java.util.ArrayList; import java.util.Scanner; +import item.Item; public class TextUi { @@ -69,6 +71,24 @@ public static void showInventoryList(ArrayList arrayList) { } } } + public static void showCategoryList (ArrayList arrayList, String category) { + if (arrayList.isEmpty()) { + replyToUser("There is nothing here! Time to spend some money and stock em up!"); + } else { + int flag = 0; + int counter = 1; + for (Item item : arrayList) { + if (item.getCategory().equals(category)) { + replyToUser(counter + ". Item Index: " + (arrayList.indexOf(item) + 1) + ". " + item); + counter++; + flag = 1; + } + } + if (flag == 0) { + replyToUser("No items were found within the category " + category + "."); + } + } + } public static void showEditMessage(String item, int oldQuantity, int newQuantity) { replyToUser("\n" + From af7811e74aff2119e92aff8589aa110f7ad69a31 Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Sun, 31 Mar 2024 16:13:38 +0800 Subject: [PATCH 138/421] make changes to fix gradle checkstyle errors --- src/main/java/item/Item.java | 13 ++++--------- src/main/java/ui/TextUi.java | 1 - 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 4545f1145c..707d16e239 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -68,14 +68,9 @@ public void unmarkOOS() { this.isOOS = false; } -/* public String toString() { - String categoryString = (getCategory() != null) ? " to " + getCategory() : ""; // Check if category is null - return (getItemName() + " (Qty " + getQuantity() + getUom() + - ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")" + categoryString); - }*/ public String toString() { - String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; // Check if category is null - return (getItemName() + " (Qty: " + getQuantity() + getUom() + - ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); -} + String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; + return (getItemName() + " (Qty: " + getQuantity() + getUom() + + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); + } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index ed378164a1..007243583b 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -1,6 +1,5 @@ package ui; -import javax.print.attribute.standard.MediaSize; import java.util.ArrayList; import java.util.Scanner; import item.Item; From 6b0d414a83ab49d4e1214584b9232daa2eb7d617 Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Sun, 31 Mar 2024 16:25:02 +0800 Subject: [PATCH 139/421] change buyprices and sellprices to floats instead of int --- StockMasterData.txt | 19 ++----------------- src/main/java/command/AddCommand.java | 10 +++++----- src/main/java/command/SellCommand.java | 6 +++--- src/main/java/item/Item.java | 10 +++++----- src/main/java/item/Transaction.java | 16 ++++++++-------- src/main/java/parser/Parser.java | 6 +++--- src/main/java/ui/TextUi.java | 2 +- 7 files changed, 27 insertions(+), 42 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 6059f45a69..76093ad89e 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,18 +1,3 @@ -1. | test | Qty: 10 cans | Cat: food | BuyPrice: $10 | SellPrice: $12 -1. | test | Qty: 10 cans | Cat: food | BuyPrice: $10 | SellPrice: $12 -1. | item | Qty: 10 dog | Cat: food | BuyPrice: $10 | SellPrice: $12 -2. | item2 | Qty: 10 dog | Cat: food | BuyPrice: $10 | SellPrice: $12 -3. | item3 | Qty: 10 dog | Cat: null | BuyPrice: $10 | SellPrice: $12 -4. | item5 | Qty: 10 dog | Cat: null | BuyPrice: $10 | SellPrice: $12 -1. | test | Qty: 10 cans | Cat: dog | BuyPrice: $10 | SellPrice: $12 -1. | item | Qty: 10 cans | Cat: dog | BuyPrice: $10 | SellPrice: $12 -1. | item | Qty: 10 cans | Cat: dog | BuyPrice: $10 | SellPrice: $12 -1. | item | Qty: 20 dog | Cat: dog | BuyPrice: $10 | SellPrice: $20 -1. | item | Qty: 20 dog | Cat: dog | BuyPrice: $10 | SellPrice: $20 -1. | item | Qty: 20 dog | Cat: dog | BuyPrice: $10 | SellPrice: $20 -1. | test | Qty: 10 dogs | Cat: food | BuyPrice: $10 | SellPrice: $12 -1. | test | Qty: 10 dogs | Cat: food | BuyPrice: $10 | SellPrice: $12 -2. | test2 | Qty: 10 test | Cat: food | BuyPrice: $10 | SellPrice: $12 -3. | test3 | Qty: 10 dogs | Cat: notfood | BuyPrice: $10 | SellPrice: $12 -1. | test3 | Qty: 10 dogs | Cat: notfood | BuyPrice: $10 | SellPrice: $12 +1. | potatoes | Qty: 491 pieces | Cat: food | BuyPrice: $0.5 | SellPrice: $1.2 +2. | cherries | Qty: 999 pieces | Cat: fruit | BuyPrice: $0.2 | SellPrice: $0.5 diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index ed244ebcca..3c7335e809 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -11,11 +11,11 @@ public class AddCommand extends Command { protected int quantity; protected String uom; protected String category = "NA"; - protected int buyPrice; - protected int sellPrice; + protected float buyPrice; + protected float sellPrice; private final Item toAdd; - public AddCommand(String itemName, int quantity, String uom, String category, int buyPrice, int sellPrice) { + public AddCommand(String itemName, int quantity, String uom, String category, float buyPrice, float sellPrice) { this.itemName = itemName; this.quantity = quantity; this.uom = uom; @@ -37,10 +37,10 @@ public String getCategory() { public String getUom() { return uom; } - public int getBuyPrice() { + public float getBuyPrice() { return buyPrice; } - public int getSellPrice() { + public float getSellPrice() { return sellPrice; } diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 292f311ea7..226b3230d4 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -12,9 +12,9 @@ public class SellCommand extends Command { protected String itemName; protected int sellQuantity; - protected int sellPrice; + protected float sellPrice; - public SellCommand (String itemName, int quantity, int price) { + public SellCommand (String itemName, int quantity, float price) { this.itemName = itemName; this.sellQuantity = quantity; this.sellPrice = price; @@ -32,7 +32,7 @@ public void execute() { } } int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; - int sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); + float sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); if (index == -1) { //throw exception; System.out.println("Item not found!"); diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 707d16e239..bca8f27e4f 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -7,12 +7,12 @@ public class Item { private int quantity; private final String uom; private final String category; - private int buyPrice; - private int sellPrice; + private float buyPrice; + private float sellPrice; private boolean isOOS; - public Item(String name, int quantity, String uom, String category, int buyPrice, int sellPrice) { + public Item(String name, int quantity, String uom, String category, float buyPrice, float sellPrice) { this.itemName = name; this.quantity = quantity; this.uom = uom; @@ -53,10 +53,10 @@ public void setQuantity(int newQuantity) { this.quantity = newQuantity; } - public int getBuyPrice() { + public float getBuyPrice() { return buyPrice; } - public int getSellPrice() { + public float getSellPrice() { return sellPrice; } diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 0e6b64f6bc..dfa4a959f3 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -5,14 +5,14 @@ public class Transaction { private String dateTime; - private int totalPrice; - private int profit; + private float totalPrice; + private float profit; private String itemName; private int quantity; - private int buyPrice; - private int sellPrice; + private float buyPrice; + private float sellPrice; - public Transaction(String name, int inputQty, int inputBuy, int inputSell) { + public Transaction(String name, int inputQty, float inputBuy, float inputSell) { setDateTime(); itemName = name; quantity = inputQty; @@ -40,7 +40,7 @@ public int getQuantity() { return this.quantity; } - public int getSellPrice() { + public float getSellPrice() { return this.sellPrice; } @@ -48,11 +48,11 @@ public String getDateTime() { return this.dateTime; } - public int getTotalPrice() { + public float getTotalPrice() { return this.totalPrice; } - public int getProfit() { + public float getProfit() { return this.profit; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index a4384e784b..37a0270b30 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -21,7 +21,7 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + - "(?: cat/(?[^/]+))? buy/(?\\d+) sell/(?\\d+)"); + "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); public static final Pattern DELETE_COMMAND_FORMAT = @@ -115,8 +115,8 @@ private Command prepareAdd(String args) throws CommandFormatException{ } String category = matcher.group("category") != null ? matcher.group("category") : "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); - int buyPrice = Integer.parseInt(matcher.group("buyPrice")); - int sellPrice = Integer.parseInt(matcher.group("sellPrice")); + float buyPrice = Float.parseFloat(matcher.group("buyPrice")); + float sellPrice = Float.parseFloat(matcher.group("sellPrice")); assert quantity >= 0 : "Quantity should not be negative."; return new AddCommand( matcher.group("itemName"), diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 007243583b..ea4fce7126 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -95,7 +95,7 @@ public static void showEditMessage(String item, int oldQuantity, int newQuantity ); } - public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, int sellPrice) { + public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { replyToUser("Quantity of " + item + " sold: " + sellQuantity + ", for: $" + sellPrice + "\n" + "Quantity remaining: " + remainingQuantity ); From 882b2efa4ce6a33c916d5eb4f979c4e776d592b6 Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Sun, 31 Mar 2024 18:49:36 +0800 Subject: [PATCH 140/421] change edit function to be able to edit all parameters --- StockMasterData.txt | 3 -- src/main/java/command/EditCommand.java | 52 +++++++++++++++++++++++--- src/main/java/common/Messages.java | 7 +++- src/main/java/item/Item.java | 30 +++++++++++++-- src/main/java/parser/Parser.java | 26 ++++++++++--- src/main/java/ui/TextUi.java | 31 ++++++++++++--- 6 files changed, 123 insertions(+), 26 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 76093ad89e..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,3 +0,0 @@ - -1. | potatoes | Qty: 491 pieces | Cat: food | BuyPrice: $0.5 | SellPrice: $1.2 -2. | cherries | Qty: 999 pieces | Cat: fruit | BuyPrice: $0.2 | SellPrice: $0.5 diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index d9463550f2..9617e2c576 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -7,12 +7,22 @@ public class EditCommand extends Command{ protected String itemName; - + protected String newItemName; protected int newQuantity; + protected String newUom; + protected String newCategory; + protected float newBuyPrice; + protected float newSellPrice; - public EditCommand(String itemName, int newQuantity) { + public EditCommand(String itemName, String newItemName, int newQuantity, String newUom, String newCategory, + float newBuyPrice, float newSellPrice) { this.itemName = itemName; + this.newItemName = newItemName; this.newQuantity = newQuantity; + this.newUom = newUom; + this.newCategory = newCategory; + this.newBuyPrice = newBuyPrice; + this.newSellPrice = newSellPrice; } @Override @@ -21,17 +31,47 @@ public void execute() { for (Item item : Itemlist.getItems()) { if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { index = Itemlist.getItems().indexOf(item); - item = Itemlist.getItems().get(index); break; } } if (index == -1) { //throw exception; - System.out.println("item not found!"); + ui.TextUi.replyToUser("item not found!"); } else { - ui.TextUi.showEditMessage(itemName, Itemlist.getItem(index).getQuantity(), newQuantity ); - Itemlist.editQuantity(index, newQuantity); + Item item = Itemlist.getItem(index); + String itemName = item.getItemName(); + ui.TextUi.replyToUser("\n" + + "Changed: "); + if (!newItemName.equals("NA")) { + ui.TextUi.showEditMessage(itemName, "newItemName", itemName, newItemName); + item.setItemName(newItemName); + } + if (newQuantity != -1) { + ui.TextUi.showEditMessage(itemName, "newQuantity", String.valueOf(item.getQuantity()), + String.valueOf(newQuantity)); + item.setQuantity(newQuantity); + } + if (!newUom.equals("NA")) { + ui.TextUi.showEditMessage(itemName, "newUom", item.getUom(), newUom); + item.setUom(newUom); + } + if (!newCategory.equals("NA")) { + ui.TextUi.showEditMessage(itemName, "newCategory", String.valueOf(item.getCategory()), + String.valueOf(newCategory)); + item.setCategory(newCategory); + } + if (newBuyPrice != -1) { + ui.TextUi.showEditMessage(itemName, "newBuyPrice", String.valueOf(item.getBuyPrice()), + String.valueOf(newBuyPrice)); + item.setBuyPrice(newBuyPrice); + } + if (newSellPrice != -1) { + ui.TextUi.showEditMessage(itemName, "newSellPrice", String.valueOf(item.getSellPrice()), + String.valueOf(newSellPrice)); + item.setSellPrice(newSellPrice); + } } + ui.TextUi.replyToUser(""); Storage.overwriteFile(Itemlist.getItems()); } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index afb6e63ef0..df4d71a32a 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -8,8 +8,11 @@ public class Messages { "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + "buy/[BUY_PRICE] sell/[SELL_PRICE]'"; public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; - public static final String INVALID_EDIT_FORMAT ="Invalid command format. Please use format: " + - "'edit [ITEM_NAME] qty/[NEW_QUANTITY]'"; + public static final String INVALID_EDIT_FORMAT ="Invalid edit command format. Please use format: " + + "'edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] " + + "buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'\n" + "You can edit at least 1 parameter up to all available" + + " parameters. For example, if you only wish to update buy and sell price, you can input:\n" + + "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'"; public static final String INVALID_SELL_FORMAT ="Invalid command format. Please use format: " + "'sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]'"; public static final String INVALID_SELL_PRICE ="Price cannot be negative!"; diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index bca8f27e4f..186d11e60d 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -3,18 +3,18 @@ import itemlist.Itemlist; public class Item { - private final String itemName; + private String itemName; private int quantity; - private final String uom; - private final String category; + private String uom; + private String category; private float buyPrice; private float sellPrice; private boolean isOOS; - public Item(String name, int quantity, String uom, String category, float buyPrice, float sellPrice) { this.itemName = name; this.quantity = quantity; + assert quantity>= 0 : "Quantity should not be negative."; this.uom = uom; if (category.isEmpty()) { this.category = "NA"; @@ -38,13 +38,26 @@ public String getCategory() { return this.category; } } + + public void setCategory(String newCategory) { + this.category = newCategory; + } public String getItemName() { return this.itemName; } + public void setItemName(String newName) { + this.itemName = newName; + } + public String getUom() { return uom; } + + public void setUom(String newUom) { + this.uom = newUom; + } + public int getQuantity() { return this.quantity; } @@ -56,10 +69,19 @@ public void setQuantity(int newQuantity) { public float getBuyPrice() { return buyPrice; } + + public void setBuyPrice(float newBuyPrice) { + this.buyPrice = newBuyPrice; + } + public float getSellPrice() { return sellPrice; } + public void setSellPrice(float newSellPrice) { + this.sellPrice = newSellPrice; + } + public void markOOS() { this.isOOS = true; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 37a0270b30..0e037b99d5 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -28,7 +28,9 @@ public class Parser { Pattern.compile("del (?[^/]+)"); public static final Pattern EDIT_COMMAND_FORMAT = - Pattern.compile("edit (?[^/]+) qty/(?\\d+)"); + Pattern.compile("edit (?[^/]+)" + + "(?:\\s+(name/(?[^/]+)|qty/(?\\d+)|uom/(?[^/]+)|" + + "cat/(?[^/]+)|buy/(?\\d*\\.?\\d+)|sell/(?\\d*\\.?\\d+)))+"); public static final Pattern SELL_COMMAND_FORMAT = Pattern.compile("sell (?[^/]+) qty/(?\\d+)(?: price/(?[^/]+))?"); @@ -139,15 +141,27 @@ private Command prepareDelete(String args) throws CommandFormatException{ private Command prepareEdit(String args) throws CommandFormatException{ final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); - // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); } - int newQuantity = Integer.parseInt(matcher.group("newQuantity")); - assert newQuantity >= 0 : "New quantity should not be negative."; + String itemName = matcher.group("itemName"); + String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; + int newQuantity = matcher.group("newQuantity") != null ? + Integer.parseInt(matcher.group("newQuantity")) : -1; + String newUom = matcher.group("newUom") != null ? matcher.group("newUom") : "NA"; + String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; + float newBuyPrice = matcher.group("newBuyPrice") != null ? + Float.parseFloat(matcher.group("newBuyPrice")) : -1; + float newSellPrice = matcher.group("newSellPrice") != null ? + Float.parseFloat(matcher.group("newSellPrice")) : -1; return new EditCommand( - matcher.group("itemName"), - newQuantity + itemName, + newItemName, + newQuantity, + newUom, + newCategory, + newBuyPrice, + newSellPrice ); } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index ea4fce7126..5689c74de9 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Scanner; + import item.Item; public class TextUi { @@ -70,7 +71,8 @@ public static void showInventoryList(ArrayList arrayList) { } } } - public static void showCategoryList (ArrayList arrayList, String category) { + + public static void showCategoryList(ArrayList arrayList, String category) { if (arrayList.isEmpty()) { replyToUser("There is nothing here! Time to spend some money and stock em up!"); } else { @@ -89,10 +91,29 @@ public static void showCategoryList (ArrayList arrayList, String category) } } - public static void showEditMessage(String item, int oldQuantity, int newQuantity) { - replyToUser("\n" + - "Changed quantity of " + item + " from " + oldQuantity + " to " + newQuantity - ); + public static void showEditMessage(String item, String editedParameter, String oldParameter, String newParameter) { + switch (editedParameter) { + case "newItemName": + replyToUser("Name of " + item + " from " + oldParameter + " to " + newParameter); + break; + case "newQuantity": + replyToUser("Quantity of " + item + " from " + oldParameter + " to " + newParameter); + break; + case "newUom": + replyToUser("Unit of Measurement of " + item + " from " + oldParameter + " to " + newParameter); + break; + case "newCategory": + replyToUser("Category of " + item + " from " + oldParameter + " to " + newParameter); + break; + case "newBuyPrice": + replyToUser("Buy Price of " + item + " from " + oldParameter + " to " + newParameter); + break; + case "newSellPrice": + replyToUser("Sell Price of " + item + " from " + oldParameter + " to " + newParameter); + break; + default: + break; + } } public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { From 19e77f22e64a2a429b5f77de64ad887d82996a67 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 31 Mar 2024 21:24:52 +0800 Subject: [PATCH 141/421] Fix readFile --- StockMasterData.txt | 2 ++ src/main/java/storage/Storage.java | 10 ++++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..3a2dd251a7 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1,2 @@ +1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 +2. | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 723abe4f48..e0f66ab9b5 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -65,7 +65,8 @@ public static void readFromFile(String fileName) { try { Scanner scanner = new Scanner(new File(fileName)); while (scanner.hasNext()) { - String fileLine = "add" + scanner.nextLine(); + //String fileLine = "add" + scanner.nextLine(); + String fileLine = scanner.nextLine(); String[] keyCommands = fileLine.split(" \\| "); String commandQty = ""; String commandCat = ""; @@ -74,7 +75,7 @@ public static void readFromFile(String fileName) { String commandSell = ""; String commandName = ""; for (String keyCommand : keyCommands) { - if (keyCommand.contains(".")) { + if (keyCommand.contains("add")) { //do nothing. } else if (keyCommand.contains("Qty: ")) { String[] commandQtyUnit = keyCommand.replace("Qty: ", "").split(" "); @@ -88,12 +89,13 @@ public static void readFromFile(String fileName) { } else if (keyCommand.contains("SellPrice: $")) { commandSell = keyCommand.replace("SellPrice: $", ""); } else { - commandName = keyCommand; + commandName = keyCommand.trim(); } } Item toAdd = new Item(commandName, Integer.parseInt(commandQty), commandUom, commandCat, - Integer.parseInt(commandBuy), Integer.parseInt(commandSell)); + Float.parseFloat(commandBuy), Float.parseFloat(commandSell)); Itemlist.addItem(toAdd); + } scanner.close(); } catch(FileNotFoundException e) { From eca574b445f84d2610fe0fa11d90698fc213617d Mon Sep 17 00:00:00 2001 From: guanlinmin Date: Sun, 31 Mar 2024 23:38:09 +0800 Subject: [PATCH 142/421] add //@@author tags --- src/main/java/command/EditCommand.java | 1 + src/main/java/command/ListCommand.java | 1 + src/main/java/command/SellCommand.java | 1 - src/main/java/item/Item.java | 1 + src/main/java/itemlist/Itemlist.java | 1 + src/main/java/parser/Parser.java | 53 +++++++++++++------------- src/main/java/ui/TextUi.java | 12 +++--- 7 files changed, 38 insertions(+), 32 deletions(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 9617e2c576..7ec080cbcf 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -1,3 +1,4 @@ +//@@author Fureimi package command; import item.Item; diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index d63a2e2a30..2b10ad6829 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -15,6 +15,7 @@ public ListCommand(ArrayList arrayList, String category) { this.category = category; } + //@@author Fureimi public void execute() { if (!category.equals("NA")) { TextUi.showCategoryList(arrayList, category); diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 226b3230d4..2b995877f3 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -7,7 +7,6 @@ import storage.Storage; import storage.TransactionLogs; - public class SellCommand extends Command { protected String itemName; diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 186d11e60d..c8bb98ae5f 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -1,3 +1,4 @@ +//@@author Fureimi package item; import itemlist.Itemlist; diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 4777701691..0062ea68fe 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -1,3 +1,4 @@ +//@@author Fureimi package itemlist; import item.Item; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 0e037b99d5..5f79a48c13 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -139,32 +139,6 @@ private Command prepareDelete(String args) throws CommandFormatException{ return new DeleteCommand(matcher.group("itemName")); } - private Command prepareEdit(String args) throws CommandFormatException{ - final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); - if (!matcher.matches()) { - throw new CommandFormatException(CommandType.EDIT); - } - String itemName = matcher.group("itemName"); - String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; - int newQuantity = matcher.group("newQuantity") != null ? - Integer.parseInt(matcher.group("newQuantity")) : -1; - String newUom = matcher.group("newUom") != null ? matcher.group("newUom") : "NA"; - String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; - float newBuyPrice = matcher.group("newBuyPrice") != null ? - Float.parseFloat(matcher.group("newBuyPrice")) : -1; - float newSellPrice = matcher.group("newSellPrice") != null ? - Float.parseFloat(matcher.group("newSellPrice")) : -1; - return new EditCommand( - itemName, - newItemName, - newQuantity, - newUom, - newCategory, - newBuyPrice, - newSellPrice - ); - } - private Command prepareSell(String args) throws CommandFormatException{ final Matcher matcher = SELL_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format @@ -194,6 +168,33 @@ private Command prepareFind(String args) throws CommandFormatException{ return new FindCommand(matcher.group("itemName")); } + //@@author Fureimi + private Command prepareEdit(String args) throws CommandFormatException{ + final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.EDIT); + } + String itemName = matcher.group("itemName"); + String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; + int newQuantity = matcher.group("newQuantity") != null ? + Integer.parseInt(matcher.group("newQuantity")) : -1; + String newUom = matcher.group("newUom") != null ? matcher.group("newUom") : "NA"; + String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; + float newBuyPrice = matcher.group("newBuyPrice") != null ? + Float.parseFloat(matcher.group("newBuyPrice")) : -1; + float newSellPrice = matcher.group("newSellPrice") != null ? + Float.parseFloat(matcher.group("newSellPrice")) : -1; + return new EditCommand( + itemName, + newItemName, + newQuantity, + newUom, + newCategory, + newBuyPrice, + newSellPrice + ); + } + private Command prepareList(String args) throws CommandFormatException { final Matcher matcher = LIST_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 5689c74de9..b3db86e490 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -72,6 +72,13 @@ public static void showInventoryList(ArrayList arrayList) { } } + public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { + replyToUser("Quantity of " + item + " sold: " + sellQuantity + ", for: $" + sellPrice + "\n" + + "Quantity remaining: " + remainingQuantity + ); + } + + //@@author Fureimi public static void showCategoryList(ArrayList arrayList, String category) { if (arrayList.isEmpty()) { replyToUser("There is nothing here! Time to spend some money and stock em up!"); @@ -116,9 +123,4 @@ public static void showEditMessage(String item, String editedParameter, String o } } - public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { - replyToUser("Quantity of " + item + " sold: " + sellQuantity + ", for: $" + sellPrice + "\n" + - "Quantity remaining: " + remainingQuantity - ); - } } From feb7626b2cd5cc46315b94bd20a2914924f9cd49 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 31 Mar 2024 23:58:16 +0800 Subject: [PATCH 143/421] Edit AddCommand --- StockMasterData.txt | 2 +- src/main/java/command/AddCommand.java | 19 +++++++++++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 3a2dd251a7..d60c8f81d5 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,2 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +2. | apple | Qty: 30 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 3c7335e809..454cd02188 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -47,10 +47,10 @@ public float getSellPrice() { @Override public void execute() { if (Itemlist.itemIsExist(itemName)) { - System.out.println("Item already exists. To increase the quantity, please use the edit command"); + updateQuantity(itemName); } else { Itemlist.addItem(toAdd); - System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + getUom() + + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUom() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); Storage.addToFile(Itemlist.getItems()); if (!category.equals("NA")) { @@ -61,4 +61,19 @@ public void execute() { } } } + + public void updateQuantity(String itemName) { + System.out.println("Item already exists and quantity has been changed"); + int indexOfItem = -1; + for (Item item : Itemlist.getItems()) { + if (item.getItemName().toLowerCase().equals(itemName)) { + indexOfItem = Itemlist.getIndex(item); + } + } + assert indexOfItem != -1; + int currentQty = Itemlist.getItem(indexOfItem).getQuantity(); + int newQty = getQuantity() + currentQty; + new EditCommand(getItemName(), "NA", newQty, "NA", "NA", -1, + -1).execute(); + } } From 78cd321b913f63ff37d27925eeaf6445ef3eced5 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 1 Apr 2024 02:26:25 +0800 Subject: [PATCH 144/421] Edit FindCommand --- StockMasterData.txt | 2 +- docs/UserGuide.md | 31 ++++++++++++++---- src/main/java/command/FindCommand.java | 38 ++++++++++++++++++---- src/main/java/common/Messages.java | 4 ++- src/main/java/parser/Parser.java | 7 ++-- src/test/java/command/FindCommandTest.java | 4 +-- 6 files changed, 67 insertions(+), 19 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index d60c8f81d5..6dd76171fc 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,2 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | apple | Qty: 30 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d9cbd084b8..d0ca6c7ba4 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -19,14 +19,18 @@ StockMaster is a platform aimed at helping SMEs track and organise their invento ### Adding an item: `add` Adds a new item to the list of items. -Format: `add ITEM_NAME qty/ITEM_QUANTITY [cat/CATEGORY]` +Format: `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]` * `CATEGORY` is an optional field. If blank, it will default to `N/A`. +> [ !NOTE ] +> +> Addition of an item with the same `ITEM_NAME` will edit the `ITEM_QUANTITY` instead + Example of usage: ``` -add Apples qty/50 -add Phone qty/5 cat/Electronics +add Apple qty/50 /pieces cat/fruits buy/4 sell/5 +add Phone qty/5 /pieces cat/Electronics buy/100 sell/500 ``` ### Deleting an item: `del` @@ -49,6 +53,13 @@ Example of usage: edit Apples qty/10 edit Phone qty/0 ``` +### Finding an item: `find` +Finds all items that contains `KEYWORD` + +Format: `find KEYWORD` + +* The search is case-insensitive e.g. `apple` will match `Apple`. +* Partial words will be matched e.g. `app` will match `Apple`. ### Listing all items: `list` Lists all stored items. @@ -92,7 +103,13 @@ the application. ## Command Summary -* Add new item: `add Apples qty/10 cat/Food` -* Delete an item: `delete Apples` -* List all items: `list` -* List all commands: `help` \ No newline at end of file +| Action | Format, Examples | +|-------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | +| Delete Item | `del ITEM_NAME`
`e.g. del Apple` | +| Edit Item | | +| Find Item | `find KEYWORD`
`e.g. find University` | +| Sell Item | | +| List | `list` | +| Help | `help` | +| Exit | `exit` | diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 721839cc1e..66e779d737 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -6,22 +6,48 @@ import java.util.ArrayList; -public class FindCommand extends Command{ +public class FindCommand extends Command { - protected String itemName; + protected String keyword; - public FindCommand(String itemName) { - this.itemName = itemName; + protected String itemInfo; + + public FindCommand(String itemInfo, String keyword) { + this.keyword = keyword; + this.itemInfo = itemInfo; } @Override public void execute() { + if (itemInfo.equals("NA")) { + itemInfo = "item + qty + uom + cat + buy + sell" + itemInfo; + } + ArrayList searchList = filterList(); + TextUi.showInventoryList(searchList); + } + + public ArrayList filterList() { ArrayList searchList = new ArrayList<>(); for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().contains(itemName)) { + if (itemInfo.toLowerCase().contains("item") && item.getItemName().toLowerCase().contains(keyword)) { + searchList.add(String.valueOf(item)); + } + if (itemInfo.toLowerCase().contains("qty") && Integer.toString(item.getQuantity()).contains(keyword)) { + searchList.add(String.valueOf(item)); + } + if (itemInfo.toLowerCase().contains("uom") && item.getUom().toLowerCase().contains(keyword)) { + searchList.add(String.valueOf(item)); + } + if (itemInfo.toLowerCase().contains("cat") && item.getCategory().toLowerCase().contains(keyword)) { + searchList.add(String.valueOf(item)); + } + if (itemInfo.toLowerCase().contains("buy") && Float.toString(item.getBuyPrice()).contains(keyword)) { + searchList.add(String.valueOf(item)); + } + if (itemInfo.toLowerCase().contains("sell") && Float.toString(item.getSellPrice()).contains(keyword)) { searchList.add(String.valueOf(item)); } } - TextUi.showInventoryList(searchList); + return searchList; } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index df4d71a32a..13f2cae450 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -17,7 +17,9 @@ public class Messages { "'sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]'"; public static final String INVALID_SELL_PRICE ="Price cannot be negative!"; - public static final String INVALID_FIND_FORMAT ="Invalid command format. Please use format: 'find [ITEM_NAME]'"; + public static final String INVALID_FIND_FORMAT ="Invalid command format. Please use format: " + "\n" + + "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + + "2. 'find /filter1/filter2 [KEYWORD] to search under the filters"; public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 0e037b99d5..653ae27570 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -36,7 +36,7 @@ public class Parser { Pattern.compile("sell (?[^/]+) qty/(?\\d+)(?: price/(?[^/]+))?"); public static final Pattern FIND_COMMAND_FORMAT = - Pattern.compile("find (?[^/]+)"); + Pattern.compile("find(?: /(?[^/]+))* (?[^/]+)"); public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); @@ -191,7 +191,10 @@ private Command prepareFind(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.FIND); } - return new FindCommand(matcher.group("itemName")); + String itemInfo = matcher.group("itemInfo") != null ? matcher.group("itemInfo") : "NA"; + return new FindCommand( + itemInfo, + matcher.group("keyword")); } private Command prepareList(String args) throws CommandFormatException { diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 8b61401cb1..0a473c29af 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -12,8 +12,8 @@ public class FindCommandTest { public void findCommandTest() throws CommandFormatException { Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); - Command findCommand = new FindCommand("testItem"); - Command findCommand2 = new FindCommand("failFindCommand"); + Command findCommand = new FindCommand("NA","testItem"); + Command findCommand2 = new FindCommand("NA","failFindCommand"); addCommandTest1.execute(); findCommand.execute(); From 18757e3a5eae1b282b71ecd1e2c329ebfe990cec Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 1 Apr 2024 03:11:27 +0800 Subject: [PATCH 145/421] Update UG for FindCommand --- docs/UserGuide.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d0ca6c7ba4..73ae0c0228 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -56,11 +56,19 @@ edit Phone qty/0 ### Finding an item: `find` Finds all items that contains `KEYWORD` -Format: `find KEYWORD` +Format: `find [/filter1/filter2] KEYWORD` +* Filter will specify the parameters that is being searched. +* If no filter is applied, it will search all items that contains `KEYWORD. * The search is case-insensitive e.g. `apple` will match `Apple`. * Partial words will be matched e.g. `app` will match `Apple`. +Example of usage: +``` +find /qty/cat Apple //search for `Apple` under `ITEM_QUANTITY` and `CATEGORY` +find Apple //search all items that contains `Apple` +``` + ### Listing all items: `list` Lists all stored items. From 9229298ea2130faebeb61dc8811d69a0957093ae Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 1 Apr 2024 04:10:47 +0800 Subject: [PATCH 146/421] Fix TestFindCommand --- StockMasterData.txt | 38 ++++++++++++++++++++++ src/main/java/command/AddCommand.java | 2 +- src/main/java/command/FindCommand.java | 10 +++--- src/test/java/command/FindCommandTest.java | 4 +-- 4 files changed, 47 insertions(+), 7 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 6dd76171fc..c98718629f 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,40 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 454cd02188..7baefa3ade 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -10,7 +10,7 @@ public class AddCommand extends Command { protected String itemName; protected int quantity; protected String uom; - protected String category = "NA"; + protected String category; protected float buyPrice; protected float sellPrice; private final Item toAdd; diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 66e779d737..080986417e 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -13,14 +13,14 @@ public class FindCommand extends Command { protected String itemInfo; public FindCommand(String itemInfo, String keyword) { - this.keyword = keyword; + this.keyword = keyword.toLowerCase(); this.itemInfo = itemInfo; } @Override public void execute() { if (itemInfo.equals("NA")) { - itemInfo = "item + qty + uom + cat + buy + sell" + itemInfo; + itemInfo = "item + qty + uom + cat + buy + sell"; } ArrayList searchList = filterList(); TextUi.showInventoryList(searchList); @@ -38,8 +38,10 @@ public ArrayList filterList() { if (itemInfo.toLowerCase().contains("uom") && item.getUom().toLowerCase().contains(keyword)) { searchList.add(String.valueOf(item)); } - if (itemInfo.toLowerCase().contains("cat") && item.getCategory().toLowerCase().contains(keyword)) { - searchList.add(String.valueOf(item)); + if (item.getCategory() != null) { + if (itemInfo.toLowerCase().contains("cat") && item.getCategory().toLowerCase().contains(keyword)) { + searchList.add(String.valueOf(item)); + } } if (itemInfo.toLowerCase().contains("buy") && Float.toString(item.getBuyPrice()).contains(keyword)) { searchList.add(String.valueOf(item)); diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 0a473c29af..df5969f1b2 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import item.Item; import itemlist.Itemlist; import org.junit.jupiter.api.Test; @@ -12,9 +13,8 @@ public class FindCommandTest { public void findCommandTest() throws CommandFormatException { Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); - Command findCommand = new FindCommand("NA","testItem"); + Command findCommand = new FindCommand("item","testItem"); Command findCommand2 = new FindCommand("NA","failFindCommand"); - addCommandTest1.execute(); findCommand.execute(); findCommand2.execute(); From 28d9a40c03f2400e51b62121b04e9290d106189d Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 1 Apr 2024 04:13:10 +0800 Subject: [PATCH 147/421] Fix Checkstyle --- src/test/java/command/FindCommandTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index df5969f1b2..0cfc70920a 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -1,7 +1,6 @@ package command; import exceptions.CommandFormatException; -import item.Item; import itemlist.Itemlist; import org.junit.jupiter.api.Test; From 9bc7b81b8e18b77215c3b67d11457ba4f6395517 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 1 Apr 2024 13:41:24 +0800 Subject: [PATCH 148/421] edit about us --- docs/AboutUs.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 8e0359bc56..070671a1be 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -1,9 +1,9 @@ # About us -Display | Name | Github Profile | Portfolio ---------|:--------:|:---------------------------------------:|:---------: -![](https://via.placeholder.com/100.png?text=Photo) | Low Tjun Lym | [Github(https://github.com/LowTL) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Fu Xueer | [Github](https://github.com/fxe025) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Heng Shu Hong | [Github(https://github.com/HengShuHong) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Joel Lim | [Github(https://github.com/joellimjr) | [Portfolio](docs/team/johndoe.md) -![](https://via.placeholder.com/100.png?text=Photo) | Min Guanlin | [Github(https://github.com/Fureimi) | [Portfolio](docs/team/johndoe.md) +Display | Name | Github Profile | Portfolio +--------|:--------:|:----------------------------------------:|:---------: +![](https://via.placeholder.com/100.png?text=Photo) | Low Tjun Lym | [Github](https://github.com/LowTL) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Fu Xueer | [Github](https://github.com/fxe025) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Heng Shu Hong | [Github](https://github.com/HengShuHong) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Joel Lim | [Github](https://github.com/joellimjr) | [Portfolio](docs/team/johndoe.md) +![](https://via.placeholder.com/100.png?text=Photo) | Min Guanlin | [Github](https://github.com/Fureimi) | [Portfolio](docs/team/johndoe.md) From eb622d7c46d2cd0d49d31fbcc4a82f890e74a338 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 1 Apr 2024 13:52:35 +0800 Subject: [PATCH 149/421] change uom to unitOfMeasurement --- StockMasterData.txt | 77 +++++++++++++------------- src/main/java/command/EditCommand.java | 16 +++--- src/main/java/command/FindCommand.java | 2 +- src/main/java/item/Item.java | 16 +++--- src/main/java/parser/Parser.java | 11 ++-- src/main/java/storage/Storage.java | 4 +- src/main/java/ui/TextUi.java | 2 +- 7 files changed, 65 insertions(+), 63 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index c98718629f..94f1f62803 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,40 +1,41 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +3. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +4. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +5. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +6. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +7. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +8. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +9. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +10. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +11. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +12. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +13. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +14. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +15. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +16. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +17. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +18. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +19. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +20. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +21. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +22. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +23. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +24. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +25. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +26. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +27. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +28. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +29. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 +30. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +31. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +32. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +33. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +34. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +35. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 +36. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +37. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +38. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +39. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +40. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +41. | potatoes | Qty: 50 pieces | Cat: food | BuyPrice: $0.2 | SellPrice: $1.2 diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 7ec080cbcf..5c8b0bf5ab 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -10,17 +10,17 @@ public class EditCommand extends Command{ protected String itemName; protected String newItemName; protected int newQuantity; - protected String newUom; + protected String newUnitOfMeasurement; protected String newCategory; protected float newBuyPrice; protected float newSellPrice; - public EditCommand(String itemName, String newItemName, int newQuantity, String newUom, String newCategory, + public EditCommand(String itemName, String newItemName, int newQuantity, String newUnitOfMeasurement, String newCategory, float newBuyPrice, float newSellPrice) { this.itemName = itemName; this.newItemName = newItemName; this.newQuantity = newQuantity; - this.newUom = newUom; + this.newUnitOfMeasurement = newUnitOfMeasurement; this.newCategory = newCategory; this.newBuyPrice = newBuyPrice; this.newSellPrice = newSellPrice; @@ -41,8 +41,7 @@ public void execute() { } else { Item item = Itemlist.getItem(index); String itemName = item.getItemName(); - ui.TextUi.replyToUser("\n" + - "Changed: "); + ui.TextUi.replyToUser("\n" + "Edited: "); if (!newItemName.equals("NA")) { ui.TextUi.showEditMessage(itemName, "newItemName", itemName, newItemName); item.setItemName(newItemName); @@ -52,9 +51,9 @@ public void execute() { String.valueOf(newQuantity)); item.setQuantity(newQuantity); } - if (!newUom.equals("NA")) { - ui.TextUi.showEditMessage(itemName, "newUom", item.getUom(), newUom); - item.setUom(newUom); + if (!newUnitOfMeasurement.equals("NA")) { + ui.TextUi.showEditMessage(itemName, "newUnitOfMeasurement", item.getUnitOfMeasurement(), newUnitOfMeasurement); + item.setUnitOfMeasurement(newUnitOfMeasurement); } if (!newCategory.equals("NA")) { ui.TextUi.showEditMessage(itemName, "newCategory", String.valueOf(item.getCategory()), @@ -72,6 +71,7 @@ public void execute() { item.setSellPrice(newSellPrice); } } + ui.TextUi.replyToUser("End of Edits"); ui.TextUi.replyToUser(""); Storage.overwriteFile(Itemlist.getItems()); } diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 080986417e..e6815f7237 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -35,7 +35,7 @@ public ArrayList filterList() { if (itemInfo.toLowerCase().contains("qty") && Integer.toString(item.getQuantity()).contains(keyword)) { searchList.add(String.valueOf(item)); } - if (itemInfo.toLowerCase().contains("uom") && item.getUom().toLowerCase().contains(keyword)) { + if (itemInfo.toLowerCase().contains("uom") && item.getUnitOfMeasurement().toLowerCase().contains(keyword)) { searchList.add(String.valueOf(item)); } if (item.getCategory() != null) { diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index c8bb98ae5f..37a2c16742 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -6,17 +6,17 @@ public class Item { private String itemName; private int quantity; - private String uom; + private String unitOfMeasurement; private String category; private float buyPrice; private float sellPrice; private boolean isOOS; - public Item(String name, int quantity, String uom, String category, float buyPrice, float sellPrice) { + public Item(String name, int quantity, String unitOfMeasurement, String category, float buyPrice, float sellPrice) { this.itemName = name; this.quantity = quantity; assert quantity>= 0 : "Quantity should not be negative."; - this.uom = uom; + this.unitOfMeasurement = unitOfMeasurement; if (category.isEmpty()) { this.category = "NA"; } else { @@ -51,12 +51,12 @@ public void setItemName(String newName) { this.itemName = newName; } - public String getUom() { - return uom; + public String getUnitOfMeasurement() { + return unitOfMeasurement; } - public void setUom(String newUom) { - this.uom = newUom; + public void setUnitOfMeasurement(String newUnitOfMeasurement) { + this.unitOfMeasurement = newUnitOfMeasurement; } public int getQuantity() { @@ -93,7 +93,7 @@ public void unmarkOOS() { public String toString() { String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; - return (getItemName() + " (Qty: " + getQuantity() + getUom() + + return (getItemName() + " (Qty: " + getQuantity() + getUnitOfMeasurement() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 8130ff36c1..3190af2542 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -20,7 +20,7 @@ public class Parser { public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); @@ -29,7 +29,7 @@ public class Parser { public static final Pattern EDIT_COMMAND_FORMAT = Pattern.compile("edit (?[^/]+)" + - "(?:\\s+(name/(?[^/]+)|qty/(?\\d+)|uom/(?[^/]+)|" + + "(?:\\s+(name/(?[^/]+)|qty/(?\\d+)|uom/(?[^/]+)|" + "cat/(?[^/]+)|buy/(?\\d*\\.?\\d+)|sell/(?\\d*\\.?\\d+)))+"); public static final Pattern SELL_COMMAND_FORMAT = @@ -123,7 +123,7 @@ private Command prepareAdd(String args) throws CommandFormatException{ return new AddCommand( matcher.group("itemName"), quantity, - matcher.group("uom"), + matcher.group("unitOfMeasurement"), category, buyPrice, sellPrice @@ -181,7 +181,8 @@ private Command prepareEdit(String args) throws CommandFormatException{ String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; int newQuantity = matcher.group("newQuantity") != null ? Integer.parseInt(matcher.group("newQuantity")) : -1; - String newUom = matcher.group("newUom") != null ? matcher.group("newUom") : "NA"; + String newUnitOfMeasurement = matcher.group("newUnitOfMeasurement") != null ? + matcher.group("newUnitOfMeasurement") : "NA"; String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; float newBuyPrice = matcher.group("newBuyPrice") != null ? Float.parseFloat(matcher.group("newBuyPrice")) : -1; @@ -191,7 +192,7 @@ private Command prepareEdit(String args) throws CommandFormatException{ itemName, newItemName, newQuantity, - newUom, + newUnitOfMeasurement, newCategory, newBuyPrice, newSellPrice diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index e0f66ab9b5..0da65b3b71 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -114,7 +114,7 @@ public static void addToFile(ArrayList items) { assert items != null : "Items cannot be null."; Item lastItem = items.get(items.size() - 1); String descriptionAdded = (items.size()) + "." + " | " + lastItem.getItemName() + - " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUom() + + " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUnitOfMeasurement() + " | " + "Cat: " + lastItem.getCategory() + " | " + "BuyPrice: $" + lastItem.getBuyPrice() + " | " + "SellPrice: $" + lastItem.getSellPrice() + "\n"; updateFile(descriptionAdded, true); @@ -130,7 +130,7 @@ public static void overwriteFile(ArrayList items) { int length = items.size(); for (int index = 0; index < length; index++) { String descriptionAdded = (index + 1) + "." + " | " + items.get(index).getItemName() + - " | " + "Qty: " + items.get(index).getQuantity() + " " + items.get(index).getUom() + + " | " + "Qty: " + items.get(index).getQuantity() + " " + items.get(index).getUnitOfMeasurement() + " | " + "Cat: " + items.get(index).getCategory() + " | " + "BuyPrice: $" + items.get(index).getBuyPrice() + " | " + "SellPrice: $" + items.get(index).getSellPrice() + "\n"; diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index b3db86e490..5722590f52 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -106,7 +106,7 @@ public static void showEditMessage(String item, String editedParameter, String o case "newQuantity": replyToUser("Quantity of " + item + " from " + oldParameter + " to " + newParameter); break; - case "newUom": + case "newUnitOfMeasurement": replyToUser("Unit of Measurement of " + item + " from " + oldParameter + " to " + newParameter); break; case "newCategory": From 5606119ff2fd00908764fd86ad90371a5ae335f8 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 1 Apr 2024 14:07:25 +0800 Subject: [PATCH 150/421] add some docs --- src/main/java/command/EditCommand.java | 16 ++++++++-------- src/main/java/item/Item.java | 6 +----- src/main/java/parser/Parser.java | 6 ++++++ 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 5c8b0bf5ab..dd5f53b3c0 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -28,44 +28,44 @@ public EditCommand(String itemName, String newItemName, int newQuantity, String @Override public void execute() { - int index = -1; + int index = -1; // flag to check if item exists in Itemlist for (Item item : Itemlist.getItems()) { if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { index = Itemlist.getItems().indexOf(item); break; } } - if (index == -1) { + if (index == -1) { // if item is not found //throw exception; ui.TextUi.replyToUser("item not found!"); } else { Item item = Itemlist.getItem(index); String itemName = item.getItemName(); ui.TextUi.replyToUser("\n" + "Edited: "); - if (!newItemName.equals("NA")) { + if (!newItemName.equals("NA")) { // check if itemName was edited ui.TextUi.showEditMessage(itemName, "newItemName", itemName, newItemName); item.setItemName(newItemName); } - if (newQuantity != -1) { + if (newQuantity != -1) { // check if quantity was edited ui.TextUi.showEditMessage(itemName, "newQuantity", String.valueOf(item.getQuantity()), String.valueOf(newQuantity)); item.setQuantity(newQuantity); } - if (!newUnitOfMeasurement.equals("NA")) { + if (!newUnitOfMeasurement.equals("NA")) { // check if unitOfMeasurement was edited ui.TextUi.showEditMessage(itemName, "newUnitOfMeasurement", item.getUnitOfMeasurement(), newUnitOfMeasurement); item.setUnitOfMeasurement(newUnitOfMeasurement); } - if (!newCategory.equals("NA")) { + if (!newCategory.equals("NA")) { // check if category was edited ui.TextUi.showEditMessage(itemName, "newCategory", String.valueOf(item.getCategory()), String.valueOf(newCategory)); item.setCategory(newCategory); } - if (newBuyPrice != -1) { + if (newBuyPrice != -1) { // check if buyPrice was edited ui.TextUi.showEditMessage(itemName, "newBuyPrice", String.valueOf(item.getBuyPrice()), String.valueOf(newBuyPrice)); item.setBuyPrice(newBuyPrice); } - if (newSellPrice != -1) { + if (newSellPrice != -1) { // check if sellPrice was edited ui.TextUi.showEditMessage(itemName, "newSellPrice", String.valueOf(item.getSellPrice()), String.valueOf(newSellPrice)); item.setSellPrice(newSellPrice); diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 37a2c16742..7269f0361e 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -24,11 +24,7 @@ public Item(String name, int quantity, String unitOfMeasurement, String category } this.buyPrice = buyPrice; this.sellPrice = sellPrice; - if (quantity == 0) { - this.isOOS = true; - } else { - this.isOOS = false; - } + this.isOOS = quantity == 0; Itemlist.noOfItems++; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 3190af2542..e1e6365adb 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -178,14 +178,20 @@ private Command prepareEdit(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.EDIT); } String itemName = matcher.group("itemName"); + // check if itemName was edited. If no, newItemName will be NA String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; + // check if quantity was edited. If no, newQuantity will be -1 int newQuantity = matcher.group("newQuantity") != null ? Integer.parseInt(matcher.group("newQuantity")) : -1; + // check if unitOfMeasurement was edited. If no, newUnitOfMeasurement will be NA String newUnitOfMeasurement = matcher.group("newUnitOfMeasurement") != null ? matcher.group("newUnitOfMeasurement") : "NA"; + // check if category was edited. If no, newCategory will be NA String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; + // check if BuyPrice was edited. If no, newBuyPrice will be -1 float newBuyPrice = matcher.group("newBuyPrice") != null ? Float.parseFloat(matcher.group("newBuyPrice")) : -1; + // check if sellPrice was edited. If no, newSellPrice will be -1 float newSellPrice = matcher.group("newSellPrice") != null ? Float.parseFloat(matcher.group("newSellPrice")) : -1; return new EditCommand( From 4d25815f10f670a061b3f18204fa65d2db2d4b0f Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 1 Apr 2024 21:39:36 +0800 Subject: [PATCH 151/421] Add Cashier functionality --- src/main/java/item/Transaction.java | 13 +++++++++++++ src/main/java/itemlist/Cashier.java | 24 ++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index dfa4a959f3..576c4ceaa9 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -1,5 +1,7 @@ package item; +import itemlist.Cashier; + import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -11,6 +13,7 @@ public class Transaction { private int quantity; private float buyPrice; private float sellPrice; + private Boolean isVoided; public Transaction(String name, int inputQty, float inputBuy, float inputSell) { setDateTime(); @@ -20,6 +23,7 @@ public Transaction(String name, int inputQty, float inputBuy, float inputSell) { sellPrice = inputSell; totalPrice = sellPrice * quantity; profit = totalPrice - buyPrice * quantity; + isVoided = false; } public Transaction(String name, int inputQty, int inputBuy, int inputSell, String storedTime) { @@ -56,9 +60,18 @@ public float getProfit() { return this.profit; } + public Boolean getIsVoided() { + return this.isVoided; + } + public void setDateTime() { LocalDateTime currentTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); this.dateTime = currentTime.format(formatter); } + + public void voidTransaction(int index) { + Transaction txn = Cashier.getTransaction(index); + txn.isVoided = true; + } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 5b786d9544..0fb9d12051 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -18,4 +18,28 @@ public static void deleteItem(int index) { public static ArrayList getTransactions() { return transactions; } + + public static float getRevenue() { + float revenue = 0; + for (Transaction t : getTransactions()) { + if (!t.getIsVoided()) { + revenue += t.getTotalPrice(); + } + } + return revenue; + } + + public float getTotalProfit() { + float totalProfit = 0; + for (Transaction t: transactions) { + if (!t.getIsVoided()) { + totalProfit += t.getProfit(); + } + } + return totalProfit; + } + + public static Transaction getTransaction(int index) { + return transactions.get(index); + } } From 8e8068b79dd1496e4269dcc0e98711de453bd8a0 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 1 Apr 2024 21:57:36 +0800 Subject: [PATCH 152/421] Change itemName to Item type in Transaction --- src/main/java/item/Transaction.java | 9 +++++---- src/main/java/itemlist/Cashier.java | 11 +++++++++++ src/main/java/itemlist/Itemlist.java | 8 ++++++++ 3 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 576c4ceaa9..8ba9c0d5ab 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -1,6 +1,7 @@ package item; import itemlist.Cashier; +import itemlist.Itemlist; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -9,7 +10,7 @@ public class Transaction { private String dateTime; private float totalPrice; private float profit; - private String itemName; + private Item item; private int quantity; private float buyPrice; private float sellPrice; @@ -17,7 +18,7 @@ public class Transaction { public Transaction(String name, int inputQty, float inputBuy, float inputSell) { setDateTime(); - itemName = name; + item = Itemlist.getItem(name); quantity = inputQty; buyPrice = inputBuy; sellPrice = inputSell; @@ -28,7 +29,7 @@ public Transaction(String name, int inputQty, float inputBuy, float inputSell) { public Transaction(String name, int inputQty, int inputBuy, int inputSell, String storedTime) { dateTime = storedTime; - itemName = name; + item = Itemlist.getItem(name); quantity = inputQty; buyPrice = inputBuy; sellPrice = inputSell; @@ -37,7 +38,7 @@ public Transaction(String name, int inputQty, int inputBuy, int inputSell, Strin } public String getItemName() { - return this.itemName; + return this.item.getItemName(); } public int getQuantity() { diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 0fb9d12051..4ad5e92bbe 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,5 +1,6 @@ package itemlist; +import item.Item; import item.Transaction; import java.util.ArrayList; @@ -42,4 +43,14 @@ public float getTotalProfit() { public static Transaction getTransaction(int index) { return transactions.get(index); } + + public Item getBestseller() { + Item bestSeller = Itemlist.getItem(0); + for (Transaction t: transactions) { + if (!t.getIsVoided()) { + + } + } + return bestSeller; + } } diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 0062ea68fe..9cc13a7384 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -43,6 +43,14 @@ public static Item getItem(int index) { return items.get(index); } + public static Item getItem(String name) { + for (Item i: items) { + if (i.getItemName().equals(name)) { + return i; + } + } + return null; + } public static int getIndex(Item item) { return items.indexOf(item); } From 7817f8c62af0510c6a1c9318bc0dd7cd40a11423 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 1 Apr 2024 23:32:55 +0800 Subject: [PATCH 153/421] Add Cashier functionality --- src/main/java/item/Transaction.java | 4 ++++ src/main/java/itemlist/Cashier.java | 11 +++++++++-- src/main/java/itemlist/Itemlist.java | 2 +- 3 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 8ba9c0d5ab..e8a9b74795 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -41,6 +41,10 @@ public String getItemName() { return this.item.getItemName(); } + public Item getItem() { + return this.item; + } + public int getQuantity() { return this.quantity; } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 4ad5e92bbe..1b4bad073c 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -6,6 +6,7 @@ import java.util.ArrayList; public class Cashier extends Itemlist { + private static final ArrayList transactions = new ArrayList<>(); public static void addItem(Transaction transaction) { @@ -20,7 +21,7 @@ public static ArrayList getTransactions() { return transactions; } - public static float getRevenue() { + public static float getTotalRevenue() { float revenue = 0; for (Transaction t : getTransactions()) { if (!t.getIsVoided()) { @@ -46,9 +47,15 @@ public static Transaction getTransaction(int index) { public Item getBestseller() { Item bestSeller = Itemlist.getItem(0); + float[] profits = new float[Itemlist.items.size()]; for (Transaction t: transactions) { if (!t.getIsVoided()) { - + profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); + } + } + for (int i = 1; i < Itemlist.items.size(); i++) { + if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { + bestSeller = Itemlist.getItem(i); } } return bestSeller; diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 9cc13a7384..4db298e0a4 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -6,7 +6,7 @@ public class Itemlist { public static int noOfItems; - private static final ArrayList items = new ArrayList<>(); + protected static final ArrayList items = new ArrayList<>(); public Itemlist() { } From 42b096c83ee4900ecfc4a75a33411060631ea46c Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Tue, 2 Apr 2024 01:38:51 +0800 Subject: [PATCH 154/421] add help message --- StockMasterData.txt | 78 +++++++++++++++--------------- TransactionLogs.txt | 8 +++ src/main/java/common/Messages.java | 26 +++++++++- src/main/java/ui/TextUi.java | 4 +- 4 files changed, 75 insertions(+), 41 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index c98718629f..2f251979d1 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,40 +1,40 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +2. | apple | Qty: 175 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +3. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +4. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +5. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +6. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +7. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +8. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +9. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +10. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +11. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +12. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +13. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +14. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +15. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +16. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +17. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +18. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +19. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +20. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +21. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +22. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +23. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +24. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +25. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +26. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +27. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +28. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +29. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 +30. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +31. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +32. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +33. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +34. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +35. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 +36. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +37. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +38. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +39. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +40. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..f9080b4c61 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,8 @@ +Date: 2024-04-01 21:32:44 +Transaction ID: 1 +Item Name: apple +Quantity: 5 +Unit Price: 3.0 +Total Price: 15.0 +Profit: -5.0 + diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 13f2cae450..b5cb10859a 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -3,7 +3,31 @@ public class Messages { public static final String DIVIDER = "----------------"; public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; - public static final String HELP = "Commands: ...."; + public static final String HELP = + " _________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|_________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| list | list |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] |\n" + + "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE] |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| edit | edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + + "| | cat/[NEW_CATEGORY] |\n" + + "| | (use AT LEAST 1 of: qty/, uom/, cat/) |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| delete | del [ITEM_NAME] |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| find | 1. find [KEYWORD] - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 [KEYWORD] - to search under the filters* |\n" + + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| exit | exit |\n" + + "|__________|______________________________________________________________________________|\n"; public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + "\n" + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + "buy/[BUY_PRICE] sell/[SELL_PRICE]'"; diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index b3db86e490..9dab111f34 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -73,8 +73,10 @@ public static void showInventoryList(ArrayList arrayList) { } public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { + float totalValue = sellQuantity * sellPrice; replyToUser("Quantity of " + item + " sold: " + sellQuantity + ", for: $" + sellPrice + "\n" + - "Quantity remaining: " + remainingQuantity + "Quantity remaining: " + remainingQuantity + "\n" + + "Total value sold: " + totalValue ); } From d593de9cfaa476647daab7492bf658228ee7f13a Mon Sep 17 00:00:00 2001 From: Shu Date: Tue, 2 Apr 2024 10:32:59 +0800 Subject: [PATCH 155/421] Add Promotion Class --- StockMasterData.txt | 77 ++++---- TransactionLogs.txt | 16 ++ src/main/java/command/PromotionCommand.java | 40 +++++ .../java/exceptions/InvalidDateException.java | 4 + src/main/java/promotion/Month.java | 26 +++ src/main/java/promotion/Promotion.java | 167 ++++++++++++++++++ src/main/java/promotion/Promotionlist.java | 31 ++++ src/main/java/storage/TransactionLogs.java | 2 +- 8 files changed, 323 insertions(+), 40 deletions(-) create mode 100644 src/main/java/command/PromotionCommand.java create mode 100644 src/main/java/exceptions/InvalidDateException.java create mode 100644 src/main/java/promotion/Month.java create mode 100644 src/main/java/promotion/Promotion.java create mode 100644 src/main/java/promotion/Promotionlist.java diff --git a/StockMasterData.txt b/StockMasterData.txt index c98718629f..c23c162615 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,40 +1,39 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +2. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +3. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +4. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +5. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +6. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +7. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +8. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +9. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +10. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +11. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +12. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +13. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +14. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +15. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +16. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +17. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +18. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +19. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +20. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +21. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +22. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +23. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +24. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +25. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +26. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +27. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +28. | testItem | Qty: 1 EA | Cat: fruit | BuyPrice: $1.0 | SellPrice: $10.0 +29. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +30. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +31. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +32. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +33. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +34. | testItem | Qty: 1 EA | Cat: N | BuyPrice: $1.0 | SellPrice: $10.0 +35. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +36. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +37. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +38. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +39. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..8cc9b5b830 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,16 @@ +Date: 2024-04-01 21:12:06 +Transaction ID: 1 +Item Name: apple +Quantity: 5 +Unit Price: 6.0 +Total Price: 30.0 +Profit: 10.0 + +Date: 2024-04-01 21:20:25 +Transaction ID: 2 +Item Name: apple +Quantity: 5 +Unit Price: 5.0 +Total Price: 25.0 +Profit: 5.0 + diff --git a/src/main/java/command/PromotionCommand.java b/src/main/java/command/PromotionCommand.java new file mode 100644 index 0000000000..c1eeb2a025 --- /dev/null +++ b/src/main/java/command/PromotionCommand.java @@ -0,0 +1,40 @@ +package command; + +import item.Item; +import promotion.Month; +import promotion.Promotion; + +import java.time.DayOfWeek; + +public class PromotionCommand extends Command { + + protected Promotion promotion; + + public void promotionCommand( + String itemName, + Float promoPrice, + int startDate, Month startMonth, int startYear, + int endDate, Month endMonth, int endYear, + DayOfWeek weekly, + int startTime, + int endTime) { + this.promotion = new Promotion( + itemName, promoPrice, + startDate, startMonth, startYear, + endDate, endMonth, endYear, + weekly, startTime, endTime); + } + + + public Promotion getPromotion() { + return promotion; + } + + + @Override + public void execute() { + } + + + +} diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java new file mode 100644 index 0000000000..94b0ce144e --- /dev/null +++ b/src/main/java/exceptions/InvalidDateException.java @@ -0,0 +1,4 @@ +package exceptions; + +public class InvalidDateException extends Exception { +} diff --git a/src/main/java/promotion/Month.java b/src/main/java/promotion/Month.java new file mode 100644 index 0000000000..9cde1cb6d5 --- /dev/null +++ b/src/main/java/promotion/Month.java @@ -0,0 +1,26 @@ +package promotion; + +public enum Month { + JAN(1), + FEB(2), + MAR(3), + APR(4), + MAY(5), + JUN(6), + JUL(7), + AUG(8), + SEP(9), + OCT(10), + NOV(11), + DEC(12); + + private final int value; + + Month(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java new file mode 100644 index 0000000000..3ded4eceec --- /dev/null +++ b/src/main/java/promotion/Promotion.java @@ -0,0 +1,167 @@ +package promotion; + +import command.EditCommand; +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import item.Item; +import itemlist.Itemlist; + +import java.time.DayOfWeek; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import static promotion.Month.JAN; + +public class Promotion { + + protected String itemName; + + protected Float discount; + + protected int startDate; + + protected Month startMonth; + + protected int startYear; + + protected int endDate; + + protected Month endMonth; + + protected int endYear; + + protected DayOfWeek weekly; + + protected int startTime; + + protected int endTime; + + public Promotion( + String itemName, + Float discount, + int startDate, Month startMonth, int startYear, + int endDate, Month endMonth, int endYear, + DayOfWeek weekly, + int startTime, + int endTime) { + this.itemName = itemName; + this.discount = discount; + this.startDate = startDate; + this.startMonth = startMonth; + this.startYear = startYear; + this.endDate = endDate; + this.endMonth = endMonth; + this.endYear = endYear; + this.weekly = weekly; + this.startTime = startTime; + this.endTime = endTime; + } + + public boolean isLeapYear(int year) { + return year % 4 == 0; + } + + public void Main() throws InvalidDateException { + if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { + throw new InvalidDateException(); + } + if (!isValidTime(startTime, endTime)) { + throw new InvalidDateException(); + } + if (isOnPromo(itemName)) { //this code should be under sell component + //Item item = Itemlist.getItem("itemName"); + //float originalPrice = item.getSellPrice(); + //new EditCommand(itemName, "NA",-1, "NA", "NA", -1, discount*originalPrice); + } + } + + public boolean isOnPromo(String itemName) { + if (!isPromoExist()) { + return false; + } + if (!Promotionlist.itemIsOnPromo(itemName)) { + return false; + } + return true; + } + + public boolean isPromoExist() { + LocalDateTime currentTime = LocalDateTime.now(); + DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); + DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("M"); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd"); + String formattedYear= currentTime.format(yearFormatter); + String formattedMonth = currentTime.format(monthFormatter); + String formattedDate = currentTime.format(dateFormatter); + int year = Integer.parseInt(formattedYear); + int month = Integer.parseInt(formattedMonth); + int date = Integer.parseInt(formattedDate); + if (year < startYear || year > endYear) { + return false; + } + if (month < startMonth.getValue() || month > endMonth.getValue()) { + return false; + } + if (date < startDate || date > endDate) { + return false; + } + return true; + } + + public boolean isValidTime (int startTime, int endTime) throws InvalidDateException { + boolean startIsValid = isVerifiedTime(startTime); + boolean endIsValid = isVerifiedTime(endTime); + if (!startIsValid || !endIsValid) { + return false; + } + return endTime <= startTime; + } + + public boolean isVerifiedTime (int time) { + String[] splitTime = String.valueOf(time).split("(?<=.)"); + if (splitTime.length != 4) { + return false; + } + int hour = time / 100; + int min = time % 100; + if (hour > 23 || hour < 0) { + return false; + } + return min <= 59 && min >= 0; + } + + public boolean isValidMonth (int date, Month month, int year) throws InvalidDateException { + switch (month) { + case JAN: + if (date > 31 || date < 1) { + return false; + } + case FEB: + if (isLeapYear(year) && (date > 29 || date < 1)) { + return false; + } else return date <= 28 && date >= 1; + case MAR: + case MAY: + case JUL: + case DEC: + case OCT: + case AUG: + return date <= 31 && date >= 1; + case APR: + case SEP: + case NOV: + case JUN: + return date <= 30 && date >= 1; + default: + throw new InvalidDateException(); + } + } + + public Float getPromoPrice() { + return promoPrice; + } + + public String getItemName() { + return itemName; + } +} diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java new file mode 100644 index 0000000000..8f024b8fe2 --- /dev/null +++ b/src/main/java/promotion/Promotionlist.java @@ -0,0 +1,31 @@ +package promotion; + +import java.util.ArrayList; + +public class Promotionlist { + private static final ArrayList promotions = new ArrayList<>(); + + public Promotionlist() { + } + + public static void addPromotion(Promotion promotion) { + promotions.add(promotion); + } + + public static void deletePromotion(int index) { + promotions.remove(index); + } + + public static boolean itemIsOnPromo(String itemName) { + for (Promotion promotion : Promotionlist.getPromo()) { + if (promotion.getItemName().toLowerCase().equals(itemName)) { + return true; + } + } + return false; + } + + public static ArrayList getPromo() { + return promotions; + } +} diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index a2ad736d52..d0bd89ca42 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -35,7 +35,7 @@ public static void readFromFile(String fileName) { String commandDate = ""; while (scanner.hasNext()) { String fileLine = scanner.nextLine(); - System.out.println(fileLine); + //System.out.println(fileLine); if (fileLine.contains("Quantity: ")) { commandQty = fileLine.replace("Quantity: ", ""); } else if (fileLine.contains("Date: ")) { From 852747e2e3502e73263c31c036fc0dc148924808 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Tue, 2 Apr 2024 15:26:05 +0800 Subject: [PATCH 156/421] no message --- StockMasterData.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 94f1f62803..b0cfe1bb0e 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -38,4 +38,3 @@ 38. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 39. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 40. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 -41. | potatoes | Qty: 50 pieces | Cat: food | BuyPrice: $0.2 | SellPrice: $1.2 From f1e2693c0c23e257395950ebb015c41cc116b7d9 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Tue, 2 Apr 2024 16:12:38 +0800 Subject: [PATCH 157/421] add mark and unmark feature --- src/main/java/command/MarkCommand.java | 28 +++++++++++ src/main/java/command/UnmarkCommand.java | 28 +++++++++++ src/main/java/common/Messages.java | 6 +++ .../exceptions/CommandFormatException.java | 6 +++ src/main/java/item/Item.java | 12 ++++- src/main/java/parser/CommandType.java | 4 +- src/main/java/parser/Parser.java | 47 +++++++++++++++---- 7 files changed, 119 insertions(+), 12 deletions(-) create mode 100644 src/main/java/command/MarkCommand.java create mode 100644 src/main/java/command/UnmarkCommand.java diff --git a/src/main/java/command/MarkCommand.java b/src/main/java/command/MarkCommand.java new file mode 100644 index 0000000000..0f94c518e6 --- /dev/null +++ b/src/main/java/command/MarkCommand.java @@ -0,0 +1,28 @@ +package command; + +import exceptions.CommandFormatException; +import itemlist.Itemlist; +import item.Item; + + +public class MarkCommand extends Command { + + protected String itemName; + + public MarkCommand(String itemName) { + this.itemName = itemName; + } + + @Override + public void execute() throws CommandFormatException { + Item item = Itemlist.getItem(itemName); + if (item == null) { + ui.TextUi.replyToUser("Item of " + itemName + " not found! Please try again."); + } else if (item.isMark) { + ui.TextUi.replyToUser("Item is already marked!"); + } else { + item.mark(); + ui.TextUi.replyToUser("Successfully marked " + item + "!"); + } + } +} diff --git a/src/main/java/command/UnmarkCommand.java b/src/main/java/command/UnmarkCommand.java new file mode 100644 index 0000000000..2c3c9e9ecf --- /dev/null +++ b/src/main/java/command/UnmarkCommand.java @@ -0,0 +1,28 @@ +package command; + +import exceptions.CommandFormatException; +import itemlist.Itemlist; +import item.Item; + + +public class UnmarkCommand extends Command { + + protected String itemName; + + public UnmarkCommand(String itemName) { + this.itemName = itemName; + } + + @Override + public void execute() throws CommandFormatException { + Item item = Itemlist.getItem(itemName); + if (item == null) { + ui.TextUi.replyToUser("Item of item name '" + itemName + "' not found! Please try again."); + } else if (!item.isMark) { + ui.TextUi.replyToUser("Item is already unmarked!"); + } else { + item.unmark(); + ui.TextUi.replyToUser("Successfully unmarked " + item + "!"); + } + } +} diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index b5cb10859a..14ba652b3d 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -48,4 +48,10 @@ public class Messages { "Stock!"; public static final String GOODBYE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; + + public static final String INVALID_MARK_FORMAT = "Invalid Command Format. Please use format : " + + "mark [ITEM_NAME]"; + + public static final String INVALID_UNMARK_FORMAT = "Invalid Command Format. Please use format : " + + "unmark [ITEM_NAME]"; } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 4db582d797..d866dc8986 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -26,6 +26,12 @@ public CommandFormatException(CommandType command){ case HELP: System.out.println(Messages.HELP); break; + case MARK: + System.out.println(Messages.INVALID_MARK_FORMAT); + break; + case UNMARK: + System.out.println(Messages.INVALID_UNMARK_FORMAT); + break; default: System.out.println(Messages.INVALID_COMMAND); break; diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 7269f0361e..64f3977bb2 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -11,6 +11,7 @@ public class Item { private float buyPrice; private float sellPrice; private boolean isOOS; + public boolean isMark; public Item(String name, int quantity, String unitOfMeasurement, String category, float buyPrice, float sellPrice) { this.itemName = name; @@ -87,9 +88,18 @@ public void unmarkOOS() { this.isOOS = false; } + public void mark() { + this.isMark = true; + } + + public void unmark() { + this.isMark = false; + } + public String toString() { String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; - return (getItemName() + " (Qty: " + getQuantity() + getUnitOfMeasurement() + + String markString = (this.isMark) ? "[X] " : "[ ] "; + return (markString + getItemName() + " (Qty: " + getQuantity() + getUnitOfMeasurement() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); } } diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index 6eb00fc0a8..d10673f1ed 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -8,5 +8,7 @@ public enum CommandType { DEL, EDIT, SELL, - FIND + FIND, + MARK, + UNMARK } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index e1e6365adb..4a6bed3830 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,17 +1,9 @@ package parser; -import command.AddCommand; -import command.Command; -import command.DeleteCommand; -import command.EditCommand; -import command.ExitCommand; -import command.FindCommand; -import command.HelpCommand; -import command.IncorrectCommand; -import command.ListCommand; -import command.SellCommand; +import command.*; import common.Messages; import exceptions.CommandFormatException; +import item.Item; import itemlist.Itemlist; @@ -44,6 +36,11 @@ public class Parser { public static final Pattern LIST_COMMAND_FORMAT = Pattern.compile("list(?: (?[^/]+))?"); + public static final Pattern MARK_COMMAND_FORMAT = + Pattern.compile("mark (?[^/]+)"); + public static final Pattern UNMARK_COMMAND_FORMAT = + Pattern.compile("unmark (?[^/]+)"); + public Command parseInput(String userInput){ final CommandType userCommand; final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); @@ -101,6 +98,18 @@ public Command parseInput(String userInput){ } catch (CommandFormatException e) { break; } + case MARK: + try { + return prepareMark(userInput); + } catch (CommandFormatException e) { + break; + } + case UNMARK: + try { + return prepareUnmark(userInput); + } catch (CommandFormatException e) { + break; + } default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -214,6 +223,24 @@ private Command prepareList(String args) throws CommandFormatException { String category = matcher.group("category") != null ? matcher.group("category") : "NA"; return new ListCommand<>(Itemlist.getItems(), category); } + + private Command prepareMark(String args) throws CommandFormatException { + final Matcher matcher = MARK_COMMAND_FORMAT.matcher(args.trim()); + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.MARK); + } + String itemName = matcher.group("itemName"); + return new MarkCommand(itemName); + } + + private Command prepareUnmark(String args) throws CommandFormatException { + final Matcher matcher = UNMARK_COMMAND_FORMAT.matcher(args.trim()); + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.UNMARK); + } + String itemName = matcher.group("itemName"); + return new UnmarkCommand(itemName); + } } From cb993a1c89419efdd88f471593f49764df48362a Mon Sep 17 00:00:00 2001 From: Fureimi Date: Tue, 2 Apr 2024 16:57:56 +0800 Subject: [PATCH 158/421] add on to list feature to allow user to list all marked items as well as marked items of a certain category --- src/main/java/command/ListCommand.java | 10 +++--- src/main/java/common/Messages.java | 7 ++++ .../exceptions/CommandFormatException.java | 3 ++ src/main/java/parser/Parser.java | 5 +-- src/main/java/ui/TextUi.java | 33 +++++++++++++++++-- 5 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 2b10ad6829..08bda51bbe 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -9,18 +9,20 @@ public class ListCommand extends Command{ protected ArrayList arrayList; protected String category; + protected boolean isListMarked; - public ListCommand(ArrayList arrayList, String category) { + public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { this.arrayList = arrayList; this.category = category; + this.isListMarked = isListMarked; } //@@author Fureimi public void execute() { - if (!category.equals("NA")) { - TextUi.showCategoryList(arrayList, category); - } else { + if (category.equals("NA") && !isListMarked) { TextUi.showInventoryList(arrayList); + } else { + TextUi.showCustomizedList(arrayList, category, isListMarked); } } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 14ba652b3d..c9724b9c77 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -54,4 +54,11 @@ public class Messages { public static final String INVALID_UNMARK_FORMAT = "Invalid Command Format. Please use format : " + "unmark [ITEM_NAME]"; + + public static final String INVALID_LIST_FORMAT = "Invalid Command Format. Please use format:\n" + + "1. 'list' to list all items in the inventory, \n" + + "2. 'list cat/[CATEGORY]' to list all items in that category, or \n" + + "3. 'list marked' to list all marked items, or \n" + + "4. 'list marked cat/[CATEGORY]' to list all marked items in that category.\n" + + "Please note that marked must be in front of cat/[CATEGORY]."; } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index d866dc8986..2528898f1e 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -26,6 +26,9 @@ public CommandFormatException(CommandType command){ case HELP: System.out.println(Messages.HELP); break; + case LIST: + System.out.println(Messages.INVALID_LIST_FORMAT); + break; case MARK: System.out.println(Messages.INVALID_MARK_FORMAT); break; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 4a6bed3830..45e4d80f4f 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -34,7 +34,7 @@ public class Parser { Pattern.compile("(?\\S+)(?.*)"); public static final Pattern LIST_COMMAND_FORMAT = - Pattern.compile("list(?: (?[^/]+))?"); + Pattern.compile("list(?:\\s+(?marked))?(?:\\s+cat/(?[^/]+))?"); public static final Pattern MARK_COMMAND_FORMAT = Pattern.compile("mark (?[^/]+)"); @@ -221,7 +221,8 @@ private Command prepareList(String args) throws CommandFormatException { throw new CommandFormatException(CommandType.LIST); } String category = matcher.group("category") != null ? matcher.group("category") : "NA"; - return new ListCommand<>(Itemlist.getItems(), category); + Boolean listMarked = matcher.group("isMark") != null; + return new ListCommand<>(Itemlist.getItems(), category, listMarked); } private Command prepareMark(String args) throws CommandFormatException { diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 00f65ce4fc..96284f4327 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -81,10 +81,11 @@ public static void showSellMessage(String item, int sellQuantity, int remainingQ } //@@author Fureimi - public static void showCategoryList(ArrayList arrayList, String category) { + public static void showCustomizedList(ArrayList arrayList, String category, boolean isListMarked) { if (arrayList.isEmpty()) { replyToUser("There is nothing here! Time to spend some money and stock em up!"); - } else { + // case 1: user wants to list all items of a certain category + } else if (!category.equals("NA") && !isListMarked) { int flag = 0; int counter = 1; for (Item item : arrayList) { @@ -97,6 +98,34 @@ public static void showCategoryList(ArrayList arrayList, String category) if (flag == 0) { replyToUser("No items were found within the category " + category + "."); } + // case 2: user wants to list all marked items + } else if (category.equals("NA") && isListMarked) { + int flag = 0; + int counter = 1; + for (Item item : arrayList) { + if (item.isMark) { + replyToUser(counter + ". Item Index: " + (arrayList.indexOf(item) + 1) + ". " + item); + counter++; + flag = 1; + } + } + if (flag == 0) { + replyToUser("There are no marked items in your inventory list!"); + } + // case 3: user wants to list all marked items of a certain category + } else if (!category.equals("NA") && isListMarked) { + int flag = 0; + int counter = 1; + for (Item item : arrayList) { + if (item.isMark && item.getCategory().equals(category)) { + replyToUser(counter + ". Item Index: " + (arrayList.indexOf(item) + 1) + ". " + item); + counter++; + flag = 1; + } + } + if (flag == 0) { + replyToUser("There are no marked items of category '" + category + "' in your inventory list!"); + } } } From bc5e03c98af4077c875667da5e8d53e55c2aa780 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Tue, 2 Apr 2024 17:01:26 +0800 Subject: [PATCH 159/421] fix checkstyle errors --- src/main/java/command/EditCommand.java | 6 ++++-- src/main/java/item/Item.java | 2 +- src/main/java/itemlist/Itemlist.java | 2 +- src/main/java/parser/Parser.java | 14 ++++++++++++-- 4 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index dd5f53b3c0..73aaaad064 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -15,7 +15,8 @@ public class EditCommand extends Command{ protected float newBuyPrice; protected float newSellPrice; - public EditCommand(String itemName, String newItemName, int newQuantity, String newUnitOfMeasurement, String newCategory, + public EditCommand(String itemName, String newItemName, int newQuantity, String newUnitOfMeasurement, + String newCategory, float newBuyPrice, float newSellPrice) { this.itemName = itemName; this.newItemName = newItemName; @@ -52,7 +53,8 @@ public void execute() { item.setQuantity(newQuantity); } if (!newUnitOfMeasurement.equals("NA")) { // check if unitOfMeasurement was edited - ui.TextUi.showEditMessage(itemName, "newUnitOfMeasurement", item.getUnitOfMeasurement(), newUnitOfMeasurement); + ui.TextUi.showEditMessage(itemName, "newUnitOfMeasurement", item.getUnitOfMeasurement(), + newUnitOfMeasurement); item.setUnitOfMeasurement(newUnitOfMeasurement); } if (!newCategory.equals("NA")) { // check if category was edited diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 64f3977bb2..1676c43498 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -4,6 +4,7 @@ import itemlist.Itemlist; public class Item { + public boolean isMark; private String itemName; private int quantity; private String unitOfMeasurement; @@ -11,7 +12,6 @@ public class Item { private float buyPrice; private float sellPrice; private boolean isOOS; - public boolean isMark; public Item(String name, int quantity, String unitOfMeasurement, String category, float buyPrice, float sellPrice) { this.itemName = name; diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 4db298e0a4..10494ee1c2 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -6,7 +6,7 @@ public class Itemlist { public static int noOfItems; - protected static final ArrayList items = new ArrayList<>(); + protected static ArrayList items = new ArrayList<>(); public Itemlist() { } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 45e4d80f4f..bbd74046f7 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,9 +1,19 @@ package parser; -import command.*; +import command.AddCommand; +import command.DeleteCommand; +import command.EditCommand; +import command.ExitCommand; +import command.FindCommand; +import command.HelpCommand; +import command.IncorrectCommand; +import command.ListCommand; +import command.MarkCommand; +import command.SellCommand; +import command.UnmarkCommand; import common.Messages; import exceptions.CommandFormatException; -import item.Item; +import command.Command; import itemlist.Itemlist; From 8f1e9ab4e7b0e8bdcfe8ec1b09bc1c74265b3454 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Tue, 2 Apr 2024 17:15:57 +0800 Subject: [PATCH 160/421] Update text file --- StockMasterData.txt | 1 + TransactionLogs.txt | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/StockMasterData.txt b/StockMasterData.txt index 3a2dd251a7..608e65d217 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,3 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 2. | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +3. | [ITEM_NAME] | Qty: 70 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $0.5 | SellPrice: $1.5 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..59d5b2ae29 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,24 @@ +Date: 2024-04-01 21:17:43 +Transaction ID: 1 +Item Name: [ITEM_NAME] +Quantity: 10 +Unit Price: 2.0 +Total Price: 20.0 +Profit: 15.0 + +Date: 2024-04-01 21:22:03 +Transaction ID: 2 +Item Name: [ITEM_NAME] +Quantity: 10 +Unit Price: 5.0 +Total Price: 50.0 +Profit: 45.0 + +Date: 2024-04-01 21:24:46 +Transaction ID: 3 +Item Name: [ITEM_NAME] +Quantity: 10 +Unit Price: 1.5 +Total Price: 15.0 +Profit: 10.0 + From bfd115bd2089b4a5c1d610e1b153b680b315a0ef Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Tue, 2 Apr 2024 17:41:27 +0800 Subject: [PATCH 161/421] add lowstockreminder (primitive version) and fixed sell bug --- StockMasterData.txt | 4 +- src/main/java/command/SellCommand.java | 7 +-- src/main/java/item/Item.java | 4 ++ src/main/java/reminder/LowStockReminder.java | 45 ++++++++++++++++++++ src/main/java/seedu/duke/Duke.java | 2 + 5 files changed, 58 insertions(+), 4 deletions(-) create mode 100644 src/main/java/reminder/LowStockReminder.java diff --git a/StockMasterData.txt b/StockMasterData.txt index 04255090a9..d96ab2a0c7 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,4 @@ 1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 \ No newline at end of file +2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +3. | orange | Qty: 0 pieces | Cat: fruits | BuyPrice: $2.0 | SellPrice: $4.0 +4. | samsung phone | Qty: 3 pieces | Cat: electronics | BuyPrice: $80.0 | SellPrice: $300.0 \ No newline at end of file diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 2b995877f3..e02794ab84 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -30,13 +30,14 @@ public void execute() { break; } } - int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; - float sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); if (index == -1) { //throw exception; System.out.println("Item not found!"); return; - } else if (remainingQuantity < 0) { + } + int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; + float sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); + if (remainingQuantity < 0) { System.out.println("There is insufficient stock!"); return; } else { diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 1676c43498..d98af144c4 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -80,6 +80,10 @@ public void setSellPrice(float newSellPrice) { this.sellPrice = newSellPrice; } + public boolean getIsOOS() { + return isOOS; + } + public void markOOS() { this.isOOS = true; } diff --git a/src/main/java/reminder/LowStockReminder.java b/src/main/java/reminder/LowStockReminder.java new file mode 100644 index 0000000000..e7f6a97602 --- /dev/null +++ b/src/main/java/reminder/LowStockReminder.java @@ -0,0 +1,45 @@ +package reminder; + +import item.Item; +import itemlist.Itemlist; + +public class LowStockReminder { + + protected String itemName; + //protected int QuantityInStock; + //protected int QuantitySoldPerMonth; + //protected float newSellPrice; + + public static void execute(){ + outOfStockItemsReminder(); + lowOnStockItemsReminder(); + } + + private static void outOfStockItemsReminder(){ + int count = 0; + System.out.println("Out-of-stock Items: "); + for (Item item : Itemlist.getItems()) { + if (item.getIsOOS()) { + System.out.println(item.getItemName()); + count++; + } + } + if (count == 0){ + System.out.println("No items out of stock"); + } + } + + private static void lowOnStockItemsReminder(){ + int count = 0; + System.out.println("Low-on-stock Items: "); + for (Item item : Itemlist.getItems()) { + if (item.getQuantity() <= 5 && item.getQuantity() > 0) { //low stock condition + System.out.println(item.getItemName()); + count++; + } + } + if (count == 0){ + System.out.println("No items low on stock"); + } + } +} diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 3c31f27076..6e0ff49da7 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -4,6 +4,7 @@ import command.ExitCommand; import exceptions.CommandFormatException; import parser.Parser; +import reminder.LowStockReminder; import storage.Storage; import storage.TransactionLogs; import ui.TextUi; @@ -30,6 +31,7 @@ public void run() throws IOException, CommandFormatException { Storage.readFromFile("./StockMasterData.txt"); TransactionLogs.updateFile("", true); TransactionLogs.readFromFile("./TransactionLogs.txt"); + LowStockReminder.execute(); this.normalOperation(); ui.showGoodByeMessage("./StockMasterData.txt"); } From def7141d22b88f3d6bb63c4d72beefe76f0a043b Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Tue, 2 Apr 2024 18:02:41 +0800 Subject: [PATCH 162/421] runtest edit --- src/main/java/reminder/LowStockReminder.java | 4 ++-- text-ui-test/EXPECTED.TXT | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/reminder/LowStockReminder.java b/src/main/java/reminder/LowStockReminder.java index e7f6a97602..e2da385833 100644 --- a/src/main/java/reminder/LowStockReminder.java +++ b/src/main/java/reminder/LowStockReminder.java @@ -17,7 +17,7 @@ public static void execute(){ private static void outOfStockItemsReminder(){ int count = 0; - System.out.println("Out-of-stock Items: "); + System.out.println("Out-of-stock Items:"); for (Item item : Itemlist.getItems()) { if (item.getIsOOS()) { System.out.println(item.getItemName()); @@ -31,7 +31,7 @@ private static void outOfStockItemsReminder(){ private static void lowOnStockItemsReminder(){ int count = 0; - System.out.println("Low-on-stock Items: "); + System.out.println("Low-on-stock Items:"); for (Item item : Itemlist.getItems()) { if (item.getQuantity() <= 5 && item.getQuantity() > 0) { //low stock condition System.out.println(item.getItemName()); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index bdcc943dd4..2aa68c29a1 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -3,6 +3,10 @@ StockMaster v2.0 ---------------- Data is being extracted from: ./StockMasterData.txt Welcome to StockMaster, where you can master the knowledge on your Stock! +Out-of-stock Items: +No items out of stock +Low-on-stock Items: +No items low on stock Enter Command: ---------------- Data is being saved to :./StockMasterData.txt From cb9100c7c5baad63b8e33145e4842a8a154d5c09 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Tue, 2 Apr 2024 19:03:17 +0800 Subject: [PATCH 163/421] Remove unused methods --- src/main/java/storage/TransactionLogs.java | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index a2ad736d52..1ee96bd2cf 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -78,25 +78,4 @@ public static void addToLog(ArrayList transactions) { descriptionAdded += "\n"; updateFile(descriptionAdded, true); } - - public static void overwriteLog(ArrayList transactions) { - assert transactions != null : "Items cannot be null."; - int length = transactions.size(); - for (int index = 0; index < length; index++) { - String descriptionAdded = ""; - descriptionAdded += "Date: " + transactions.get(index).getDateTime() + "\n"; - descriptionAdded += "Transaction ID: " + transactions.get(index + 1) + "\n"; - descriptionAdded += "Item Name: " + transactions.get(index).getItemName() + "\n"; - descriptionAdded += "Quantity: " + transactions.get(index).getQuantity() + "\n"; - descriptionAdded += "Unit Price: " + transactions.get(index).getSellPrice() + "\n"; - descriptionAdded += "Total Price: " + transactions.get(index).getTotalPrice() + "\n"; - descriptionAdded += "Profit: " + transactions.get(index).getProfit() + "\n"; - descriptionAdded += "\n"; - if (index == 0) { - updateFile(descriptionAdded, false); - } else { - updateFile(descriptionAdded, true); - } - } - } } From 8bb31a7b88aac1d9eb7668b33ca7f9a2fc2df8cd Mon Sep 17 00:00:00 2001 From: fxe025 Date: Tue, 2 Apr 2024 22:29:34 +0800 Subject: [PATCH 164/421] Update UG --- docs/UserGuide.md | 36 ++++++++++++++++++++++-------------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 73ae0c0228..0ef1369346 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -44,15 +44,23 @@ del Apples ``` ### Editing an item: `edit` -Edits the quantity of the item. +Edits the parameters of the item. -Format: `edit ITEM_NAME qty/NEW_QUANTITY` +Format: `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
` Example of usage: ``` -edit Apples qty/10 -edit Phone qty/0 +`edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` +`edit fish name/Salmon qty/1 uom/pieces cat/fish device buy/1.00 sell/10.00` ``` +User can choose to edit at least 1 parameter up to all available parameters. + +Example of usage: +``` +edit apple buy/1.00 sell/2.00 +edit fish name/Salmon qty/1 cat/fish +``` + ### Finding an item: `find` Finds all items that contains `KEYWORD` @@ -111,13 +119,13 @@ the application. ## Command Summary -| Action | Format, Examples | -|-------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | -| Delete Item | `del ITEM_NAME`
`e.g. del Apple` | -| Edit Item | | -| Find Item | `find KEYWORD`
`e.g. find University` | -| Sell Item | | -| List | `list` | -| Help | `help` | -| Exit | `exit` | +| Action | Format, Examples | +|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | +| Delete Item | `del ITEM_NAME`
`e.g. del Apple` | +| Edit Item | `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | +| Find Item | `find KEYWORD`
`e.g. find University` | +| Sell Item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]`
`e.g. sell apple qty/50 price/4.50` | +| List | `list` | +| Help | `help` | +| Exit | `exit` | From 53504aed3eadb6a2d3e4243102510ccff102d70e Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 3 Apr 2024 13:10:15 +0800 Subject: [PATCH 165/421] Add Promotion Class --- StockMasterData.txt | 2 +- src/main/java/command/Command.java | 3 +- src/main/java/command/PromotionCommand.java | 20 ++- src/main/java/command/SellCommand.java | 3 +- src/main/java/parser/CommandType.java | 3 +- src/main/java/parser/Parser.java | 67 +++++++++- src/main/java/promotion/Promotion.java | 116 ++++------------ src/main/java/promotion/Promotionlist.java | 141 +++++++++++++++++++- src/main/java/seedu/duke/Duke.java | 7 +- 9 files changed, 246 insertions(+), 116 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8b13789179..a8471875dd 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1 @@ - +1. | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 \ No newline at end of file diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index a71e7f8779..0637a1f427 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,8 +1,9 @@ package command; import exceptions.CommandFormatException; +import exceptions.InvalidDateException; public abstract class Command { - public abstract void execute() throws CommandFormatException; + public abstract void execute() throws CommandFormatException, InvalidDateException; } diff --git a/src/main/java/command/PromotionCommand.java b/src/main/java/command/PromotionCommand.java index c1eeb2a025..5d3a1eee60 100644 --- a/src/main/java/command/PromotionCommand.java +++ b/src/main/java/command/PromotionCommand.java @@ -1,8 +1,10 @@ package command; +import exceptions.InvalidDateException; import item.Item; import promotion.Month; import promotion.Promotion; +import promotion.Promotionlist; import java.time.DayOfWeek; @@ -10,29 +12,25 @@ public class PromotionCommand extends Command { protected Promotion promotion; - public void promotionCommand( + public PromotionCommand( String itemName, - Float promoPrice, + Float discount, int startDate, Month startMonth, int startYear, int endDate, Month endMonth, int endYear, - DayOfWeek weekly, int startTime, int endTime) { this.promotion = new Promotion( - itemName, promoPrice, + itemName, discount, startDate, startMonth, startYear, endDate, endMonth, endYear, - weekly, startTime, endTime); - } - - - public Promotion getPromotion() { - return promotion; + startTime, endTime); } @Override - public void execute() { + public void execute() throws InvalidDateException { + System.out.println(promotion); + Promotionlist.addPromotion(promotion); } diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 2b995877f3..980af25caf 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -31,7 +31,8 @@ public void execute() { } } int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; - float sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); + float originalSellPrice = Itemlist.getItem(index).getSellPrice(); + float sellPrice = (this.sellPrice >= 0) ? this.sellPrice * originalSellPrice : originalSellPrice; if (index == -1) { //throw exception; System.out.println("Item not found!"); diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index 6eb00fc0a8..9704130e05 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -8,5 +8,6 @@ public enum CommandType { DEL, EDIT, SELL, - FIND + FIND, + PROMOTION } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 8130ff36c1..7d1006114d 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -9,10 +9,13 @@ import command.HelpCommand; import command.IncorrectCommand; import command.ListCommand; +import command.PromotionCommand; import command.SellCommand; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; +import promotion.Month; +import promotion.Promotionlist; import java.util.regex.Matcher; @@ -33,7 +36,7 @@ public class Parser { "cat/(?[^/]+)|buy/(?\\d*\\.?\\d+)|sell/(?\\d*\\.?\\d+)))+"); public static final Pattern SELL_COMMAND_FORMAT = - Pattern.compile("sell (?[^/]+) qty/(?\\d+)(?: price/(?[^/]+))?"); + Pattern.compile("sell (?[^/]+) qty/(?\\d+)"); public static final Pattern FIND_COMMAND_FORMAT = Pattern.compile("find(?: /(?[^/]+))* (?[^/]+)"); @@ -44,6 +47,12 @@ public class Parser { public static final Pattern LIST_COMMAND_FORMAT = Pattern.compile("list(?: (?[^/]+))?"); + final Pattern PROMOTION_COMMAND_FORMAT = Pattern.compile( + "promotion (?[^\\s]+) discount/(?\\d+(\\.\\d{1,2})?) " + + "period /from (?\\d+) (?\\w+) (?\\d+) " + + "/to (?\\d+) (?\\w+) (?\\d+) " + + "time /from (?\\d+) /to (?\\d+)"); + public Command parseInput(String userInput){ final CommandType userCommand; final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); @@ -59,7 +68,6 @@ public Command parseInput(String userInput){ System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); } - switch (userCommand) { case EXIT: return new ExitCommand(true); @@ -101,6 +109,12 @@ public Command parseInput(String userInput){ } catch (CommandFormatException e) { break; } + case PROMOTION: + try { + return preparePromotion(userInput); + } catch (CommandFormatException e) { + break; + } default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -151,12 +165,26 @@ private Command prepareSell(String args) throws CommandFormatException{ if (sellPriceIsPresent && inputPrice < 0) { throw new CommandFormatException("SELL_PRICE"); } - int sellPrice = sellPriceIsPresent ? inputPrice : -1; + if (Promotionlist.isOnPromo(matcher.group("itemName"))) { + return new SellCommand( + matcher.group("itemName"), + sellQuantity, + Promotionlist.getPromotion("itemName").getDiscount() + ); + } else { + return new SellCommand( + matcher.group("itemName"), + sellQuantity, + -1 + ); + } + + /*int sellPrice = sellPriceIsPresent ? inputPrice : -1; return new SellCommand( matcher.group("itemName"), sellQuantity, sellPrice - ); + );*/ } private Command prepareFind(String args) throws CommandFormatException{ @@ -198,6 +226,37 @@ private Command prepareEdit(String args) throws CommandFormatException{ ); } + private Command preparePromotion(String args) throws CommandFormatException { + final Matcher matcher = PROMOTION_COMMAND_FORMAT.matcher(args.trim()); + + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.PROMOTION); + } + String itemName = matcher.group("itemName"); + float discount = Float.parseFloat(matcher.group("discount")) / 100; + int startDate = Integer.parseInt(matcher.group("startDate")); + String startMonth = matcher.group("startMonth"); + int startYear = Integer.parseInt(matcher.group("startYear")); + int endDate = Integer.parseInt(matcher.group("endDate")); + String endMonth = matcher.group("endMonth"); + int endYear = Integer.parseInt(matcher.group("endYear")); + int startTime = Integer.parseInt(matcher.group("startTime")); + int endTime = Integer.parseInt(matcher.group("endTime")); + System.out.println(Month.valueOf(startMonth.toUpperCase())); + return new PromotionCommand( + itemName, + discount, + startDate, + Month.valueOf(startMonth.toUpperCase()), + startYear, + endDate, + Month.valueOf(endMonth.toUpperCase()), + endYear, + startTime, + endTime + ); + } + private Command prepareList(String args) throws CommandFormatException { final Matcher matcher = LIST_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index 3ded4eceec..c835e74306 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -41,7 +41,6 @@ public Promotion( Float discount, int startDate, Month startMonth, int startYear, int endDate, Month endMonth, int endYear, - DayOfWeek weekly, int startTime, int endTime) { this.itemName = itemName; @@ -52,116 +51,53 @@ public Promotion( this.endDate = endDate; this.endMonth = endMonth; this.endYear = endYear; - this.weekly = weekly; this.startTime = startTime; this.endTime = endTime; + + } + + + public Float getDiscount() { + return discount; } - public boolean isLeapYear(int year) { - return year % 4 == 0; + public int getStartDate() { + return startDate; } - public void Main() throws InvalidDateException { - if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { - throw new InvalidDateException(); - } - if (!isValidTime(startTime, endTime)) { - throw new InvalidDateException(); - } - if (isOnPromo(itemName)) { //this code should be under sell component - //Item item = Itemlist.getItem("itemName"); - //float originalPrice = item.getSellPrice(); - //new EditCommand(itemName, "NA",-1, "NA", "NA", -1, discount*originalPrice); - } + public Month getStartMonth() { + return startMonth; } - public boolean isOnPromo(String itemName) { - if (!isPromoExist()) { - return false; - } - if (!Promotionlist.itemIsOnPromo(itemName)) { - return false; - } - return true; + public int getStartYear() { + return startYear; } - public boolean isPromoExist() { - LocalDateTime currentTime = LocalDateTime.now(); - DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); - DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("M"); - DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd"); - String formattedYear= currentTime.format(yearFormatter); - String formattedMonth = currentTime.format(monthFormatter); - String formattedDate = currentTime.format(dateFormatter); - int year = Integer.parseInt(formattedYear); - int month = Integer.parseInt(formattedMonth); - int date = Integer.parseInt(formattedDate); - if (year < startYear || year > endYear) { - return false; - } - if (month < startMonth.getValue() || month > endMonth.getValue()) { - return false; - } - if (date < startDate || date > endDate) { - return false; - } - return true; + public int getEndDate() { + return endDate; } - public boolean isValidTime (int startTime, int endTime) throws InvalidDateException { - boolean startIsValid = isVerifiedTime(startTime); - boolean endIsValid = isVerifiedTime(endTime); - if (!startIsValid || !endIsValid) { - return false; - } - return endTime <= startTime; + public Month getEndMonth() { + return endMonth; } - public boolean isVerifiedTime (int time) { - String[] splitTime = String.valueOf(time).split("(?<=.)"); - if (splitTime.length != 4) { - return false; - } - int hour = time / 100; - int min = time % 100; - if (hour > 23 || hour < 0) { - return false; - } - return min <= 59 && min >= 0; + public int getEndYear() { + return endYear; } - public boolean isValidMonth (int date, Month month, int year) throws InvalidDateException { - switch (month) { - case JAN: - if (date > 31 || date < 1) { - return false; - } - case FEB: - if (isLeapYear(year) && (date > 29 || date < 1)) { - return false; - } else return date <= 28 && date >= 1; - case MAR: - case MAY: - case JUL: - case DEC: - case OCT: - case AUG: - return date <= 31 && date >= 1; - case APR: - case SEP: - case NOV: - case JUN: - return date <= 30 && date >= 1; - default: - throw new InvalidDateException(); - } + public int getStartTime() { + return startTime; } - public Float getPromoPrice() { - return promoPrice; + public int getEndTime() { + return endTime; } public String getItemName() { return itemName; } + + public String toString() { + return getItemName() + getDiscount(); + } } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 8f024b8fe2..b7229063b2 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -1,5 +1,12 @@ package promotion; +import command.EditCommand; +import exceptions.InvalidDateException; +import item.Item; +import itemlist.Itemlist; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; public class Promotionlist { @@ -8,10 +15,6 @@ public class Promotionlist { public Promotionlist() { } - public static void addPromotion(Promotion promotion) { - promotions.add(promotion); - } - public static void deletePromotion(int index) { promotions.remove(index); } @@ -25,6 +28,136 @@ public static boolean itemIsOnPromo(String itemName) { return false; } + public static boolean isOnPromo(String itemName) { + if (!Promotionlist.itemIsOnPromo(itemName)) { + return false; + } + assert getPromotion(itemName) != null; + if (!isPromoExist(getPromotion(itemName))) { + return false; + } + return true; + } + + public static boolean isLeapYear(int year) { + return year % 4 == 0; + } + + public static void addPromotion(Promotion promotion) throws InvalidDateException { + int startDate = promotion.getStartDate(); + int endDate = promotion.getEndDate(); + Month startMonth = promotion.getStartMonth(); + Month endMonth = promotion.getEndMonth(); + int startYear = promotion.getStartYear(); + int endYear = promotion.getEndYear(); + int startTime = promotion.getStartTime(); + int endTime = promotion.getEndTime(); + String itemName = promotion.getItemName(); + float discount = promotion.getDiscount(); + + if (!Itemlist.itemIsExist(itemName)) { //promotion not created as item does not exist + throw new InvalidDateException(); + } + + //promotion not created as either invalid date for the month or year + if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { + throw new InvalidDateException(); + } + // + if (!isValidTime(startTime, endTime)) { + throw new InvalidDateException(); + } + promotions.add(promotion); //promotion is valid and created + //add in writeToPromotionList + + } + + public void deletePromo(int index) { + promotions.remove(index); + } + + + public static boolean isPromoExist(Promotion promotion) { + LocalDateTime currentTime = LocalDateTime.now(); + DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); + DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("M"); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd"); + String formattedYear= currentTime.format(yearFormatter); + String formattedMonth = currentTime.format(monthFormatter); + String formattedDate = currentTime.format(dateFormatter); + int year = Integer.parseInt(formattedYear); + int month = Integer.parseInt(formattedMonth); + int date = Integer.parseInt(formattedDate); + if (year < promotion.getStartDate() || year > promotion.getEndDate()) { + return false; + } + if (month < promotion.getStartMonth().getValue() || month > promotion.getEndMonth().getValue()) { + return false; + } + if (date < promotion.getStartDate() || date > promotion.getEndDate()) { + return false; + } + return true; + } + + public static boolean isValidTime(int startTime, int endTime) throws InvalidDateException { + boolean startIsValid = isVerifiedTime(startTime); + boolean endIsValid = isVerifiedTime(endTime); + if (!startIsValid || !endIsValid) { //format for date and time is valid + return false; + } + return true; + } + + public static boolean isVerifiedTime(int time) { + String[] splitTime = String.valueOf(time).split("(?<=.)"); + if (splitTime.length != 4) { + return false; + } + int hour = time / 100; + int min = time % 100; + if (hour > 23 || hour < 0) { + return false; + } + return min <= 59 && min >= 0; + } + + public static boolean isValidMonth(int date, Month month, int year) throws InvalidDateException { + switch (month) { + case JAN: + if (date > 31 || date < 1) { + return false; + } + case FEB: + if (isLeapYear(year) && (date > 29 || date < 1)) { + return false; + } else return date <= 28 && date >= 1; + case MAR: + case MAY: + case JUL: + case DEC: + case OCT: + case AUG: + return date <= 31 && date >= 1; + case APR: + case SEP: + case NOV: + case JUN: + return date <= 30 && date >= 1; + default: + throw new InvalidDateException(); + } + } + + public static Promotion getPromotion(String itemName) { + for (Promotion promotion: promotions) { + if (promotion.getItemName().equals(itemName)) { + return promotion; + } + } + return null; + } + public static ArrayList getPromo() { return promotions; } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 3c31f27076..7e78224600 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -3,6 +3,7 @@ import command.Command; import command.ExitCommand; import exceptions.CommandFormatException; +import exceptions.InvalidDateException; import parser.Parser; import storage.Storage; import storage.TransactionLogs; @@ -20,11 +21,11 @@ public class Duke { /** * Main entry-point for the java.duke.Duke application. */ - public static void main(String[] args) throws IOException, CommandFormatException { + public static void main(String[] args) throws IOException, CommandFormatException, InvalidDateException { new Duke().run(); } - public void run() throws IOException, CommandFormatException { + public void run() throws IOException, CommandFormatException, InvalidDateException { ui.showWelcomeMessage("StockMaster v2.0", "./StockMasterData.txt"); Storage.updateFile("", true); Storage.readFromFile("./StockMasterData.txt"); @@ -34,7 +35,7 @@ public void run() throws IOException, CommandFormatException { ui.showGoodByeMessage("./StockMasterData.txt"); } - private void normalOperation() throws IOException, CommandFormatException { + private void normalOperation() throws IOException, CommandFormatException, InvalidDateException { String userInput; do { userInput = ui.getUserInput(); From ed16e12c4b10850e49c0096a1f9c7afabd27e992 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 3 Apr 2024 18:07:53 +0800 Subject: [PATCH 166/421] Fix NumberFormatException --- src/main/java/item/Transaction.java | 2 +- src/main/java/storage/Storage.java | 94 ++++++++++++---------- src/main/java/storage/TransactionLogs.java | 73 ++++++++++------- 3 files changed, 96 insertions(+), 73 deletions(-) diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index e8a9b74795..d857a245a3 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -27,7 +27,7 @@ public Transaction(String name, int inputQty, float inputBuy, float inputSell) { isVoided = false; } - public Transaction(String name, int inputQty, int inputBuy, int inputSell, String storedTime) { + public Transaction(String name, int inputQty, float inputBuy, float inputSell, String storedTime) { dateTime = storedTime; item = Itemlist.getItem(name); quantity = inputQty; diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index f2c925a1b6..507ca8a0eb 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,6 +1,8 @@ package storage; import item.Item; +import item.Transaction; +import itemlist.Cashier; import itemlist.Itemlist; import java.io.File; @@ -11,9 +13,8 @@ import java.io.IOException; /** - * Represents an add command where a new task is added to the existing list of task. + * Represents a class that stores and writes information of a list of items to a file. * String FILENAME represents the designated relative file path for the file. - * File dukeData represents the File object created to be updated. */ public class Storage { private static final String FILENAME = "./StockMasterData.txt"; @@ -55,6 +56,54 @@ public static File setFile() { return new File(FILENAME); } + /** + * Write contents to the file. + * + * @param scanner The scanner to read the file. + * @throws NumberFormatException If number is found to be invalid type. + */ + public static void interpretLines(Scanner scanner) throws NumberFormatException{ + while (scanner.hasNext()) { + String fileLine = scanner.nextLine(); + String[] keyCommands = fileLine.split(" \\| "); + String commandQty = ""; + String commandCat = ""; + String commandUom = ""; + String commandBuy = ""; + String commandSell = ""; + String commandName = ""; + String commandIsMarked = ""; + for (String keyCommand : keyCommands) { + if (keyCommand.contains("add")) { + //do nothing. + } else if (keyCommand.contains("Qty: ")) { + String[] commandQtyUnit = keyCommand.replace("Qty: ", "").split(" "); + assert commandQtyUnit.length == 2 : "length not 2!"; + commandQty = commandQtyUnit[0]; + commandUom = commandQtyUnit[1]; + } else if (keyCommand.contains("Cat: ")) { + commandCat = keyCommand.replace("Cat: ", ""); + } else if (keyCommand.contains("BuyPrice: $")) { + commandBuy = keyCommand.replace("BuyPrice: $", ""); + } else if (keyCommand.contains("SellPrice: $")) { + commandSell = keyCommand.replace("SellPrice: $", ""); + } else if (keyCommand.contains("[")) { + commandIsMarked = keyCommand.contains("X") ? "true" : "false"; + } else { + commandName = keyCommand.trim(); + } + } + Item toAdd = new Item(commandName, Integer.parseInt(commandQty), commandUom, commandCat, + Float.parseFloat(commandBuy), Float.parseFloat(commandSell)); + if (commandIsMarked.equals("true")) { + toAdd.mark(); + } else if (commandIsMarked.equals("false")) { + toAdd.unmark(); + } + Itemlist.addItem(toAdd); + } + } + /** * Read lines from the file and identify tasks written inside. * Add the identified tasks into a list of existing tasks. @@ -64,46 +113,7 @@ public static File setFile() { public static void readFromFile(String fileName) { try { Scanner scanner = new Scanner(new File(fileName)); - while (scanner.hasNext()) { - String fileLine = scanner.nextLine(); - String[] keyCommands = fileLine.split(" \\| "); - String commandQty = ""; - String commandCat = ""; - String commandUom = ""; - String commandBuy = ""; - String commandSell = ""; - String commandName = ""; - String commandIsMarked = ""; - for (String keyCommand : keyCommands) { - if (keyCommand.contains("add")) { - //do nothing. - } else if (keyCommand.contains("Qty: ")) { - String[] commandQtyUnit = keyCommand.replace("Qty: ", "").split(" "); - assert commandQtyUnit.length == 2 : "length not 2!"; - commandQty = commandQtyUnit[0]; - commandUom = commandQtyUnit[1]; - } else if (keyCommand.contains("Cat: ")) { - commandCat = keyCommand.replace("Cat: ", ""); - } else if (keyCommand.contains("BuyPrice: $")) { - commandBuy = keyCommand.replace("BuyPrice: $", ""); - } else if (keyCommand.contains("SellPrice: $")) { - commandSell = keyCommand.replace("SellPrice: $", ""); - } else if (keyCommand.contains("[")) { - commandIsMarked = keyCommand.contains("X") ? "true" : "false"; - } else { - commandName = keyCommand.trim(); - } - } - Item toAdd = new Item(commandName, Integer.parseInt(commandQty), commandUom, commandCat, - Float.parseFloat(commandBuy), Float.parseFloat(commandSell)); - if (commandIsMarked.equals("true")) { - toAdd.mark(); - } else if (commandIsMarked.equals("false")) { - toAdd.unmark(); - } - Itemlist.addItem(toAdd); - - } + interpretLines(scanner); scanner.close(); } catch(FileNotFoundException e) { System.out.println("File does not exist."); diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 1ee96bd2cf..7d8f2ece23 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -9,6 +9,10 @@ import java.util.ArrayList; import java.util.Scanner; +/** + * Represents a class that stores and writes transaction information of a list of items to a file. + * String LOGNAME represents the designated relative file path for the file. + */ public class TransactionLogs extends Storage { private static final String LOGNAME = "./TransactionLogs.txt"; @@ -24,43 +28,52 @@ public static void updateFile(String inputText, boolean ifAppend) { } } + /** + * Write contents to the file. + * + * @param scanner The scanner to read the file. + * @throws NumberFormatException If number is found to be invalid type. + */ + public static void interpretLines(Scanner scanner) throws NumberFormatException{ + String commandQty = ""; + String commandProfit = ""; + String commandTotalSell = ""; + String commandSell = ""; + String commandName = ""; + String commandDate = ""; + while (scanner.hasNext()) { + String fileLine = scanner.nextLine(); + if (fileLine.contains("Quantity: ")) { + commandQty = fileLine.replace("Quantity: ", ""); + } else if (fileLine.contains("Date: ")) { + commandDate = fileLine.replace("Date: ", ""); + } else if (fileLine.contains("Unit Price: ")) { + commandSell = fileLine.replace("Unit Price: ", ""); + } else if (fileLine.contains("Total Price: ")) { + commandTotalSell = fileLine.replace("Total Price: ", ""); + } else if (fileLine.contains("Item Name: ")){ + commandName = fileLine.replace("Item Name: ", ""); + } else if (fileLine.contains("Profit: ")) { + commandProfit = fileLine.replace("Profit: ", ""); + int quantityAsInt = Integer.parseInt(commandQty); + float buyAsFloat = (Float.parseFloat(commandTotalSell) - Float.parseFloat(commandProfit)) + / (float) quantityAsInt; + Transaction toAdd = new Transaction(commandName, quantityAsInt, + buyAsFloat, Float.parseFloat(commandSell), commandDate); + Cashier.addItem(toAdd); + } + } + } + public static void readFromFile(String fileName) { try { Scanner scanner = new Scanner(new File(fileName)); - String commandQty = ""; - String commandProfit = ""; - String commandTotalSell = ""; - String commandSell = ""; - String commandName = ""; - String commandDate = ""; - while (scanner.hasNext()) { - String fileLine = scanner.nextLine(); - System.out.println(fileLine); - if (fileLine.contains("Quantity: ")) { - commandQty = fileLine.replace("Quantity: ", ""); - } else if (fileLine.contains("Date: ")) { - commandDate = fileLine.replace("Date: ", ""); - } else if (fileLine.contains("Unit Price: ")) { - commandSell = fileLine.replace("Unit Price: ", ""); - } else if (fileLine.contains("Total Price: ")) { - commandTotalSell = fileLine.replace("Total Price: ", ""); - } else if (fileLine.contains("Item Name: ")){ - commandName = fileLine.replace("Item Name: ", ""); - } else if (fileLine.contains("Profit: ")) { - commandProfit = fileLine.replace("Profit: ", ""); - int quantityAsInt = Integer.parseInt(commandQty); - int buyAsInt = (Integer.parseInt(commandTotalSell) - Integer.parseInt(commandProfit)) - / quantityAsInt; - Transaction toAdd = new Transaction(commandName, quantityAsInt, - buyAsInt, Integer.parseInt(commandSell), commandDate); - Cashier.addItem(toAdd); - } - } + interpretLines(scanner); scanner.close(); } catch(FileNotFoundException e) { System.out.println("File does not exist."); } catch(NumberFormatException e) { - System.out.println("Invalid numbers found"); + System.out.println("Invalid numbers found!!!"); } } From cdda7b5770ded7326ce36cde84be52104002d15d Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 3 Apr 2024 18:12:31 +0800 Subject: [PATCH 167/421] Remove unused imports --- src/main/java/storage/Storage.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 507ca8a0eb..6474e7a889 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,8 +1,6 @@ package storage; import item.Item; -import item.Transaction; -import itemlist.Cashier; import itemlist.Itemlist; import java.io.File; From 218810e3d992bd8c163219a6c94782d675189538 Mon Sep 17 00:00:00 2001 From: LowTL Date: Wed, 3 Apr 2024 18:21:51 +0800 Subject: [PATCH 168/421] Add CashierCommands class --- src/main/java/command/CashierCommands.java | 37 ++++++++++++++++++++++ src/main/java/itemlist/Cashier.java | 4 +-- src/main/java/parser/CommandType.java | 5 ++- src/main/java/parser/Parser.java | 31 +++++++++++------- 4 files changed, 62 insertions(+), 15 deletions(-) create mode 100644 src/main/java/command/CashierCommands.java diff --git a/src/main/java/command/CashierCommands.java b/src/main/java/command/CashierCommands.java new file mode 100644 index 0000000000..8cf6f91e26 --- /dev/null +++ b/src/main/java/command/CashierCommands.java @@ -0,0 +1,37 @@ +package command; + +import item.Item; +import itemlist.Cashier; +import parser.CommandType; +import ui.TextUi; + +import java.text.DecimalFormat; + +public class CashierCommands extends Command { + protected CommandType commandType; + + public CashierCommands(String command) { + this.commandType = CommandType.valueOf(command); + } + + @Override + public void execute() { + switch (commandType) { + case BESTSELLER: + Item bs = Cashier.getBestseller(); + TextUi.replyToUser("The bestseller is " + bs.getItemName()); + break; + case TOTAL_PROFIT: + float profit = Cashier.getTotalProfit(); + TextUi.replyToUser("The total profit so far is " + String.format("%.2f", profit)); + break; + case TOTAL_REVENUE: + float revenue = Cashier.getTotalRevenue(); + TextUi.replyToUser("The total revenue so far is " + String.format("%.2f", revenue)); + break; + default: + break; + } + + }; +} diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 1b4bad073c..94be0d4032 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -31,7 +31,7 @@ public static float getTotalRevenue() { return revenue; } - public float getTotalProfit() { + public static float getTotalProfit() { float totalProfit = 0; for (Transaction t: transactions) { if (!t.getIsVoided()) { @@ -45,7 +45,7 @@ public static Transaction getTransaction(int index) { return transactions.get(index); } - public Item getBestseller() { + public static Item getBestseller() { Item bestSeller = Itemlist.getItem(0); float[] profits = new float[Itemlist.items.size()]; for (Transaction t: transactions) { diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index d10673f1ed..d9f430a70f 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -10,5 +10,8 @@ public enum CommandType { SELL, FIND, MARK, - UNMARK + UNMARK, + TOTAL_PROFIT, + TOTAL_REVENUE, + BESTSELLER, } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index bbd74046f7..c1566c1e61 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,19 +1,8 @@ package parser; -import command.AddCommand; -import command.DeleteCommand; -import command.EditCommand; -import command.ExitCommand; -import command.FindCommand; -import command.HelpCommand; -import command.IncorrectCommand; -import command.ListCommand; -import command.MarkCommand; -import command.SellCommand; -import command.UnmarkCommand; +import command.*; import common.Messages; import exceptions.CommandFormatException; -import command.Command; import itemlist.Itemlist; @@ -50,6 +39,12 @@ public class Parser { Pattern.compile("mark (?[^/]+)"); public static final Pattern UNMARK_COMMAND_FORMAT = Pattern.compile("unmark (?[^/]+)"); + public static final Pattern TOTAL_PROFIT_FORMAT = + Pattern.compile("profit"); + public static final Pattern TOTAL_REVENUE_FORMAT = + Pattern.compile("revenue"); + public static final Pattern BESTSELLER_FORMAT = + Pattern.compile("bestseller"); public Command parseInput(String userInput){ final CommandType userCommand; @@ -120,6 +115,13 @@ public Command parseInput(String userInput){ } catch (CommandFormatException e) { break; } + case TOTAL_PROFIT: + //fallthrough + case TOTAL_REVENUE: + //fallthrough + case BESTSELLER: + prepareCashierCommands(userInput, commandWord); + break; default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -252,6 +254,11 @@ private Command prepareUnmark(String args) throws CommandFormatException { String itemName = matcher.group("itemName"); return new UnmarkCommand(itemName); } + + private Command prepareCashierCommands(String args, String command) { + final Matcher matcher = TOTAL_PROFIT_FORMAT.matcher(args.trim()); + return new CashierCommands(command); + } } From 7d6bf3e8780eb75d27acb149c122247586cdf6f3 Mon Sep 17 00:00:00 2001 From: LowTL Date: Wed, 3 Apr 2024 18:28:33 +0800 Subject: [PATCH 169/421] Fix wrong imports --- src/main/java/command/CashierCommands.java | 2 -- src/main/java/parser/Parser.java | 13 ++++++++++++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/command/CashierCommands.java b/src/main/java/command/CashierCommands.java index 8cf6f91e26..fb61f6fe08 100644 --- a/src/main/java/command/CashierCommands.java +++ b/src/main/java/command/CashierCommands.java @@ -5,8 +5,6 @@ import parser.CommandType; import ui.TextUi; -import java.text.DecimalFormat; - public class CashierCommands extends Command { protected CommandType commandType; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index c1566c1e61..35fde5ea04 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,6 +1,17 @@ package parser; -import command.*; +import command.Command; +import command.AddCommand; +import command.DeleteCommand; +import command.EditCommand; +import command.ExitCommand; +import command.FindCommand; +import command.HelpCommand; +import command.IncorrectCommand; +import command.ListCommand; +import command.MarkCommand; +import command.SellCommand; +import command.UnmarkCommand; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; From bab0d5f70e5e0609c00958a04e360e3df4ce8696 Mon Sep 17 00:00:00 2001 From: LowTL Date: Wed, 3 Apr 2024 18:29:07 +0800 Subject: [PATCH 170/421] Add CashierCommands import --- src/main/java/parser/Parser.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 35fde5ea04..c38c70fb85 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -12,6 +12,7 @@ import command.MarkCommand; import command.SellCommand; import command.UnmarkCommand; +import command.CashierCommands; import common.Messages; import exceptions.CommandFormatException; import itemlist.Itemlist; From 4487e8da612536351e5c903666e9487a1f04f484 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 3 Apr 2024 22:31:26 +0800 Subject: [PATCH 171/421] merge upstream --- StockMasterData.txt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index d96ab2a0c7..21ac5188cc 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,4 +1,2 @@ -1. | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | apple | Qty: 180 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 -3. | orange | Qty: 0 pieces | Cat: fruits | BuyPrice: $2.0 | SellPrice: $4.0 -4. | samsung phone | Qty: 3 pieces | Cat: electronics | BuyPrice: $80.0 | SellPrice: $300.0 \ No newline at end of file +1. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +2. | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 From 2431459cf06a5926702253d5644bb8f066faaf4e Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 3 Apr 2024 23:02:31 +0800 Subject: [PATCH 172/421] add parser and sell JUnit tests --- docs/UserGuide.md | 13 +++ src/main/java/command/AddCommand.java | 14 +-- src/main/java/command/EditCommand.java | 29 +++++++ src/main/java/command/FindCommand.java | 9 ++ src/main/java/command/ListCommand.java | 5 ++ src/main/java/command/MarkCommand.java | 5 ++ src/main/java/command/SellCommand.java | 13 +++ src/main/java/command/UnmarkCommand.java | 5 ++ src/test/java/command/SellCommandTest.java | 22 +++++ src/test/java/parser/ParserTest.java | 99 ++++++++++++++++++++-- 10 files changed, 201 insertions(+), 13 deletions(-) create mode 100644 src/test/java/command/SellCommandTest.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 0ef1369346..03c815ba47 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -43,6 +43,19 @@ Example of usage: del Apples ``` +### Selling an item: `sell` +Sells a quantity of an item from the list of items at a stated price. + +Format: `sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]` + +* `SELL_PRICE` is an optional field. If blank, it will default to the item's set sell price. + +Example of usage: +``` +sell Apple qty/20 price/6 +sell Phone qty/1 +``` + ### Editing an item: `edit` Edits the parameters of the item. diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 7baefa3ade..7f42914076 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -9,20 +9,20 @@ public class AddCommand extends Command { public static final String MESSAGE_SUCCESS = "added: "; protected String itemName; protected int quantity; - protected String uom; + protected String UnitOfMeasurement; protected String category; protected float buyPrice; protected float sellPrice; private final Item toAdd; - public AddCommand(String itemName, int quantity, String uom, String category, float buyPrice, float sellPrice) { + public AddCommand(String itemName, int quantity, String UnitOfMeasurement, String category, float buyPrice, float sellPrice) { this.itemName = itemName; this.quantity = quantity; - this.uom = uom; + this.UnitOfMeasurement = UnitOfMeasurement; this.category = category; this.buyPrice = buyPrice; this.sellPrice = sellPrice; - this.toAdd = new Item(itemName, quantity, uom, category, buyPrice, sellPrice); + this.toAdd = new Item(itemName, quantity, UnitOfMeasurement, category, buyPrice, sellPrice); } public String getItemName() { @@ -34,8 +34,8 @@ public int getQuantity() { public String getCategory() { return category; } - public String getUom() { - return uom; + public String getUnitOfMeasurement() { + return UnitOfMeasurement; } public float getBuyPrice() { return buyPrice; @@ -50,7 +50,7 @@ public void execute() { updateQuantity(itemName); } else { Itemlist.addItem(toAdd); - System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUom() + + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); Storage.addToFile(Itemlist.getItems()); if (!category.equals("NA")) { diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 73aaaad064..bca282cde2 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -27,6 +27,34 @@ public EditCommand(String itemName, String newItemName, int newQuantity, String this.newSellPrice = newSellPrice; } + public String getItemName() { + return itemName; + } + + public String getNewItemName() { + return newItemName; + } + + public int getNewQuantity() { + return newQuantity; + } + + public String getNewUnitOfMeasurement() { + return newUnitOfMeasurement; + } + + public String getNewCategory() { + return newCategory; + } + + public float getNewBuyPrice() { + return newBuyPrice; + } + + public float getNewSellPrice() { + return newSellPrice; + } + @Override public void execute() { int index = -1; // flag to check if item exists in Itemlist @@ -77,4 +105,5 @@ public void execute() { ui.TextUi.replyToUser(""); Storage.overwriteFile(Itemlist.getItems()); } + } diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index e6815f7237..b5e676a77f 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -17,6 +17,14 @@ public FindCommand(String itemInfo, String keyword) { this.itemInfo = itemInfo; } + public String getItemInfo() { + return keyword; + } + + public String getKeyword() { + return itemInfo; + } + @Override public void execute() { if (itemInfo.equals("NA")) { @@ -52,4 +60,5 @@ public ArrayList filterList() { } return searchList; } + } diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 08bda51bbe..1e664656c6 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -17,6 +17,10 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMar this.isListMarked = isListMarked; } + public String getCategory() { + return category; + } + //@@author Fureimi public void execute() { if (category.equals("NA") && !isListMarked) { @@ -25,5 +29,6 @@ public void execute() { TextUi.showCustomizedList(arrayList, category, isListMarked); } } + } diff --git a/src/main/java/command/MarkCommand.java b/src/main/java/command/MarkCommand.java index 5ea2003d7b..930776fb50 100644 --- a/src/main/java/command/MarkCommand.java +++ b/src/main/java/command/MarkCommand.java @@ -14,6 +14,10 @@ public MarkCommand(String itemName) { this.itemName = itemName; } + public String getItemName() { + return itemName; + } + @Override public void execute() throws CommandFormatException { Item item = Itemlist.getItem(itemName); @@ -27,4 +31,5 @@ public void execute() throws CommandFormatException { } Storage.overwriteFile(Itemlist.getItems()); } + } diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index e02794ab84..ee8e834398 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -19,6 +19,18 @@ public SellCommand (String itemName, int quantity, float price) { this.sellPrice = price; } + public String getItemName() { + return itemName; + } + + public int getSellQuantity() { + return sellQuantity; + } + + public float getSellPrice() { + return sellPrice; + } + @Override public void execute() { int index = -1; @@ -49,4 +61,5 @@ public void execute() { Cashier.addItem(newTransaction); TransactionLogs.addToLog(Cashier.getTransactions()); } + } diff --git a/src/main/java/command/UnmarkCommand.java b/src/main/java/command/UnmarkCommand.java index ddc7f3a54f..43a38ee326 100644 --- a/src/main/java/command/UnmarkCommand.java +++ b/src/main/java/command/UnmarkCommand.java @@ -14,6 +14,10 @@ public UnmarkCommand(String itemName) { this.itemName = itemName; } + public String getItemName() { + return itemName; + } + @Override public void execute() throws CommandFormatException { Item item = Itemlist.getItem(itemName); @@ -27,4 +31,5 @@ public void execute() throws CommandFormatException { } Storage.overwriteFile(Itemlist.getItems()); } + } diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java new file mode 100644 index 0000000000..1ea905e1af --- /dev/null +++ b/src/test/java/command/SellCommandTest.java @@ -0,0 +1,22 @@ +package command; + +import exceptions.CommandFormatException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.fail; + +public class SellCommandTest { + + @Test + public void sellItemTest() throws CommandFormatException { + try { + Command sellCommandTest1 = new SellCommand("testItem", 1, 3); + Command sellCommandTest2 = new SellCommand("testItem", 7, 14); + sellCommandTest1.execute(); + sellCommandTest2.execute(); + } catch (CommandFormatException e) { + fail("Unable to sell item."); + } + } + +} \ No newline at end of file diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index bc9d35cf6b..b3c5983ab2 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -1,9 +1,21 @@ package parser; +import command.Command; +import command.AddCommand; +import command.EditCommand; +import command.FindCommand; +import command.HelpCommand; +import command.ListCommand; +import command.MarkCommand; +import command.SellCommand; +import command.UnmarkCommand; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + public class ParserTest { + private Parser parser; @BeforeEach @@ -11,12 +23,87 @@ public void setUp() { parser = new Parser(); } - /* - * Note how the names of the test methods does not follow the normal naming convention. - * That is because our coding standard allows a different naming convention for test methods. - */ + @Test + public void testParseAddCommand() { + String userInput = "add ItemName qty/10 /unitOfMeasurement cat/Category buy/10.5 sell/15.0"; + Command command = parser.parseInput(userInput); + assertInstanceOf(AddCommand.class, command); + AddCommand addCommand = (AddCommand) command; + assertEquals("ItemName", addCommand.getItemName()); + assertEquals(10, addCommand.getQuantity()); + assertEquals("unitOfMeasurement", addCommand.getUnitOfMeasurement()); + assertEquals("Category", addCommand.getCategory()); + assertEquals(10.5f, addCommand.getBuyPrice(), 0.01); + assertEquals(15.0f, addCommand.getSellPrice(), 0.01); + } + + @Test + public void testParseEditCommand() { + String userInput = "edit ItemName name/NewName qty/20 uom/NewUOM cat/NewCategory buy/15.0 sell/20.0"; + Command command = parser.parseInput(userInput); + assertInstanceOf(EditCommand.class, command); + EditCommand editCommand = (EditCommand) command; + assertEquals("ItemName", editCommand.getItemName()); + assertEquals("NewName", editCommand.getNewItemName()); + assertEquals(20, editCommand.getNewQuantity()); + assertEquals("NewUOM", editCommand.getNewUnitOfMeasurement()); + assertEquals("NewCategory", editCommand.getNewCategory()); + assertEquals(15.0f, editCommand.getNewBuyPrice(), 0.01); + assertEquals(20.0f, editCommand.getNewSellPrice(), 0.01); + } + + @Test + public void testParseSellCommand() { + String userInput = "sell ItemName qty/5 price/20.0"; + Command command = parser.parseInput(userInput); + assertInstanceOf(SellCommand.class, command); + SellCommand sellCommand = (SellCommand) command; + assertEquals("ItemName", sellCommand.getItemName()); + assertEquals(5, sellCommand.getSellQuantity()); + assertEquals(20.0f, sellCommand.getSellPrice(), 0.01); + } + + @Test + public void testParseFindCommand() { + String userInput = "find /info Keyword"; + Command command = parser.parseInput(userInput); + assertInstanceOf(FindCommand.class, command); + FindCommand findCommand = (FindCommand) command; + assertEquals("/info", findCommand.getItemInfo()); + assertEquals("Keyword", findCommand.getKeyword()); + } + + @Test + public void testParseListCommand() { + String userInput = "list cat/Category"; + Command command = parser.parseInput(userInput); + assertInstanceOf(ListCommand.class, command); + ListCommand listCommand = (ListCommand) command; + assertEquals("Category", listCommand.getCategory()); + } + + @Test + public void testParseMarkCommand() { + String userInput = "mark ItemName"; + Command command = parser.parseInput(userInput); + assertInstanceOf(MarkCommand.class, command); + MarkCommand markCommand = (MarkCommand) command; + assertEquals("ItemName", markCommand.getItemName()); + } + + @Test + public void testParseUnmarkCommand() { + String userInput = "unmark ItemName"; + Command command = parser.parseInput(userInput); + assertInstanceOf(UnmarkCommand.class, command); + UnmarkCommand unmarkCommand = (UnmarkCommand) command; + assertEquals("ItemName", unmarkCommand.getItemName()); + } @Test - public void parse_emptyInput_returnsIncorrect() { + public void testParseHelpCommand() { + String userInput = "help"; + Command command = parser.parseInput(userInput); + assertInstanceOf(HelpCommand.class, command); } -} +} \ No newline at end of file From 37e7760458a2c5ee31b1c8a582fd33d005b6728d Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 00:30:57 +0800 Subject: [PATCH 173/421] Standardise variable name --- src/main/java/itemlist/Cashier.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 94be0d4032..780f2962d3 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -22,13 +22,13 @@ public static ArrayList getTransactions() { } public static float getTotalRevenue() { - float revenue = 0; + float totalRevenue = 0; for (Transaction t : getTransactions()) { if (!t.getIsVoided()) { - revenue += t.getTotalPrice(); + totalRevenue += t.getTotalPrice(); } } - return revenue; + return totalRevenue; } public static float getTotalProfit() { From 1e378475bb9d01fbc0d941ed60f5864fe5502af1 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 4 Apr 2024 00:42:50 +0800 Subject: [PATCH 174/421] add addcommand sequence diagram --- docs/Diagrams/AddCommand_Sequence_Diagram.png | Bin 0 -> 48441 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Diagrams/AddCommand_Sequence_Diagram.png diff --git a/docs/Diagrams/AddCommand_Sequence_Diagram.png b/docs/Diagrams/AddCommand_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3e840854b500fdf54824bbdcca59ba40f6f95f8a GIT binary patch literal 48441 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 Date: Thu, 4 Apr 2024 00:53:00 +0800 Subject: [PATCH 175/421] checkstyle edit --- src/main/java/command/AddCommand.java | 15 ++++++++------- src/test/java/command/SellCommandTest.java | 2 +- src/test/java/parser/ParserTest.java | 5 +++-- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 7f42914076..ede89e5b39 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -9,20 +9,21 @@ public class AddCommand extends Command { public static final String MESSAGE_SUCCESS = "added: "; protected String itemName; protected int quantity; - protected String UnitOfMeasurement; + protected String unitOfMeasurement; protected String category; protected float buyPrice; protected float sellPrice; private final Item toAdd; - public AddCommand(String itemName, int quantity, String UnitOfMeasurement, String category, float buyPrice, float sellPrice) { + public AddCommand(String itemName, int quantity, String unitOfMeasurement, String category, float buyPrice, + float sellPrice) { this.itemName = itemName; this.quantity = quantity; - this.UnitOfMeasurement = UnitOfMeasurement; + this.unitOfMeasurement = unitOfMeasurement; this.category = category; this.buyPrice = buyPrice; this.sellPrice = sellPrice; - this.toAdd = new Item(itemName, quantity, UnitOfMeasurement, category, buyPrice, sellPrice); + this.toAdd = new Item(itemName, quantity, unitOfMeasurement, category, buyPrice, sellPrice); } public String getItemName() { @@ -35,7 +36,7 @@ public String getCategory() { return category; } public String getUnitOfMeasurement() { - return UnitOfMeasurement; + return unitOfMeasurement; } public float getBuyPrice() { return buyPrice; @@ -50,8 +51,8 @@ public void execute() { updateQuantity(itemName); } else { Itemlist.addItem(toAdd); - System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() + - ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); + System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() + + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); Storage.addToFile(Itemlist.getItems()); if (!category.equals("NA")) { System.out.println(" to " + getCategory()); diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index 1ea905e1af..9fcc3acdf4 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -19,4 +19,4 @@ public void sellItemTest() throws CommandFormatException { } } -} \ No newline at end of file +} diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index b3c5983ab2..902a8e37ee 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -12,7 +12,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; public class ParserTest { @@ -106,4 +107,4 @@ public void testParseHelpCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(HelpCommand.class, command); } -} \ No newline at end of file +} From 6fdca2f357d493e5d8ecd92388c6b9aa0f10e0fd Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 01:00:43 +0800 Subject: [PATCH 176/421] Update DG --- docs/DeveloperGuide.md | 29 +++++++++++++----- .../CashierCommands_SequenceDiagram.png | Bin 0 -> 78591 bytes 2 files changed, 21 insertions(+), 8 deletions(-) create mode 100644 docs/Diagrams/CashierCommands_SequenceDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7bfd081572..8ce54593bd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -7,10 +7,19 @@ ## Design & implementation {Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} -### Exception + +### Command +The Command class is an abstract class which is extended to execute the various commands +used in the product. + ### Itemlist Itemlist class is an object which contains items to be added to the stock inventory list. Able to add items, remove functions, edit items inside the list. + +The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` + +![AddCommand_SequenceDiagram](./Diagrams/AddCommand_Sequence_Diagram.png) + ### Item Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, quantity of item, and others. @@ -22,6 +31,10 @@ Storage class contains methods to write description of items to the file `./Stoc and retrieve information from the file when program restarts. ### UI +### Cashier +Cashier class extends Itemlist class +![CashierCommands_SequenceDiagram](./Diagrams/CashierCommands_SequenceDiagram.png) + ## Product scope StockMaster allows users to use the following commands: @@ -52,13 +65,13 @@ a typical mouse/GUI driven app ## User Stories -|Version| As a ... | I want to ... | So that I can ... | -|--------|----------|-----------------------------|------------------------------------------------------------| -|v1.0|new user| see usage instructions | refer to them when I forget how to use the application | -|v1.0|user| add new items | | -|v1.0|user| make changes to added items | change details about items such as quantity or price | -|v1.0|user| search for specific items || -|v2.0|user| find a to-do item by name | locate a to-do without having to go through the entire list | +| Version | As a ... | I want to ... | So that I can ... | +|---------|----------|-----------------------------|-------------------------------------------------------------| +| v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | +| v1.0 | user | add new items | | +| v1.0 | user | make changes to added items | change details about items such as quantity or price | +| v1.0 | user | search for specific items | | +| v2.0 | user | find a to-do item by name | locate a to-do without having to go through the entire list | ## Non-Functional Requirements diff --git a/docs/Diagrams/CashierCommands_SequenceDiagram.png b/docs/Diagrams/CashierCommands_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..32e6eb256104c30b4e6bc9e08e763013ab3c6bbf GIT binary patch literal 78591 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 JOf@=s=|8B6AJG5+ literal 0 HcmV?d00001 From 63eccac5f8f313432f10ec71bde92145ea3f0a49 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 4 Apr 2024 03:59:48 +0800 Subject: [PATCH 177/421] Edit Promotion Class --- PromotionStorage.txt | 6 + StockMasterData.txt | 3 +- TransactionLogs.txt | 24 ++++ docs/DeveloperGuide.md | 43 ++++++- .../java/command/AddPromotionCommand.java | 45 +++++++ .../java/command/DeletePromotionCommand.java | 28 +++++ src/main/java/command/FindCommand.java | 2 +- src/main/java/command/ListCommand.java | 10 +- src/main/java/command/PromotionCommand.java | 38 ------ src/main/java/command/SellCommand.java | 14 +-- src/main/java/common/Messages.java | 29 ++++- .../exceptions/CommandFormatException.java | 21 +++- .../java/exceptions/InvalidDateException.java | 23 ++++ src/main/java/parser/CommandType.java | 4 +- src/main/java/parser/Parser.java | 99 +++++++++------ src/main/java/promotion/Promotion.java | 21 ++-- src/main/java/promotion/Promotionlist.java | 51 ++++---- src/main/java/seedu/duke/Duke.java | 15 ++- src/main/java/storage/PromotionStorage.java | 115 ++++++++++++++++++ src/main/java/storage/Storage.java | 1 + src/main/java/ui/TextUi.java | 24 ++-- src/test/java/storage/StorageTest.java | 3 +- src/test/java/ui/TextUiTest.java | 6 +- 23 files changed, 466 insertions(+), 159 deletions(-) create mode 100644 PromotionStorage.txt create mode 100644 src/main/java/command/AddPromotionCommand.java create mode 100644 src/main/java/command/DeletePromotionCommand.java delete mode 100644 src/main/java/command/PromotionCommand.java create mode 100644 src/main/java/storage/PromotionStorage.java diff --git a/PromotionStorage.txt b/PromotionStorage.txt new file mode 100644 index 0000000000..a7866ed801 --- /dev/null +++ b/PromotionStorage.txt @@ -0,0 +1,6 @@ +apple have a 50.0% discount +Period: 2 APR 2024 to 4 APR 2024 +Time: 1200 to 1500 +apple iphone have a 10.0% discount +Period: 1 APR 2024 to 4 FEB 2025 +Time: 1300 to 1600 diff --git a/StockMasterData.txt b/StockMasterData.txt index a8471875dd..d188027f39 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,2 @@ -1. | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 \ No newline at end of file +1. | [ ] | apple | Qty: 29 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +2. | [ ] | apple iphone | Qty: 49 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..61ad4e6de1 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,24 @@ +Date: 2024-04-03 20:24:38 +Transaction ID: 1 +Item Name: apple +Quantity: 1 +Unit Price: 2.5 +Total Price: 2.5 +Profit: -1.5 + +Date: 2024-04-03 20:24:46 +Transaction ID: 2 +Item Name: apple iphone +Quantity: 1 +Unit Price: 250.0 +Total Price: 250.0 +Profit: 150.0 + +Date: 2024-04-04 03:59:13 +Transaction ID: 1 +Item Name: apple +Quantity: 10 +Unit Price: 2.5 +Total Price: 25.0 +Profit: -15.0 + diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7bfd081572..6c01cd7a7a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -4,9 +4,9 @@ {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} -## Design & implementation +## Design -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} +{Describe the design of the product. Use UML diagrams and short code snippets where applicable.} ### Exception ### Itemlist Itemlist class is an object which contains items to be added to the stock inventory list. Able to add items, remove functions, edit items inside @@ -22,6 +22,45 @@ Storage class contains methods to write description of items to the file `./Stoc and retrieve information from the file when program restarts. ### UI +## Implementation + +This section describes some noteworthy details on how certain features are implemented + +### [Proposed] Promotion feature + +The promotion mechanism is facilitated by `StockMaster`. It enables the user to design and create discount offers for his/her +own business given a certain period and time. Additionally, it implements the following operations: +* `promotion` +* `del_promotion` +* `list_promotions` + +The PromotionCommand will execute the appropriate command and prints messages to the user through the `TextUi`. + +**Add new promotion:** + +Example: + +``` +promotion apple discount/50 period /from 1 Jan 2024 /to 31 Dec 2024 time from/ 0000 /to 2359 +``` +This command will add a new promotion by calling `addPromotion(promotion)` method in `Promotionlist.java`. The +`addPromotion(promotion)` then calls `isItemExist(apple)` in `Itemlist.java` to check if the item exists in the inventory. + +Next, it subsequently calls multiple of its own methods, `isValidMonth(1, Jan, 2024)` and `isValidMonth(31, Dec, 2024)` +to check if the date is valid. `isValidTime(0000, 2359)` is called to check if the time is valid + +Lastly `isOnPromo(apple)` is called to check if there is already an existing promotion on `apple`. If there is an existing +promotion, the user will be unable to create another promotion for `apple`. + +**Delete promotion:** +The promotion will be deleted by calling `deletePromotion(index)` method in `Promotionlist.java`. + +Example: `del_promo apple` + +**List promotion:** +All of the `Promotions` will be shown to the user through the `TextUi`. + +Example: `list_promotions` ## Product scope StockMaster allows users to use the following commands: diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java new file mode 100644 index 0000000000..b697f0fa56 --- /dev/null +++ b/src/main/java/command/AddPromotionCommand.java @@ -0,0 +1,45 @@ +package command; + +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import org.w3c.dom.Text; +import promotion.Month; +import promotion.Promotion; +import promotion.Promotionlist; +import ui.TextUi; + +public class AddPromotionCommand extends Command { + + protected Promotion promotion; + + public AddPromotionCommand( + String itemName, + Float discount, + int startDate, Month startMonth, int startYear, + int endDate, Month endMonth, int endYear, + int startTime, + int endTime) { + this.promotion = new Promotion( + itemName, discount, + startDate, startMonth, startYear, + endDate, endMonth, endYear, + startTime, endTime); + } + + @Override + public void execute() throws InvalidDateException, CommandFormatException { + try { + Promotionlist.addPromotion(promotion); + TextUi.replyToUser( + "The following promotion has been added", + promotion.getItemName() + " have a " + promotion.getDiscount() * 100 + "% discount", + "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + + " " + promotion.getStartYear() + " to " + promotion.getEndDate() + " " + + promotion.getEndMonth() + " " + promotion.getEndYear(), + "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + ); + } catch (InvalidDateException | CommandFormatException e){ + System.out.println(""); + } + } +} diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java new file mode 100644 index 0000000000..bdac5adaac --- /dev/null +++ b/src/main/java/command/DeletePromotionCommand.java @@ -0,0 +1,28 @@ +package command; + +import exceptions.CommandFormatException; +import promotion.Promotion; +import promotion.Promotionlist; +import storage.PromotionStorage; +import ui.TextUi; + +public class DeletePromotionCommand extends Command { + + protected String itemName; + + public DeletePromotionCommand(String itemName) { + this.itemName = itemName; + } + @Override + public void execute() throws CommandFormatException { + if (Promotionlist.itemIsOnPromo(itemName)) { + Promotion promotion = Promotionlist.getPromotion(itemName); + int index = Promotionlist.getIndex(promotion); + Promotionlist.deletePromotion(index); + TextUi.replyToUser("Promotion for " + itemName + " has been removed"); + PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); + } else { + throw new CommandFormatException("ITEM_NOT_ON_PROMO"); + } + } +} diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index e6815f7237..5cb457e041 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -23,7 +23,7 @@ public void execute() { itemInfo = "item + qty + uom + cat + buy + sell"; } ArrayList searchList = filterList(); - TextUi.showInventoryList(searchList); + TextUi.showList(searchList); } public ArrayList filterList() { diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 08bda51bbe..e62356f0d2 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -7,11 +7,11 @@ public class ListCommand extends Command{ - protected ArrayList arrayList; + protected ArrayList arrayList; protected String category; protected boolean isListMarked; - public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { + public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { this.arrayList = arrayList; this.category = category; this.isListMarked = isListMarked; @@ -20,9 +20,9 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMar //@@author Fureimi public void execute() { if (category.equals("NA") && !isListMarked) { - TextUi.showInventoryList(arrayList); - } else { - TextUi.showCustomizedList(arrayList, category, isListMarked); + TextUi.showList(arrayList); + } else if (arrayList.getClass().getSimpleName().equals("Item")){ + TextUi.showCustomizedList((ArrayList) arrayList, category, isListMarked); } } } diff --git a/src/main/java/command/PromotionCommand.java b/src/main/java/command/PromotionCommand.java deleted file mode 100644 index 5d3a1eee60..0000000000 --- a/src/main/java/command/PromotionCommand.java +++ /dev/null @@ -1,38 +0,0 @@ -package command; - -import exceptions.InvalidDateException; -import item.Item; -import promotion.Month; -import promotion.Promotion; -import promotion.Promotionlist; - -import java.time.DayOfWeek; - -public class PromotionCommand extends Command { - - protected Promotion promotion; - - public PromotionCommand( - String itemName, - Float discount, - int startDate, Month startMonth, int startYear, - int endDate, Month endMonth, int endYear, - int startTime, - int endTime) { - this.promotion = new Promotion( - itemName, discount, - startDate, startMonth, startYear, - endDate, endMonth, endYear, - startTime, endTime); - } - - - @Override - public void execute() throws InvalidDateException { - System.out.println(promotion); - Promotionlist.addPromotion(promotion); - } - - - -} diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 872251286f..bf81327cf9 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -4,6 +4,8 @@ import item.Transaction; import itemlist.Cashier; import itemlist.Itemlist; +import promotion.Promotion; +import promotion.Promotionlist; import storage.Storage; import storage.TransactionLogs; @@ -11,12 +13,12 @@ public class SellCommand extends Command { protected String itemName; protected int sellQuantity; - protected float sellPrice; + protected float discount; - public SellCommand (String itemName, int quantity, float price) { + public SellCommand (String itemName, int quantity, float discount) { this.itemName = itemName; this.sellQuantity = quantity; - this.sellPrice = price; + this.discount = discount; } @Override @@ -30,16 +32,14 @@ public void execute() { break; } } - //int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; - //float originalSellPrice = Itemlist.getItem(index).getSellPrice(); - //float sellPrice = (this.sellPrice >= 0) ? this.sellPrice * originalSellPrice : originalSellPrice; if (index == -1) { //throw exception; System.out.println("Item not found!"); return; } int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; - float sellPrice = (this.sellPrice >= 0) ? this.sellPrice : Itemlist.getItem(index).getSellPrice(); + float getSellPrice = Itemlist.getItem(index).getSellPrice(); + float sellPrice = (this.discount >= 0) ? this.discount * getSellPrice : getSellPrice; if (remainingQuantity < 0) { System.out.println("There is insufficient stock!"); return; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index c9724b9c77..c73ee5c640 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -39,15 +39,27 @@ public class Messages { "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'"; public static final String INVALID_SELL_FORMAT ="Invalid command format. Please use format: " + "'sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]'"; - public static final String INVALID_SELL_PRICE ="Price cannot be negative!"; + public static final String ITEM_NOT_FOUND ="Item is not available"; public static final String INVALID_FIND_FORMAT ="Invalid command format. Please use format: " + "\n" + "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + "2. 'find /filter1/filter2 [KEYWORD] to search under the filters"; - public static final String WELCOME = "Welcome to StockMaster, where you can master the knowledge on your " + + + public static final String EMPTY_LIST = "There is nothing here! Time to spend some money and stock em up!"; + public static final String WELCOME_MESSAGE = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; + public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; + + public static final String INVALID_PERIOD = "Invalid Period Format. Please ensure that range is valid" + + "\n" + "e.g. period /from 1 Jan 2024 /to 10 Jan 2024"; + + public static final String INVALID_TIME = "Invalid Time Format. Please ensure that the time is in 24 hours " + + "format and have a valid range:" + "\n" + "e.g. time /from 0000 /to 2359"; + + public static final String INVALID_MONTH = "Invalid Month has been entered. Please use format: MMM (e.g. JAN, DEC)"; - public static final String GOODBYE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; + public static final String INVALID_DISCOUNT = "Invalid Discount has been entered. Please ensure it falls within the " + + "range of 0 to 100"; public static final String INVALID_MARK_FORMAT = "Invalid Command Format. Please use format : " + "mark [ITEM_NAME]"; @@ -61,4 +73,15 @@ public class Messages { "3. 'list marked' to list all marked items, or \n" + "4. 'list marked cat/[CATEGORY]' to list all marked items in that category.\n" + "Please note that marked must be in front of cat/[CATEGORY]."; + + public static final String INVALID_DEL_PROMO_FORMAT = "Invalid Command Format. Please use format:\n" + + "del_promo [ITEM_NAME]"; + public static final String INVALID_PROMOLIST_FORMAT = "Invalid Command Format."; + + public static final String ITEM_IS_PROMO = "Item already has a promotion. Please remove the current promotion to " + + "add a new one."; + + public static final String INVALID_PROMOTION_FORMAT = "Invalid Command Format. Please use format:\n" + + "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DAY] /to [END_DAY] time /from [START_TIME]" + + " /to [END_TIME]"; } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 2528898f1e..5af8b9636b 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -26,9 +26,18 @@ public CommandFormatException(CommandType command){ case HELP: System.out.println(Messages.HELP); break; - case LIST: + case LIST_ITEMS: System.out.println(Messages.INVALID_LIST_FORMAT); break; + case LIST_PROMOTIONS: + System.out.println(Messages.INVALID_PROMOLIST_FORMAT); + break; + case DEL_PROMO: + System.out.println(Messages.INVALID_DEL_PROMO_FORMAT); + break; + case PROMOTION: + System.out.println(Messages.INVALID_PROMOTION_FORMAT); + break; case MARK: System.out.println(Messages.INVALID_MARK_FORMAT); break; @@ -39,20 +48,20 @@ public CommandFormatException(CommandType command){ System.out.println(Messages.INVALID_COMMAND); break; } - } public CommandFormatException(String error) { switch (error) { - case "SELL_PRICE": - System.out.println(Messages.INVALID_SELL_PRICE); + case "ITEM_NOT_FOUND": + System.out.println(Messages.ITEM_NOT_FOUND); break; + case "INVALID_DISCOUNT": + System.out.println(Messages.INVALID_DISCOUNT); + break; default: System.out.println("Error Detected"); } - - } } diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java index 94b0ce144e..38237b7898 100644 --- a/src/main/java/exceptions/InvalidDateException.java +++ b/src/main/java/exceptions/InvalidDateException.java @@ -1,4 +1,27 @@ package exceptions; +import common.Messages; + +import java.sql.SQLOutput; + public class InvalidDateException extends Exception { + public InvalidDateException(String Error) { + switch(Error) { + case "INVALID_PERIOD": + System.out.println(Messages.INVALID_PERIOD); + break; + case "INVALID_TIME": + System.out.println(Messages.INVALID_TIME); + break; + case "ITEM_IS_PROMO": + System.out.println(Messages.ITEM_IS_PROMO); + break; + case "INVALID_MONTH": + System.out.println(Messages.INVALID_MONTH); + break; + default: + System.out.println("Error Detected"); + break; + } + } } diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index a4e219f1df..84d2987fa9 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -2,7 +2,9 @@ public enum CommandType { EXIT, - LIST, + LIST_ITEMS, + LIST_PROMOTIONS, + DEL_PROMO, HELP, ADD, DEL, diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 90ce909fe5..0ac31345a0 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -2,19 +2,21 @@ import command.AddCommand; import command.DeleteCommand; +import command.DeletePromotionCommand; import command.EditCommand; import command.ExitCommand; import command.FindCommand; import command.HelpCommand; import command.IncorrectCommand; import command.ListCommand; -import command.PromotionCommand; +import command.AddPromotionCommand; import command.MarkCommand; import command.SellCommand; import command.UnmarkCommand; import common.Messages; import exceptions.CommandFormatException; import command.Command; +import exceptions.InvalidDateException; import itemlist.Itemlist; import promotion.Month; import promotion.Promotionlist; @@ -46,19 +48,21 @@ public class Parser { public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); - public static final Pattern LIST_COMMAND_FORMAT = - Pattern.compile("list(?:\\s+(?marked))?(?:\\s+cat/(?[^/]+))?"); + public static final Pattern LIST_ITEM_COMMAND_FORMAT = + Pattern.compile("list_items(?:\\s+(?marked))?(?:\\s+cat/(?[^/]+))?"); public static final Pattern MARK_COMMAND_FORMAT = Pattern.compile("mark (?[^/]+)"); public static final Pattern UNMARK_COMMAND_FORMAT = Pattern.compile("unmark (?[^/]+)"); - final Pattern PROMOTION_COMMAND_FORMAT = Pattern.compile( - "promotion (?[^\\s]+) discount/(?\\d+(\\.\\d{1,2})?) " + + final Pattern PROMOTION_COMMAND_FORMAT = + Pattern.compile("promotion (?[^/]+) discount/(?\\d+(\\.\\d{1,2})?) " + "period /from (?\\d+) (?\\w+) (?\\d+) " + "/to (?\\d+) (?\\w+) (?\\d+) " + - "time /from (?\\d+) /to (?\\d+)"); + "time /from (?\\d{4}) /to (?\\d{4})"); + public static final Pattern DELETE_PROMO_COMMAND_FORMAT = + Pattern.compile("del_promo (?[^/]+)"); public Command parseInput(String userInput){ final CommandType userCommand; @@ -80,9 +84,17 @@ public Command parseInput(String userInput){ return new ExitCommand(true); case HELP: return new HelpCommand(); - case LIST: + case LIST_ITEMS: try { - return prepareList(userInput); + return prepareItemList(userInput); + } catch (CommandFormatException e) { + break; + } + case LIST_PROMOTIONS: + return preparePromotionList(); + case DEL_PROMO: + try { + return prepareDeletePromo(userInput); } catch (CommandFormatException e) { break; } @@ -119,7 +131,7 @@ public Command parseInput(String userInput){ case PROMOTION: try { return preparePromotion(userInput); - } catch (CommandFormatException e) { + } catch (CommandFormatException | InvalidDateException e) { break; } case MARK: @@ -172,6 +184,7 @@ private Command prepareDelete(String args) throws CommandFormatException{ return new DeleteCommand(matcher.group("itemName")); } + private Command prepareSell(String args) throws CommandFormatException{ final Matcher matcher = SELL_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format @@ -179,16 +192,12 @@ private Command prepareSell(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.SELL); } int sellQuantity = Integer.parseInt(matcher.group("sellQuantity").trim()); - boolean sellPriceIsPresent = matcher.group("sellPrice") != null; - int inputPrice = (sellPriceIsPresent) ? Integer.parseInt(matcher.group("sellPrice")): 0; - if (sellPriceIsPresent && inputPrice < 0) { - throw new CommandFormatException("SELL_PRICE"); - } if (Promotionlist.isOnPromo(matcher.group("itemName"))) { + float getDiscount = (Promotionlist.getPromotion(matcher.group("itemName"))).getDiscount(); return new SellCommand( matcher.group("itemName"), sellQuantity, - Promotionlist.getPromotion("itemName").getDiscount() + getDiscount ); } else { return new SellCommand( @@ -197,13 +206,6 @@ private Command prepareSell(String args) throws CommandFormatException{ -1 ); } - - /*int sellPrice = sellPriceIsPresent ? inputPrice : -1; - return new SellCommand( - matcher.group("itemName"), - sellQuantity, - sellPrice - );*/ } private Command prepareFind(String args) throws CommandFormatException{ @@ -252,7 +254,7 @@ private Command prepareEdit(String args) throws CommandFormatException{ ); } - private Command preparePromotion(String args) throws CommandFormatException { + private Command preparePromotion(String args) throws CommandFormatException, InvalidDateException { final Matcher matcher = PROMOTION_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { @@ -268,32 +270,49 @@ private Command preparePromotion(String args) throws CommandFormatException { int endYear = Integer.parseInt(matcher.group("endYear")); int startTime = Integer.parseInt(matcher.group("startTime")); int endTime = Integer.parseInt(matcher.group("endTime")); - System.out.println(Month.valueOf(startMonth.toUpperCase())); - return new PromotionCommand( - itemName, - discount, - startDate, - Month.valueOf(startMonth.toUpperCase()), - startYear, - endDate, - Month.valueOf(endMonth.toUpperCase()), - endYear, - startTime, - endTime - ); + try { + Month startMonthEnum = Month.valueOf(startMonth.toUpperCase()); + Month endMonthEnum = Month.valueOf(endMonth.toUpperCase()); + return new AddPromotionCommand( + itemName, + discount, + startDate, + Month.valueOf(startMonth.toUpperCase()), + startYear, + endDate, + Month.valueOf(endMonth.toUpperCase()), + endYear, + startTime, + endTime + ); + } catch (IllegalArgumentException e) { + throw new InvalidDateException("INVALID_MONTH"); + } } - private Command prepareList(String args) throws CommandFormatException { - final Matcher matcher = LIST_COMMAND_FORMAT.matcher(args.trim()); + private Command prepareDeletePromo(String args) throws CommandFormatException{ + final Matcher matcher = DELETE_PROMO_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.DEL_PROMO); + } + return new DeletePromotionCommand(matcher.group("itemName")); + } + private Command prepareItemList(String args) throws CommandFormatException { + final Matcher matcher = LIST_ITEM_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { - throw new CommandFormatException(CommandType.LIST); + throw new CommandFormatException(CommandType.LIST_ITEMS); } String category = matcher.group("category") != null ? matcher.group("category") : "NA"; - Boolean listMarked = matcher.group("isMark") != null; + boolean listMarked = matcher.group("isMark") != null; return new ListCommand<>(Itemlist.getItems(), category, listMarked); } + private Command preparePromotionList() { + return new ListCommand<>(Promotionlist.getAllPromotion(), "NA", false); + } + private Command prepareMark(String args) throws CommandFormatException { final Matcher matcher = MARK_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index c835e74306..f58671e00f 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -1,16 +1,8 @@ package promotion; -import command.EditCommand; -import exceptions.CommandFormatException; -import exceptions.InvalidDateException; -import item.Item; -import itemlist.Itemlist; +import ui.TextUi; import java.time.DayOfWeek; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -import static promotion.Month.JAN; public class Promotion { @@ -57,7 +49,7 @@ public Promotion( } - public Float getDiscount() { + public float getDiscount() { return discount; } @@ -98,6 +90,13 @@ public String getItemName() { } public String toString() { - return getItemName() + getDiscount(); + return getItemName() + " have a " + (getDiscount()*100) + "% discount" + "\n" + + "Period: " + getStartDate() + " " + getStartMonth() + " " + getStartYear() + " to " + + getEndDate()+ " " + getEndMonth() + " " + getEndYear() + "\n" + + "Time: " + getStartTime() + " to " + getEndTime(); + } + + public void print(String args) { + TextUi.replyToUser(args); } } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index b7229063b2..242874a1fa 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -1,9 +1,9 @@ package promotion; -import command.EditCommand; +import exceptions.CommandFormatException; import exceptions.InvalidDateException; -import item.Item; import itemlist.Itemlist; +import storage.PromotionStorage; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -15,12 +15,15 @@ public class Promotionlist { public Promotionlist() { } + public static int getIndex(Promotion promotion) { + return promotions.indexOf(promotion); + } public static void deletePromotion(int index) { promotions.remove(index); } public static boolean itemIsOnPromo(String itemName) { - for (Promotion promotion : Promotionlist.getPromo()) { + for (Promotion promotion : promotions) { if (promotion.getItemName().toLowerCase().equals(itemName)) { return true; } @@ -43,7 +46,7 @@ public static boolean isLeapYear(int year) { return year % 4 == 0; } - public static void addPromotion(Promotion promotion) throws InvalidDateException { + public static void addPromotion(Promotion promotion) throws InvalidDateException, CommandFormatException { int startDate = promotion.getStartDate(); int endDate = promotion.getEndDate(); Month startMonth = promotion.getStartMonth(); @@ -55,28 +58,25 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException String itemName = promotion.getItemName(); float discount = promotion.getDiscount(); - if (!Itemlist.itemIsExist(itemName)) { //promotion not created as item does not exist - throw new InvalidDateException(); + if (!Itemlist.itemIsExist(itemName)) { + throw new CommandFormatException("ITEM_NOT_FOUND"); + } + if (discount < 0 || discount > 100) { + throw new CommandFormatException("INVALID_DISCOUNT"); } - - //promotion not created as either invalid date for the month or year if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { - throw new InvalidDateException(); + throw new InvalidDateException("INVALID_PERIOD"); } - // if (!isValidTime(startTime, endTime)) { - throw new InvalidDateException(); + throw new InvalidDateException("INVALID_TIME"); } - promotions.add(promotion); //promotion is valid and created - //add in writeToPromotionList - - } - - public void deletePromo(int index) { - promotions.remove(index); + if (Promotionlist.isOnPromo(itemName)) { + throw new InvalidDateException("ITEM_IS_PROMO"); + } + promotions.add(promotion); + PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); } - public static boolean isPromoExist(Promotion promotion) { LocalDateTime currentTime = LocalDateTime.now(); DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); @@ -88,7 +88,7 @@ public static boolean isPromoExist(Promotion promotion) { int year = Integer.parseInt(formattedYear); int month = Integer.parseInt(formattedMonth); int date = Integer.parseInt(formattedDate); - if (year < promotion.getStartDate() || year > promotion.getEndDate()) { + if (year < promotion.getStartYear() || year > promotion.getEndYear()) { return false; } if (month < promotion.getStartMonth().getValue() || month > promotion.getEndMonth().getValue()) { @@ -100,10 +100,13 @@ public static boolean isPromoExist(Promotion promotion) { return true; } - public static boolean isValidTime(int startTime, int endTime) throws InvalidDateException { + public static boolean isValidTime(int startTime, int endTime) { boolean startIsValid = isVerifiedTime(startTime); boolean endIsValid = isVerifiedTime(endTime); - if (!startIsValid || !endIsValid) { //format for date and time is valid + if (!startIsValid || !endIsValid) { + return false; + } + if (startTime > endTime) { return false; } return true; @@ -145,7 +148,7 @@ public static boolean isValidMonth(int date, Month month, int year) throws Inval case JUN: return date <= 30 && date >= 1; default: - throw new InvalidDateException(); + throw new InvalidDateException("INVALID_TIME"); } } @@ -158,7 +161,7 @@ public static Promotion getPromotion(String itemName) { return null; } - public static ArrayList getPromo() { + public static ArrayList getAllPromotion() { return promotions; } } diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index 78f4b868b3..ce5fc3d28b 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -6,6 +6,7 @@ import exceptions.InvalidDateException; import parser.Parser; import reminder.LowStockReminder; +import storage.PromotionStorage; import storage.Storage; import storage.TransactionLogs; import ui.TextUi; @@ -18,6 +19,10 @@ public class Duke { private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); private Itemlist itemlist = new Itemlist(); + private static final String STORAGE_FILE = "./StockMasterData.txt"; + private static final String TRANSACTION_FILE = "./TransactionLogs.txt"; + private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; + /** * Main entry-point for the java.duke.Duke application. @@ -27,14 +32,16 @@ public static void main(String[] args) throws IOException, CommandFormatExceptio } public void run() throws IOException, CommandFormatException, InvalidDateException { - ui.showWelcomeMessage("StockMaster v2.0", "./StockMasterData.txt"); + ui.showWelcomeMessage("StockMaster v2.0", STORAGE_FILE); Storage.updateFile("", true); - Storage.readFromFile("./StockMasterData.txt"); + Storage.readFromFile(STORAGE_FILE); TransactionLogs.updateFile("", true); - TransactionLogs.readFromFile("./TransactionLogs.txt"); + TransactionLogs.readFromFile(TRANSACTION_FILE); + PromotionStorage.updateFile("", true); + PromotionStorage.readFromFile(PROMOTION_STORAGE_FILE); LowStockReminder.execute(); this.normalOperation(); - ui.showGoodByeMessage("./StockMasterData.txt"); + ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } private void normalOperation() throws IOException, CommandFormatException, InvalidDateException { diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java new file mode 100644 index 0000000000..ac521c2c58 --- /dev/null +++ b/src/main/java/storage/PromotionStorage.java @@ -0,0 +1,115 @@ +package storage; + +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import item.Item; +import promotion.Month; +import promotion.Promotion; +import promotion.Promotionlist; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class PromotionStorage extends Storage{ + + private static final String PRMOTIONSTORAGE = "./PromotionStorage.txt"; + + public static String getFileDirectory() { + return PRMOTIONSTORAGE; + } + + public static void updateFile(String inputText, boolean ifAppend) { + try { + writeToFile(getFileDirectory(), inputText, ifAppend); + } catch (IOException e) { + System.out.println("IOExceptions occurred"); + } + } + + public static void readFromFile(String fileName) { + int count = 0; + String itemName = ""; + float discount = 0; + int startDate = 0, startYear = 0, endDate = 0, endYear = 0; + Month startMonth = null,endMonth = null; + int startTime = 0, endTime = 0; + try { + Scanner scanner = new Scanner(new File(fileName)); + while (scanner.hasNext()) { + String fileLine = scanner.nextLine(); + switch (count) { + case (0): + String[] itemNameParts = fileLine.split(" have a "); + itemName = itemNameParts[0]; + discount = Float.parseFloat(itemNameParts[1].split("%")[0]) / 100; + count = count + 1; + break; + case (1): + String[] periodParts = fileLine.split("Period: "); + String[] startEndPeriod = periodParts[1].split(" to "); + String[] getStart = startEndPeriod[0].split(" "); + String[] getEnd = startEndPeriod[1].split(" "); + startDate = Integer.parseInt(getStart[0]); + startMonth = Month.valueOf(getStart[1]); + startYear = Integer.parseInt(getStart[2]); + endDate = Integer.parseInt(getEnd[0]); + endMonth = Month.valueOf(getEnd[1]); + endYear = Integer.parseInt(getEnd[2]); + count = count + 1; + break; + case(2): + String[] getTime = fileLine.split("Time: "); + String[] startEndTime = getTime[1].split(" to "); + startTime = Integer.parseInt(startEndTime[0]); + endTime = Integer.parseInt(startEndTime[1]); + Promotion toAdd = new Promotion(itemName, discount, startDate, startMonth, startYear, + endDate, endMonth, endYear, startTime, endTime); + Promotionlist.addPromotion(toAdd); + count = 0; + break; + default: + System.out.println("Read Promotion File Error"); + } + } + } catch (FileNotFoundException e) { + System.out.println("File does not exist."); + } catch (NumberFormatException e) { + System.out.println("Invalid numbers found."); + } catch (InvalidDateException | CommandFormatException e) { + System.out.println(e);; + } + } + + + + public static void addToPromotionFile(ArrayList promotions) { + assert promotions != null : "Promotions cannot be null."; + Promotion lastPromotion = promotions.get(promotions.size() - 1); + String descriptionAdded = (lastPromotion.getItemName() + " have a " + + (lastPromotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + lastPromotion.getStartDate() + + " " + lastPromotion.getStartMonth() + " " + lastPromotion.getStartYear() + " to " + + lastPromotion.getEndDate()+ " " + lastPromotion.getEndMonth() + " " + lastPromotion.getEndYear() + "\n" + + "Time: " + lastPromotion.getStartTime() + " to " + lastPromotion.getEndTime() + "\n"); + updateFile(descriptionAdded, true); + } + + public static void overwritePromotionFile(ArrayList promotions) { + assert promotions != null : "Promotions cannot be null."; + int length = promotions.size(); + for (Promotion promotion: promotions) { + String descriptionAdded = (promotion.getItemName() + " have a " + + (promotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + promotion.getStartDate() + + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + " to " + + promotion.getEndDate()+ " " + promotion.getEndMonth() + " " + promotion.getEndYear() + "\n" + + "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + "\n"); + if ( promotions.indexOf(promotion) == 0) { + updateFile(descriptionAdded, false); + } else { + updateFile(descriptionAdded, true); + } + } + } +} diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index f2c925a1b6..0baa95b223 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,5 +1,6 @@ package storage; +import exceptions.InvalidDateException; import item.Item; import itemlist.Itemlist; diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 96284f4327..3c3470235b 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -3,16 +3,13 @@ import java.util.ArrayList; import java.util.Scanner; +import common.Messages; import item.Item; public class TextUi { public static final String DIVIDER = "----------------"; - public static final String WELCOME_MESSAGE = "Welcome to StockMaster, where you can master the knowledge on your " + - "Stock!"; - - public static final String GOODBYE_MESSAGE = "Thank you for using StockMaster, hope we have helped your lazy ass!"; private final Scanner in; public TextUi() { @@ -39,16 +36,20 @@ public void showWelcomeMessage(String version, String storageFilePath) { version, DIVIDER, "Data is being extracted from: " + storageFilePath, - WELCOME_MESSAGE + Messages.WELCOME_MESSAGE ); } - public void showGoodByeMessage(String storageFilePath) { + public void showGoodByeMessage(String storageFilePath, String transactionLogPath, String promotionStoragePath) { replyToUser( DIVIDER, - "Data is being saved to :" + storageFilePath, + "Inventory is being saved to :" + storageFilePath, + DIVIDER, + "Transactions are being saved to:" + transactionLogPath, DIVIDER, - GOODBYE_MESSAGE + "Promotions are being saved to: " + promotionStoragePath, + DIVIDER, + Messages.GOODBYE_MESSAGE ); } @@ -58,9 +59,9 @@ public static void replyToUser(String... message) { } } - public static void showInventoryList(ArrayList arrayList) { + public static void showList(ArrayList arrayList) { if (arrayList.isEmpty()) { - replyToUser("There is nothing here! Time to spend some money and stock em up!"); + replyToUser(Messages.EMPTY_LIST); } else { replyToUser("List: "); for (T item : arrayList) { @@ -83,7 +84,7 @@ public static void showSellMessage(String item, int sellQuantity, int remainingQ //@@author Fureimi public static void showCustomizedList(ArrayList arrayList, String category, boolean isListMarked) { if (arrayList.isEmpty()) { - replyToUser("There is nothing here! Time to spend some money and stock em up!"); + replyToUser(Messages.EMPTY_LIST); // case 1: user wants to list all items of a certain category } else if (!category.equals("NA") && !isListMarked) { int flag = 0; @@ -153,5 +154,4 @@ public static void showEditMessage(String item, String editedParameter, String o break; } } - } diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index e8b57a402b..87850a4cc2 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,5 +1,6 @@ package storage; +import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; import java.io.File; @@ -13,7 +14,7 @@ public class StorageTest { @Test - public void readFromFile_fileNotFound() { + public void readFromFile_fileNotFound() throws InvalidDateException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); String directory = "./testFile1.txt"; diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 3ea8bbb68c..3696b1a265 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -10,7 +10,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertLinesMatch; import static ui.TextUi.getUserInput; -import static ui.TextUi.showInventoryList; +import static ui.TextUi.showList; public class TextUiTest { @@ -32,7 +32,7 @@ public void testShowInventoryList() { ArrayList itemList = new ArrayList<>(); itemList.add("test 1"); itemList.add("test 2"); - showInventoryList(itemList); + showList(itemList); String[] output = outputStreamCaptor.toString().split("\\r?\\n"); String line1 = "List: "; String line2 = "1. test 1"; @@ -47,7 +47,7 @@ public void testShowEmptyInventoryList() { //only test for empty arrayList a PrintStream originalOut = System.out; System.setOut(new PrintStream(outputStreamCaptor)); ArrayList itemList = new ArrayList<>(); //empty arrayList - showInventoryList(itemList); + showList(itemList); String[] output = outputStreamCaptor.toString().split("\\r?\\n"); String line = "There is nothing here! Time to spend some money and stock em up!"; List expectedOutput = List.of(line); From 94e042b0e084fa38d5e0ff7da341351ac54fc56f Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 4 Apr 2024 05:00:50 +0800 Subject: [PATCH 178/421] Edit Checkstyle --- .../java/command/AddPromotionCommand.java | 1 - src/main/java/command/SellCommand.java | 2 -- src/main/java/common/Messages.java | 4 +-- .../exceptions/CommandFormatException.java | 2 +- .../java/exceptions/InvalidDateException.java | 18 ++++++------- src/main/java/parser/Parser.java | 4 +-- src/main/java/promotion/Promotionlist.java | 25 +++++++++---------- src/main/java/seedu/duke/Duke.java | 7 +++--- src/main/java/storage/PromotionStorage.java | 23 +++++++++-------- src/main/java/storage/Storage.java | 1 - src/test/java/command/AddCommandTest.java | 3 +++ src/test/java/command/DeleteCommandTest.java | 3 +++ src/test/java/command/FindCommandTest.java | 3 ++- src/test/java/command/SellCommandTest.java | 3 +++ 14 files changed, 53 insertions(+), 46 deletions(-) diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index b697f0fa56..770d1a04c9 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -2,7 +2,6 @@ import exceptions.CommandFormatException; import exceptions.InvalidDateException; -import org.w3c.dom.Text; import promotion.Month; import promotion.Promotion; import promotion.Promotionlist; diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 7be4dcfd2a..e52dd058cb 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -4,8 +4,6 @@ import item.Transaction; import itemlist.Cashier; import itemlist.Itemlist; -import promotion.Promotion; -import promotion.Promotionlist; import storage.Storage; import storage.TransactionLogs; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index c73ee5c640..6e2061e8ac 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -58,8 +58,8 @@ public class Messages { public static final String INVALID_MONTH = "Invalid Month has been entered. Please use format: MMM (e.g. JAN, DEC)"; - public static final String INVALID_DISCOUNT = "Invalid Discount has been entered. Please ensure it falls within the " + - "range of 0 to 100"; + public static final String INVALID_DISCOUNT = "Invalid Discount has been entered. " + + "Please ensure it falls within the " + "range of 0 to 100"; public static final String INVALID_MARK_FORMAT = "Invalid Command Format. Please use format : " + "mark [ITEM_NAME]"; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 5af8b9636b..2f1f75395e 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -58,7 +58,7 @@ public CommandFormatException(String error) { break; case "INVALID_DISCOUNT": System.out.println(Messages.INVALID_DISCOUNT); - break; + break; default: System.out.println("Error Detected"); } diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java index 38237b7898..6f801f7a3c 100644 --- a/src/main/java/exceptions/InvalidDateException.java +++ b/src/main/java/exceptions/InvalidDateException.java @@ -2,26 +2,24 @@ import common.Messages; -import java.sql.SQLOutput; - public class InvalidDateException extends Exception { - public InvalidDateException(String Error) { - switch(Error) { + public InvalidDateException(String error) { + switch(error) { case "INVALID_PERIOD": System.out.println(Messages.INVALID_PERIOD); - break; + break; case "INVALID_TIME": System.out.println(Messages.INVALID_TIME); - break; + break; case "ITEM_IS_PROMO": System.out.println(Messages.ITEM_IS_PROMO); - break; + break; case "INVALID_MONTH": System.out.println(Messages.INVALID_MONTH); - break; + break; default: - System.out.println("Error Detected"); - break; + System.out.println("Error Detected"); + break; } } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 0ac31345a0..be5ee779af 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -56,7 +56,7 @@ public class Parser { public static final Pattern UNMARK_COMMAND_FORMAT = Pattern.compile("unmark (?[^/]+)"); - final Pattern PROMOTION_COMMAND_FORMAT = + public static final Pattern PROMOTION_COMMAND_FORMAT = Pattern.compile("promotion (?[^/]+) discount/(?\\d+(\\.\\d{1,2})?) " + "period /from (?\\d+) (?\\w+) (?\\d+) " + "/to (?\\d+) (?\\w+) (?\\d+) " + @@ -91,7 +91,7 @@ public Command parseInput(String userInput){ break; } case LIST_PROMOTIONS: - return preparePromotionList(); + return preparePromotionList(); case DEL_PROMO: try { return prepareDeletePromo(userInput); diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 242874a1fa..dc00bb6ba8 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -127,24 +127,23 @@ public static boolean isVerifiedTime(int time) { public static boolean isValidMonth(int date, Month month, int year) throws InvalidDateException { switch (month) { - case JAN: - if (date > 31 || date < 1) { - return false; - } case FEB: if (isLeapYear(year) && (date > 29 || date < 1)) { return false; - } else return date <= 28 && date >= 1; - case MAR: - case MAY: - case JUL: - case DEC: - case OCT: + } else { + return date <= 28 && date >= 1; + } + case JAN: //fall through + case MAR: //fall through + case MAY: //fall through + case JUL: //fall through + case DEC: //fall through + case OCT: //fall through case AUG: return date <= 31 && date >= 1; - case APR: - case SEP: - case NOV: + case APR: //fall through + case SEP: //fall through + case NOV: //fall through case JUN: return date <= 30 && date >= 1; default: diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/Duke.java index ce5fc3d28b..1993e59b83 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/Duke.java @@ -16,12 +16,13 @@ import java.io.IOException; public class Duke { - private final TextUi ui = new TextUi(); - private final Parser parser = new Parser(); - private Itemlist itemlist = new Itemlist(); private static final String STORAGE_FILE = "./StockMasterData.txt"; private static final String TRANSACTION_FILE = "./TransactionLogs.txt"; private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; + private final TextUi ui = new TextUi(); + private final Parser parser = new Parser(); + private Itemlist itemlist = new Itemlist(); + /** diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java index c0cb41f813..fd64cf1233 100644 --- a/src/main/java/storage/PromotionStorage.java +++ b/src/main/java/storage/PromotionStorage.java @@ -2,7 +2,6 @@ import exceptions.CommandFormatException; import exceptions.InvalidDateException; -import item.Item; import promotion.Month; import promotion.Promotion; import promotion.Promotionlist; @@ -33,9 +32,14 @@ public static void readFromFile(String fileName) { int count = 0; String itemName = ""; float discount = 0; - int startDate = 0, startYear = 0, endDate = 0, endYear = 0; - Month startMonth = null,endMonth = null; - int startTime = 0, endTime = 0; + int startDate = 0; + int startYear = 0; + int endDate = 0; + int endYear = 0; + Month startMonth = null; + Month endMonth = null; + int startTime = 0; + int endTime = 0; try { Scanner scanner = new Scanner(new File(fileName)); while (scanner.hasNext()) { @@ -84,16 +88,15 @@ public static void readFromFile(String fileName) { } } - - public static void addToPromotionFile(ArrayList promotions) { assert promotions != null : "Promotions cannot be null."; Promotion lastPromotion = promotions.get(promotions.size() - 1); String descriptionAdded = (lastPromotion.getItemName() + " have a " + - (lastPromotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + lastPromotion.getStartDate() + - " " + lastPromotion.getStartMonth() + " " + lastPromotion.getStartYear() + " to " + - lastPromotion.getEndDate()+ " " + lastPromotion.getEndMonth() + " " + lastPromotion.getEndYear() + "\n" + - "Time: " + lastPromotion.getStartTime() + " to " + lastPromotion.getEndTime() + "\n"); + (lastPromotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + + lastPromotion.getStartDate() + " " + lastPromotion.getStartMonth() + " " + lastPromotion.getStartYear() + + " to " + lastPromotion.getEndDate()+ " " + lastPromotion.getEndMonth() + " " + + lastPromotion.getEndYear() + "\n" + "Time: " + lastPromotion.getStartTime() + " to " + + lastPromotion.getEndTime() + "\n"); updateFile(descriptionAdded, true); } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 4e9b9f8322..6474e7a889 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -1,6 +1,5 @@ package storage; -import exceptions.InvalidDateException; import item.Item; import itemlist.Itemlist; diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index f307cbbed8..bef39423ee 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.fail; @@ -18,6 +19,8 @@ public void addItemTest() throws CommandFormatException { addCommandTest2.execute(); } catch (CommandFormatException e) { fail("Unable to add item."); + } catch (InvalidDateException e) { + throw new RuntimeException(e); } } diff --git a/src/test/java/command/DeleteCommandTest.java b/src/test/java/command/DeleteCommandTest.java index 62e8fecf94..551e070a6b 100644 --- a/src/test/java/command/DeleteCommandTest.java +++ b/src/test/java/command/DeleteCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.InvalidDateException; import itemlist.Itemlist; import org.junit.jupiter.api.Test; @@ -21,6 +22,8 @@ public void delCommandTest_success() throws CommandFormatException { deleteCommand.execute(); } catch (CommandFormatException e) { fail("Unable to delete."); + } catch (InvalidDateException e) { + throw new RuntimeException(e); } } diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 0cfc70920a..2b96c7b879 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.InvalidDateException; import itemlist.Itemlist; import org.junit.jupiter.api.Test; @@ -9,7 +10,7 @@ public class FindCommandTest { @Test - public void findCommandTest() throws CommandFormatException { + public void findCommandTest() throws CommandFormatException, InvalidDateException { Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); Command findCommand = new FindCommand("item","testItem"); diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index 9fcc3acdf4..88d5d226c6 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.fail; @@ -16,6 +17,8 @@ public void sellItemTest() throws CommandFormatException { sellCommandTest2.execute(); } catch (CommandFormatException e) { fail("Unable to sell item."); + } catch (InvalidDateException e) { + throw new RuntimeException(e); } } From 230140095c40c68a772f0d7c801247c92e24428d Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 11:12:21 +0800 Subject: [PATCH 179/421] Add cashier functions --- src/main/java/command/CashierCommands.java | 4 ++-- src/main/java/parser/Parser.java | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/main/java/command/CashierCommands.java b/src/main/java/command/CashierCommands.java index fb61f6fe08..be1d5a8180 100644 --- a/src/main/java/command/CashierCommands.java +++ b/src/main/java/command/CashierCommands.java @@ -8,8 +8,8 @@ public class CashierCommands extends Command { protected CommandType commandType; - public CashierCommands(String command) { - this.commandType = CommandType.valueOf(command); + public CashierCommands(CommandType command) { + this.commandType = command; } @Override diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index c38c70fb85..b871396624 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -132,8 +132,12 @@ public Command parseInput(String userInput){ case TOTAL_REVENUE: //fallthrough case BESTSELLER: - prepareCashierCommands(userInput, commandWord); - break; + try { + return prepareCashierCommands(userInput, commandWord); + } catch (CommandFormatException e) { + + break; + } default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -267,8 +271,15 @@ private Command prepareUnmark(String args) throws CommandFormatException { return new UnmarkCommand(itemName); } - private Command prepareCashierCommands(String args, String command) { - final Matcher matcher = TOTAL_PROFIT_FORMAT.matcher(args.trim()); + private Command prepareCashierCommands(String args, CommandType command) throws CommandFormatException{ + final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(args.trim()); + if (!matcher.matches()) { + System.out.println(Messages.INVALID_COMMAND); + return new IncorrectCommand(); + } + if (command != CommandType.BESTSELLER && command != CommandType.TOTAL_PROFIT && command != CommandType.TOTAL_REVENUE) { + throw new CommandFormatException(Messages.INVALID_COMMAND); + } return new CashierCommands(command); } } From 99d85b7b14f9acc5f6f3b62ba3566b15af5f2383 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 4 Apr 2024 11:27:39 +0800 Subject: [PATCH 180/421] Edit expected text --- text-ui-test/EXPECTED.TXT | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 2aa68c29a1..d4e690c2b3 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -9,6 +9,10 @@ Low-on-stock Items: No items low on stock Enter Command: ---------------- -Data is being saved to :./StockMasterData.txt +Inventory is being saved to :./StockMasterData.txt +---------------- +Transactions are being saved to:./TransactionLogs.txt +---------------- +Promotions are being saved to: ./PromotionStorage.txt ---------------- Thank you for using StockMaster, hope we have helped your lazy ass! From 835bd02fd46f6f5cd65c5b57dd17929767e96352 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 4 Apr 2024 11:35:45 +0800 Subject: [PATCH 181/421] Fix parsertest --- src/main/java/command/FindCommand.java | 4 ++-- src/test/java/parser/ParserTest.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 95a6e5b002..90e4d7afb1 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -18,11 +18,11 @@ public FindCommand(String itemInfo, String keyword) { } public String getItemInfo() { - return keyword; + return itemInfo; } public String getKeyword() { - return itemInfo; + return keyword; } @Override diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index bfd92b6c94..19aec32622 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -55,7 +55,7 @@ public void testParseEditCommand() { @Test public void testParseSellCommand() { - String userInput = "sell ItemName qty/5 price/20.0"; + String userInput = "sell ItemName qty/5"; Command command = parser.parseInput(userInput); assertInstanceOf(SellCommand.class, command); SellCommand sellCommand = (SellCommand) command; @@ -69,13 +69,13 @@ public void testParseFindCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(FindCommand.class, command); FindCommand findCommand = (FindCommand) command; - assertEquals("/info", findCommand.getItemInfo()); - assertEquals("Keyword", findCommand.getKeyword()); + assertEquals("info", findCommand.getItemInfo()); + assertEquals("keyword", findCommand.getKeyword()); } @Test public void testParseListCommand() { - String userInput = "list cat/Category"; + String userInput = "list_items cat/Category"; Command command = parser.parseInput(userInput); assertInstanceOf(ListCommand.class, command); ListCommand listCommand = (ListCommand) command; From 495c93f72783f73127bfc4cc0092dadf18df1044 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 11:45:09 +0800 Subject: [PATCH 182/421] Fix styling --- src/main/java/parser/Parser.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 47852195bc..16304b27a1 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -349,7 +349,9 @@ private Command prepareCashierCommands(String args, CommandType command) throws System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); } - if (command != CommandType.BESTSELLER && command != CommandType.TOTAL_PROFIT && command != CommandType.TOTAL_REVENUE) { + if (command != CommandType.BESTSELLER && command + != CommandType.TOTAL_PROFIT && command + != CommandType.TOTAL_REVENUE) { throw new CommandFormatException(Messages.INVALID_COMMAND); } return new CashierCommands(command); From 2b2686599b41bae84521cefb25ddb7838e839153 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 4 Apr 2024 11:46:03 +0800 Subject: [PATCH 183/421] edit help message --- src/main/java/common/Messages.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 6e2061e8ac..dc42c8015b 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -9,12 +9,12 @@ public class Messages { "|_________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|----------|------------------------------------------------------------------------------|\n" + - "| list | list |\n" + + "|list items| list_items |\n" + "|----------|------------------------------------------------------------------------------|\n" + "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] |\n" + "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + "|----------|------------------------------------------------------------------------------|\n" + - "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE] |\n" + + "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + "|----------|------------------------------------------------------------------------------|\n" + "| edit | edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + "| | cat/[NEW_CATEGORY] |\n" + @@ -26,6 +26,15 @@ public class Messages { "| | 2. find /filter1/filter2 [KEYWORD] - to search under the filters* |\n" + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + "|----------|------------------------------------------------------------------------------|\n" + + "|promotion | promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] |\n" + + "| | to [DATE] [MONTH] [YEAR] time /from [TIME] /to [TIME] |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "|delete | del_promo [ITEM_NAME] |\n" + + "|promotion | |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "|list | list_promotions |\n" + + "|promotions| |\n" + + "|----------|------------------------------------------------------------------------------|\n" + "| exit | exit |\n" + "|__________|______________________________________________________________________________|\n"; public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + "\n" + From 2411b5a2efe2a7da1b1d1e75a9976e152d3f84d6 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 4 Apr 2024 12:15:22 +0800 Subject: [PATCH 184/421] delete extra text --- docs/DeveloperGuide.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index bd5da794c1..d9846460c8 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -34,7 +34,6 @@ Storage class contains methods to write description of items to the file `./Stoc and retrieve information from the file when program restarts. ### UI -<<<<<<< HEAD ### Cashier Cashier class extends Itemlist class ![CashierCommands_SequenceDiagram](./Diagrams/CashierCommands_SequenceDiagram.png) @@ -88,7 +87,7 @@ Example: `del_promo apple` All of the `Promotions` will be shown to the user through the `TextUi`. Example: `list_promotions` ->>>>>>> 066333f49202f21788226cf5159f4e6c67f2dbde + ## Product scope StockMaster allows users to use the following commands: From 49e2b9fc7f1b5db24df842a0b4504f36b1d179af Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 4 Apr 2024 12:29:05 +0800 Subject: [PATCH 185/421] Merge upstream --- PromotionStorage.txt | 6 + docs/Diagrams/AddCommand_Sequence_Diagram.png | Bin 0 -> 48441 bytes docs/Diagrams/AddPromotion.png | Bin 0 -> 58044 bytes .../CashierCommands_SequenceDiagram.png | Bin 0 -> 78591 bytes docs/Diagrams/DeletePromo.png | Bin 0 -> 26796 bytes docs/Diagrams/ListPromotion.png | Bin 0 -> 11172 bytes .../java/command/AddPromotionCommand.java | 44 +++++ src/main/java/command/CashierCommands.java | 35 ++++ .../java/command/DeletePromotionCommand.java | 28 +++ .../java/exceptions/InvalidDateException.java | 25 +++ src/main/java/promotion/Month.java | 26 +++ src/main/java/promotion/Promotion.java | 102 +++++++++++ src/main/java/promotion/Promotionlist.java | 166 ++++++++++++++++++ src/main/java/storage/PromotionStorage.java | 119 +++++++++++++ src/test/java/command/SellCommandTest.java | 25 +++ 15 files changed, 576 insertions(+) create mode 100644 PromotionStorage.txt create mode 100644 docs/Diagrams/AddCommand_Sequence_Diagram.png create mode 100644 docs/Diagrams/AddPromotion.png create mode 100644 docs/Diagrams/CashierCommands_SequenceDiagram.png create mode 100644 docs/Diagrams/DeletePromo.png create mode 100644 docs/Diagrams/ListPromotion.png create mode 100644 src/main/java/command/AddPromotionCommand.java create mode 100644 src/main/java/command/CashierCommands.java create mode 100644 src/main/java/command/DeletePromotionCommand.java create mode 100644 src/main/java/exceptions/InvalidDateException.java create mode 100644 src/main/java/promotion/Month.java create mode 100644 src/main/java/promotion/Promotion.java create mode 100644 src/main/java/promotion/Promotionlist.java create mode 100644 src/main/java/storage/PromotionStorage.java create mode 100644 src/test/java/command/SellCommandTest.java diff --git a/PromotionStorage.txt b/PromotionStorage.txt new file mode 100644 index 0000000000..a7866ed801 --- /dev/null +++ b/PromotionStorage.txt @@ -0,0 +1,6 @@ +apple have a 50.0% discount +Period: 2 APR 2024 to 4 APR 2024 +Time: 1200 to 1500 +apple iphone have a 10.0% discount +Period: 1 APR 2024 to 4 FEB 2025 +Time: 1300 to 1600 diff --git a/docs/Diagrams/AddCommand_Sequence_Diagram.png b/docs/Diagrams/AddCommand_Sequence_Diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..3e840854b500fdf54824bbdcca59ba40f6f95f8a GIT binary patch literal 48441 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 E08SY|+yDRo literal 0 HcmV?d00001 diff --git a/docs/Diagrams/CashierCommands_SequenceDiagram.png b/docs/Diagrams/CashierCommands_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..32e6eb256104c30b4e6bc9e08e763013ab3c6bbf GIT binary patch literal 78591 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 JOf@=s=|8B6AJG5+ literal 0 HcmV?d00001 diff --git a/docs/Diagrams/DeletePromo.png b/docs/Diagrams/DeletePromo.png new file mode 100644 index 0000000000000000000000000000000000000000..4130121867763c92dbaddd2564f15e707112e5b9 GIT binary patch literal 26796 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

l>edml>lrZZT8!elYP9;ieTfyweGp=hV? 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 literal 0 HcmV?d00001 diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java new file mode 100644 index 0000000000..770d1a04c9 --- /dev/null +++ b/src/main/java/command/AddPromotionCommand.java @@ -0,0 +1,44 @@ +package command; + +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import promotion.Month; +import promotion.Promotion; +import promotion.Promotionlist; +import ui.TextUi; + +public class AddPromotionCommand extends Command { + + protected Promotion promotion; + + public AddPromotionCommand( + String itemName, + Float discount, + int startDate, Month startMonth, int startYear, + int endDate, Month endMonth, int endYear, + int startTime, + int endTime) { + this.promotion = new Promotion( + itemName, discount, + startDate, startMonth, startYear, + endDate, endMonth, endYear, + startTime, endTime); + } + + @Override + public void execute() throws InvalidDateException, CommandFormatException { + try { + Promotionlist.addPromotion(promotion); + TextUi.replyToUser( + "The following promotion has been added", + promotion.getItemName() + " have a " + promotion.getDiscount() * 100 + "% discount", + "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + + " " + promotion.getStartYear() + " to " + promotion.getEndDate() + " " + + promotion.getEndMonth() + " " + promotion.getEndYear(), + "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + ); + } catch (InvalidDateException | CommandFormatException e){ + System.out.println(""); + } + } +} diff --git a/src/main/java/command/CashierCommands.java b/src/main/java/command/CashierCommands.java new file mode 100644 index 0000000000..be1d5a8180 --- /dev/null +++ b/src/main/java/command/CashierCommands.java @@ -0,0 +1,35 @@ +package command; + +import item.Item; +import itemlist.Cashier; +import parser.CommandType; +import ui.TextUi; + +public class CashierCommands extends Command { + protected CommandType commandType; + + public CashierCommands(CommandType command) { + this.commandType = command; + } + + @Override + public void execute() { + switch (commandType) { + case BESTSELLER: + Item bs = Cashier.getBestseller(); + TextUi.replyToUser("The bestseller is " + bs.getItemName()); + break; + case TOTAL_PROFIT: + float profit = Cashier.getTotalProfit(); + TextUi.replyToUser("The total profit so far is " + String.format("%.2f", profit)); + break; + case TOTAL_REVENUE: + float revenue = Cashier.getTotalRevenue(); + TextUi.replyToUser("The total revenue so far is " + String.format("%.2f", revenue)); + break; + default: + break; + } + + }; +} diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java new file mode 100644 index 0000000000..bdac5adaac --- /dev/null +++ b/src/main/java/command/DeletePromotionCommand.java @@ -0,0 +1,28 @@ +package command; + +import exceptions.CommandFormatException; +import promotion.Promotion; +import promotion.Promotionlist; +import storage.PromotionStorage; +import ui.TextUi; + +public class DeletePromotionCommand extends Command { + + protected String itemName; + + public DeletePromotionCommand(String itemName) { + this.itemName = itemName; + } + @Override + public void execute() throws CommandFormatException { + if (Promotionlist.itemIsOnPromo(itemName)) { + Promotion promotion = Promotionlist.getPromotion(itemName); + int index = Promotionlist.getIndex(promotion); + Promotionlist.deletePromotion(index); + TextUi.replyToUser("Promotion for " + itemName + " has been removed"); + PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); + } else { + throw new CommandFormatException("ITEM_NOT_ON_PROMO"); + } + } +} diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java new file mode 100644 index 0000000000..6f801f7a3c --- /dev/null +++ b/src/main/java/exceptions/InvalidDateException.java @@ -0,0 +1,25 @@ +package exceptions; + +import common.Messages; + +public class InvalidDateException extends Exception { + public InvalidDateException(String error) { + switch(error) { + case "INVALID_PERIOD": + System.out.println(Messages.INVALID_PERIOD); + break; + case "INVALID_TIME": + System.out.println(Messages.INVALID_TIME); + break; + case "ITEM_IS_PROMO": + System.out.println(Messages.ITEM_IS_PROMO); + break; + case "INVALID_MONTH": + System.out.println(Messages.INVALID_MONTH); + break; + default: + System.out.println("Error Detected"); + break; + } + } +} diff --git a/src/main/java/promotion/Month.java b/src/main/java/promotion/Month.java new file mode 100644 index 0000000000..9cde1cb6d5 --- /dev/null +++ b/src/main/java/promotion/Month.java @@ -0,0 +1,26 @@ +package promotion; + +public enum Month { + JAN(1), + FEB(2), + MAR(3), + APR(4), + MAY(5), + JUN(6), + JUL(7), + AUG(8), + SEP(9), + OCT(10), + NOV(11), + DEC(12); + + private final int value; + + Month(int value) { + this.value = value; + } + + public int getValue() { + return value; + } +} diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java new file mode 100644 index 0000000000..f58671e00f --- /dev/null +++ b/src/main/java/promotion/Promotion.java @@ -0,0 +1,102 @@ +package promotion; + +import ui.TextUi; + +import java.time.DayOfWeek; + +public class Promotion { + + protected String itemName; + + protected Float discount; + + protected int startDate; + + protected Month startMonth; + + protected int startYear; + + protected int endDate; + + protected Month endMonth; + + protected int endYear; + + protected DayOfWeek weekly; + + protected int startTime; + + protected int endTime; + + public Promotion( + String itemName, + Float discount, + int startDate, Month startMonth, int startYear, + int endDate, Month endMonth, int endYear, + int startTime, + int endTime) { + this.itemName = itemName; + this.discount = discount; + this.startDate = startDate; + this.startMonth = startMonth; + this.startYear = startYear; + this.endDate = endDate; + this.endMonth = endMonth; + this.endYear = endYear; + this.startTime = startTime; + this.endTime = endTime; + + } + + + public float getDiscount() { + return discount; + } + + public int getStartDate() { + return startDate; + } + + public Month getStartMonth() { + return startMonth; + } + + public int getStartYear() { + return startYear; + } + + public int getEndDate() { + return endDate; + } + + public Month getEndMonth() { + return endMonth; + } + + public int getEndYear() { + return endYear; + } + + public int getStartTime() { + return startTime; + } + + public int getEndTime() { + return endTime; + } + + public String getItemName() { + return itemName; + } + + public String toString() { + return getItemName() + " have a " + (getDiscount()*100) + "% discount" + "\n" + + "Period: " + getStartDate() + " " + getStartMonth() + " " + getStartYear() + " to " + + getEndDate()+ " " + getEndMonth() + " " + getEndYear() + "\n" + + "Time: " + getStartTime() + " to " + getEndTime(); + } + + public void print(String args) { + TextUi.replyToUser(args); + } +} diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java new file mode 100644 index 0000000000..dc00bb6ba8 --- /dev/null +++ b/src/main/java/promotion/Promotionlist.java @@ -0,0 +1,166 @@ +package promotion; + +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import itemlist.Itemlist; +import storage.PromotionStorage; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; + +public class Promotionlist { + private static final ArrayList promotions = new ArrayList<>(); + + public Promotionlist() { + } + + public static int getIndex(Promotion promotion) { + return promotions.indexOf(promotion); + } + public static void deletePromotion(int index) { + promotions.remove(index); + } + + public static boolean itemIsOnPromo(String itemName) { + for (Promotion promotion : promotions) { + if (promotion.getItemName().toLowerCase().equals(itemName)) { + return true; + } + } + return false; + } + + public static boolean isOnPromo(String itemName) { + if (!Promotionlist.itemIsOnPromo(itemName)) { + return false; + } + assert getPromotion(itemName) != null; + if (!isPromoExist(getPromotion(itemName))) { + return false; + } + return true; + } + + public static boolean isLeapYear(int year) { + return year % 4 == 0; + } + + public static void addPromotion(Promotion promotion) throws InvalidDateException, CommandFormatException { + int startDate = promotion.getStartDate(); + int endDate = promotion.getEndDate(); + Month startMonth = promotion.getStartMonth(); + Month endMonth = promotion.getEndMonth(); + int startYear = promotion.getStartYear(); + int endYear = promotion.getEndYear(); + int startTime = promotion.getStartTime(); + int endTime = promotion.getEndTime(); + String itemName = promotion.getItemName(); + float discount = promotion.getDiscount(); + + if (!Itemlist.itemIsExist(itemName)) { + throw new CommandFormatException("ITEM_NOT_FOUND"); + } + if (discount < 0 || discount > 100) { + throw new CommandFormatException("INVALID_DISCOUNT"); + } + if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { + throw new InvalidDateException("INVALID_PERIOD"); + } + if (!isValidTime(startTime, endTime)) { + throw new InvalidDateException("INVALID_TIME"); + } + if (Promotionlist.isOnPromo(itemName)) { + throw new InvalidDateException("ITEM_IS_PROMO"); + } + promotions.add(promotion); + PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); + } + + public static boolean isPromoExist(Promotion promotion) { + LocalDateTime currentTime = LocalDateTime.now(); + DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); + DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("M"); + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd"); + String formattedYear= currentTime.format(yearFormatter); + String formattedMonth = currentTime.format(monthFormatter); + String formattedDate = currentTime.format(dateFormatter); + int year = Integer.parseInt(formattedYear); + int month = Integer.parseInt(formattedMonth); + int date = Integer.parseInt(formattedDate); + if (year < promotion.getStartYear() || year > promotion.getEndYear()) { + return false; + } + if (month < promotion.getStartMonth().getValue() || month > promotion.getEndMonth().getValue()) { + return false; + } + if (date < promotion.getStartDate() || date > promotion.getEndDate()) { + return false; + } + return true; + } + + public static boolean isValidTime(int startTime, int endTime) { + boolean startIsValid = isVerifiedTime(startTime); + boolean endIsValid = isVerifiedTime(endTime); + if (!startIsValid || !endIsValid) { + return false; + } + if (startTime > endTime) { + return false; + } + return true; + } + + public static boolean isVerifiedTime(int time) { + String[] splitTime = String.valueOf(time).split("(?<=.)"); + if (splitTime.length != 4) { + return false; + } + int hour = time / 100; + int min = time % 100; + if (hour > 23 || hour < 0) { + return false; + } + return min <= 59 && min >= 0; + } + + public static boolean isValidMonth(int date, Month month, int year) throws InvalidDateException { + switch (month) { + case FEB: + if (isLeapYear(year) && (date > 29 || date < 1)) { + return false; + } else { + return date <= 28 && date >= 1; + } + case JAN: //fall through + case MAR: //fall through + case MAY: //fall through + case JUL: //fall through + case DEC: //fall through + case OCT: //fall through + case AUG: + return date <= 31 && date >= 1; + case APR: //fall through + case SEP: //fall through + case NOV: //fall through + case JUN: + return date <= 30 && date >= 1; + default: + throw new InvalidDateException("INVALID_TIME"); + } + } + + public static Promotion getPromotion(String itemName) { + for (Promotion promotion: promotions) { + if (promotion.getItemName().equals(itemName)) { + return promotion; + } + } + return null; + } + + public static ArrayList getAllPromotion() { + return promotions; + } +} diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java new file mode 100644 index 0000000000..fd64cf1233 --- /dev/null +++ b/src/main/java/storage/PromotionStorage.java @@ -0,0 +1,119 @@ +package storage; + +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import promotion.Month; +import promotion.Promotion; +import promotion.Promotionlist; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Scanner; + +public class PromotionStorage extends Storage{ + + private static final String PRMOTIONSTORAGE = "./PromotionStorage.txt"; + + public static String getFileDirectory() { + return PRMOTIONSTORAGE; + } + + public static void updateFile(String inputText, boolean ifAppend) { + try { + writeToFile(getFileDirectory(), inputText, ifAppend); + } catch (IOException e) { + System.out.println("IOExceptions occurred"); + } + } + + public static void readFromFile(String fileName) { + int count = 0; + String itemName = ""; + float discount = 0; + int startDate = 0; + int startYear = 0; + int endDate = 0; + int endYear = 0; + Month startMonth = null; + Month endMonth = null; + int startTime = 0; + int endTime = 0; + try { + Scanner scanner = new Scanner(new File(fileName)); + while (scanner.hasNext()) { + String fileLine = scanner.nextLine(); + switch (count) { + case (0): + String[] itemNameParts = fileLine.split(" have a "); + itemName = itemNameParts[0]; + discount = Float.parseFloat(itemNameParts[1].split("%")[0]) / 100; + count = count + 1; + break; + case (1): + String[] periodParts = fileLine.split("Period: "); + String[] startEndPeriod = periodParts[1].split(" to "); + String[] getStart = startEndPeriod[0].split(" "); + String[] getEnd = startEndPeriod[1].split(" "); + startDate = Integer.parseInt(getStart[0]); + startMonth = Month.valueOf(getStart[1]); + startYear = Integer.parseInt(getStart[2]); + endDate = Integer.parseInt(getEnd[0]); + endMonth = Month.valueOf(getEnd[1]); + endYear = Integer.parseInt(getEnd[2]); + count = count + 1; + break; + case(2): + String[] getTime = fileLine.split("Time: "); + String[] startEndTime = getTime[1].split(" to "); + startTime = Integer.parseInt(startEndTime[0]); + endTime = Integer.parseInt(startEndTime[1]); + Promotion toAdd = new Promotion(itemName, discount, startDate, startMonth, startYear, + endDate, endMonth, endYear, startTime, endTime); + Promotionlist.addPromotion(toAdd); + count = 0; + break; + default: + System.out.println("Read Promotion File Error"); + } + } + scanner.close(); + } catch (FileNotFoundException e) { + System.out.println("File does not exist."); + } catch (NumberFormatException e) { + System.out.println("Invalid numbers found."); + } catch (InvalidDateException | CommandFormatException e) { + System.out.println(e);; + } + } + + public static void addToPromotionFile(ArrayList promotions) { + assert promotions != null : "Promotions cannot be null."; + Promotion lastPromotion = promotions.get(promotions.size() - 1); + String descriptionAdded = (lastPromotion.getItemName() + " have a " + + (lastPromotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + + lastPromotion.getStartDate() + " " + lastPromotion.getStartMonth() + " " + lastPromotion.getStartYear() + + " to " + lastPromotion.getEndDate()+ " " + lastPromotion.getEndMonth() + " " + + lastPromotion.getEndYear() + "\n" + "Time: " + lastPromotion.getStartTime() + " to " + + lastPromotion.getEndTime() + "\n"); + updateFile(descriptionAdded, true); + } + + public static void overwritePromotionFile(ArrayList promotions) { + assert promotions != null : "Promotions cannot be null."; + int length = promotions.size(); + for (Promotion promotion: promotions) { + String descriptionAdded = (promotion.getItemName() + " have a " + + (promotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + promotion.getStartDate() + + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + " to " + + promotion.getEndDate()+ " " + promotion.getEndMonth() + " " + promotion.getEndYear() + "\n" + + "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + "\n"); + if ( promotions.indexOf(promotion) == 0) { + updateFile(descriptionAdded, false); + } else { + updateFile(descriptionAdded, true); + } + } + } +} diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java new file mode 100644 index 0000000000..88d5d226c6 --- /dev/null +++ b/src/test/java/command/SellCommandTest.java @@ -0,0 +1,25 @@ +package command; + +import exceptions.CommandFormatException; +import exceptions.InvalidDateException; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.fail; + +public class SellCommandTest { + + @Test + public void sellItemTest() throws CommandFormatException { + try { + Command sellCommandTest1 = new SellCommand("testItem", 1, 3); + Command sellCommandTest2 = new SellCommand("testItem", 7, 14); + sellCommandTest1.execute(); + sellCommandTest2.execute(); + } catch (CommandFormatException e) { + fail("Unable to sell item."); + } catch (InvalidDateException e) { + throw new RuntimeException(e); + } + } + +} From c070aff26b599d3ab9ca567450c05499e436188e Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 4 Apr 2024 12:35:03 +0800 Subject: [PATCH 186/421] Add Storage Class Diagram & Sequence Diagram --- docs/Diagrams/Storage.png | Bin 0 -> 16796 bytes docs/Diagrams/Storage_class_diagram.png | Bin 0 -> 86195 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Diagrams/Storage.png create mode 100644 docs/Diagrams/Storage_class_diagram.png diff --git a/docs/Diagrams/Storage.png b/docs/Diagrams/Storage.png new file mode 100644 index 0000000000000000000000000000000000000000..a633a2adfdcedf5fefc1a1bbbbbcb7d355048bb7 GIT binary patch literal 16796 zcmch9cU%+Qx-La}34|(02`wmH6p&t}NtGrjRjO1447~+HQK||Ggd$28P@2*qNL3UC zfzUyvO7A6i#qZnSxqF{|@7??S&bfbxB$>?2S~K&mr@h1(>TA+avQZKc5YT9AsT&gz z5K4f5AIV9irzd&Zio1g}1xTLdr8IIHNX5D-))Q61ZnfY%h>S~uF#P zi$s?4J*-re$sU3=wyG+6Me@SsgptV>>%DNXa7tRJjl%w_^-c7p-Yc_?U?Yu zrLJ%Dd*27Pz1HR=4mq=lcYb{qvNYS70EI_0`16nw z2F*Q`{@NBr=4hFiDeYDAAyZmTIKpLT&pEUY$ zn6^%M|zrln?&sT!O$ijTwg4mdC{X)|&9klCypag@# zDjymS5+Y+e5=mUcC!FUUzS-pn`{R;vza|iw$Tc zTy+1&^rVGK-j_bgqTHfNb*R+bAY0Z?N7Q}*t?*$iX#dOf?T+hxA3iXN(e!6Z8>m*^ z`>DUPS~t~uSWv(>^v>^&_P5uLx;35?vS}szzJk=(UtTkMu9@_tkWXH%poZn7HG;Ur zrX}>X=Wy8#p630BVPFh3cfRo{z`nfHV=y8zYb2#T$0~ST@aOWk3iGDG9b+nHVZ*TF zIWFRSGNX%MNAK7UX{WE7==$p0`X}LPHq(AfozflTD_3za~0$qq?VEeHRD$ZzLrU z%WW#dTCbD%)Gvj`>!NT*g6?^0vMZS{jGkX5tl|*24M*nYp78Rq$|rABBE?lcMK%d2 z310VG`kHc)vaBlxr5LX1ympqHZd2ow0OCxLH`Wr?a?H$Kk&(fAzy)!!jb?IvW!=Q) z4Q>DaEO~cJ79AsWG>?7#zP+XuQ;^f}!^x}3BT-KOC&8S<% zS#16I0B*1HuZbLT559BO7uAcCM|HyYiPD)yn8(BoMbrs9{8!RS1yz}hpcA>zTuS4a zW63zX+h*yHb47KM%_^)#V2y&0u>Jkl;>f6M#4B1(1E-}e{8z`AT+(Upx9ecsckcWe ze@j?5R;!oyjEv{r~3DvMu4FH!wMs6m;yA>GWw127)jPmEPyy5)y7 zA4$k38@)f_rj;9xT3K-q7@5nnVMNejH&H=_YAD)>U5T)O-Sis-K7PeMxV!{b(fk%A z>N6Ccm-U5jTGjW^iC>B*lIN&w_L^!YWH|&k;gd??HVss+z1&C=yR@g4mAQ|oR46K> z<_J|=_3ZMUXEl7!Hd?aPuUOZ6=lQ;=G*u#}9mb+ABl~K5^7FVL_Y2e{yRxp_o6qB- z#*jrKU!$fH*`@WfuiU%JiGP+Lmr}Bn!W0ePwC*M=S!>yG)JDmyh_)KkUZJk&I-&pY z6JqbAarq{ur1~503fnFP%+bI*N~uvay|Fw$7yd)Mk#mo1zy@J7wya|CfNu5@ql9Yg z7efp=Oka(j7b!!d@$bFKkM4{_vSdZ)ZCA>pxL%we;D=UeMO?2;*5VoKlPpaGB`{8h zK2tH|-9ZxFUfk~HxyM7=s#^1{OMIY2<{M+2`ZMfKc`+gRP4Zi-e6YlhI`ExY@nAXa z*tzvpzGYJ+9m>ux6`bjxZ{21zgCF>(szbqRau_Xsdl}j({nyqSp0()dzicQ=p0hV9W*OM@?T1W}LDRP~`ld5x3dS|>+*C2qa6jSxPA7|vR;-^E%dypnwCA`Wwvw7t-s1cG zd!VXqhJ7vqaoiDix3 zk93`(3L6{suawT(Ggxh?wt7$iGkuf`c<@zsRh<#frY*l+LTQS5ENj)TE@)J}b z;dT=DO!J3qmoc;w+jWIC?xV(M=s3BC+Y+cqUCqiZA6JObVpaX1QdFC7{a2rr3DIn0 zwD{}Xrvc3z+m^$~-d?*z9wKIW*{}-9-kAWO7 z`@MDSI{Pv6D@o>gCQ)0iIuESCk+lEH2$52zW_MI1k6Fxgn$L|JH^4*S51ncbX;>P6 z`$iVAo{Lc<$rpF*WxVV$cB%Ntrrujc#HzMTSt8it>#JKaqWU5C>D_XdZ za%)8?yqfXp`=ib|+Aa#}2!vKb=h(X3oi}LaM6#9+BC!X_-Vr=z`YR(P6CjYEUG_2yvjV+)6mQIBp>EWMT zMS&DFTGU1Zw~O`C;7)lNu=OLAg*o_?)|#ukzn_tPmn;8SS{kplKxo1g9aIzyix43S z0Iiv}w)Upo)Z2SMXK=!?L@q02T>CVmFXEwlcqEIs-HXUQ|ON_TelX8&I-nW=Y= zc0D#$3`3AC(k`F4-w24AmY7hGi=JUa^TTFT)#F$_#j9tge{?-e^5>3iiz1!1SKtkI z;|^E0i})saXIPk?)Z|;F$GZQI{-+Es*vL>@tzCuTM^ z*0G3As}LIe0;q&}hX1=k(cW;!J2I{_ZCyXg;6K8meynAZ80x9AL_ZcXkKbF*ZInQm zK<)-X7|2J8jGhy%`Xc3pv$ipYx6~g~s>YPCoszASbH0RM)e2y6yOA(|@occWexSVz znI(X6#-uJ%;I+BQp4)owXSBu+Bv~hwa%7(xw*qCFN+hZ+6XDB`MAV)u`IhmN?K7b zN!U{t+7CpT>r=#Et=lC(c_P5`EH%|$_%p?Oqx`_6dnuWjrPg65JFUboi$u8>j3Y1k z_kfk^)KAE)%+Lc{d$~BC^c&YL%hMejoM~;e;{DI-_R+@-a1CmM5Z_~UuX~L!fZDR; z+fL9#!vNcsj!!b@vr&jqtNyqsBaLXd(*#@Y*F~-RE5m+Hgd^0eW>dLR6HMMhpUbIAx5ZZC3< zK^PY@7K@^JA8%<#`AcAqY)E~Dr8bTPB0Q1|Dal?ayVHj2E|jU_ONrVV>OraSnexIo z7b21>0Zg^;2;abyGPFXF&Um6?xQp_&m3>`bhq$=76h9Kewzq*hZrot^9kj+f)z=`FGMACllY6@`iyC{VH zjE?uw*%&)|B0+n8KI4*2X>)JI;;jlo~?nK{iGT3Y_y`ssd_i?*dOl+!dHMU`>IOe0S zV9T_K$c2WniJ$m3XW&@XGeg|~)f6`c?OlDu@H}8#3@XtK z!?kj)MlzAMuB!&Z>O56!XDM3e+AAd+FL$!*Qn%kXZPiE1pPz_kyX2A!AY<|AMp9VD zYF!2#XTAR7+ z2^str{p&oukAf0-{BzU?DOM&Lq+5Pn*O{H2{rXZb^V$O>krTEv7|~`@W?_V1bt4jc zI_dRz-b+>SC|`!o5&5*&KMFpW!ktVJt=^=x{#0CN{6gpD_5?ASwb@79Z^@)4^d!)M zKeSf^16Dei+v4Ho!Ot9B2Spf!O~`t|GE!yrOQC_-_Cv>NhK->f!#)12-KXks7lu1u zUOo)m{;WAP-;=g=X~D_@y~V|@(NEXIl3h=H6vt$+4u(OU68u?vzI8JTH!@Ob@b8Hs z78I@5GP%NztK#TY+X>?>$dwz#Z;2}^M;v64!)Ayz%E*srqbu|s?qVQH$Dhjhkw{|3 zDx%8S9hA~BjN3YaMND*a>ozhOMXb?}vS|!GJ#YqS$1I)&W=E^h-<9drTx?cmk*9bt z&rmGo8_Pt{`GD>|_+O*mS)8#bD@8MU#^-Qr@EXwS0rlKg^d!Hs8O`!2T(~`7XsYkZu!t9%o)` ztbxb(r?{ok3V<6LOzJ!*_!PaTl_>xdDGJ@6AscE6x*ylF-cAJ#J=yuTv_8}E8;Yz= zwX`5Jr96z4PPWtBu(jowoUqdXik5>P>^05$fPTgga35p&4A86K#IlSE-U@bexYqj7M zs8$Lm#8&1&6~xODe4Z7MS4_KK##a3+#r8v0$}Ma7PQP9^(2l+54Zzb-z6Mnsm^4dO z_b*{LrIhAZ>#$SV@&OkOPIrUn#&Mf{Vw)3&;c+5_o9i~34Vz?$scVEK65c8M$cm~9*C1eKfkRXdZtZ*esNg3T0q>2-G)lE8^I4~ zyFY*=Zwn)6?2bE|5Zzep|PL^?Nc=3`xT}7M42uF`3z%AE{dC#U%!6627dD$Q27FTQu*JP>;UcJd%gTd@4cJ5hk>(C*4|CC1$b)i9yXaHjN zapAey^xh3vs6CBcg9C{sxWJKa;^liz1~-y|@r(jy}56pCK{E z5DW$ty4JL}nN6%8??PS}B2XayyYOTGQ8cQ8iUXxMK(gKgEA==zncMGPgKaifV;lbZ zH3qcHHjcL8$lHLpP29pE=kMNnT3K~;i*6(g=QDScJH&3970@Sp`+%yS&&4C_Of3{4 z#93Tcr0t7i8bXX!&~WoFfF%uTa0BVpTH|>HeP6Zfmun@B)0bt3VXOHX378o6yFh7- zn8M$0<!_ji5bMN0~NH|1kqr`h)>jX1z13so>xc~X=CuV<)(Wja6wxDp^Jjp!APq`{?K+#?Ta9`?4V=gf~ zG>Nus-FNzXFj%vf>ZU@|^fT8HgI~T3jn&+FAt~zV-2#uA0$Sr$JXKriCX>d$xE*Gz z2EP`r|7P9OHY%67W-2cgaI&KZ@}FFX;(5ufQLBlZ3YLjvBOYEOl`4+T&V3SO#BHdI zw#*t%wso(NRPby>_u^8<4Kk?J?I!!YK%B@wpNWV>o3l<9@|+lI6;KExx|*oE?k znUaj$QVWlhrW~pXJuSuslax;D-H8%!o*EPMr^oUB2BBPdd9||bObQIA7;+d(qiRaG%bH9J zVTCGskEFmJ`O>j5I*o6q(5h3nqiTi7#d{!UIML_Eu5f+5a-nZ?P2CQ>m~!io9n*k5S$hn5jqjrInRdmEE z%;v}{0k>bNfF&X2vQ}|6ixsRqIm*vVxOPc}KEd02&cTx1*D_i&iq2;{qa|>sWLr^_ zjoK%&&_4Q%>kLKtjW+_`U*?uIS+!11kJiXS6E3l4#^x#4*2x97T1~5rR*(B@sCJ2NtQi*-+Y_WjK2YDpC7=|B7@l(vD3H_JmvR!+Vr60^ zRf4%W{aI;Z^zz=38Bnwn(%*P{*Kzt~S7EPhM%;HXCe$GsCN z=w<~TNgP5~iB9N2F~*rN1)>^k2_b$D>km~Sp{p@0t;Wy@+8a?jg@)G=%~ZZ|CXl1i zvm=W1Wj%^pGo7`HRtVfqUJJ2*B`TMxUc^{eZrHka@r1a4=48|>HMJYX!#rbA(Gw^` zPLJZaK8)A*LQW5U5*pAu2-?%rdfx3PpUL?^&|vBGkFNES#xlQDY~NO(yWDuGmAX7bQSfG)do!ZV9_~vW^XJ`5Pt|w{;gBIp z7D*b>YN9jK+mi+d?&q8dSVX_}Kb8F6dFDLlAGbWcba*U)q1rEl+o{qT?yr?-rwR0I zPYg>s1bhs0-^P$rsI9l3d9x1Gd-E~&#ivZP3KGPFDX;lOMfE+#s(Ub6g0{Wx{U==4 zI^&s!BnRYqr}W5csONl z=+O4!7pf44v#Y@Hq2M)qto}H4mPxiupA9gN8G?Vp;Qsp<$$z3LWoM=v!v3D?t#1qh zg4=r^_ZQjo`_X^42Ed7(85GyE8f3C}IFA{DS>x$CO6d&d&c8UlW0c?u z-8ck1b_lEx=dF>*E8rck=7X1(pgJ7Rrx_HCWjub&pMz?@=cv?)AszI zMUq}peNzLTLfm)n)WPAmx%Ho>=bzYcdT;&wPXOKcj=Nx5QUvH!FU}@p=P_8!)0c+J zGciCO5}bMekbMY{<6K}gh;Fc0BUIXfTWZOn7;FL5d;QsyqrG%*;Bqe&=7bspJ?!!R z)_{`OjPz9S^WBxv=kI_Sa>1l17ajELt+5|1hVg6A-Y-)FrITumgg?|avm%@^5Gv*%LBf!6Z^ zuX}8O8$~zP<1nf32deSJ|EM7iZt$aL3hkA3WD|Oz;q-%qRhBdvg_9lI(ORyPb{$l2 zf8#t*ViR^^df9!%aMoX8uzfODh4{RZ|H;AD&mkcCn*u?cKXGUJPgAkPx+xG^2OG3* z4!$u|Ze>0zg{1lR0yvDREi}58Xo+9XE#2d=F1IMTijS$vVcogmg+B<(fnUS{cDRaG^{AeQ~~DIhOhU0rt! z1h>NpiMIh+ePFu$=n>=U#5DMPmEu{I+iG0a$lUDgHW^p2Enqswn|)&psuLA9N==S^ z%vI5Wv8TTKO>pEpgB(R!A)!8t8nk=>pnV#EW|)^-I+pDX1`)jg)%ES$w}8|n!_=zb z+^;=>zxuw!@9tf&rD`G!4)3z4$zm_)lsf)NbATYq2it?(3fLY=!QgxC+5?< zr)c2f;0v%XKmu#vhG1Mxhz)y(p+KO=zE(nOxvi-7BJa_(9O@Di^3FnBy7e2U zhky<~dc+qH1YuF|nv}14{8Apf8aVsdxj_aZ_!CbaC(W$`G(Nrnr^CzJ0cII^>hm*z zr`?U+idy~^mwtLQh4U=iOQhO+4mS( z!=dRdkA*2@v*kjLBbC5m?C9xrev*K{IpCAExm=$CEt@ChkDhA}P|FdGtyqn^+6#%d zpis%fj2|r&#AT9lka`pvA&7@1Td%V&D;=#!GI4Q<8Qk_geY04}$#L(q(IvnVR~C+4 zn$ETq5*pA=zih<~JK<0qi&FtVIWFIw*V>@2x`p&tq8yVx{y0|FMUX_<@&@g!y|E_E z>|S^2h}q-k!$+L)7Ux~Q7Ny9aK!AVU)IU>9xXp-i4kwZ39#o#kqsqrADKLen60(GS zK(m>5<)9AKoO^i_*oUoO2l)uuTSnzg?u|U7iWDJ#ZEKgcEMAY`fU}C7=g4%$`e_qCXAsPWiJA8 zr@Ic=Jo&s8c2AdBvQ3QFYGr0*>)MJU;rO`!2+i&X+8b5lYt0(H0lbb7jWR~t70wcf zh5L-AN(@VQ2`PFXKpJR}ICzMm?P{%FDX1N0L(`|?cB<3wqu>P75&K@xQX{K8!2aL2 zx0NEf^Wu>bQPC0X!&6cgV3gUa(zs{+OlAP7|6?LRWH8%VD*(7Washx}U~x>Msjy7osfe&3mMBnG#L? zvGZibL3{T@&DK>;>T`0gf)_a09vW%+%w6Rjo_ous5_@$T)}9u0v|2|DX*hZz-1}x3 zKqiGMI^`fT^y{K_bzV9#N{gQGaF8Xq@JU~@_y0muj74+x$eX4=C&o%=A{;Cj5dqt?^z|CEceR#SdV zu5ubnv~NumxQaToC&aT9k*1T4tKOJcdN)w4oJ8W(0k)-VgkZm%gUz;~sT&!WVWZ8a z7VbIX1t{rg{wr6m49KXABp2?~mvte7SN2s#V7C`Ml1L6BB5O@qM>scYT59%_AlNrv zi5pc++pCeWL|734%PC<^pqZ1OkydmHUx9V}5RnheF#|SWF0vsA_a{$D??d9c{TUH8PQtjb*wU+?5kj`^{0@qP@jfT>=R`mJ2|0x zsDCd9@-&!|n8==eR}JiTWKJz~Bu9D@p(gToOhw5N8Ylc`?bd;)-vOrk#Y_@)8ZjDi zyBT1E>&37Cc%Gz~nl9r1>W%Ghy-q;_YSgM5B^@)$%k4r((yu&A1k_i&M1P%z?UJFS z^T$W&j0K2=xU)P5JsRT#Jj2D;;ZHAnGm397Z@8G6QR%ILF;p10<%V@!!tw> zAa^&ot2I#O4ZfJ1_(;UZ$Hxr-Oo6Magl~H6Emv$Wn3WZw1Ad%6pwlk;e&yz`w$}pt zBZ5E&XkNh391m&hde^)LD!!2oI_h_{qMa_5<*G%&%aw*(bFsyV6ut;dM^H(4MoLR#a)J&kvuVLWEQh7v$wau zMyaYLqe8!B*SY*NC(I0J^e+(fvjl*Y;GO84;LSJ__BXFz-zL=-mUQYDKmX|1KyLL3 z$`Ou3e!0%>4%61vO}p}OBS1LNj&EF0JAgJlsIrVgQ7X`0aozE(3BS<`;0xC2===F6KwD`6nkv#C^M{33n{TUT+68#1>686^K= z0ARI)r&}YSp5ygKC+i)M62K&&VKdPze8-2&6+<%}C{tkL@J+Uag;7X*j1`0)F2aXu zJ*?uCaK~HF(5(;BZXoVkqMI&iPxYOyDhI^(QgAszzphY76rN5t1q}gWCE`O(N|qtM z0i2=|pSkzYu6muykR$&ZuPMc$DhJItfDGP1L-!``F9G6P0^%mnwb3_)$f+<~lWgF2 zQQ&3|oPYAUCWHdu=wez9*#dly#3u;t{ZT(lCeO0g{rm>7%yjC5_B_wdjRH~~2R6LX z4p^(vM+4xE@p&c@clm;xVfe%^vE36;!|?ey=-Q{eC?xA~C^t45S(B2a>}rm*I+>$5}*8OIXx_O8>!60tOgcDH>pIC z8YiwC;vXPjik5%~jPAMRHsE}GeW9Cf0us%@1uAF?K6qUM(g+w2a`socAk^5&>=w`r z#HwRp?(0!V`2PBDr6)orMcgwW4)mRsD`Xp;k|Ow!c;o+J#W;ttFlv0LxH0$?xeSF(FX2hb-LF>AopAna1t zcDop~R~5P+?Bw7%N5!$Njl9G+K!Pusl}`mOi~QkK0m1of=`gS&9&P=ILt8iamjm*q zFwGZc(72h!byG8I4vt2sR@k&m0%CIQ+M{aVx{**ZgV`)DE*@hLohUNmZ36KqaE1$? z^6uWmlMd0K5CxyU`?tJl6!HcEB##GmpUT05aq6!)f?Y0XS8S z6^)zmS-QZHyLvUIYONJD9QZaN_8{=Tjl3iMc_BNemy7WUshjjfu|+L-^rHOU$@2#JB1|#C)>z`JAkls zs4Z^g6bk)ih*6z42s=!BCgt(WvMI0zWXN*9_H68udVN|qJI}~X4WedGre^lK$qu3! zo?m@v{PgKlfvZ~kAbA2?m?W4XLVTyT>kzuTT;7%t(Pc)r5Gmm^i)k%&Bac~SwpZYu zk7(q6u-3Sh$Of3=h$3Jm6bw-4ZH_?)IsYKw2T^S@Z?GQ^kChcVhDigjGLB&u;36oL zoxPNlnl)LITUlQ}F}M`U$$WSv+LA-f1|G|N7}%z!#t9yn6nwV4AdEqgHyw?BHT>$9 z(8+M+3Et7NnOg3P5_{~BW2>o1R|S&8-Oa5rr#b{g4-|DORSc_cZ8NF9102Epkcu9E zKw|<}+ruOh>$9?ps&tf!IEZwv3M1w?7&cL;GxBivmNDt>=N#Gf}9T z^glyFCmOE*Y(z@dbhb_l*x|CHEFfSMk%tdjRrHqh({Z>2a8k0kwJrEuRI){V*qo`9$- zm~ed5y_(l90!}*MzCPV{K|(^pR;)-i&Ud|t+fXa&YG^E5qquM-ZxSH1XJYO?A|+n} ztnoGgQ6+_K+#E=%MSv+Z3?9f(1g)^g>!3<_#u`5fa?#{wLsp&XZb7XdX$1IZ1MmQ6 z=Fxp3Ob-zrj0n%uOQJK+g*(O0!&&0a{fU}>XFau^M(WorhfY!E|NTF0dW(Um*Q%7%xr8@Qo1N-5s$6P z)Ro3^jlDEO8&TzYplc76Ry1EYnFmRuyeFc!+=f%NVtAPC_E9XOFr7bvKdhQFnIj~8 zd;Mi49~@2=N@YMMHSek*x-0?XLKtFeK@t~9{hXkZTgmWKEig#bns@7%aT}vBOM*8u z`2*-|ekLBul|blQ;1!UM@Bi5k!<huLd*Ms+V-W zSYmz=WC$R~%&y|`1YoR6mDk0H5r+P~uGb_Io1HDD^_XhPfpDd(*h!J4p!mRCLyU$r)MxTP42oj>L8(n6fkAO^pI7}Hhcir(4iZb>>MdZhH+^13hMNaeGV1Z| z3?)t}-`38o9RU8V>`z0FlSl%_0;W$o@+k9*JV?ypRBWpR+-9sFqrEPJfZF~f;g4;U z_z?-yKG||wcQg+(zik#j!2T$XLJINKM5d(3GiMgXdkMJc+sOC=w-;bsc5P*B{wq#@ z_!FAfjyoErPevh~$qPsxW|hDE3F5ZBwW$h407JqHN!KVkQr+2E#-2rDa|z_1fff6F z@Od&D%Jy}>|C2+(x=-u%5z<&YE3ZDQ2#61n^p%&>8%ddeL4U;~N9Xt9aOCcVSbFB_ zJf>}_Pai+pIX5aV3>1oUbJyA_ef409R#2Qrodn=JyCO-b=10m3LBx(hjHApJj8$P5 zUltcfL~`@6^T9mI!=AJN^mWKm>6~R?VJVdI7`tuH$5;ku{%ufzu*rx3v#&d&gc_fX z?<}ng!|w=2Qmt(P24H}p0`0Wh@^`A!e@^2C@MLk4*=U~%uncXQUiiwW6$*OikY|f@ z@^uzjDk9%mB?nc?y4w1sBB@s3W|x4=_+Jyy|E{@3hrsFEF#!4?n+l}`O9R1dbPp6@ zx{~ITT`Pw_qGdem3E!SdI)AP8zg}Mwwf5*}YEjHTWN970+>qd)C4Cc2D5W(}K zL(Cdr*EeJD{De9alEqOxKjuD2PnrBZ-v7lToPiyW#JLtuY;v#iDP=K!{tx%T*69P# zUIF4S`+LMM&LRFoQqvS_+6#bh>HPd{zv))Ov`9LrCqVk)e<1#N?*BmiTmbQt^K(pE z15o`J;um(jfxgB6H|q6YL;Szn8=u`}_ut01w2YdzL*{P4LjiEo6Ursy zor?r1S`($?^{A!ErUr}+VupkQAk;g4`|EZ?uWrf3fhWwS9dx`D=Y$?=1Bb_Kc0dW& zh@1-EdN}sRISI7nB$OEDMaDmTNE49p9>lf3-WyPW`vlY7{*RQ|Yl4i`oxh-euJ`{K z^v|9A_n?2q+d0q}6me306dfWTdRz~3S&uQRJ8d=Xp_UC3w7Vo*HNd0Loi$L{d4!Z9 zE7Z?67O|{OMu46*evH&fm*bY&WN5?51aK2U+sT0R#}kmG;+fJWVC{zdD~5#Hzi&t= zy)r2Jey}uDS^|nc;89cH`W1nMt=4$Vw+b6`;2M~KgjzcA85;bSpOl!DKf?gC_5#ek z&THyP5Zee{Eg)65Okdr+F`J~Yn}MvHczaJ1gyFS;=kdX-tBDe52tr+Z3(xnCh1lC; zNV-U@{(%0s9EsakZ!wj z1?&#im7JCaGFKmI@aDo+Ot3s5KCrgE?F+UCT^6ze0$1^7M}@Tq*obBGeXS3taAgOO zPYUH1Qc^5*@x!C)Yt2d<+R2#yH|=vW#wZi6)id0pnL_S z;RZIEH+zNdih@Z6y|C{~zBgax1pMJVN=B*v7yg$48PV}1w8i(gV%{Nkdw`MA;tvO! zCeBBp4Zpu_dH>+-bA`5V=-BUaWakJx|8F_7f9zN+W6XUHm(Bc$R=`?pz79UPyC}m> zsg+>tqVLYeBGIrw;8HDqZ-+Dc_CF`4*ec+Xu`1{vB z(BMS^r(h(6fG|?r&hS!WDQH4Io9lj79#IL}uc;BPtjC!kjpRd39W!m0D*`LnHpKiQ zez4NDLNkng&6!TJEPjM!Dghl^CDql{%447xio{8R8~KP9>~waowsOBTt@ecK%hTMF zIM*QYoj5&!t1LjL<68rngy=lJqX!rG#@a#qpNsGw8QY130qYM%-U7ki=kg6#@p)w- z;5-SRug0c}Qn0`=`XmL-yq7F-YwE6RY{}R?7csZ|J|`Y5zYCgk8AH4FV9n zcSJ!>_WUx*;p|WP;|());UxJ@a^x6>68;r5sayj{z2kR7>A%@?|F3uF$Hgxet3`jg zp5~1LF;03hdt`FAz=hH@ymp79pH=*9jeb7JFqi%iG#IXae@b)opBi8LV?qFv0J0^J zC!4eRFh2YK7b#2AKo=_y1$YhGTtQ!^>N%7b{6+;2Qil3>@9f{+dR{5pgKt`$2AhC3 u*FV3Xx^qD_w&Rao{`DsZP)18Q!WKR4k|9nH@Rt+_2(&fy)nBRFM*c6P?=F7; literal 0 HcmV?d00001 diff --git a/docs/Diagrams/Storage_class_diagram.png b/docs/Diagrams/Storage_class_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..23ab02f3db116a1098faa5aafc9d8a7732eaa430 GIT binary patch literal 86195 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 literal 0 HcmV?d00001 From 9092601711438e7a22e267941758f510a0f6bb8e Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 15:42:57 +0800 Subject: [PATCH 187/421] Update UG --- docs/UserGuide.md | 29 +++++++++++++++++++++++++++++ src/main/java/itemlist/Cashier.java | 13 +++++++++---- 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 03c815ba47..e763072efd 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -102,6 +102,35 @@ Example of usage: list list Electronics ``` +### Get bestselling item: `bestseller` +Reads all the Transactions and returns the item with the highest profit. + +Format: `bestseller` + +Example of usage: +``` +bestseller +``` + +### Get total profits: `total_profit` +Reads all the Transactions and returns the total profits. + +Format: `total_profit` + +Example of usage: +``` +total_profit +``` + +### Get total revenue: `total_revenue` +Reads all the Transactions and returns the total profits. + +Format: `total_revenue` + +Example of usage: +``` +total_revenue +``` ### List all available commands: `help` Lists all commands as per the command summary below. diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 780f2962d3..e1b32798e1 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -13,13 +13,18 @@ public static void addItem(Transaction transaction) { transactions.add(transaction); } - public static void deleteItem(int index) { - transactions.remove(index); - } - public static ArrayList getTransactions() { return transactions; } + public static ArrayList getTransactions(Item item) { + ArrayList results = new ArrayList<>(); + for (Transaction t: transactions) { + if (t.getItem() == item) { + results.add(t); + } + } + return results; + } public static float getTotalRevenue() { float totalRevenue = 0; From ed9c0789dfbf8e697c2fe029d2248b02f63e3e63 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 15:45:47 +0800 Subject: [PATCH 188/421] Rename Duke to StockMaster --- src/main/java/seedu/duke/{Duke.java => StockMaster.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename src/main/java/seedu/duke/{Duke.java => StockMaster.java} (93%) diff --git a/src/main/java/seedu/duke/Duke.java b/src/main/java/seedu/duke/StockMaster.java similarity index 93% rename from src/main/java/seedu/duke/Duke.java rename to src/main/java/seedu/duke/StockMaster.java index 1993e59b83..c52f343931 100644 --- a/src/main/java/seedu/duke/Duke.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -15,7 +15,7 @@ import java.io.IOException; -public class Duke { +public class StockMaster { private static final String STORAGE_FILE = "./StockMasterData.txt"; private static final String TRANSACTION_FILE = "./TransactionLogs.txt"; private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; @@ -26,10 +26,10 @@ public class Duke { /** - * Main entry-point for the java.duke.Duke application. + * Main entry-point for the java.duke.StockMaster application. */ public static void main(String[] args) throws IOException, CommandFormatException, InvalidDateException { - new Duke().run(); + new StockMaster().run(); } public void run() throws IOException, CommandFormatException, InvalidDateException { From 32adeb0f3d80099dbce1a8a39e229d4fdf1816b1 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 15:46:16 +0800 Subject: [PATCH 189/421] Refactor test code --- .../java/seedu/duke/{DukeTest.java => StockMasterTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/test/java/seedu/duke/{DukeTest.java => StockMasterTest.java} (88%) diff --git a/src/test/java/seedu/duke/DukeTest.java b/src/test/java/seedu/duke/StockMasterTest.java similarity index 88% rename from src/test/java/seedu/duke/DukeTest.java rename to src/test/java/seedu/duke/StockMasterTest.java index 2dda5fd651..9e4f7147e0 100644 --- a/src/test/java/seedu/duke/DukeTest.java +++ b/src/test/java/seedu/duke/StockMasterTest.java @@ -4,7 +4,7 @@ import org.junit.jupiter.api.Test; -class DukeTest { +class StockMasterTest { @Test public void sampleTest() { assertTrue(true); From 2a2497d0893021437f2ab09a79eac03c69d0ea9e Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 17:44:06 +0800 Subject: [PATCH 190/421] Change test --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8ce350294f..ca09fcd187 100644 --- a/build.gradle +++ b/build.gradle @@ -29,7 +29,7 @@ test { } application { - mainClass.set("seedu.duke.Duke") + mainClass.set("seedu.duke.StockMaster") } shadowJar { From 6718c732803ff5edfd6f30996e3702a8a3de9821 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 18:45:06 +0800 Subject: [PATCH 191/421] Separate CashierCommands --- src/main/java/command/BestsellerCommand.java | 17 +++++++++ src/main/java/command/CashierCommands.java | 35 ------------------ src/main/java/command/ListCommand.java | 10 ++++- src/main/java/command/TotalProfitCommand.java | 19 ++++++++++ .../exceptions/CommandFormatException.java | 2 +- src/main/java/parser/CommandType.java | 2 + src/main/java/parser/Parser.java | 37 ++++++++++--------- src/main/java/ui/TextUi.java | 10 +++++ 8 files changed, 78 insertions(+), 54 deletions(-) create mode 100644 src/main/java/command/BestsellerCommand.java delete mode 100644 src/main/java/command/CashierCommands.java create mode 100644 src/main/java/command/TotalProfitCommand.java diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java new file mode 100644 index 0000000000..40ce384c7f --- /dev/null +++ b/src/main/java/command/BestsellerCommand.java @@ -0,0 +1,17 @@ +package command; + +import item.Item; +import itemlist.Cashier; +import parser.CommandType; +import ui.TextUi; + +public class BestsellerCommand extends Command { + + + @Override + public void execute() { + Item bs = Cashier.getBestseller(); + TextUi.replyToUser("The current best-selling item is " + + bs.getItemName()); + } +} diff --git a/src/main/java/command/CashierCommands.java b/src/main/java/command/CashierCommands.java deleted file mode 100644 index be1d5a8180..0000000000 --- a/src/main/java/command/CashierCommands.java +++ /dev/null @@ -1,35 +0,0 @@ -package command; - -import item.Item; -import itemlist.Cashier; -import parser.CommandType; -import ui.TextUi; - -public class CashierCommands extends Command { - protected CommandType commandType; - - public CashierCommands(CommandType command) { - this.commandType = command; - } - - @Override - public void execute() { - switch (commandType) { - case BESTSELLER: - Item bs = Cashier.getBestseller(); - TextUi.replyToUser("The bestseller is " + bs.getItemName()); - break; - case TOTAL_PROFIT: - float profit = Cashier.getTotalProfit(); - TextUi.replyToUser("The total profit so far is " + String.format("%.2f", profit)); - break; - case TOTAL_REVENUE: - float revenue = Cashier.getTotalRevenue(); - TextUi.replyToUser("The total revenue so far is " + String.format("%.2f", revenue)); - break; - default: - break; - } - - }; -} diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 342642e1be..9eeeebbd7a 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -1,6 +1,7 @@ package command; import item.Item; +import item.Transaction; import ui.TextUi; import java.util.ArrayList; @@ -16,6 +17,10 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMarked this.category = category; this.isListMarked = isListMarked; } + public ListCommand(ArrayList transactions, boolean isVoided) { + this.arrayList = transactions; + this.isListMarked = isVoided; + } public String getCategory() { return category; @@ -25,10 +30,13 @@ public String getCategory() { public void execute() { if (category.equals("NA") && !isListMarked) { TextUi.showList(arrayList); - } else if (arrayList.getClass().getSimpleName().equals("Item")){ + } else if (arrayList.getClass().getSimpleName().equals("Item")) { TextUi.showCustomizedList((ArrayList) arrayList, category, isListMarked); + } else if (arrayList.getClass().getSimpleName().equals("Transaction")) { + TextUi.showTransactionList((ArrayList) arrayList); } } + } diff --git a/src/main/java/command/TotalProfitCommand.java b/src/main/java/command/TotalProfitCommand.java new file mode 100644 index 0000000000..4991028cda --- /dev/null +++ b/src/main/java/command/TotalProfitCommand.java @@ -0,0 +1,19 @@ +package command; + +import itemlist.Cashier; +import parser.CommandType; +import ui.TextUi; + +public class TotalProfitCommand extends Command { + CommandType command; + public TotalProfitCommand(CommandType command) { + this.command = command; + } + @Override + public void execute() { + float totalProfit = command.equals(CommandType.TOTAL_PROFIT) ? + Cashier.getTotalProfit() : Cashier.getTotalRevenue(); + TextUi.replyToUser("You have earned " + totalProfit + + " in "+ (command.equals(CommandType.TOTAL_PROFIT) ? "profits" : "revenue") + " so far."); + } +} diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 2f1f75395e..55c1dacd5e 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -60,7 +60,7 @@ public CommandFormatException(String error) { System.out.println(Messages.INVALID_DISCOUNT); break; default: - System.out.println("Error Detected"); + System.out.println(error); } } diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index b2544021ce..8fd34cd363 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -17,4 +17,6 @@ public enum CommandType { TOTAL_PROFIT, TOTAL_REVENUE, BESTSELLER, + LIST_TRANSACTIONS + } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 16304b27a1..23572de462 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -14,10 +14,12 @@ import command.MarkCommand; import command.SellCommand; import command.UnmarkCommand; -import command.CashierCommands; +import command.BestsellerCommand; +import command.TotalProfitCommand; import common.Messages; import exceptions.CommandFormatException; import exceptions.InvalidDateException; +import itemlist.Cashier; import itemlist.Itemlist; import promotion.Month; import promotion.Promotionlist; @@ -65,6 +67,9 @@ public class Parser { public static final Pattern DELETE_PROMO_COMMAND_FORMAT = Pattern.compile("del_promo (?[^/]+)"); + public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = + Pattern.compile("list_txn+\\s?(?:void/[NY])*"); + public Command parseInput(String userInput){ final CommandType userCommand; final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); @@ -93,6 +98,12 @@ public Command parseInput(String userInput){ } case LIST_PROMOTIONS: return preparePromotionList(); + case LIST_TRANSACTIONS: + try { + return prepareTransactionList(userInput); + } catch (CommandFormatException e) { + break; + } case DEL_PROMO: try { return prepareDeletePromo(userInput); @@ -150,14 +161,9 @@ public Command parseInput(String userInput){ case TOTAL_PROFIT: //fallthrough case TOTAL_REVENUE: - //fallthrough + return new TotalProfitCommand(userCommand); case BESTSELLER: - try { - return prepareCashierCommands(userInput, CommandType.valueOf(commandWord)); - } catch (CommandFormatException e) { - - break; - } + return new BestsellerCommand(); default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -343,18 +349,15 @@ private Command prepareUnmark(String args) throws CommandFormatException { return new UnmarkCommand(itemName); } - private Command prepareCashierCommands(String args, CommandType command) throws CommandFormatException{ - final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(args.trim()); + private Command prepareTransactionList(String args) throws CommandFormatException { + final Matcher matcher = LIST_TRANSACTION_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { - System.out.println(Messages.INVALID_COMMAND); - return new IncorrectCommand(); - } - if (command != CommandType.BESTSELLER && command - != CommandType.TOTAL_PROFIT && command - != CommandType.TOTAL_REVENUE) { throw new CommandFormatException(Messages.INVALID_COMMAND); } - return new CashierCommands(command); + //is true if void/Y + boolean isVoided = matcher.group("isVoid").equals("Y"); + + return new ListCommand<>(Cashier.getTransactions(), isVoided); } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 3c3470235b..960bc294f6 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -5,6 +5,7 @@ import common.Messages; import item.Item; +import item.Transaction; public class TextUi { @@ -130,6 +131,15 @@ public static void showCustomizedList(ArrayList arrayList, String category } } + public static void showTransactionList(ArrayList transactions) { + int counter = 0; + for (Transaction t: transactions) { + counter++; + replyToUser(counter + ". " + t.getItemName() + " " + + (t.getProfit() > 0 ? "earned " : "lost ") + t.getProfit()); + } + } + public static void showEditMessage(String item, String editedParameter, String oldParameter, String newParameter) { switch (editedParameter) { case "newItemName": From b366a96ede18719c45be455dd424a54f026f13f5 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 18:46:53 +0800 Subject: [PATCH 192/421] Remove unnecessary imports --- src/main/java/command/BestsellerCommand.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index 40ce384c7f..375bcad143 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -2,7 +2,6 @@ import item.Item; import itemlist.Cashier; -import parser.CommandType; import ui.TextUi; public class BestsellerCommand extends Command { From 0ffdf13d5cb78fd93ba54f8c2863d39dcfe8f4d1 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 4 Apr 2024 19:02:04 +0800 Subject: [PATCH 193/421] Add EmptyListException --- src/main/java/command/Command.java | 3 ++- src/main/java/command/ListCommand.java | 6 +++++- src/main/java/common/Messages.java | 1 + .../java/exceptions/EmptyListException.java | 18 ++++++++++++++++++ 4 files changed, 26 insertions(+), 2 deletions(-) create mode 100644 src/main/java/exceptions/EmptyListException.java diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 0637a1f427..4eb4820c85 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -1,9 +1,10 @@ package command; import exceptions.CommandFormatException; +import exceptions.EmptyListException; import exceptions.InvalidDateException; public abstract class Command { - public abstract void execute() throws CommandFormatException, InvalidDateException; + public abstract void execute() throws CommandFormatException, InvalidDateException, EmptyListException; } diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 9eeeebbd7a..b12ac47d35 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.EmptyListException; import item.Item; import item.Transaction; import ui.TextUi; @@ -27,7 +28,10 @@ public String getCategory() { } //@@author Fureimi - public void execute() { + public void execute() throws EmptyListException { + if (arrayList.isEmpty()) { + throw new EmptyListException(arrayList.getClass().getSimpleName()); + } if (category.equals("NA") && !isListMarked) { TextUi.showList(arrayList); } else if (arrayList.getClass().getSimpleName().equals("Item")) { diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 6e2061e8ac..e622a0a908 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -84,4 +84,5 @@ public class Messages { public static final String INVALID_PROMOTION_FORMAT = "Invalid Command Format. Please use format:\n" + "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DAY] /to [END_DAY] time /from [START_TIME]" + " /to [END_TIME]"; + } diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java new file mode 100644 index 0000000000..2e4ead78bb --- /dev/null +++ b/src/main/java/exceptions/EmptyListException.java @@ -0,0 +1,18 @@ +package exceptions; + + +import common.Messages; + +public class EmptyListException extends Exception { + public EmptyListException(String error) { + switch (error) { + case "Item": + System.out.println("There are no items with your search query."); + case "Transaction": + System.out.println("There are no transactions with your search query."); + default: + System.out.println(Messages.INVALID_COMMAND); + } + } + +} \ No newline at end of file From 884d98f7a9163e66298430110fe6083309adf6f5 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 4 Apr 2024 23:52:53 +0800 Subject: [PATCH 194/421] Update User Guide --- docs/UserGuide.md | 90 ++++++++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 28 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e763072efd..48ec256779 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -6,15 +6,11 @@ StockMaster is a platform aimed at helping SMEs track and organise their invento ## Quick Start -{Give steps to get started quickly} - 1. Ensure that you have Java 11 or above installed. 2. Download the latest version of `StockMaster` from [here](http://link.to/duke). -3. - -## Features +3. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar StockMaster.jar` command to run the application. -{Give detailed description of each feature} +## Features ### Adding an item: `add` Adds a new item to the list of items. @@ -29,8 +25,8 @@ Format: `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy Example of usage: ``` -add Apple qty/50 /pieces cat/fruits buy/4 sell/5 -add Phone qty/5 /pieces cat/Electronics buy/100 sell/500 +add apple qty/50 /pieces cat/fruits buy/4 sell/5 +add phone qty/5 /pieces cat/Electronics buy/100 sell/500 ``` ### Deleting an item: `del` @@ -40,20 +36,18 @@ Format: `del ITEM_NAME` Example of usage: ``` -del Apples +del apples ``` ### Selling an item: `sell` Sells a quantity of an item from the list of items at a stated price. -Format: `sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]` +Format: `sell [ITEM_NAME] qty/[SELL_QUANTITY]` -* `SELL_PRICE` is an optional field. If blank, it will default to the item's set sell price. Example of usage: ``` -sell Apple qty/20 price/6 -sell Phone qty/1 +sell apple qty/20 ``` ### Editing an item: `edit` @@ -90,17 +84,17 @@ find /qty/cat Apple //search for `Apple` under `ITEM_QUANTITY` and `CATEGORY` find Apple //search all items that contains `Apple` ``` -### Listing all items: `list` +### Listing all items: `list_items` Lists all stored items. -Format: `list [cat/CATEGORY]` +Format: `list_items [cat/CATEGORY]` * `CATEGORY` is an optional field. By default, it will list all the stored items. Example of usage: ``` -list -list Electronics +list_items +list_items Electronics ``` ### Get bestselling item: `bestseller` Reads all the Transactions and returns the item with the highest profit. @@ -132,6 +126,40 @@ Example of usage: total_revenue ``` +### Add promotion to items: `promotion` +Creates a promotion for items that changes the sell price. + +Format: `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR] +time /from [TIME] /to [TIME]` + +* `DISCOUNT` ranges from 0 to 100 and can take in up to 2 decimal place. +* `[DATE]` must be a valid for the specific `[MONTH]` E.g. `30 Feb 2024` is not allowed. +* `[TIME]` must range from 0000 to 2359. In addition, time range must be valid. + +Example of usage: +``` +promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500 +``` +### Delete a promotion: `del_promo` +Deletes a promotion for an item. + +Format: `del_promo [ITEM_NAME]` + +Example of usage: +``` +del_promo apple +``` +### List promotions: `list_promotions` +List all the promotions created. + +Format: `list_promotions` + +Example of usage: +``` +list_promotions +``` + + ### List all available commands: `help` Lists all commands as per the command summary below. @@ -156,18 +184,24 @@ Format: `exit` **Q**: How do I transfer my data to another computer? -**A**: Simply copy and paste the saved folder that is created upon launch of +**A**: Simply copy and paste the saved folders that is created upon launch of the application. ## Command Summary -| Action | Format, Examples | -|-------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | -| Delete Item | `del ITEM_NAME`
`e.g. del Apple` | -| Edit Item | `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | -| Find Item | `find KEYWORD`
`e.g. find University` | -| Sell Item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]`
`e.g. sell apple qty/50 price/4.50` | -| List | `list` | -| Help | `help` | -| Exit | `exit` | +| Action | Format, Examples | +|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | +| Delete Item | `del ITEM_NAME`
`e.g. del Apple` | +| Edit Item | `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | +| Find Item | `find KEYWORD`
`e.g. find University` | +| Sell Item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | +| List Inventory | `list_items` | +| Get Best Seller | `bestseller` | +| Get Profit | `total_profit` | +| Get Revenue | `total_revenue` | +| Create Promotion | `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR]time /from [TIME] /to [TIME]`
`e.g. promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500` | +| Delete Promotion | `del_promo ITEM_NAME`
`e.g. del_promo apple` | +| List Promotion | `list_promotions` | +| Help | `help` | +| Exit | `exit` | From 39c679a756189c51f53dc50b5d198c04dc4ffc61 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 5 Apr 2024 00:40:54 +0800 Subject: [PATCH 195/421] Fix ListCommand --- src/main/java/command/ListCommand.java | 56 +++++++++++++++++++++++--- 1 file changed, 51 insertions(+), 5 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 9eeeebbd7a..a6ff74bdfe 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -1,7 +1,9 @@ package command; +import common.Messages; import item.Item; import item.Transaction; +import promotion.Promotion; import ui.TextUi; import java.util.ArrayList; @@ -28,15 +30,59 @@ public String getCategory() { //@@author Fureimi public void execute() { - if (category.equals("NA") && !isListMarked) { + if (containsItems(arrayList)) { + if (category.equals("NA") && !isListMarked) { + TextUi.showList(arrayList); + } else { + showCustomizedItemList(); + } + } else if (containsPromotions(arrayList)) { TextUi.showList(arrayList); - } else if (arrayList.getClass().getSimpleName().equals("Item")) { - TextUi.showCustomizedList((ArrayList) arrayList, category, isListMarked); - } else if (arrayList.getClass().getSimpleName().equals("Transaction")) { - TextUi.showTransactionList((ArrayList) arrayList); + } else if (containsTransactions(arrayList)) { + showTransactionList(); + } else { + TextUi.replyToUser(Messages.EMPTY_LIST); } } + private void showTransactionList() { + @SuppressWarnings("unchecked") + ArrayList transactionList = (ArrayList) arrayList; + TextUi.showTransactionList(transactionList); + } + + private void showCustomizedItemList() { + @SuppressWarnings("unchecked") + ArrayList itemList = (ArrayList) arrayList; + TextUi.showCustomizedList(itemList, category, isListMarked); + } + + private static boolean containsItems(ArrayList arrayList) { + for (Object obj : arrayList) { + if (obj instanceof Item) { + return true; + } + } + return false; + } + + private static boolean containsTransactions(ArrayList arrayList) { + for (Object obj : arrayList) { + if (obj instanceof Transaction) { + return true; + } + } + return false; + } + + private static boolean containsPromotions(ArrayList arrayList) { + for (Object obj : arrayList) { + if (obj instanceof Promotion) { + return true; + } + } + return false; + } } From 49474ad748e6486bee048ab0b48a6107a972077d Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 5 Apr 2024 02:08:36 +0800 Subject: [PATCH 196/421] edit UI output --- StockMasterData.txt | 2 +- src/main/java/command/MarkCommand.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 0a90bc735b..b7dcab61a7 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,2 @@ -1. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +1. | [X] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 2. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 diff --git a/src/main/java/command/MarkCommand.java b/src/main/java/command/MarkCommand.java index 930776fb50..f9df799b7f 100644 --- a/src/main/java/command/MarkCommand.java +++ b/src/main/java/command/MarkCommand.java @@ -22,7 +22,7 @@ public String getItemName() { public void execute() throws CommandFormatException { Item item = Itemlist.getItem(itemName); if (item == null) { - ui.TextUi.replyToUser("Item of " + itemName + " not found! Please try again."); + ui.TextUi.replyToUser("Item of item name '" + itemName + "' not found! Please try again."); } else if (item.isMark) { ui.TextUi.replyToUser("Item is already marked!"); } else { From 55fd8f4ec309b6005c630f15f8427ff718a9711d Mon Sep 17 00:00:00 2001 From: Fureimi Date: Fri, 5 Apr 2024 02:27:52 +0800 Subject: [PATCH 197/421] update UG --- StockMasterData.txt | 4 ++-- docs/UserGuide.md | 46 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index b7dcab61a7..8f40839bc4 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,2 @@ -1. | [X] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 -2. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 +1. | [X] | apple | Qty: 45 pieces | Cat: fruits | BuyPrice: $3.5 | SellPrice: $5.5 +2. | [X] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 48ec256779..12645da455 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -50,23 +50,51 @@ Example of usage: sell apple qty/20 ``` +### Marking an item: `mark` +Marks items in the inventory list. + +Format: `mark [ITEM_NAME]` + +Example of usage: +``` +mark apple iphone +``` +### Unmarking an item: `unmark` +Unmarks a marked item in the inventory list. + +Format: `unmark [ITEM_NAME]` + +Example of usage: +``` +unmark apple iphone +``` + ### Editing an item: `edit` Edits the parameters of the item. -Format: `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
` +Format: `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] +cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
Example of usage: ``` -`edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` -`edit fish name/Salmon qty/1 uom/pieces cat/fish device buy/1.00 sell/10.00` +edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00 +edit fish name/Salmon qty/1 uom/pieces cat/fish device buy/1.00 sell/10.00 ``` User can choose to edit at least 1 parameter up to all available parameters. Example of usage: ``` -edit apple buy/1.00 sell/2.00 +edit apple qty/45 buy/3.50 sell/5.50 edit fish name/Salmon qty/1 cat/fish ``` +Expected Output: +``` +Edited: +Quantity of apple from 50 to 45 +Buy Price of apple from 4.0 to 3.5 +Sell Price of apple from 5.0 to 5.5 +End of Edits +``` ### Finding an item: `find` Finds all items that contains `KEYWORD` @@ -87,16 +115,20 @@ find Apple //search all items that contains `Apple` ### Listing all items: `list_items` Lists all stored items. -Format: `list_items [cat/CATEGORY]` +Format: `list_items 'marked' [cat/CATEGORY]` +* `marked` is an optional field. If used, it will only list marked items. * `CATEGORY` is an optional field. By default, it will list all the stored items. Example of usage: ``` list_items -list_items Electronics +list_items cat/Electronics +list_items marked cat/fruits ``` -### Get bestselling item: `bestseller` +_**Note**_
+_marked **MUST** be before cat/[CATEGORY]_ +### Get bestselling item: `bestseller`. Reads all the Transactions and returns the item with the highest profit. Format: `bestseller` From f118f7923355be59669d60a7cd6729a7f43e478b Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 12:48:35 +0800 Subject: [PATCH 198/421] Add EmptyListException to FindCommand --- src/main/java/command/FindCommand.java | 8 ++++++-- src/main/java/exceptions/EmptyListException.java | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 90e4d7afb1..913c69ec17 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.EmptyListException; import item.Item; import itemlist.Itemlist; import ui.TextUi; @@ -26,7 +27,7 @@ public String getKeyword() { } @Override - public void execute() { + public void execute() throws EmptyListException { if (itemInfo.equals("NA")) { itemInfo = "item + qty + uom + cat + buy + sell"; } @@ -34,7 +35,7 @@ public void execute() { TextUi.showList(searchList); } - public ArrayList filterList() { + public ArrayList filterList() throws EmptyListException { ArrayList searchList = new ArrayList<>(); for (Item item : Itemlist.getItems()) { if (itemInfo.toLowerCase().contains("item") && item.getItemName().toLowerCase().contains(keyword)) { @@ -58,6 +59,9 @@ public ArrayList filterList() { searchList.add(String.valueOf(item)); } } + if (searchList.isEmpty()) { + throw new EmptyListException("No items found!"); + } return searchList; } diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index 2e4ead78bb..7c0d7ce324 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -11,7 +11,7 @@ public EmptyListException(String error) { case "Transaction": System.out.println("There are no transactions with your search query."); default: - System.out.println(Messages.INVALID_COMMAND); + System.out.println(error); } } From 05a19dd76c168c4b69a64a5b96b4a852e499b1ab Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 12:55:42 +0800 Subject: [PATCH 199/421] Add CashierCommands Sequence diagram --- docs/Diagrams/CashierCommands_SeqDiag.puml | 30 ++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 docs/Diagrams/CashierCommands_SeqDiag.puml diff --git a/docs/Diagrams/CashierCommands_SeqDiag.puml b/docs/Diagrams/CashierCommands_SeqDiag.puml new file mode 100644 index 0000000000..7ad1753560 --- /dev/null +++ b/docs/Diagrams/CashierCommands_SeqDiag.puml @@ -0,0 +1,30 @@ +@startuml +participant CashierCommands +participant Cashier +participant TextUi + +CashierCommands -> Cashier: getBestseller() +activate Cashier +Cashier -> Cashier: retrieve bestseller +Cashier <-- CashierCommands: bestseller +deactivate Cashier +CashierCommands -> TextUi: replyToUser("The bestseller is {bestseller.getItemName()}") +deactivate CashierCommands + +CashierCommands -> Cashier: getTotalProfit() +activate Cashier +Cashier -> Cashier: calculate total profit +Cashier <-- CashierCommands: profit +deactivate Cashier +CashierCommands -> TextUi: replyToUser("The total profit so far is {formattedProfit}") +deactivate CashierCommands + +CashierCommands -> Cashier: getTotalRevenue() +activate Cashier +Cashier -> Cashier: calculate total revenue +Cashier <-- CashierCommands: revenue +deactivate Cashier +CashierCommands -> TextUi: replyToUser("The total revenue so far is {formattedRevenue}") +deactivate CashierCommands + +@enduml \ No newline at end of file From 11ccb1d5056287e54d9e3410cf8c7fc7d86f71d7 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:20:26 +0800 Subject: [PATCH 200/421] Add Cashier clas diagram --- docs/Diagrams/CashierClassDiagram.puml | 36 ++++++++++++++++++++++ docs/Diagrams/CashierCommands_SeqDiag.puml | 29 ++++++----------- 2 files changed, 46 insertions(+), 19 deletions(-) create mode 100644 docs/Diagrams/CashierClassDiagram.puml diff --git a/docs/Diagrams/CashierClassDiagram.puml b/docs/Diagrams/CashierClassDiagram.puml new file mode 100644 index 0000000000..2454dc8cf7 --- /dev/null +++ b/docs/Diagrams/CashierClassDiagram.puml @@ -0,0 +1,36 @@ +@startuml + +class Cashier { + - transactions: ArrayList + + addItem(transaction: Transaction): void + + getTransactions(): ArrayList + + getTransactions(item: Item): ArrayList + + getTotalRevenue(): float + + getTotalProfit(): float + + getTransaction(index: int): Transaction + + getBestseller(): Item +} + +class Transaction { + - item: Item + - totalPrice: float + - isVoided: boolean + + getItem(): Item + + getTotalPrice(): float + + getIsVoided(): boolean + + getProfit(): float +} + +class Item { + - name: String + - price: float + - cost: float + + getName(): String + + getPrice(): float + + getCost(): float +} + +Cashier --> Transaction : has 1..* transactions +Transaction --> Item : has 1 item + +@enduml \ No newline at end of file diff --git a/docs/Diagrams/CashierCommands_SeqDiag.puml b/docs/Diagrams/CashierCommands_SeqDiag.puml index 7ad1753560..302fbfbcf5 100644 --- a/docs/Diagrams/CashierCommands_SeqDiag.puml +++ b/docs/Diagrams/CashierCommands_SeqDiag.puml @@ -1,30 +1,21 @@ @startuml -participant CashierCommands +participant BestsellerCommand +participant TotalProfitCommand participant Cashier participant TextUi -CashierCommands -> Cashier: getBestseller() +BestsellerCommand -> Cashier: getBestseller() activate Cashier -Cashier -> Cashier: retrieve bestseller -Cashier <-- CashierCommands: bestseller +Cashier -> Cashier: Retrieve bestseller +Cashier --> BestsellerCommand: Bestselling item deactivate Cashier -CashierCommands -> TextUi: replyToUser("The bestseller is {bestseller.getItemName()}") -deactivate CashierCommands +BestsellerCommand -> TextUi: replyToUser("The current best-selling item is {bestseller.getItemName()}") -CashierCommands -> Cashier: getTotalProfit() +TotalProfitCommand -> Cashier: getTotalProfit() / getTotalRevenue() activate Cashier -Cashier -> Cashier: calculate total profit -Cashier <-- CashierCommands: profit +Cashier -> Cashier: Calculate total profit / total revenue +Cashier --> TotalProfitCommand: totalProfit / totalRevenue deactivate Cashier -CashierCommands -> TextUi: replyToUser("The total profit so far is {formattedProfit}") -deactivate CashierCommands - -CashierCommands -> Cashier: getTotalRevenue() -activate Cashier -Cashier -> Cashier: calculate total revenue -Cashier <-- CashierCommands: revenue -deactivate Cashier -CashierCommands -> TextUi: replyToUser("The total revenue so far is {formattedRevenue}") -deactivate CashierCommands +TotalProfitCommand -> TextUi: replyToUser("You have earned {totalProfit} in {profits/revenue} so far.") @enduml \ No newline at end of file From a4d9b24dbc51a92eca837425857e9c9b9898d0fc Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:28:30 +0800 Subject: [PATCH 201/421] Update DG --- docs/DeveloperGuide.md | 8 ++++++-- docs/Diagrams/CashierClassDiagram.png | Bin 0 -> 26940 bytes .../CashierCommands_SequenceDiagram.png | Bin 78591 -> 23603 bytes .../{ => PUML files}/CashierClassDiagram.puml | 0 .../CashierCommands_SequenceDiagram.puml} | 0 5 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 docs/Diagrams/CashierClassDiagram.png rename docs/Diagrams/{ => PUML files}/CashierClassDiagram.puml (100%) rename docs/Diagrams/{CashierCommands_SeqDiag.puml => PUML files/CashierCommands_SequenceDiagram.puml} (100%) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index bd5da794c1..26dab5eec4 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -34,12 +34,16 @@ Storage class contains methods to write description of items to the file `./Stoc and retrieve information from the file when program restarts. ### UI -<<<<<<< HEAD ### Cashier Cashier class extends Itemlist class + +#### Class diagram +![CashierClassDiagram](./Diagrams/CashierClassDiagram.png) +The Cashier class extends the Itemlist Class. + ![CashierCommands_SequenceDiagram](./Diagrams/CashierCommands_SequenceDiagram.png) -======= + ## Implementation This section describes some noteworthy details on how certain features are implemented diff --git a/docs/Diagrams/CashierClassDiagram.png b/docs/Diagrams/CashierClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..ec089f8beb6832f2e8bc1ebabad54a6b49cf796e GIT binary patch literal 26940 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 JEJd^1{{gl(lJ)=q literal 0 HcmV?d00001 diff --git a/docs/Diagrams/CashierCommands_SequenceDiagram.png b/docs/Diagrams/CashierCommands_SequenceDiagram.png index 32e6eb256104c30b4e6bc9e08e763013ab3c6bbf..3bf8717f691ee540410c5e0a3ba475ea83360d2a 100644 GIT binary patch literal 23603 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 literal 78591 zcmc$`1yo$ywk;YV!QI^nPVnHt-L-J{3IT#cNN~5{8YH+D6fS|_8iKn!6iy)lenIx$ z=bd}cfA_!Ee*1s5Mp3m`i#27;G5hGFj|x>$l14=$LVEJ#3977&gxZrQ&&!`YdFF`l z5_U$6@K6x;>#4JvwAhpKVUiu#2RJKHMbRfus-ls9o4kO1Mtm;=aDMUx?Z?B<(;kOH z^CwU4zsX97YPcKjFQDt=xZH^xCDDdj<|k>Zn23H`wrSL&(@8RQ-%^|Td@ZyBLSbX6 zL2fVoJ_sj(ebyRkkulDO+$`T-^ZbzMm8X@TbeFA@pYJndWDday{;%qDOWu|u&jkkj znkttYTQj43dKRt*_pPiJ_oGf1Q?9%{xwyEJSHyzR$-9@^{Woyf$vh*1$=0%a+_(Sp z+Xg#9&t%+HSu?X--O(mDhx4l3i^HX8OlqlKhOGuuq4{s9pO1f<37!$43w4V}|Hro@ z25XL?-ZWH?hm*X5erU+U(ObsuNc-nxU3X`~#ts&D8m&yITsJ<94{XYbJfL)J9G%6%nI8?A+y9UmQs-9ksl4e^*z!lRP4PgTlM; z;Y+&HBD%=$ufi9*6Y@U$2yQmw#*YKC=N>`KtK{<`NZ>#O4x-G`$Vt}ZdJs3Fd%Auo zFa4U#bIVNcUDE-NzGD}zQ@`I0x{!94+1_N?_Ebeyx)WI&8*Fk6we1J4_|dTDUGFKe zw6n9bMOiXvhnHQ0m?nQ{0_lCZV#lj1D?d1gMn@+tNo>`R-Q`vT5i)B;4(y5jsE{Sl0AcC_5?wA!dH0wU%`r7khVnK-?F7m%hzsHIT zACw`X-Ye9Tl$NGuVnR0Zy>&_QQEIsVIWRKP^EhBrO8HX#8Sw0z%{%us|Mn@^@N0ASoOsJf{tddc^ZOrMJe(8)BVoxiC zE>H3sgwK7JqT;}mYm0|`&!;kbS$E*_z3qWz5G?jyX&U>y08`l-K0aymxRgldNH^IJ}STsvz)L(Dj9i(cBL=dOE>WzjUWLUcNxk5JNI9 zi7}vD`iWRR!`_|Ao*SQLG09sIBEKgt4P*!iQT8puR;e-P-dtkdKI|G~A8LsM^W{oC z)I!@oJqZx0dg-w-XxxVl>%T){+$XfaLuF~olPhMfjM(aZn_|(?ARGy%rQ4@LGBiMI z+jF5`zT^pqWebOOqy_!)ogR2}T)ta#m#oO#FLs6H=AtjrvOWRiomDPc(krTFw87vu z8~*(Lq==^k@585)HnK~#hAZV~Hc@3m&@MC=d5IW^!&KJ3Z;l4~KbX5Jubt9cUw)hw zxo4^H)TTy#UG3TjA3~g@WO3^H{Oc$-mJh&!#%j#JPSL2$iYI<8;ZttBi~YIT?xjoQ zgzOaSDiU*Rjv&S0a`4S9e*)WB1#2s=Rf?vi;kiKkl;tq`(^^_eC+}w`spxoV#-4p4 z*_ecdoODcw+01F!(b?dcWG^=itP{N`tTbVz&yMai9IfcmPMOx6#K%9Bi}tY3K8Oy8 zo+rC&;9F36Tt6A_^H;ieMdSC$w_G+h?;ewJw;xk(i?y)Z}{TA>oIfD`^;- zl#MoaRc?IHV#!;t_?Y*tvK+o>P&6&@M__vCirVO$GAio4s( z^gCyHXEq6{=EoJB154FH56dngT)t4fr8V7HTr;%R8Qc5O{jYpN3V_L1Gx}6^jFZyz zdsrsJrSZ6N)9_c(p&S)VUvLvrHW4g*s3!L&yX}QRN>>p0wA@8OdZyAoU}pJ#$vV#s zN;pSBEqKVumsp^WU+Q?%1$f}F0C(sJG^s$%e83sIFS&`$UXQ=QC)CVkw$g4Z>TWNU zkcd3~T&JHei3-ZZurlLRv8hZqC@bL)8I)8-Xl*_JwYpf|oIq!6`)qUZTh^fn0}&># zS8k^Uot^y|ij;S|s74#%=R1(xnvft||5M97d7J@x6-%FvTnBo!Xp+t-d~smyHx$}$ zlgOUbXB$W)%ra8eMgR+-F-FAcuUM}<)yzQ6Nv|&EfXi>$GOVUUH`m4zEd8DB#ry*R z9dT?>CR)$WS0Ium?c`n-9Lga!xX}^(4!ukRpkQ41nTHe{YJ9lPT$&{xanszxS&2YT zTrrGmX#9Xq(M(Dt$|Z%zN1XW1`oNQxNbe4E(H=P!Q!j>!brBy@r095xk9nomcmb+z zOz8diioUGXShVnGOTza{n>k`v!aZ>PNJS@a32jTEEWADROSfX?!zgjMlg%rfbV#9q z{?=XM0l>7XB0%Ofn&hCAz|uwLEoPo!irQx>54_2__#i-gtIQlzQZ_Q$1ER}8UT~xp z#p!wX<5the*4qaMG$%+fZpW{QI5zxj9jN19Q($G%k>|eN>w))Df))8C&v4hzr>z9n z-}Uo=z5ac}7VbgtahRpeo{*!biC#c$b4rILK8O)5RZHW*D>M!*8WRXtto49L-2J7s#8q<4#V0n;c`QGGvK56@MTY#P1B&FCxbW*T zgy4##`YE2LglXZ!j`xh1kBxqpy^uz@rcHG?VOzmTb+A}YaGBP5TPDu_yh<=CRG`vZcMT#?w8xK2Yc8=34!p(Jf_lb$P0sgE#(gSZBC4(sY`o%6l6#w| z*~7S4_bTTr2mVepG5c2@bi2$bsd`Zl^d&@@X%$P6&tOQYTuWO8VlG~(ol9G0{?(mu z+tb~deQr7jiI(~9mJW$`@=d&)c@56liw7=Jc?-MJ=uI^kGd=?8-YN)WDw!nYq zrH8{7qmHd=jhWv6qejNlME32_VO|_qWQ+Dp70exUH}Ihn!o` z_sK~O5`5h*;~ES@P`wBh!g$SsD(Q-?vo~DK?DIU{U7B*@!q7KTbLmOTMD+~7nxoUq zfEbE2_Cm~%V?WL=_QfI$C6IP`>7Tntr!KzmjV?)O1nF1D{p52MNn7v&+e55MK=YhI z_&|sdxaWdw%E4)7?j<1?#M0Z9{a6q?tu1-;}Lh zgv0FoSn*YPhkl$D7(KbBe8W)R3)&)*`EHn{x`leFBi6m1b8&69!;n}(e~!X%q%)z= zi`{Wz?Q=oqE86lQd-VQc_MwPj_^H?l{&kyCU+l4_8p{&Vl676; zbFAmdDtxn|e+^}u{T`~)(xPLO4!S3ji&NPd`n%oHn?2&&+^|c2TXg)ktx0O@a)rgH>!*=IQACDso zdqETqaK;rxr;$7rI-HWaR4|)PjBkrZ^ksG)pw5{_K3QDXohBaqVs7V1wzW+&Ez#y% z%^V;>Y6iVu2Yj=ZL~OSD(A#E>X~od?+_B6MiC&gO$I8x2trg`wO6jRS$tgx%#zldy zcfkZ@`--YloKE6XuEC=pnx7D^wlV?d*<46KaOV5_v(R(*o@$I4R9_J)kjVm}swlsy zL(SB&TKL^(sm|8a@UU*%eRo>CyPY#_U-<>7Yj46d(cD!58dY64r>c-b#dQ_7#|jkls$_y7$u06jJ zXgm5&1UI@s#cIrBtZ2warXPP~_h%u5-y4H#p4h^RGxj$7pfyjaMPZtv?NnG)^oW&3 z%u*?Kh~>FUAvSW9J;3ddn1z&i0z3uK< z=OZ@6UJ>GB{_gaMNEjV}>Tlvz^gj25|GZSL(t82T`6BIjGbAnHKG?FmrV*}zib-w( z|3+Dn$7++|X2s9m`PxBzqH#GvYfG1rb4YcS`Dh4p)BMU8P|MRC-BQhgkD2+G9XE59 zmrv|^m5_)4f;N$~E?&%zs_)4Mf|*FXA<8w)tZZZHjID>JBBv^a93#6}>smJy1IH!P zN#9>hrq6lT)~NDzi zT?0Rl5x!-XHezyMu5dBChIrPyEycpeHMxW>#!Iyc30u3TAqREER9Qc;@p;PTWzj5j zeu+eob0*!u(noNH-x0SbAHI5ZNa_GgA!M z3$Y^opsXKac1Q;1{Kc)%6fq_z8$z~lfr^<=(_RV@PHAR%@6YTb&BNRMr%Nl?ukCEm z`t9Kp5(k3pprO}jT>;YSF=pHmpNES$20lSra}3zu89f8pAA*5|DA0r8 zYxQ938+;`{)6HHS6JSA3088qe2Gq8!lIhNH-=xT`!zh%wDikwSW9P#}nEO;p*reDP zMPz}#3FpZl>PkfiuCg8~D$X#yB*1@e2d|Te?`Syc35y4vMqLq}jc;_!ktIGWP^snn z_HC$k^78|8R2XjXYkC?%m238cw7k{a&*`)+>(Pgo9W{;_3`8aQRPCS~w|Mw0m59a} zH8Ue$0wcZQ*`F)<>qQ<=bkU238;O_O% z0Js7Oy~*|bN&7(!Ou3`JZdg?QRI!d4tdq?6$6tb|c61Qp7Bv!wQp3N3xFpbdseoDf zc`UHVPtu@5&|O(xy!^y)Mj1_Vqa>DqDAA8!OMD&;r!^@GVegW3KyA_m#}fEbEOS7smKWbLH4)o_00lD`{NT^OFDOSNBY{)x<^!E8K}~Wx_t$v zYB)$W4jFv>aK=VxzqhIGYvXrPf|*C~C+^m_E#kLM00w0sC9=ZMQjtn{5W$ z6{c11?C4e<$exTrI(UYEJyL%zPd)l7<;x}U+@tN_0Si4l{Y@w=E$x8wOD!7@@*jTl z&aP1=4L#iB&5)2%Yr393U5Xw!9NlxqQs%MEWWU+36UQvjT-yqV35Epkil})zJ2}lm zLNuQriy2j*ADCI|o0%+gvxa5TEu9M>v1$R;vO36eCoZr?vAd(#ZDeyK@_b1Q%dC3m z?m~JpC4p<^ouF>yL}9abjQbg{#m( z+G>~(T7i)%E~Qd#gvGZaryWD{`(7rd(qjj7>}EleymK~_pJ6NIOO}!y$yB6k;Rix7VVm+Tp7ipGlsN= zX`C?^zx5?vN>j@YS6dvB{@gts(<41B!0X{VPUWZQX2; znTvrRbIi1Qp!0JeJ)IKL{an?Gv=|2NNsEEnSQ^e1IOPh#UzsWJ`lloSN z$&Mb_Z^0!TqGJ>kS8CoF@ic5v?nh||2Fk4sI-J56QiPpL)3?&yuG(1I+!l9h`W8NP zHH_6-q4IIaDrTo2pO;rEw*5A_OmG(ru}%A!H7qN;{zCrQR-x)qogynYTHRP5k8OAi z56hDl$qs_jP9`cuLUNw=`znIYUP*hf(j_+?SD$|Mj@Q7efhu?RA4m328Bcy;di^V6 z`{v#4Esh;Cp(Snj$SfOt3N4vK@H2@+S5f~Ir$tJ$qj|@!cCf&`W+s2~e%Bu^K=~e z#f5}(x(6lDt~#CZ$mhff)>Vl3L0&UP1Ly^ReguujX9Z+uSI5*Sz7tiJ$C|e;urh#J zh|S(o%1m$jcaqQoD(o~?H6s0A?8Wd4>4Zx4ctF84bx}P(i0{6b#abJ-n`&g-mFQ-%2a9Zu*B1I{}= zetK&iC*=DZ7AvB$yW}w?H6OW_yjpuJ#Fv-4tbykZ z7V%ih6o=Ga88Vuy%kMVYt#JHi`2{?M_nF>q8g4kM62045)3~R2 z-g)KLbgVMV8n3KLUeO+~{ABRmBR=}q>|oO8~)DqaSF@7cTQwP zM2McO3BP8Ed^;#`p;n_#uS*mTM_YwxNEnWAzNqft4h0XERQI{2U6hH=A|3DJ5N!x% zeWh?u!lUHu;o&P6&*)W^YFswdYZrivWn;8i>(}l!%+ekMC^cH z<6f8HK=q`kJ#At^++~`r*x|`jw#%pP9HyPLQynrJE??r;uQoKyXCe|jeC+s{xu6g-b`5*g#BnxuOw|~z2sgh})D%m1q;MT9 z&w#y`LUo=0DhKivwQgG_R3h=99?Gg#&G~|md;n3Fbj#3V$rVaId(G72IkZ19Dj6QS zcV+BGqMa=g!G>?VApUkT;t3o93+ZYITBH+f(?2_+2oN+1SoUb>jTrmI;t(J~Q(|Si zHJl#EohG>@&DZ}_i6)3>^1EApz46qp;jgsZ*fZ10RFYtk+LwGe)pv3<*K0*5zNbX8tX0gHMV2q>=l+&NPrNu@c4>8@yTB@5ghqX*S=J3 zI@ZbQrG1evjS^jVPD~C3rsEO?OrN}$2xK^&-NPv{5DxKdpe18it^Rg*@QOlLcGbnl z*dv(A(gMeuN6M_D2FDy&?Oi@8m|wbNd;CKdB_gBYT}lYaINVtA`^y`}x4&wo2sZV) zm+;mYql^1gFHl<%RMEEi&&=>JJrY~*`W?*~)ym{n#S_;^*4D1CH8$M)+L%6mT1>U!~4wG|(@!q-lpZAo<+Fw%|>7t3_`zdAX}4&XqoyEhIU7Fvk|BHD}*`ebo<| zEP=DHBpD%NNKI!frh(tB%z#>G38RH}Vet7X|~rJO>?R zodXI8J)ZLRBfcfIkAG}^6OlmtIna}hY{gU{5x3(;dxu`|D~$?o{|3n~^6Y*)7{$vD zjUvKf4cA!1A_Kpq^@)@jDS10H=}utp*1^k&c=A~+j|nkrgL_4$U)^=NV*itk7nR=v zq%=EDztsaH1z9Tlq|BPz(%Fc?|GxQIJZ_%eFx{bWh(D>2956~6nlOVY!wBbP6Fd48}2a&tblaV#0L6>49zNZz4SL7v7X>t$EE6N9s=K zz{27p=Cv==9IUR|v1>p99tamWc&(m)7#E0uzxSqm_RYz{MGMeO#Ds9`j$|+U;Iy=- zq^@wj)iknxXfkm8Di}|h&v$4efL$kk0I%e2%lk!UZ(5)@Ez?3nh29aRb zuA#0p_)tZ`o$Cc(Sx`0qUx_S=Lmy-nuX3YP6JlQ4bk)SAm{0FL+R6@(-qYCAS2qM^ zA9(3coO>G6dxN2%I;E4u)Od8JSm=j0&&HuCfhcHQlIv;(a?UX))*;uVd!s)%-g%WA z-i@LJgkQDW@MK76QP~AeqX$s06*fn6Pjjq#t5sT$ynv3LkZFTD9&+`)2jkys^gi_9 z1;(r#xTRQy%zf^F{=#&uE>%g^QvO8wq1=;6@>iNbWiADN%BlD#plk?vlSBlpsG#-S_+pA zXuMN}Odt!62A1-m+bCOpb+V;HLY}0&(C&w--U^dTtWX)5OAcv{l@FU@*jUpjlL+O+DiAp8kQ~i!e2T`wDDFQ zMH;VSk$0}+Q?G?-`hEie|92VK7UOnoTTHPFT0-SVTrP-RMx?#eW#Co0kPB}a}*SMxn%e4|#>whCjk^-p!5 zVewp3>?Ux%k`AHRg>gVI4DqgqJjf`t$G>nA{qi6t|Ad();5rBT=}ClIFq*vh1-k=hi)zsM?!jCI?-iUtKO0hv`j!plZ~%F4-D5I-_P1Mya&`qnVBUMb z;t_@S_scMj^z0k2i_*sV!2bn*4xiVB<^QHZLCpxv1D?cG@Sr2E<;H5^g`MRfjr+Xn zRxeW#cpuhgls;9nfqE}nC9_ma(--OTMkhYfC zp0*|m3@PDmm?%a%9YLKqOnWYK+a_)c6%#Bld~kVh+)?S^;Ef^hC(U7Xaj&C8-|m+* z^m?oExtB87ZJiidU3N&Hc{W#IShxoDSobS`Iy^#@`8nwy(ik6|RewQ6obNPHGdzl- zP)`fDQZa+_k=heeiw%=iVueXgt%;oo@$gMzF_L@B78Reiq(YH3ZcGcw2xmYlnX|+^uwgcxPjj3$4cS65_r!DK z`-Httjd&YNLBcr^bz&sDl`r*PF~<;QKL`^r0qUr(f$|*;AIf{dv?-8ZL6sH*c-))# zbL<8#S^)tvB2<_CT0aj5E{vR!M^xBw12 z6N{A+or1jRB+n?HJldonUR3f#KjmgW0fB&%d}!q9lgt*@0w0*WYb zv%x7LykWxt)2e(r1lbo8^byV*lzF^<_zZJuF=%FAyemS?aV{byt|1)eN?RMBB^G48 zp#x~apAflAFp`G78TKwk)E(r>$WQKBbuqf8AGv_E*I zsm~MWQF^n&k5s5RP4Z8gE_0jk-qM&EZ?ZUFR!SDg~^JFia?1Wjr}V>g4xY`F$R;_pPz1xB!MNO zye?*}s(^Dm<5N>>VNB&QUr4Y^37`+7la0j+2rTu8`prQ^Bvu(=Le#=<)t!X%!|xwtm8cuhba9?|c!}>= z`_c41VrQ%=-9!)9Qo8@TtAXhmqdKV>8T%ntVKA{`cwBwI^1E=z@79_g+`Sc6Ac9`4 zebo)GF-+w6K+VFrE%+Wq*bz$*uSVE?{MZT;YF4yfBTX54mBECXJ7WbC(rj#O=T+3O zd`@=LYHUgh;+MXF_;{Q%n0#|mS3ly|I=ZP_{P*lO^S`X**RNme)suo(H@`5W%Hg2} zQO>oIJ!D=HR{A6Dn#UMc`dy9&(hUPv3mL6!U@&-B7@Fw?X}^Uov2DE>9$TfXchVc4 za*SCnzd?s(pkVS))*5%~BxKhK3mtr2!Py^w>2DXi2+$$Qq<`eNnRw`Xdb_Oab6#*C zh0o@>$@Vpq|C36#kD3tWC3xz4rjS=Z5lrZU08tL@C1a2OGR+J3;zb`(PI(tBhodGY z_DuM4*ql{{$l?jmXaWC zzh%Ij85O!#LdDI_| z;2ytmT1SwIAo#p=3vqMb`IcmU5Ez<;F60&o(@@4qH=gt}t*ov2lL>kD{xejWuz@SS z32ODZ>4%Ng#E()8Wg=qYiLk{Muaam|uXkXr&(&)R|4)|0h18 zj~b>1EfF&Q2wiXk1%-t0``xHhfuvD_sV`7rx?50Cq22$Wl75#|A7;1F($cb_(GxP& zBu?D%Gh2M4I?8dv6XQ`CYfv~3%jL=#3Wzr^lFni@H#e_8{#D=p*Vx$cMv_sE!&2+N zp53#wWVFC5c>nwK;o-+>CMPn_U!r^mPZ0M{)=d zPI);f^LCOQ?DuHey=Lr=2d0v~DD9=11wUyDGNuA@G!bRe;scUnL2~uN&k)(PsO~ld z)8jNB`8zc`HNOfbOt8L{W85 z{i1)zQc?yJ$i||UIYnWYDx)jugC&-__s#iTn&bvNVee6>sC8wA`Q4_9L?ABZ`STK2 zS(p83_GAURbRjRTNeoO?>G!^J5*J+D+(kDpN2_0}*1i5WEiugIS(G30^TMxxyc#Dt zm8MkT%Tc^Cc!^G~1)D_E=jnDC(TLV}(i4<@}6~?A(zGPzn=U^%97=QlX9em=N*o zoKEAaHKYd($amm_|6)z!BM(y9@N(@4v2b0mX?&JDBwBS%9Fu6;$OF<@o5ASMK#sr- zC))gr?A|1HmvGg87Un@84#5a7x^g+H#M{J^dI~&DUfp8mW=uh6R;rlb(hL^y_Df}D zsaf&wsXbJfWCb*ZUnVI}0sf$xGeNL$4sqlf`<8>Qk)jPyNA>na>Tf%OV)hy1J6g_lwmk3mKUALMUn)Mj2om+6AM5g8U0bVi z+0#0MEa?5qdiA{yz`Lz0qtfIF+!6)@u$FM<*iqAd)*}i<%*M9w*EbKb=x3U+;3`lE z+?|o7fG11?N+}AN5k}ChAM^WFw*REDEA0t#7Tf_-CLwI|sX93E8 z$#-g2DJ2U(#T+gwF;7Gj%^=pX#_-z4W24fzlitIin;2l-z&V-YB+ljS6HLWm1gQ5# z5VLxge?G%=s27?plAoP#g&_5U@ypZ=wU`I}bU~TF8_QYYBhDh`W2|lJX!vF~Pnpk1o zofI~I~$z?-zk zgT`-CtnJ7sg!Dh_h{M39YjoO;4%te8mZ@UN9Qf2(P+H8wNjRKIm&OriL;+s0z@B;dfjB6%TaTlAW&fpEid?K!$`0hEKj*QrQLBKYELqsXuU&vse>1{ z$rQRJZWqG?-iXhICcEdcaD3hN*l?`as40Qb@9U(!-SfmuRZ=ZenzBT0&%3oR^g?VXiQMGWurNG1Zb-ad< zb!T6!Uj@9BH|*cawwxx0vq)xn643o#5q_RRQZaSb1O*}n@^QZ&si(%f_@*qX)KyFKgE1&P-Nm9rRkV`(( zDI2edwr*I`qz$TIP&HH!>D;W+|9tm@D&}$%jYPwcdbWffmN{%zxtzY>&2Dul*Doi6 zugj<2bWO|jxq+wLwE(6d;j|J)FMqxZ@l;O1gAUkU6JeClG)$~6P8?{pkY?G<(cIsd zVfZWH;LPwDPiub~^pWbklM_N$&_Y5&I_f5NSU%es`xgS)nsaE=grdS?y2mx%g021R zr4+@5g;8Gf7c1w6_t;2_@{;FkRUyrv*s$+5(;U`0|E!mr(9{U}D(vGbD?HS!n7g}8G&wY!}yp;Jb_E#r z#z76e)kvl$Ia|Ye+$R6rhJ68WZ#bPVSJ=>V=i87=jt<+HRt8U5S#YAYE*tgZ4O-Bw z``_>_UeI^tH)mtY6SW!aF1s3nN8g|CZk1Bk$X9@Gz}=C=1;YH|0`knY-#Gst*EPZh zBZRp#PW7jxB+Xadstkw%tbM=?nH=yj8TDK~JIs~NiJl5i{vMyM3GeKTgW&jI2(I0~g4_!eRuBn3YX7iqVWdxj-5$S7h zV36heNU)?fP(C^$0;O7pqLWZcG(GTF9EzwH#5!YJ0S4QD%>nfWYP4Ss2Zc&II2`^x zPMrX~W9t?c-73T3#Tu=YhF6uu_!>;HquC_j<9Sdu>drk0Tai|~*nRFD1>fD>G9yJIK`sXb4aMn3I zT11slrBsQXQlFcPJ}c6-u=DqiP;P{WOm3A?sjgP<cGIj#6}lCy%8PQa7MM* zh13ydhf3g4&ExlpuzE-sH~P2j?v=YsNJB(pb;#`0ccx-!X&TEXY&wR?nd&(Bwx@pDq;@e-_Hi=MdP?Z7$x0h6MaU z6#t6JhnZqwYhFZw4tw$A4G?U_PetWKo^wYww|4H`myt)P7_$Fg%Ok->AP`oT_X*-~rVtYhP=3nKr*m0) z|NGMMpIBTqEiNwZ{mnrg%w>qe{_#^yO-&fkLifG&|DVYL-DudnrEECoAb0#1ZfcV6 zq1HHtQv9`9H_Bj^h!M94VoH1?e`ueG;7q1fM_6el7*(65oD}E}i}U|R|9{)T-<8QDV{7g5f&V9k z$AyZcqoWVSg{?Ob0ho7%16M0lImpP!#K3@O`2SheDVRY>h}7ug747xK!Nd4J@%8m} zSvvZCIx_Hwoq^5UESK^3ClBz}_ApyQBJ~d^0b6;0@i%{F_CJ?LpIcj7zaH3Pb$sAA z$pm$jFxRrT!rV#toZw)U%Wu8C1=ZBmEy|obJz-_HaBVjWheyBU+4^Q7JtO}r{$9Y1 zrj<`LzPUK)9T|~+n3l4emA|(H*orAGX8e6U)z%H$s@dHj`T#GJ)h%&YX*aB97zUxn z^UZpq+RZsu_GhYLJ2`^2t*sgqHOI;%2lDej%;UMej`Tm(B3D!o*9w+#;#{I*E`yh;0J32KP)tu{iYy+$r>yz%?VAM>! z=pPnz&ER*DrH+}dq0`@z42y+bH4F?g`00$LL(kuwAGo#(<-oEd=kzE{#a;Pv9V=yt%mQp@C7F#`2F%;~niw_e)`~zdF*|g=W!T~VSQDKM)K<3``nN)llP`L|DCm!TE8!UjJkX4t z;9OFo*gbAHtn+nj86TU_QkVI^n9|z~uVI)o4p{4nUc26_NKzmEdrke*`M>AHe!jk) z1zX#7_)nlH@!yKG$MYlVIN7}n1yfT$!j_T5_o-K{s!-H49$y$y_`n^)`faP;UcTVI zHgx{Rr`zce2Qya1=su&-VOsBZ)&J~>{(O6Yt$OGBP32|7i*1(~iwA4G>{EVOcoP%~ zjr#J>;srCDwBH|`fn>LwyAUNeF`GA193QvL&(d| z@7LvD>fCy$0S`$NfFJmhl?2AGsA#(*n$mZUOsD#fey9byv=m?yEf^Z;7;Ws>Ujn-L zz4oXDfpy!-PG}J6I1dKQ%C;Ap>aM3%|1FyV+g_Jhk73FYXkLb6r0)r0UTcj6%qq`p z2I|8M4GsUye8=%xkK^t6)BwZQ-$>)%O#rs%@w}V=n(3&h5F&aK<^q~@G)M?Pj(Dh{ z2Nx|LHXXwx$Z6;>XA|JCw>JUP#jZwMpsG$i$^#^T{g=Ke$wF*oiXy)snB7mLdUwZUxElQyq{+N4LL_wb(Uha z|F#XiFf!9)^)lzQUAIg1@gm@B^F_jjT&Czlcmn3{anx$bw5Up7EpCDCri#02541L* z#aOX($;KvIW?s{j5vK$Psk}H2Yu`GI_+OqOubZX&UqHH2fs=ZGtOenA|{& zkY+H{dxILpH&YltFk^em?*ky?L0EJGWbcfj1Q2&qIqkgTTI7*rbt4b@*hVZn)nVP=fO`7Tl-XX2)CV=|HKX1`@5=S4QKHJba!*&ClG5UlO* zFMBPT0*7jM*Gw3KO4dPIrgt&^q;vNDn_!uG>|O(Y>^0veG|8ob$E}OibU(f5!A(T( zr^}{0qAH0w#S(^^F>7)YQ>_rcFxRr6E?$F9yAezCTVYud`dHn)=o4rYU9|==kcFp7OxFDs;IS2vCYSC=DhSWV1I#LMhLgVIvG7fg%2vKb?FMI2K(j?blYCpc z=nszTnZU@;2jDi6?q3Q8souNLmT%8#|4GUGgN>s|%D#`hYuocXG*){+bQzqOs`%T1 z>?SMyYl!g^-gZU15o{u2i>@2TRRn2yn%jY2Q>tX@HD#N%ZijZ&=Fzsxp$(s2D5m?# z_M0s(iMVWIS>=?Q67Z2g6;neplP+L6EQ#+MNl=($68-G|m-WBf(y)Qiv>Bgb^gIip zl^5HXpJHsBt2TdJus$glova}{itJa-+@hFOZf4!ck?~Azt)nSz_0b!yb=5tntMpBP zybmCFnpM&&wJ-%L=4{;aVU^I0`i|zfEhv9!z$`o+AG+95=D7{)_axM9^NW?F5MPf zwc)C{;Rm=2<$~!Le$~th{6L;S!-cqe+ zKnvng3YzvZkWUE}@u9`nKouJ#Ulbcue5F!(&7kmlK4S5y8T(4MRm{cWyZDR`6Eh+= zho^f>w~N`(zLcVK*HSiJhgP(6gncSfQr?$&tGD= zz#C*nFt3^uj*G4BL=9smaxrl8-3iPUtG}ztts;%5+vKLrgumTe{JeH_$>#8R#K=gZ z(*ckA(7EAjzXeI}Jl}o@5{;zII45jF*xxN2T(_hLqrlc5 zzs>}oovwU6F;!{etG&ZhBpxe@gR6!RlqjjV^ex#MvM~}&taG^4ED-C+itqiIoA>op z;L&|g34$_6M9F4v3Xo(SQRNosI8uTs$bz=#`tjN6)O|;LhJ#54$o@$2t;MiufCAvf z7p9Nml^$6czDh3JKEGcLgQ{7SDIk4(w(N`*hg!VBCgmCD)`q;fw}zixeyrGE3YmWV z$o=}#kjD2t4(?$mWxOm?!{>f8qh;)|kAEc*7ueLwMi*808p^I{f@#SFuqz4vvU$N4#qbHD57!owu&XumM5)P-9$41;CL3^5G3 z=V6!UYCya7A~HFm0jEDUt@ZQg@T$`EU#I5C;VoEfblxKReKfskrO#En2BH)eKIw#& z(CyhD_CD0U6|(O1?woya-N1;|sW;pG;|=)<_w!lu5OrSN-khMpvaeJFA1<{|v)Y2m zr-FJ9mC0`3&2nE+Ts!``bV%4Jc5bkrTOPeM7<{QT&e?8R+THfa@l85tTj8__jivR9 z-D!Kmr@{Vx!EB%N%-H^Ivda}ZJ^v(@|;p6 z_|?nfiTaGol_{(A9FZ7{sryp5-|g;vBL&Vk@=LU+231$BxPWEd`)zrx$~K}s4Dr{~du-pZbCTn(8cV*D*`Wb^}bPU=E?k5Xd4Cq_@#_IA=%u7>LJ6+x8N z>n_f%v&TY&Ur8vV)9f-2mRXWc54e;x%;B{Rvw32W`*!hO)krSC2H$i*_nd%4=wA;e zQh$7C4SGjAkqA(jQu>ddw0Tig><{llH=M(*!Y<90!aN)lr>NRPGm^`MGK4%EckE6i z9FqasZU`?$XzJsb!P!(fHpZ>wKr_dI(+l^qD&{A!tBdkLSbYr5dx4sJHXd%3W0iRp zSkUlWZ6v%f7uL?Y1|7p>A@t)CZ-Hrn`P%AZp&wS&Fd+>_F9C);s}ONr@7?1H<`nxb zSthBdG0sXeO+#%HZ2&WC@RGvS!BQkRvv`s*eU>w8OiK6LVs+=U`aj)RzfrF$X5kd3 zd4Bi97bmN{8t@0j|9LR(OnLAJnZF%e|MK!3Q<1_qrq0Rs_K{DW08y{$(iB9>0^>wzQ%9iycG)F6C*I&cQv4?0DjHTq?3jcePhj!Ar;sT|l|^ zfla>X3^=D%re3~c!*6&XVLF6ibUY+>?5>bt%XIorQcyP6$J{IAql~101rv^F()ZtJ zxk+&)v?v(|YlUDFG6E#G&r2I}uQ@_EQ{U_VEEbRnaRn_|4(3BV8WBji$X@>7#M{3> z-P6k*ld#$w7>BM6=$$&csZyRTZv04p!RdL_nsk-AGI7rNVTnv!=7~4I^>$J7_!mUW z%jrPc+Y2s%n>^05dEKeK4-d|eS&m!DL&>##S#IXbrbvB9=Pof`ct`HF(pw*TR;z_w z9q+MvnqDqJQ0BN%V-Y(!8iYE${Y~;P>uz1^H!;75waBKA>ojxzu=1`U9tr4%UY|@s zFt{k+T8Ez0smI*nXMjaZ%y+(NAkSY@3N^f^u6>-V_s;n=Zabjm=3>jUIKVJpV2kOM@g@$lEks^}&Ii0J0>4wS>ZJvk!#b5=p2U?pG9m~3 zuCzr6S3R9iS2tWbZ~Dop(a=`Z(26L}2C(q5a^HD)&h|Hg{erTJXy!}(@)S7YEC@a zN=r;MU3&Ia%UbMRr-o81-sF2|q1}P!RH%Q+a{ByJ+iDl;afuQu-?2s&D;G6ct?7}O z6JS$JDu4?0JLP5S_dO?;PAI&#(tr$SknfMbmU`8Cpm-(_@7o{Or0)o87CrJ#i~yRd z@Zv8M9uxJSWere>14Z9USuH#~gQ#YM^kPRX)fEFE5@Ep%R7V#0q>B# zmRlXTx+M{z0<2$ZF=Qj1I+JKLu8A%7ehJhE?%jq zhRN=Eh0=XNIf_>PNQn4~+CXnteB1mw6d}5Y_-Ctd>G83?&9vCpXMF6BF9W>bI`Hor zpO7yz@d5vGp-5PxtSe)&cz900l)~|_Q&K>9V4IwZDGCv*wZZ+`z1?>5d+@`bPYehH zgnZ*v?Rge5y_%RD|(D3s|Olbzn1({ z0|LI>?2%_xOYaulDa`P&L#<`4#0Qx-0$2=$WnF_8_xy%}MYTqGT;kvBZ8WCaJ(Oh% znb!zg@uqJ}PHks1@giOIyMP+q&@*~AsUy8z@RU zbDzRY#->8Lf`4@3!j{k@szdn(rxolExp_DzAJw?V);sUcY#dD51T zx=QiZbtpem*MHN}7<}`5NI=I*WX4b&nO+X5V~uve?^$`7i&;yIpUFa%PByE$nXt9j z<8E!`a9M^#gN{6=V&;lmo1>C+G?*ZmDl zJONlnR9TLiD6oA|f>bd&pBg8NWF|DRetE7$Jft=l!j;%y`^Kw|$Ont1^GLHKp=8Rx zxCDP6T{nm@?yLP#xd=v6M-Z=Em!888L33@%j2+g_8frNhkyU(9WP+>%n|9nnTgUt?o^GhF545HJ03>mCO3|-QK zsKjX%ebofqXTr}2sDJnwi7CXxaccD0mFC_ zqFTgShsF&DHczjnE(AYk;yN3@93j-*n4&y*At{}(c+#}{T2wR}P!iwW>HI@p)^nO=KEbPNF4~7En3WQLUVKb!SBpKtIxuylW z>ND653+r}UAlu3=#r}@PT72f3ep@9|{RuZ+P}B4(qlrJe%{jr$xe{M4vTH%dJfj+F z=amm4NFf5B z{2G5%pg|3i;r(0P8$OUW-Bwoz1G9|w@z5Yo`EDsnZ z&PF>}xnaJY$D5cM%PcOqvVO+pg{2%b7icP=rU8soC1bW#IFdh=>{H{--Zv1BO8K<& zW0N%)uS4SOOQzFxKzb*>u#*1xv_-`t-T;HGPX7mmTtiZORN||dKVzqs7wr=q* z{py_%5AO%lbG@Q_$#h8^?-zJ+RhiD6jZ%%EPg=0cg!Qfiqb2Dq@iZ*h8?Kv#ZrV3S z670*<$`L~U@sz>is4h3nKN6y-`JLL@|*ht@e{oKnJ()EC-l~?A*&$+#_?juniXM$SKUJ|rKZq> zQaQ==DUgQMQX-EnVk`7uZb?&`c{*N1r)p>_Ou?ex%Q{${M4n+<>PFV|p+}w7O3oTx znNCjb_L+l0MR8x1wPRx=X5}`|xFi$%CGuRpn6RA3!56m1$3ykCZ6i>9&+d4w9wYXG z#0TExbXC`EnsVD_m+uzkxSv}8V7|_27Y1%ugQoo8$xUAGZe@z`l_J#Ga)X%6=Hipm z)vEeI-tY^#x`lYo^LnkO&ha^7Rrj~!*$!I_YT#?T0V;5Kg0%mh#y%hQJY%AnuVEq@ zf2AxC)ry1;bE`j&8Puk?ysU$=d;`*Efwl`45NAR9S0fterua8mh895=OHH(r@7`?m z@os9;@r0JTXzA!KRr?R~3KK_42sf?ds-jfPq(^S4ili5AH0)st%d^@Utf|j3L#nwY zP6EQTk`VF)L%Dh4Bocmt7O8kJa>;e)@eBG|=AMI9X@BsCi=PAnbqAuzgBn3e{KX?I z!%Z+d%PS~zrvL}BFQ!%dR%(%ck|5SnaarqFjGZen%cg9vS~)>pjafAE`_>3qU1C=E zIUYwaXHAnT1x(v@(z?~o($yMYi1dlCKgV&f-i`#Z+KmqWuG0ZG4TMVGoveahW)19~oc?7NK(nK8-AUyM$j zws~L3C;rsHtZupk%8B?}NbuN4X z1vG|6>^zq2t1=iLha7$CD-Dnc$|n5>tkD(S(OU|Kh)2D3KBZ5(%exN=Fa|$CsVLn1 zz%x){Fq(%$BYhj(yhD98Zk|3AU(eSpYn5TEoKN;DUeDkiZu@q+oz>cR_SwvK%Fq85ofPhF^@4;Asc2p;8g?Yz1fG$7^qTAc&X zWOa`^(obn6=dp{vZeOBpPc@R=GID%@`mvW-`ckaFmGRIcMJz6TT72z*$7T6lqM%YH zY5QUQ;ySY>-5HIPaDn_gdp*662p!^boy#zUMn|)=en0K=CV4H5h)p-E2HOX%H02FQ z`SvuWpPo&RzJ@Wsa3nOYikLR zP-|~W`TFsNe>MVrLzAUNvrH^6-9KU8!9~7}=A!8owk}_@Y7MU2{hzCBGr{f3JL#TH-*6@&V9sgiv zbNpV-YEp|^9jZJ|150JRpElSi>}HPqUKEQ&nvHnW)56ma@q`#LzI6_l!~$+Apfe^2 zlvT6sSRJDG6d@YLKbXWfzSzYj0$Odja_`w!a`D@XQp}@uY32=?S{94{KHg#A*yNb!{fo9Su`-|Z*LpBz(%CRVMv1Roq@|r1;0*c_YT5NDenMNbp z)~U+pH6~|$spZEq56J_B#;7K$Pwq2%6{+pGL;y<>3Z81#;X3fg5{CH1kAw=2MJ5&C zO-DM|(=2o~Z91-!IX@PMCLfK*Yt}E%&lHMJx9_{?|Db;CZ4CAS3P{o9L`|P5If&+*;$#bx@vOTI zyS9MWK`a9BaY4aLM*s9iLp=6{nxoEMF!QqnTQE7bfN?e7&LJ;#*d}rR_-qtMQtr`* z630bTmZuQigv(Mq`$-h3oAP~zn)Qq36XON{G1q+4U5o~V9B+*f<@5P=7DhDN!}t}@ zgU$`GL4!wrwvP6Hm0(FY9~WEYV}8l8$DIy-%YB7MZ@y`JA;DJmh$b|;!ibkEY4GVc z+Nl)Z@~yW9m;E`tXT1$g`d!yG@B%X-Th(B@*fl7X8$TN?BXwC6o##lJM>iW3*6Kwlb@|Ka<*4ty#BvhwA!)RCACr#Mo#9M2kqnfk7+Ee^5Wz8gn5Zm^*Y<{L&!SDvd&6YdU;$3p$W3$ zpA&hO8t)Njp6N>gi`nuAZ2;BiiWII*)Ym1gzy0lG`k!n7R=LR#==^)^8F0R-NEUq< zW1Vq~>{Z3eH<2uos$+=sArkJUH^VP|5)NCs_~NBWCxk~s<$l^NLWRY7ElBQ8Z=O1o z;Pxmr0zcIF*Az3$*&N&b!-QPJu^9iP!*ZM@YcT2UxdS0riDtz8(D4q3cgz~z52*b6 zmpW}(U(l3%0+gNZj*ssiliTeVZviE*_T5^Dm6K%`cyJ3q20_Hl@7@F1IHqJPo!Mxsh1OcP!-4V>yC7{77NM zp4-#%5x=bD)vsdP2Rs$17F8!|yFMjF;tdDb>tjJfmXLxgG2hDjBChF%r;U(t717yt za*N}gpm)wsHVM2gOB##&S+OB&!7SjTciNU@O#g5Fj(^Rp`)?D!teo+!K1&^s>hD&E z+V~yb5siwygq6u-i~eFy1_NB0qJtZ0pIZ0eOV{2J&p_!os*d27;zXAgR1%fa zcKXyxF4eD*)KnFC1GHxQC5qT}miJ>;zkh^fr2cFYPh-;d@9Zjyx^={ef}DngDOwKXV1sbDD^I8WTvJBVm8+QsDFyyJkC!;AY&jh;dm<6 zcsk0f&Q%4*kr-)ZWnRK2WCx7h4LXRrpGus=lovt(0J9#n?* znTzK6N?kE5-COklGVFt0XLo@-lk?n(+`yzL!|nCjYxHuxK7zQ=v?g;x6&AV9fOnp5 zQ$0OBc336j#tH65EXpx*Fqe~7sIGG6XMQ$y*D67El5z=ddqUqZ*w0bKZYh3mB z!otXyc&8%-n#bmr6mAc6g!pla(2IML&p3$~!z?hVRS3l(o_c2{X#R&bS zb>)L-Oa{{w7>dg*b{`BgBt{-&iu^(H+O(mt^NMU2?yaG-^CV3izQshlh^1=K!!9s; zx`M85q}Mg+dHAGI1?cw1nM}uXN!HKLPY>D|Y!_kwHbWrz=*Z#dpb}Gic^{@BEGTgnK!r<0G2=6_Xs=o2|@pp)Kw%{F-eVxU``Xe-(wCfvWda0X`ZQ-@0UPt{TVm2vl?@_Wg-4oJR z3)-hk2?$QPEM!5c)-8`OZ;Ol9qWQE|XVGPkm3fX%nOsbkXm~8n$YrodzBVsmogKt_ zB(b95*)(A`dZqDw(-zu-L)L(E9v@~Z1Zq0OlxZG6r?3Tx?@xIiLYN@NuI|&i#Wjj- zY(5wQP|vEauzYeP5&V8&qHg7(^-R6u^53H62^Adr&DaEBX+9Knu68;|YLk$Z~ zPR_UP3R9$xFIEIf{Ib z>HC%;J5dRKTyyQg<~CzQw8!~PH8Gj<^HeqZIe)0_Le%-x1Vj2zt5WLmcegeU0Rv}Z{5#69ILd+B-|*t9RF zNGF4zaF~gNgh9l0!R$B7i-B~!sKAv)+H{k}sQdnv|1XtR3!rawV*7xkthlvyn>Vnd z!t|dy)!cZDX^$Us@f5jV-(~p&Pf!~gDvPMKoTfLS2>^b5Vu%n%?(TS1EO7{%h?RSK zoI?fNasHe*a9|NLFg6L>cNxDwVgj!1vDsSr=5_f77iA>WJ2{vzV6MK7c^*SGy$qQ% z)I97Yp2)mfrfD=DJbtnzfrACp!XDXSD!Mx{thTlVaiiCM;!a4r>jaG7%x4-|t)&h5 zs@e&vUTMPU_%>Xt66HA@G2rMkD= zY2B{#sYo_dI=L&GXWEQ^=;FL#HJGCm;Nq<^#v$-`RU0Hx(PB5A3;JwPoT*t=TIZEs zRW@d773A_@uvz8jW|wna^yWP98_IvI>1xHa1}$%29?d2CfA`16kZj%@hUdz|}i&WAY)fyaX~b^1`ZS zfL^~SV5-VXk4{MF?i}lI7{6s%gBAiJ72cng>^~ApQvD`yfZ@Rkf6WG)>|W}l$yD0& z7fwvIZhWY(uTR8fnIy3z*H|!~sg7n?tfelr#r+kS(5x*a7CLG~?9{)EJED)4X&a73xpY=v9c>OA$?}iG1 z1ascP-4KU>e0BSu!Ic&9T#NFN73toW$R z%~2o4UmD}3$d*60Cw#YmG-M?HnNqXC!}#`l5qP5P}m+zJmk0pb-2TwPtwE2tB2 z1~eF$n5^QXbb_W2fUp7R?RD#IUPiF@aw1ITt!+zWjuzkrf>%LbsY}t9 zKyA=CRpXuW9w3h$n5$r4hr~o(y6X@7xfSBVYU@ZwT}m*M*_g-Da)tM+3!fvb3Wz@Tx03CwB)|%-%jAXQOuA&CbLqoq6Wn04&=ILu4dxs4#q*jz8Fe%MbkRV|--GBvDN%1^im?0) z5J~%ufv2oPJK>pVjS_z;GNMY5EFNd{{<0U8)_v$ngq+0scpca$-yFVcHe*OC27d9f z35eO|>Ro|9+2HQUgMg#^Z$(D1{NEKBUa_NcMrH&oEUZL;gC*pGXPyxjkryhYfuFE2 zCWTJ|Ov7fecK*-Ei7!0i=87N)i=0x=1Led4X7QSxhd;@;6k0q5RhZQE)UAi@ifeS< z&gfpqpvd$qj__4{*LXZmhj(4-XCu4<8_>8+L~_4x(7#n?*oDN!o#UnJqpfZ?8-FUT z)dD&XJW71Zzv&SE(A9=TB1>&=5`DitMV9ua-wkO?;VOWgr4F$sv$(D~uhLVqpYaq| zp(ogy>*l1cwU5q@bC~yQSy@>cC1qndJU*k5cFbUHnxSH4S(a6ZG|+VfLrS~>VIa{` z#LWJ{?FoJZ1FU_DiRXnLqrqzMig<^GE{cv?dSD3ovVp0{MrMM6@=e`7dg!Ye590<@ zL|eBqHD+>UgXp41LGIs!L{`l7&Pa`uKOmprb0D%_5lX$gkPJAOBc4z)ef3&a@GUT3 zVz1A@h*3S_Q7*>=){xrOr`wIO6D@Xh>_T?C)@ruiJN;c26)WrUMEn*Y=&Ed&DNF3H z8}nu5iRZaFB+)Q#7C$;z3Z5HHz?oy|VQ6Ub8?`!{`G~wsuP2$_Hx0#9S?Iy*GbKGM z!mrz_LjU6R9TW;*?Tjgo8QI-+uMOE(1@VwXubG>5^K(=BDVw5dY7o5^(P6I+?Zm&k z(xYTs)GgFltw@;{QgcfX1q>~e{ zqopZp*D*?`0A3*R zQr9Ih>n^uF>q1hVgBrPg5LlNJ}*y^Q!CJuV+>Nl4jR%A?)M@xpbLBxuoOl2!y zX84?yaVHfNM%Yw>ef6(+l3ijsfK_CB+j4Z=d7F_J2S?ijzHDg6U9rOEhKXqNlvE#e zXrIzNb!|J1pi8QIK?bO|O1L`Dx@X;ZZw@z@Ej8*$(Fw`|H@<2qNybQ{ z#rFg+>DBkYGhX!n7zJbf{J1NSRAB4k9KlkR>&1RX#e;RKEhQwjiwxMhYG&ZCY)JAJ z?To{q6@|N4drD?zB;ZLde7NO2?@6-;uuQxGfE{J{wb|2BOULf=f0rpNCzN@#RU-~W zFAjDlE#h5kOUx+&6z`=wyUist$FK+vh6PC8uz=%9;7o$;O* zZR2ujx-SeCx5}1|xk82;t8~k}_Bq13mh*Yl>W>_YrBX0OJ$bo2uaZ}E)c8xEEMyl; zvSE5aP72h^bf7QF37eUfK`0jn)dzY>$p+4zqX!eFfrDWuO>R+*X|_J;T-CVNBdKiZ zv2WD6h#}!5-0b>P2YNT$nC*!YSPSQCxPJ-Bz(w0GEQ^2PSD8!1e_Og-k_{aGm7|CC z(vsUkor5ZZ$MglOntzmo4F4i0{o?~MOWLu#JWme~#?zl}+V2}APTo4Ao}wSO=!jSZQ;l1fFxLokXTAm>wn@ni1 zUn|V1nm!oh-^-5_bUTtK57sIHl+k*~IO=t2{VNEzBe3QJXBU;QOT6*Z>sf79GWtNX zHMe4^>5soY_60Te{6dNz$Ijj^aOPF%Tj`f|FW&%KLKEo7PkJcj9n6=V@et!jZN{fJ z)LOwrIX?!BpOPaa8AO>dbtRSb`)*_#)RdUpc8@dM)5nr)V|{FR9mC@&0Fj+OjBfQr z=PGtZK+hNusW?^p9y~gjh1oelD_zz-5Iat}m;Ek|oc=ZJSnSM2CYMhT9v;q@sx@!)49>!Hss$nz2M?1#0R^FwxRJ^0|P>d z*bMxDg88>gdWH&gJ8`ah#V&vtEcf~u?+O-B;k?zfcJfVBUBiR|SzZx9CrIZluUv5; z5%;!9-Ms%FN(gXDo?gRUq%b)lpV7pGUX7jxMFGFTyMeNRo}!H(c@YUQXybeOzRyT+ zh}v>eCuGX2g-FnvJ?!+!LeZ9f9l}_ycJI7;7*e2^i8vC@hiTRsS2>>UM-`1vPXo=9 zZW1E3$;m~|Rga}&Hj6NsICcs3SR~q~z}D%jFn`BoJ}Ymfe0JyfLHq zFKD;BvA=7P&ij}12kL)bckI*fH!v9*V0Bkt0R#xe^H&33`+dQSpa;_T`iMk+p1w zlRW5lX1$i0L;ulI51Y&^WB+WEUW_FvM$=74Mg)}3gY=-+iKf^TdiJs~hd z3q>vz00V%QCKJ5ag#EM+bcxz(fWP)>9;FX{U(p+bX=%OW`c2?xz!+i1-??TZ(8bzd z3t%p-w7U%UtxvGDVsE=P+z~n?#7icvBNJOQy9az?Dl8S77^)!Ct{>^XD}6%)Q@el- z*af#+w2T2tu`3A`v?--dqr1I~bl z1+<}(i%ChL?SfBrZa%zPrU2}oB6ko)BBoQ2#HeJm(p~kXLti`&$+6lg016})cLqAT zwhk=eF#g^84kma}lS2nMy!ktQwT9A#$kzD@>nyFU1VPn(t0hO~vqp&^KEIz4g` zb^xH<*vN-L#3}-K!?kO>nBbLBErWAN;D?sFE+8CWT-x8YJAR!MUROB^NU+I#dZQ5> zl)oe<*AyKcy(#1fh?kWKGvRMa`BEA0I^i)YZRxfC>jpq_Uj8GE_KSl777qQKP)IU| z$>=X)KBoXOe2ndL|rV#)R~iZ!Z&Ig00dK|q@=(D z*Yd2s5K#I6TeYE@@e94JZfDqfhr%E2I7Y0!(P>8mc%qnCI(4^jM);)7V}>D8WuNBB zehX5%2K)ogHF?#rnl%lbFjz5T)ycD-@zIqQmac&NaG*H3cozJmPm@8f!EjhmdoB-a zm-_}$6e;j8Tc#W2VNst^OwCSFL4gAQ^K*EXi7dLU%A4<1%vpvs?m|G?o65kHp-sc> z)tWH;R-WFpV@D&G5ofO%G^k*ixV2r29ev5~xEZ&5spVSyZm`0kay0tYGT${TtsPpf z8vYWIaLyc7HqFLX-q~?gbLX=(@$*}7_)vR0o5oxS{|6Z!anBV0=Iq_HMqEdh6Z#qW zb>NN&6aM3~_-9K@`G<=AC`sJ&7^B<0ot6YF;kA6{n%?^hlguD2@# z7C0GPNC7RC@4i^Ox5>WIAjOsb+ zkDiR0^X?2-UOVF;nQF4oKwyPMr7^%6gJjNj3kdYxz}obyz-m~C+#qA8GQwIK7__eG zDa1T#W!p9X`f`(7zWn8zS52$<^2R8{+kJ4UKxkU$J`yQ(YAW#182;!1jLD(E@Gn=D& zsDS_KmeS$9;BS3uU0~&MUs6bh$UnGFJ5Z+*qAu)l%yuCCQQ>qhVvElXW9EoT=qB|c zr|53`weNJV$5zAwi#ukU^QhR2m$t-sb@r3}4ajX*Pe-oaMG2Drwd$UuqwZBy!^0ly zdi0L6ifxiJ&tU+B(!!7QMU}3AU0a>G_R{*j^$>yZl@{5t0fX+~>ZpmJDw%KYO&uko0u!0Egl)bfeH>2kCU}&WDek(&l+q9;)yf<5Sw%{%~mMg(g zqyHP&IrfJ4l&|^TJ)-PYL%S%KRurY}nNKs`ai5Qh+!i+Pg@N7KLCxIQ*VU;5%aeV5 z=qeQD21t-K!tBNta*sWt$i7qmwuS7Hx|=YDQI5Qtq?kBA)}5m-N}Bagf^BqzdAUqT z{Z9t#xjc;9ORsh&6xDn*XtzFW(S|i~lP(3QQ9UIST$%!45G&1c`^<;lnz_A%@;FZt zsCM}-)#Em>0aNCHOdDW#+co5UV-MFe?>9Lug>#QD9T5*8;JAML72bQ6O4tsH=(r;% zQxD%lZF_qN$UFjP=M&qDTSTT zcLl^tSGbud)9`Z^zPi~YjIyo95*K8}vXx@Y^76tjtcq8=Do~Q#%ZcskRjVW=kuky6 zOUq{DM%5or?{qRIV;8CnR|9yJbf1INy!W&lz2H$Wc9Yj^sfdZ1zaZXchSut=9 z-|Ouz#j<^{LE(D5iC2M!(X&*+!8(W?B+|k2-Nl?D%nN^_vc@r{Xpuk2Abtl z`qFNKWJ+GGqo2cer|pCC7Q1HEd);$*`HX52 z^iA3QM{QBlVe6``cq=N&7Grt+4#Lj@X1C9B!t){%DCJxu%bOmRt7{^M5l4!|Wt~OM z9!;`=%Q~N~EOy)uh?>cY9!_e`yF;TYKcEE!b95XB%D>AOptogRx295sP#6hdI6>N2 zkEm0ZubvmaW-M)~-1!RLi{Ipe0N8_|^Fw z{SgT_sn6S)nDH~P3lb6v=e(T7in(r(!s~&po%cf#4Q?+$S2YNUo{jg52z&H*x5XH} z-SJM63gvA!E>ZIT1|}R}@A`vLIB}TDM#_Bm?s<;JKPJuViXV|;oR-mYKlWKy8FZ+` zn-*QB0OTItZ+t#rpr|xv!iioBP4XZo5U#riwsf<}MNhIj%Dc6oH~ZQf+J8{)v_fB8 zNk`%oYFwzW_0uy!$`0~AFc*Ocv>JFJ7`UI@t5wtw8=@DMX|4%>8_V~`S)oMc>Vryp z<(|Xob&AJs`0oc<54Hb;*1#Y9H81!8+TYp*hGtv78!1zXJ zieP?%a(gK_=R!HG4)WQvVAIm9ay__>T@frMYL` zb$!&t$}x*zeuap8MApA{y^ci}lJ0%p_OzU|pm7vb4`b3C@cEd4+_*R*t5##g=`^O6 z%hddHsE06-VaP31@$+?@)9colfi1*retjHrJu@pCOx3jwRqzf z8bO&zDE+qi!OZXBx$1clOHvs-vC!EdS4&XF#ZDP^=6-WAm{pndlJxWn`Z6(W>0%-q zOMkfi9LQS_>g70IA4UQ?!2Z^j%AQ_y0UhcQVc^8J{clDyj#cb+Eof9tb%sMj2*|~UE3x4jYJjMa>N!QzrcM^6z5-(RzQCH9tbzpaPO`JKoBRW0SY&f$|< z(n8f9bxtCWv4OzW5@sLCFobCq>{#+li%Fry%XgO8!9{fl`mwv6 zT4BKSUZ5K;qjd~S-~FA8_d9$E2tB^upl_;%z(T3H&_QHhFlOvYAV+y5#vFM*S$X7|YR9AM#iHSKJ- z%D)hCTsZOe*k&Ag+9q1rDhteT+O7!x&iM+vO$?qqgbpA1{s{LFBU7@tz;?eNW}BL; zsUS=jV)c957C#-LZ~-okF&9>bK4!&nuI0nq;sXevvsz!n&I}%fqFoX$s~eHO^gTc{ z=ql8oN{PJMu2DO-rV9{cg%nh13Z~4f3AhX)EE9yh)Xo{fr)54v)W-_5Z#<+o(Q;jh zcUes~*$3*ptkS_Ru!x{R61Y|fe=TOz&052e6Z$imw7?B#3-C=0&lcadPoS-$7jua5 zu38f}Ayu7FM4z@xt#bWFZYrzGzTWm6m;?v{OH28dA>jIMkjjqbcN+eiwH|VBC20l( zamTQC61z5Ib;DQzfvU7+vTe=1`X63cS=kGwjgF2!&vXo9fMm~dU0`+`;WLrRKWcUd zl7Y)Ni5t*mGX&H=!Y>UdwA*m|&>V)Q{BGYlw*4LqtMaiKFtFtul#pLpj;0o44k0O4OZ`m<3Y) zG5_Y|aBAoloh#1t6sg@#Pk^5;n^jkpej@!KrmUuxpW)-VRZ{l>>PJMF-}N6cGj}nb z+MS*1sCWCVHp4v!OtqABdQk_zZ~t8gt9q?Y6!1cJIg8YIW6@%%@#(>v*k1 zG86Y4XH;a{-m<(hE?KHhcLhkx(VmEl#X$0(K#lgdxBd>e`ui%ryP!>2Kv0*8!u~>& zC8w|_oM^GsvhAN=`Wl5F&X~=-i&!dLD_yE*zpH3E6miFah`P^N2lmDDXFk%n;|d+V zAI8&B)TggI$IGg2&*4(nzo(J`Wzu$+=xDHCtze>-U9cNU0sxKNIhxu!$6jjJd>K5b zc5wkRCLv3IFlDWn`flNKDy3ZUz4u zOJ{%T5|rWhI#0$5CwLdAsmCt$Q87t_09xV0*}6&n>SiYNVyiS>nl}PIkpL*|sY`(| zv49b5Dz4gy7>+Bv==FU-c_85E=x8n>W7Pmh1>UBteosaMqBd(vH_sB`k&GKGMF2;WimCX7?@$V$IrbHfa8d#$aK;2uZ)nP+Ng2ZhCgw|8@!f~H1qfpHC6_K)0+s18J+mPJI_V?#r7U{W3m zinc{OW+QGU`Yb6cm!UZ8Fl9(%^8y?V<3k?`^UGC~^p1o(}@F#&4kj zkbeK`&E1{6)7nPuSu0zxH%HelTeBs<6WV?QPomFDBL#2x{Q_r$rzOq?cq1-h64K;4 ziCVuJ+|vLY1x3rtl^nR(DnRoP?genG2eNP5M?e_U9JC#T1Clt{ua=CYOSXCCk!JOlT9)d+{5e>_-C(}8yR&0?7O|a zoz=MiF>eoVRyc6$YU!}5R}?^&+raqv=Xe7HMI?Z{?2yn;B0}LJa|-;a?+I zfau6)5)lg~!k6lS`~yeTE)Oye&d-3~6h7YLd;guNShHs^8SdQ#zDVyTA;Q1=zhgN8 z^1xihFAgO5v%|*@(5x17y!#W?c^zM1S!4u>^)lJ1&woi`wPJ=?7Io4!$b?cBpB!3@ zIcZWEmw6k(ZNKHuY(gJa*loBQwct{%STv?JDZS9I7jDVw;l zs$s@Cw{27mMCndxkPelUP#L zmKH&gM!Gu$hAxSr8%8>%^Q^(|FW&P!@A(}5LO%+7_TFo)`@Zfgpd7Db5`I%P@8UDthJO=sub!29w$ip(;sUCWhPaMXkYF7swTUl(oe@E%hHb%fnpyBp!nVPpYM~iuJ zqrN)i-j_z@9`cJ~s4nq)d-1$%dt5C|MS`KL{_t!?s)L<5gG;4As1(uw1nI=OI#!ed z_+`e%{1mCc6_@>M#hW=1q$BrDvKjDW?CkI7HE@Be{U&5p@6=wo00+C8tObCNfrl~O z=*#jw@RBC-*-taseAQ4L%GtL3?+3I?Y8vrW19k4vY@gRr%!{&r7gnIG*{Wg03@kRnma}17Y`;j*)4>2 zd$HPaPRvM<$0hzoE19W1WPSEHRFIx^;NZ)W7@2`9bQx-;k}dw zX{dMKJqyWWLTYC!F6Um(y&eORLb+^Ouj~frn3aieT&Ui6q3s@sUuh%O2I<|Uw+skz z%7=2J7B-4BD{Ypha0s=tm>{ivEPT{+7Mi2s{7EPaRZEePu1I|pAMD_R_kc66Quedd z`3BX`I3eSt&A+hwidIC0Q6A9wr6v4%O}`;1;WdC3*3=++7J12Ftn?w)ZGW=q@j?Br z#11Pg{eir~Z+L^3Hf2)3CZ(EWS=1gfZ)4PFD0huKY&_fK{TH6j&Nmx@NYNT??Q7kk z@o_YzXOnLwW&bhT`k($%qdpgVlF1_8lWRx|sYIY_(cMbk<98k{o!0Vh_In_X}l$gvaL^QF&AOhfgFOzQ6AEplE$FwBG-7zqE|sq^#c1 zKfBSW^0M2)$vFEjkVYQ!twk|gh&5e=w5hb*quGNwlI0 zyjD~DIAvdl31}y-2?GC!TmE++uPs zuc_Oo>H;Uf?L-=_>|ZyxTJh`#`(O=Ac6zpz?2G=06uI-rax;)T)itr)jLJ5B|4Qt` z7q6=dcFu`4_Ajf(uKUZ0cS0j06Ds=m z%H6A5D*;IsTr{rI(>EU1S;N-opB``TC0jvq4nMKa(r}4vq`MBqj@?_T_!io*;4oC? zq@<}H6mo2ARQ#Mi%!faDQ^T0+DEq~)4Aae%tlJZzVY@q)$@$DiB@M^pzC*e&PH2@5 z;|x79a;4E$H3PWvX(4tClVkX9l(njk^`x4I>U7oGht#VGUCn82WCRk9;%o@)J*Ds$ z&No|w>3odPjUc5D2L<4iF{|tr zgQS^Sk{na7QnYLe$zALiHH9CLW{E+bDBP0${4D;S38yS@f9T>y4m0!7UC}=4^NEJ3 za@+nI#DIu=&9p7~7D=Nz;YnSWvz**@`Xln;r*t8*4swdx>(9_lbaZqvFbO@QBgKvS z4I&rXK#bnrYI-CxqYOEfR;kAoWJhW46dNMnN?FUF{!X88{(e524tH|4TEI>~`+dG$ z_maPRMt9klMK+6`#C}tHNbolF$)`O(yKc9I-IQ-(x-DX;wAPLw8Dj}3Z8|{K7?N+e zc>N0UmFEeO6(?%Cx%e|$jl|7}OwaXJ0*Itps(Dy+?4|nF#;8?RpUvxARP+iDt(@yM zTZ@e0Poq7^(Y3!8)H|HeSx*SMJa_u0@T%WYwm{sMBt=0iR*}+N_}SPt0>Z%1$yI4Q?ePM%f^bB8YU7id0J3j#U4GEqZA<- z+&PetQ>S^7{l^yBnngVZ_~Q&L=_b?Z)%4%y?eso1c3+-o`Hnp=%!=`{YAPnZ_SK1sMyFxCrG3 za4>qc(}$EqLjC7_B1KTHe1=bhimoBZj#`s zc`tbFG{SU1&}ZhmZJeg7Ggc%Ir$)RVFOtV*)bL<+@Ux%`3!_3ZlTDEjw~Hs>L?Ghr zAXMDk+<+j^j09f_Tp(0M4M$|2$J^oA-#leTM={;p+)l%E6F)m1F1Cd_^>9<{oiECe z0OwP&(7j*ALgoMZw!5?Qg{dh$ptFR47>gI9`rZ_PfPM3|qRt!~rJ=N0;eGCU+RGck zk7cnY<`D0mk&&UwYd2Z$G@7qfIx4u*|5YWl;UPLY;^`FB1jjp!Qn=RXbRSVV>e<%T z=6bl0_B^D;UpwOI+}`>XFv`;@?QGnp}oC| z7KF!r8Z0nA%0a|Tx>0OzT|7Y=6$)amY3jez%-N3;s3@`c z#`<2AEJ#CX1uQdo&q6R1L*c97MOL#yDR1IO3j@;(dPA_o@h*ch&?g z{{Fa|b9YxM847t{s=8frykNw;En%b(ycQf!=R9lLyG9BmJet;z2errOb1xIY6IezXY)!>ohbA=REwnPhi~>YIlOQ?sP*|c z@tt3_*)SLVd3)RGupmJo$k^NVP8z&m^;Suw(ESPnK3H&G5*CB;cOB}H27UB;)gq=7 z7L*723usteW%gS$%_L;e!4n2%-4Bs#A(s{O(uGjt46HXnKZ%Fux!*CXTjWdFzCcNP zewWTEeOjDFBRY59^$u>sAo)UYUI~XCR-i|Qv1ZU~hScZ>Gc!h-RcsHNyNBo3m^Bk{ z!{^P<7-b3As6O^TLN#uFvxS>jtI#Mx)_#BE*BhTo(6g@bbeG|dRSBbV2%yZYPRLve z<|`zJy~vk%tI5S!RI;=6NNQIetZga1bNf zx7-n5oWdi#E5H3|-Q+L#=mbqrMjE~ueE+66K4YAIi&Wa`r;6XIE#n))1VcBh{a1VU zNe$O!!0B`I$n{VV8^qL$qCbDZT%;032vT3BlH}5VNK&~Uk~}KKyVxO4_vebqwqN1p z$fwtLj~|8Pm~9jvq{yV5tFk?Ts88fS^1m~gmr%rOMGT#%epKJfs9_#!LA}s+mjFXQ zq>nTdcTctWUHHtn&C;hw2HdTwWdz%_A{X)<571(&L3Dw6S&> za4%k4kYHCRoW8Mw`n(hny=&-neM^hgl&);Xmd#tugB`(77qrSIbRXMY`1{Dl!SSEU zQRacZwysw6+VA}`WVyR*`QH?uM@@h06?d(TF5j3;)Mb1pZR5Ll+4IvLmy?zl0kUQR zzj6^s>~C!4`}pR; z*lz4QTF-1IZ6h)@Ms#~1%vd_&Ljts7xLNoq&`pOCss>mVDDhc#?b~yIN={M=;to{u zzDByDkOzGgv+M4mA?nz>YWmWyLr6)9gN}tDdg6>cTykZ>a!T&7?AGl#lccbKgBZ(wRi@hrjsz8Nfn+p{E%NV8 zkTDD!i@S}R0{k-Rj5!`cV9*OtKBNupSDV{Kb+JL=_i}vptZ_q*y0ae^c?ssl;ECJi ztB#TK=wy-4U0XFU_Q9&(uv8+x)GWKt*}J5r8gg!-WtVK8wsJYlk_KcWmSCiga;M|< zuH5E|B+!1Rlv?v00Zm9m7SW}CkEsen+d37#oMZsf+q<&_?2>Q+?7K(d{u+C?*`$WD z3K61NhClWMzh9xCX*hik5D$h&Py1&W?H<`juD(sohyVFypzJkUyC)tQ^a?k#zCAfo zMP5IhB2jh`-WAnyds(~>uAfd)lW46C_3_q84<3xGeLPkq5#p}=_O@#;t1WI`e=}`& zFm$@?Ra0hd-d92YWSw`fn(QPT7wi$&&6a)jak`q)(hracSfRw6$h2ukNqGUEt5XXK zK~se1I|whbRJrGVH(c^U)DM>0z|F;oYqc@_iR3BH)_segt?qy;WC$sOif>$Fh#BrO z!HRH>tFmZ~)?XY@enAU>&UhYjg5>hVukN zy=sMTn}pz8j8X)g_jun44+7WT9Gg@h{zsd0a)ABdN3Sgw&UK;tCOs!<3-W_W=_ z-!5d`S6qyPEwp=U)@w)jpR-F3S0C-1o_u2#Q(`dMXqA{EV!WULw@w6QNgfqdxK@(J zPUB(woZ5T$L;W#7=oDH&V-way3I@-YdFESU8sfBX-#kM_J(hS?iC8nzK!H>plU^SEpAOHYkDL6q}h4$&5v~_=a8dm#rAKPrXDY#*?)%W-?wgAa`Pj zY65t#^q3Fp!C;G8Qx_LxSejb2)qR7@H$n3GEwhr44+D@`hMmB;0CrTK>Ub!zNh5Hg-|kKi$;*!g^y)YF>estd_W?^Gi<9cNKSJ?_31oV`N6#j6-| zry2)=C-Hp}gVksl%VsSQg@vpn`{)5%6HS%Le}0tHRHL_7<~s!r+okq!&>WyL%6)d| z<0S9~scG+aoA3XpR*s+)4gu-%n1Ft)asES=U8gc&YJres)P?%VZwFnSkcS*~A(85MXQg$;^_0p);gy>N%b>TiNB4}Gsr zvwc2ve$3Y@Lj`JDuqPBh7bsV64a9T={XrLd=?HM7R}*h4TppJ}*Hjj;#KX!sOD?2dXk=W@gqU2~q)D3(zHpc#*pn!ICmEGG@bB@~jqp zUl?o(oVTY1D#r7Qi(iYBh4Z5hb^yXHYXT>5jxNZ)_+YO=RS8>?vzIa3?40j*)yMH= z%RSh~F2wM4(=${0IPI4_8mxvJr~e^Ao#=;-10brkM zhjkEsBF$?w=rHfz>h6mx>8{Ml)7REO#fZq!{gmpP?U4U8Zfcgwb8RlNs#49~M@1-7 zEuvHC>fOI<@a?}V<)7vO^mpMFF?>c?9 z)^tm}C$RhclQ7POJ+AUqS5IAVVc0(jD(M}diK-sV;8&Nyerv|ljv!{DSFp9C|$+HyIS-m)rN{L~#M4eb<1mfIn)Gw4yZ z!-Bu|<^r2HS|J`btexGkzkpC;2NUSF0~{OirTd$JDxyz!TcEyntZV zK{a}!oyv~3P-3_-HnNY3bH^EU$yK_AiZ#ZpWqSLGv*}m5y@!uzYa{-4sw?FTSoR{V zpK^udAFX5ZRryKf*Ag7jJ88g-RNoi*FzW9dtscJ;dXihn#38XbY>)O%UMN!H`}ku< z6+7IJu?~}q;fBFk9nsLDDPcd7oOj+?-o!pXr(~xkzEi+FN-{-J_iFF;NUj;kdVF1d zdn#G`r>*m|DCMOf)OolnJVaXD9{%iiB2;C)At)F3Cl{4tzN1XR5MH`>;l#=s0`szwOz6c3ehz zBvylg+=q@~=MgUr6@A-Ce{9q=@3}oG75oENH2lM1I2yHeBL65?rh49tVT^YcYOBf| zMAhPGdnWIy894_1rzr!)%F4)1A?3O}$3Y;u?frtU*c?7)ao6JIpO zn{xM+w>Lg+R1W|ez~dVGZ3s#1r_T}10VJI59e2d2IF$_kzXBNHG*WALnbQQyYgc#-$;Q&cQ!0ED_eyNh<# z?IVrx!`BzCWV{9+U)s~sS^(G+)J6ABPEQw*awDC>P5KaD6-rb$39p!BMa!9&x=)h) zjM2B%*hRJ8Zyu6L$%aTCpx?ng`cmCHcKdgH>nZ)cjndH9pKw_@EqM1;ZEBL^Uvh^G z#{~sVrhDdY`W@ABAxeIxIaAZt>T@As3nvt0eC2qF$siaxZ_xV{G@m}*m+n)z;-tK@ z<0$q)$9qtqny+O}Mx0|Z)c`8x$!=&bkQ`-%);K3C{k$*d{lCbrFBZ*i@1~{{Pm2Nt6ch4UM%0$uCgz< zYTm3E8~ITey#Ci>k(d^byZO^kP{uT9Ry(9>TZ9H;lBYQ?wXb_8YlsVDUox4)rE>4z zK9^wrF-HO8}hQ|m#@fulp%XW{%J8m2jJdCfO*ShB4p{N(( zJTO5CS--%W8AYSSdzjHdw;&m_d0wRo8&FoBdeFRT>v~d&DwC{AQIN@+q2J(XIhb}& zNLV0dU|~ac2KTJJwUsGQ*Kgx$P=t+pEU3x0yU!8kT!>=I ziYkb;Uxz69_})s3)#Y_rcbB_*Mo8K{mgOTz+8SFFKFbt6ZL1p`=c|n!Az}L(cahRM z(vLe>3crKfm%#HrhS>T{_o@7ouk$}#^+l{>iw{H>lbw`uix_F0NbS2tZP%M@7w=U6 z`tHZ$W~BO9XYa|h-?w%TuG=`H;0>gvucS)*=MTAS5Nymx^) zQV4qz{1;{y3NSllkUell0+EnQK-B_LhGsR@UFuu01L0L|Xi)ch zzJsIVZc=;$)4p1yVnCar(!)1{47kD_K)WB$KMGDAG#D&cNbK_gyDJmyX@J)}(7e zPo8%FFjx`?kw7$_EGK5ZAp8+R-8a6US)pbT=m2IWP-4d>bjBLzlq|%LW z*K@=GIB7E&x|H}{`%D-Mx1L9w%p4vawS)fwx3l42pCcYxyzlsLR5qE{k)4%w_!@nk zdU0RIQ2=jEKvoDNcmu2*Ze*3{g$NEP@%Z!GsfRa0Mz_uMHps+j2La;@02-Erwf=k- z#Y3>yT$)umS=r`1Y}fi{vQnN(J|$_2mm+=NC&TAfp`GvW3eT2}6c#kcT<|N_#00=B zMHc7cfl#uWy@N})?bRsmj<4|$g(NTvdPs4)Q^4u~5d!Eg(3cq=VjBXIR9b!m@7{_S zD;=Gfyl&lpfMYq`4H9r~CF{ANBA=^k8UF<}%Plzq7ULoa+lK=`aY*-WYsqTj7ff7%PiVk$^Xir&;?Tc{mRPX~Z(>sCs2QdEbH% zxOWPC7HV22aR7}# zp}JvGni~0G*}$J5ULu2h^*j1$S1 z0uF)oQ!G0K65;lzk1yT#`f8p24MgKM(ziD^>N8x8zze*x&8@9s;0C7mw`s9!l`iKp z=70S7alF__OzjkG=w_kudm?F26JCpr(SmjD)zi~cfCy{CzxV)KC~wfTK_EPMvQgu8 z6v1?7IA3^d7*i(N!Cu%KyaA^)(yO#3_4oJB?XGrQGVNh7UZYs@hIkwdN}A=x^QWBe zG*N*?p_K5$a=bWog2$o_8cAYzw6~{3C4LGL?#(tBz)U2^nlBa{E8U~A$UrIUb77DJ zUwVk=$dPqE^LALiR4oq>)Zj-vZXCd_uzE6xDe!VrAfam36CJc$F*=~isU(l%Ya(3? z)+{z~aC6h3vSS#1xxc?3tuyKjbL0o(m@=3N5ICLyZS6=R!<{>K%t8?u$5Z3ysYPIN z^zGX>rykEmewg6LMb3l8*06$vY^ca+k--~hs(u3O=5IIM7(44ZEQKQC$_Aqu2LU8s}{U^B8E*Fxyc0>Lc-mP)(84>2h` zXm!}#K*_!aK{S!8p`{g!^++(M=n#;R)V3aPH$7!Ms@o{6d*&T%tZ6fIaz0dUHEezE zvNj}c$M<{Hd7{E5;jAO-`A)rxu(}dVAhGbi!Ry!WV;(E2Z_$OEP=<_g;RL&AYJMh5 zLgpoD_XsSmjDTfxvJ?7uSh59D?rg>i#q-n)c47F6o!UKcEsiXXkaP!_=kwcRj_^gn zLhT66$Fc{_F1m*lj{l5X1jK}-WKUnuD~nPUmPfG8iIzJ#JHvN+KzO)mxJxoZmtrvJ zX9_mEBuwnUu|iZE`7g!6U^C4l(boD3vc zB#$nPEO!cg*>|eSqDbk!budeU(v=4{J@)TRPwmYz#09yK23rN)%>wIev6iekZXJRTd(ttT@6|8E8<0e>L4 zyPJt*n}|*SDd}aFz4N9A9=rsJe;iLc{lKGjB1EqB&QqR;KYuO=GK9*#FptQ0&hXri z>J*0}(qT?wAkrLZgEDzzgW^fQ&3#B3sEV)xlacBgOo%Z&v-ojT9W7S+?RW5Vk(v6b z^f~ms&Yaq`YLZ~ZI+|UcJs~nb`ZUIC^ksT-5UK%re>#mB_s4NC4TC{G(QB@i? zi0kf`Iry0CkuU4*oA;H@#+3CR3+hFLe&dvAzt~$HdzqZnXs0U2;-t8qgn2yTiLFNW z-biFo^YFNWY;K9=8~KiN>l}U??xzp+$Fp819imq>RnS#!r+;RmRUQ&fv^L0Ex|VY0 zQJ_mt8cx0t=C^PDE~JBK>Iu^9|6k1^Xzl#xe{2-bdzAR{6EU6Vljk?_mAjvEt@@ip zP0r^`~6&I*93%UCQqd;fPM%5~cgm>&tRJToLJwHaX zAohHDbnMY!>T#&muDfT1=Zk9Jx znUy-`=I)7@21pCbsNPq8$FzK!G@EcuUYY#dE?8V40Uvi?@!!dsnlsU$wF+bDc4!*3z!F|gpW2qB$Ol^ z16dj6ZQt(`ZyCOWJ0m5nEBauV-hHA>F#XTSsHXO3|5VyN0=h<&L1f7LdavLZA zZD*(Xtq8XtiopmNaJ`>nCJ77=5gzXNUX#1cxDYccehUMX;~W=SD?->Y2$x$e9f9i- zMrbmrk2iV)fRkL30tuV(%L*wgE3+i=+Gz{ejIwFjJd$L$+{8fFM+Z}J4evo)KXiQ? zFtT=`jBLq_GwK$-V-zf2nwI0VW~gestBgn_O)Q}u&I#)qc>@5o3F4Btq{AdK3x#D3 z`yNe=8bQaGW+T}>IVQSrMJGa1OP~-CT!ra0Y>-0T<}Lp zBq*fRD{Uu~?KJRI4+qOJDENO_EgJ10&(Bx(_Jw3~G-83BV6xs*18NFC(SH@+|0~!B z1yzsM?+en?4D-j=#F2i-)v3(|jjI&XyX^FRfaYCjaTcbGlEQDc*?Oy7yXEwk` z?vQn6$MY{yXq?sxISM#{BZ|vvD8rf#u(iP8!Vau20wQ+p0D$2F?~K|Tz#-#*Yt99O zV@MgSpxdI9Nq2}$bOuRzl$ih3o2Rn!WJdkJTXX;HQJ$1L6K31fHI@^lnc@#@mM!H@8dcfSCWrJ~%eW6=Kg zjLO;y5OW88U^@CH>*Q4WPC}IrOc?{YP1<)Y!V4+5H(B_Nr8EE>stv4CdTCq@tLi@S`cmXxz3MncYi5gHoohk9M$xyk=`T+}=`SxNa<-aoeU2nuSL&C#Y>Zl; zdw6;EsIw1WLX@J#CvqQ0q=FF){79$4vtoKF8p-CL^Z|9TdBx5aT#z_bEC|b*oRe^L zsfkm&fA?y^de0%y*%3l@n-f_kuPh?MkGjRIm1&j7EU2sQ?xH=EyyzU2dPE7GO<#ha zm1po{jNGFwZl(~=h-w%5q|`qY;!-X}RQ?3ytB;_4QJS?kUE$lm7*E0!m*Me>(# zp9C@+kT)px;wOjivvM&jZ!`}=FABhVzBg)ao}?~x40 zi@%agR^iBv_h$$PMj|9ZSdWw~ikkM?$;}E5V_{euV?|@Jpw5)7)TcFn!aHj*QEDb7 zEge;$-F{9Ql8|7&Z5{Vnc=&D8_6*#rhzCZml68(rC8ArYZ`@Opk)55_HtUT0R4BA^ zZ8*D!j5f_CS@pM;d3}^Guy#G9VR@}%NO3XS;Iwwrmh9p%;spdIP z<&%0Zn@ebfMqT$WM|764M6C6TngXZhPp<1|?5~J69!s-m>XANw^1ZYo=Yxh>-S^$@ z39Hk%$IF%$tB;+YRf3EyHA3;YjoHW?j6>q|mTn)n`>KIWiOMxoTq7)6PZo0_Kb#I@ zUwbG-#m&Xn_76zv$@kMs+{%_qRQ^FQ)+T>~rCQHXSF1o_fy}azJK; zqQ1j2l+rrerzs?iu_YI%-4K|;w3RUGKzKVV)Pyfzp0!+JwJs0tTkSomf@L}$N2I!T3gN35OP>kGIky>OY zQ1!7HN@;?gLtyJUZd5o7tq@awbyyyVR7I3=q^y6-F5!mOInczywTRv3y>+^fCAOUz9F#4pPY%^thHET-bV(wV`N43 z`ysXTeibY%EF+SD&Tu%WzUUOKUJynkS02qDkuDiY%gBgILqoH^n#2B=_xA4HyH8)g zhJ&<{31iX{^9ca{6f)M9l$4aJ?*M!a$rW6V*Do^%b=s*@jZ1K~TP3i)a*|b~@2{G1 zO`0Aef9}e5v^hanbujC5Zub_nR^Ij}jlEx=Ykd7OJ6<**5{gSF(aGKbFbwU6CJ=l7 z$6}xcx)XZh^I4(PxUc5z&a56lJ=s%2=^8m(0EB=`LGiBd=1;eM4Gt(y&uOo`JG;AE z02Bll)L~#`%q;`bhlG5FMH>FrCQg6h8zAwh{ex~2osR(+LxcjOgq_^0?dLr^p=HUT z>5F^dL*>qC?7ivx2hU<724zy-Thj?pbxfRXRDgmb78~*x1`%*JM}V`tP@9>J?U~LS zd0cNMY4^;1qt~a?W=V^Si`~8#OH{x|@c=jFl^qArxaPUO11~N7=+DtnVPy(a)_JfK zc&gUtYj10<&kHn5(k6Yt;0}J2B;xH^ak;p(l()5lv0{Aj$FU$K)N!F^6@37q%srzR zn|FA=nDfMO5oTTF#t=$(-+#n0* zL6z?SRuKpAAOi%r**3gI)!J?H7mBB;&Ln%pD*yu5u#YN(wQ?VqiSo;vP7Yx-EF{ zH8KENZ8%wO1(&FopK2XEM{-p8Vb+c3>(jXPfe8 zGi%fVp_7lF?Ec>wnLPhJyvyFr;kdj65rtg8UxP+`#f#Ctbe+2$h|KdOD z3Rlt>-ZSWXY5i>)N5Qsrs0!cDSHeg$NXIPm7nYIAt3hph_~xXPF1pC}{kdL;4F;Vm<-&V^AGClC4JY3tz%u_wt?}Yd)wV}#MsC(=jHB33OnMQi{)Y!C_?BlFN z2?;+BZVg^uGDU)=Z#1qOdi;J8{R4CW`5b3&kqP zlrRb%NogPryz2@)903F1<~|kL^UwzM26klJ&6f>_6$2_-i0XUT!WPbn@x$&rX;IN7 zSj?Q2lFiezzl0NV%D+g3szw()dq(mo(uI^6x~=_wwfG3l=lRsT{Ye&rR*Bma!K7UB zdg#1aw3rKM-m60&OA}NY8L%2$8n{Jf?zH|cRF9-76+Ht%4vJiw%r9f~wvCFD( z6D=ZVNx^G^#B*>c{^553PQD-&lgB4xpB&#s+;uh`mJteCwH_zgAs1vt4~i)pR+L>pD@NRA;H0lk1*QPeG|H3cq4&&UxRY|~dg>_gjiliiMSsbMI0zvaH=A}) zpKQw~0Z|I{(WyOWy=1>kDwYy=Hx%B-{}oWssA-zoHXHq{IhEHpkCkCzq=wgsA&P8nK1 z7nm|XczgTp=f!C4o-j$YhulSQgWj`(&X;ngmD`8wQ+#adqn8u{q`1Zt@i%P0)C@zb z&Q4xY!Et(e3?=Xc0!L5igD%a4?!+pvFA8_A+{Bg~p8y@|hDjtN3?j?*S_%9@+eM(9@_E0yz+SI?1G zjk@p8?lww#jBA9^df$uc0rBhLY9ZzUKY}M1#5?6RC|?OVJb8MDbR)dSJ{d=2H;dSk zv&nAD?%AEfkzVqx*dUnDaHuImq~U>AGkP0UzC>UzOWAM&?Uaqs**&e~%G(SwLpefs z-ME}R3M9SWsz*y)sN0@56m~lXa)v;5-|UeP&WECI&stu?+ zeyud2>2&(+vxiTGenIH#Smn-WooH?lZ)j(|=e|;=X%sE1Ol0fN`Po%F<#u1Tqb_m3 zkN9^z;CTWMFjqxMYZvdDnuhf9kdp>a{E~n8aYLu`#Qysr5*oGjgFMMEG{<}* z+eqe<-b>udOb&^W>KD(t!aJ5z8y2Pt`F>w0Qq*B`msvefK%B@+#0BeO-bC8bmcFnl zKhNIZ9Z_D^P){4Om2Uo}e%7ES{x~<%@+v;GuUl+)h9{D0@yZaR&OpDrjsdf*YJ-an zc2a7F{_GE6JbWtY>Fu=lK&dQvO}VolP1n+06P)kf#!Jwtq_2YTs-jWzpjdtL#D8Pq z-i*ou^pg5s(y{s?lJ;>(hnLs`z1Z9|N$Jo-W^dg?#r`7saUJ4_;+L~z&T zx?bVmWhq+79FZ94&i`hc(hEx-`^`iHePQ{&{=~xzyaXr47i4y9Urs89IklDsU#v|9 zepVa4I}1WH&yQ%6b7+1LCD0Sws#0zrk_^~F@#F=(JCY`uL(Bgl+Nx}n0o zvUY?P#@zA?#uT7u?m9n;{gFnMKDr2A?z4s{Z!aD*#?_?=dNK0?)@1^vnj!aVRf%&B zmNcD{b(`m1qY6HWDu_DOrk-?J4ce1Q6SRomKQqQ0clGN&t&li5k4iA-X%xk2W_oeq ze92`UFG6HYo7JU=tr8)4tE}~am{*6YZ2c|Doj3yiI}^t88qQb2n!(38r}{nd^pdG812Fa=SBEvTF?0 zRkaL0=fC{`k*fJADm+t+O-gKs61p3;D9zt;u9H&vka8xyn8WK4Q9!K8T82+IHwG+O zuYg;`g|E^Z&paBVN@D!+)TflnTX&|uzR>P9mHQ@0>bUm!*Y=NlnhkE`L^kHAqcl&v z`IPl7!~Geetl2!9xb9E%#cD2_QFIiZ+`VS&O^%^Cl`knZBua`Ec_LFKxev6D!+-jl zC2`Kg)Ve)Y7J|_L- zf?$9s#bwlTHvqJYlQzR(NQ5l&sOjnNen7>Ht{4^YJjfA5*9TTEa39bs)&r$F_2b9) zRk9Tjy)9!8K(L6*;-hm@+J1JN!4C;(mJ_cvomb5ELX>`eWcdDaPKxcskoVP2G-k%X zYES@}yBgd+!{m5z(5`v6(?$3CWC=SqE^dvFV+q*z!giXjBfwQGRZiK*RK#};40O;% z3i%JFOPZV=td+*=HiNtle}LOggHPjrc{paa1qZ?)j&hA;fpi1=n*Yys?l2tiA@rM< zyJEm_?Vo-wNxiMm2?U6hTdQptn^oX-&_wrt{!9`?Us!pxAh(CJDS(t28UCYC+K_3Z zqoF}T5>0?u9}^pUt8?s-ByzG^8QD|hh|D^C*dksL0OLFot@_j7Nr?DEU3SXAlt|!< zuoUrp`-O)`&6j$GBwkD~9**;Z%UvXI&(skkC(mEzkx+D{W`CTI0diVJ7zxZv)h`=E zP`&{?vb!4RIS=DuBX^Mc;Y zV!<#L7&UK>4{m#{Lpwc!dp?Ta-uV4H%bt8YQy3tmX=!N=z+&b{0v`GHa{`!fD-fVb zo*!)iCFsoJvK)^?g}Z|jBl}>7EN4RirLgCGNe3l(7oG#~;LLI-KNJAg>zm<~PB(K? z;F5v zs(=^uqfOt~g_E#uhtZOBeC-AeDY0t|x&r zp<+~JwwN_8K<#2M5X`G@zS{iL=!@6WtE#H>Qd;jyzN>tjHIUu!0G^K62{5%~*#YQI z_wKHPmdPVY1ZS4F1FQnIkO(`X+B#T7B8((;wv1skr!+o2EBzWI*uiC;Z4uVPf1duk zm-;t_)r^C(rlv+pRyIZlPAZ|-)=+SLHrB-Dv@G?^cKmgv_CTTpiNInmBA>2MPSgXzmz2nFm=aFE-Jt=R7c?Nfr^(u% z@s3yv3!^pOaa~A&n(frNM;JiY!Q{Dc30cjJCD+#r*-lpvrrJp2MLBB$CzYd}xgu$8 zOrWX?PQ=5*8#zJ(uau;_4a=Q>5J+{a3Rsnh6sKWGxsF$l4|N^p9g?MJNTgyfOBGevb*3qrzpG3bRkWT z6iC%#kw#XAc7Ko}Pll?wiKg^dQ1I9__RzJ#1zAio57s$^;mW9W!N2w@1+ zuYxXsPLP*(&!zxjy?0`L$WqV6dmC)k&9X82vF!2ABmV7x0f+Rg(HX_>*gG$o+w0fa z5j2JIRJ-AP!yu=&VP64To~~K5&A-Sp|I%gtOQOlTREHs#D1@n3>(XqI@{ZAlT|=XW z1b>XIS{o39Y+x`)5`iPq31flQmOn>@3jiKrCgVGbz4?6|d-$3cvv^=@#TGfZ<$o^1 z_V@Swk1cko>hdH1kNO?g)y1OCyoT2so?()9H&@aFU)-};OVRuT*FLFugFbU-)OXaS z!X2$}|Ic0%`xKXnHie+;k>q0ZH6Rv%4YU34>JnQ#Q(nF+v};H_VO)bw%$Xa>Hz~k# zW?*JkU1KCxVf;p;0P9{{Ha z;Ol`9OLSs3$iO#YTrx5ioqQE#Wq(i?q0nOD)Nc|@$xLRZ^v}C^mw&M@TmS6H3{o#dg#O!`>A&B>C%o^1I>b_5z?Ms( z9)H-87kNpGq<$7?SAfNV-%;W_=X2Nffok>|h>5PWEs4;~%CVcOgt{}|=6=%w$R>an za#zD6-Sj^vzR5x7pwtyD>HSDbNV*PLmv+N{KjWZN*f`E^f3zMy-MF`8y`-FK!LS{Y0{pq1Ml? z5PMQ`3IURLu#v(!_o`h9Wf{D09;0V)7AUgi2mc6sC6oOvf5A_+1}A&2ZCi3+)dDZN z%%AqYy;=2BGYN$)#g4@UiTM&NClLIxxBOJ4#C;1TIr?0;l#ps}sziH^Cr&_XzX#*U zH^Qjf@!1<8jFg=O7jp_7-j<88=RZfQ4m%hZY5pI|-a0I*wr%@X@e)xQrMp{@mQuPy zy1R2|q?GOfq*J=PTj}l`y1Qejfp4MLb>H{%y!ZQk+s7YkbK3@IF>B7X&Lj5ycLblD z1g}DWes?)JC_T2Q{?0+P7jC@DtUt?qK{w<{1kZ2OINg-8>ty9Lbd>F0tTV}l7k*Z; zkzly3BMsujArsQt%NOHk+#48y@;>VgF!EbfJ+(LILF~3p4gGdvK^qF5)Z{4$?wx*o zp4Gnx9`j1pqTO}a9oTVO7Zy!U__+D`X(yYAR~$-7SqfJqo8mk(D@XCo`Fsu1*N8eL z*XTO;Zag0*Zl6}BO|1O-bTX4KzHA+^q-fR3)|^UBz*Y*6e?@|`<&&<}z)J@rCU_0m{uDL=roL@_GU>JS=!nMMLboZeW0Jed z`lx8naq~i=fc@>|+Iy+A>-pI&S7}&X zT-S=cPPI4)Q)9^!SGFZ3K!$~5Iro7! zcmGBlO(}FF4=vHt;tQ|503=U(OvW8Hit_RJwF}97lwpbW!fZL!7rqGvuOa_26I9aG z){X)%x?UG$eB)fg2sgYv|6d|ooNcUx60SK(nyB+@dgor{nbmMHr>`_*rBgFSejR!*nHXsGyeD%+pr(X!#wMP_z3qXjGz{^C@~(MkLo zD26K86A1N3!BTA|)YRr`BIKxf4 zKlVM!-l{WA@22kgXsF!WO3N17+uW>0?k(NErecY6Ajk;ZmS|iVNMJ$j{8?sYQC^Dz zXKxjY`OjhMjoU2~)3mV}v(w3{u%e=(sutovwVJ~ILHj5p9{3FF;#O;93Qtk-&O0p@ zAMV5ROc(*gqae;{`;KEHB)mjmlieew1trtN+=W;A+Mb0yaN2#7=G;1cf4+{+yDg@h zqW^gCDa)-+ghwjJc+MN(ym54=wuSL?Tj%d)uf)yvY+K)17Z>oOxGHkmRF&$wShrMt z{5X>-fym$GKR7uzY%L|)Ca-I%`Yv<2!6BKg^Jg8lVsh&b{;rU%QT=0!t7CBrXAkaI zMq>R`XR&smLQBwk z2kV3{|IlO;+WoU?F;QQ)WH3?RhUmp6gr4D_LlMp8r5^CY*yF3e5C8pF_RT$OSb^&* z{eNC?pEInXq(KHol|O$^=pLZgFa(pil`DuxkK}MA?pc^Siq3iVJvi%adCt8{9thx^;z7iKcaA{nS`^{uA}goX z$JA=KuMQO}c5*!-_yspAn=h^Uz^`Uti>bka9uvDYa-?_W?9~FxlV6(bvllA{c?NN# zUf%HV1V5}C(4{c4~JuU6-w|Da6TZ9ZSe+|<;(ytzsF_~-yOjr4jIdsg!avB#*i zR>IFkzsC}f)$|7+#JoG4V0$9}`+UXUoq8bf#KCK6UrU!I)<0G4Xu6KIEKgo3eRp_x z2(&vp!tVapekcSu{fviG88nK{fap5oKX*iyip}L3ZP50^!|Cztcx}H#rVGAC5E?YJ zOGPgv0(woX32EmkXAN7b)KR)nVIX8{TBOK5o}8J&E?>uSSH9xA-=qPr2~g%NU6QYI zcj>mrz8uUF@}CZc9K(}J8_&Mozg`T^)*vjTaBoY|lXu}@L??0XdljSlYLmGmzw#A7 zqTqP10@Y|12%|pR6oNFYnB*(gwLB;0o`B~Uz-#DujS~1-KjJ;jU)=gWtZ`O&;R*v2 zx5ru)6^UKjm-8%jt?9i`r<>ZVwaF6mg`sP3`gB$C_6K{ombcR$bmtz>?u_O%Jvqth zR{`JegOFDWEw1@qy?;T;&)wAxIZ^)ZqBsiZQTqpm)&rL`9<6d6xBs)f^_Y^CV1n1z zH?Vo#5hm!MJwG>{n=4u8e@Dk<4T1Kdu}2qZqA59qX`n?w)eL<9=3) zp+*<8UUAJoTHRb!(f8C+3TO*-Zd5Y|%J+qGnB)obfP+Fhh$(bFu+!mKfcIKg3(Oo! z?LtGC@~)q{-w#-bIXN8eo)8m$UiGx>6}cmy>g2tLYq?SF)d)EEt>-o)$oJej3G`4x za4=_Gjh(dBzvxJ#ik?4z2Qy+cPT|Rx)tp;&os}GTd~}yM0|C`OP`X1&{t^DO)ARGK z*w#0r*GyhiBaWXRB%wy?1`i_SrAmZUBE%xv?>`)7gUm;D_;CGBys*eT($>xe*KhPu#+(3C>VHTe1P9zK*Q7Zj6jDiN9;yol6>(O*FsR)_dEl#551JZPEU z^J|8)ES0+hm{i3HA1bfmDL&odZ;uo4dKhVFSxmhBzD8<$J8DRt+xNjBtTDs+>R{JZ zlq&IB2LIvd>rLA3dG|M|JA)_6cGj7q;ayfpHtjq7vVeeyH1E4nFw}piR0f#;>Il#j zBNuiv_X_*V^o*(YXM#A7#on}N;RKbi58}3B z;I+==Ya8E<_*Bog&u)^OV+E~3I}7p)NsJ7B`2$rnK117jr>CN8DX|h$#h6OqmIGNO!tp7S9JS|27N{M=K`Tr zv+qg6CoOpj`nG1wSIQr$*IIi(Ov5E);E;U$mnY=nFG?t9NRb-ZvEdTc$-3n0vVOAX zqZX%S24PWE5KfH!*`wCa?^s$q9MbwVjoqnk_@SYvbr@#~RdI~DUOWWjnFVn;rGp=3 zv=%YuKyQqjN8fTbU}J11YRjaAcZzhs-&){GG*IY=z_Dq2du+A)pjO!D+SO!^JVf@x z*XCer((Z6x#m!$=;F1~c(jyj_JzYv7`nc}wdS$2goY4FS`SvN>DhCaT>%Eq{+A+f- zQt|bBJy4PHn!M5&=qsEqaDO_a09B&jRX73_hLCAc@i&%Ez##0{{!cNW;qwV<+$$=t z$WR|ql#EdZh@?nKx66e8@3ii*-Z^Zba#k7r`+ueVT_OVB*AVXSs`_fHYd;7Mq@4daP{oX8#UF{TRNRjkB=G$qsPL#609q1GV*P|1cT%$ z;CKP*CV(;M@$vYWJy`>u_FX&9aMDTtkRUyM#c|4I`l*R!K0F3EprR~fhjJhrIZHAg>z*{+X3 zFF9@Pk`@kpE<2%rcK+2sKYc#}Zl@nWc?WQYI9BTxKc?vZXw!kc254uS8Wo*(LsdU3 z$wW0vH#26RVKq(tQ^Emi*#AE>+WHTxAIu<<@n=JB6;pPOF(IJ;k%r>UyR3zom#YAR zrgfINKSk7UC%++P_K)HI^5clCkY*kpp8tH=j&Jq-&#Y*27uK>P==VU)5a-u6i1{2OgH0(gS%7|v}>=Sqr;ND4H7M|H9c-&j}ZFKo%a zUH5A?$NV>HA<@(7(b+uT*)*^c`3b9~eudV*j;!J%GP3hRe-+8cf@yYr6NDkbJ|wzd z;J#h^m`~@i1MgJQ@IHDyi;Q6|0`tpi_%|P>o;+VCsQj+SNO5V6X9PI+UXro@oDDy- zdn72Hvo|Z$1N}biRryLQ3$u=RQ9}GqjO87AuQqI?Uxj~Mr}7Xs;%Y)VcF8R8xD?~s zJ7TuYxg&knuX{ONw5>C7?rwdFJMx}ihlqzHrni$pZX&`lWsDUMfDRo%a|$D>oLCoc$`GCj5AgO`x8d@nJ+t zT-UMBfL$WKF2lAk>gO%|C#n}iVJ?eHuSu>gPS#|!6{Uyv&K{s#l;LTCKt^f=EU{yt z8aN5{SE5q}2F*MwmwU{OdUVo!ug5Q-4kClHB2$qW=Fo2iGFt|MtL_8wq|lW5=R0np zmp!uW@ha%i=Q83an6mPhYJv0?7|ml%=B1IbS`It+V-W4kqL;IUak`5G)E5>P(A?eD z#l_dEvMJQ^_eXFCxHE65`()bD+xMgszFpI(QNQn-1HPGY!pz9F>T(GUbi0DfxTO$| z4p$nObXpLF#hKg}dG^9}-uA*Xc_&?rs8ti);8~BtrGASat+~_Z@r+)K1;IR)0Qtx( zu14a6O|*((5@4G=%Kz>|M9^siNY)d!rQ+G!^_F z1S}6paL~h*cqX%FFRo&BH}LGs-Am^?mt8Q?7vqDn_Ro%y2ttCscadgofQnM^e0+;Z z^A+Yx+B-(mj}=mHE--G-eRRk?zEjXfXE|sO@Q`mbWX_Fa6lfd31So<&hs#U*n|}!l z7RVY*`{t+7w|q82d~rX4ka_bHtFg>(MUz~o54l)D-oLF_Tuh3_*97Y6Qf3}q{_MJN zOTVivX2#wE#aC8N`)J47b}98M&e?dxJ9zuV>Vp?v6odCPDqVRJB&QY8e7CzJ%FT;4 z&((IJ`glXNI|1c=Ct#$@u9I`uz-xL*Gq%V|{4*@W^bFV&Upf%(*d^t@L_z>`dd7~Z z#Au6DalikQdOpgX`+(NeK{%$fBb?`=KTo*SV@5q02yE?dX)lXJS22IgQB#QT=8~&g z!A7OUU*v`z(A%k#8TH(Mc&e8D!MF82TDyzNu;yI zYQ_-)?;`^4{P7Xw?s%Ed0kP%?_9uN7=o=y%Xok{p8m>oCn1Ou&+6CUZ-*I-PJ zpdbfKJO8yq>H2tw1BoSCs3ED!K&Td$bTtmszy(@quIh7@6z8ok{!d|9P1B zx#MJbs_X8T4DbmoB-^dbs`7M3R6H+nxA1&^1rPfQ_Q}d$=edX8M^Vvg?X(feI z3VQ}=QKVZbzEW8n6^1&opd!sv$a>)aLpzmP>$?wZ_tzI%aa|M&`@uHC$oWFrh+2DI z36Gl}_8KRX*)x?M-%qiIb70_) zd!PIvC##b$3{+_>O7YQ&XI`>c~`CCOrzfNHIFSic^QH#?n$f zDU`xKPPf^z0U!9NutwyczA7Do1|K%xjcGH|p$|ssgIc8JL2cxO5?qeyeq+kspK+r6 z?-!z@SyA?!`^raxVKbHaZ}=AOehgR2rkmCRFf#&^Q|Vi7@AqiSn%Vr0I^wRijpBT4 zrt_*DCC}bsozKOVZ)y%@?pK}KHlCi5un*=h$yxO)x2OmW8B#|p4J0g!r$r*Naq8q+T z3!qt}((l`2iCL5A0yoBFsc(VV?XU{j4*Y*TY`+-3i@9QA*0A@yan)ic$yevu)LSu+ z^ft-tVA`gpWZ2ycYGb(Rce#KD-H>g2wjY;`C2aF>AiW+ukE@d3S5P!z!PRhNj9b%| z!Ynop z3WN@1YsaIaL<#RQW1h>l)>`4RDN|`e>}Lijy5CZ8Qs4k^;qFp4uY5+70Di=c_s1e~&HL=$7FiNvf>EaJGtILjG%B^$D)rF{K}ta-^Dgs{ zMEm>ze|^#-gTCQ_8P+X_{F}2Z1>mazehgFprF-DF8tjPQ>Ry=zJ#=IRDHtA9?*L`m zkycqRArTRMKzI#cL?6i!kQ%EHwBfLi>vWM7HBLbM>E9iRcxQ14KE`81S`mTPEAMLr zB~*^d%~0T1PWVKpFZ&&!J45|OBW5rx5W1!&u}R;FiCgEVcTpgNQfskrkiXXWA79qjw{7l zqDv>e5(+GbB?eLoll#dqm~8U+ad9vGR^}1AzlS{?5B)Ap*3GVWe@@YJB0uDnXm@|u z=Sl}l3`yYx7s;CFU;j#d>1Fifu3#t=b*H@iDqrg*q)1w{bH)|BL?IVLImR*-oHyJT zZ4jS@?=u>|G3%by%z=@Fi`0D;NO-Iq*Paj*qqLMHDYcf^`UTOrWcORSy}zJI{K9pH z9e$;LWO8XCWH`~D=8h4wydTB{`bB(|fTzwI;ZI{z+~M=?-OtQLua$E%kQFnqdyGz& z8%a_=_DRr&`F(=WzW-Knx zA7|>wewwk*tQxTMq$?FF|8_}V9?gM&GJZoA*Cf*p{x~qlTrq{N&y|c#KW~TOAdC2M zxDhYIatW+jzw(9$Z;R}~DRW(nKHyB|Sp|;+_OX!c6>Us5e2t#M4dpr;i;Ss}{s#XO zgWIdN!fc`@>DUhDw7T8z%YPA-2x(7RDE@HSdr`C)ACUB{TYvRsN)u7-jYZwjn;;!z zcQ|;Gyb!S6KsNRKH3qx87wQ&|r2H4~il(KQCP{2aLO%I7zheUYFf(wlr2B#3JAX;^C0Wvdc`%HFVf z*!(4W*Yfi6ZV?~>|2GLmZ*Tu(hvQgP9Me_`)bKa1VhzA!DWCXScQ{Dl&tT@(kn7&h z4@X=kMUe|5i$<_-eLjLBrtzT(LY_7%4|X@zpOy2RaVB2khTvd?it2fcGLSyM?*^FZIIuJDo6k=KPqvJ&va=T`$si%8|t0 zKz$jd+C8rfda`yVqm)0j<`iatPfeo+Li+t0gN{1+qj~L=X_rD=<6A8;!a0!IW~Ql3 zMfDig7oDEu$m04UznxXh=pfgdWMp+WMW;kMB!)7Tt!lcvkB(QOa^a#P4hTan}i3_%Jix#MGu=RovDXM+16^H1rm^)0iLP~kB(|eJH?|Q zv#Y$cSrV~^@V6yl!uzSj9n#zBDUml-QN*H@87uuZdUB1str~Z)%K%Y}WA-ZZmvvL} zf9Kn+#9XVIjM@{!8b~toQBhhUV600j%F z4bUdeIoZi~rw^p=RyY&=r89$ZdVzLG&!*(YZ8-G!vb;HEd#r6_;QAD1RN-i zGub1NfY#p+Ot%zHy(KE9KVDoWLZKm(yZ*Jv_~e)17nchxK^R<=eUcr1;)=)=sCn%Z+%?&3=7hG#Y5=+c>hoO~!M;eMHwvm2@&H>jVdnq*MU!l#l zSR|{{J@8=Ne$5V>SR=sO4_n(gLp@WA9V@W4fqQ64rCum|?MgY#7I(1VCw(j`C(0Ff zbwW?x#Ec<6yS0KxyZRoJgaK@DFpo{H*jQWhd=HE6meAV&M{CHftxXOQI zL!XC)do@?4nO~-6^Xr3?g*8jxaA|Nny-yjvbSl^K-!H|8P%03-qQhY35zEDIMQ%>T z0fS^&1*cZYEkERVrYi;pJFPJpI8ZlS_jBfNC4^bs7Ns5cRoIgh%+8)x0_l2Wd(FLH zV9$r&7ecdRr9EJSr8~%t4EYzYHz;R6vC;gyT_;>l?bB3x)6P#C&H7ug?3qPHFQC_ z32TnfgPQCbh~A7ELUF}q8hM5)~w#=CQtk<45fFUx;rZMaFnui%`oUcC4e zfNyv(N(m-_Bn=2HPT*NZ2f!$D&*v~JS2Y98Z2{5gMe|DgUqrx2jz3m$0JDKGbied) z>$M9nvE}?CyE`U;(fNm8f@6AO^&3gc^_2-Tm{ajkYPg~ zX3*~J!gG%Br;H1ZtX5eBG{mF7wRcId+e@-CNn%nmGG@0+O8|v%;(_+s7@Wj}%%X47 z1ECv6JF%tshuxnL65wLv_5g!!#4ZA(5(Af)b*lgb!IY}Wd>%+lD>WDv0L_#q8@I4y zPyn>{bt&_~ex>A3GL7{tRr*3N-JU#oza}p9Nl`Yt=9w$a8ncbnOG-xU=ltL0r=!Bo zP%pTcc#KKE%$KaIX<+F;W&|na+fIcunTT9Lr3RigMEzP;6tT}UW&5P{+3Qwu@nRf`6oojD%^Fav>;Wck>TwMeZeAlU5IG9+?ZX+kTCt;2Cc>Cv)^PaCU?R{NLn`jBXWUG z#WQHMy?eQ{7tLjBQ0*VNV&v;vz@dG7IcKxR|8NbKhW-SwWZ2q^+P~}h>GrZ-QH-W?QNB9k(Agb)KR8kpavGtL zC)6!whFnqGvqjrKBs>luiEsj+zo|WFb?<{2Sv^ntcC|NwDvabS zPyyP)fAKdE$x6_^cav@o)*3#_&(9yq>KpN3nHF%MS#^LUvHqy?pH8>xI zM?^#vjQY_zGup9^cs=R5Jn>VJX-=);p}t;-_~+9_YN>?7}`3YdzOo1pEirlHyYm^5)n< zRZbmB6rxgIfGsSLgDESs?nHr}gardZ!`k~W=;^j=ZEl4INsX0eh_qWG4NSJdp~+iy z-0_Zwf(_pNg$P*#So1~q$N!Og1s@_?w&$En_gJt$8P`Vkv+>9tT18XYc*!v=I$^>k z@r?VW58+AVi6&Sf43~_*wGtns1Z~={zdK-rwR+XqT`pl+0059jOmIMK=4xbelO_Qu zh4p}9z;%mP&7!`cuQR@G>e0d4q14X_I>4Mk((!^-Tb8GYX%|a>9Zusf^|X=RvjApL zU-((mjCsz^7jA}`;#(q5F3-G zfIFaW@5S9yb7Q37{vKJyL%`MjH6jj6SC0F{(TKWl@#}eYQW;I_^W$^>))FiM!lS?V zLBgOI^z|%q5;LptQz>n2_sq|=lt_iOmI5tfxhAjq9bUftWGee^-HXuAx3V3LBON|* zHoA^B+^X$vM>1j!BiKygMV>f0V=U>>?c_{EjE|*jljr@y2wfJI1H*cUq!MjJF6A^s z0i$b44l4>?%i`BGyUKSd?Qnh9@H@*4jg^!jrL}rCq+T@9z(0mI-TA=*0;-f9^%7+%!cC{hD-;FQ)w*Vgxv!DMZm=PpXZ;>2^`3|xfuvppTHYkz*y5f~Pf)HJB;QS4R&UlImC||2gzXiP zw4iu1=vXWR0K2iV&n{og`RX+~f1jzK-v!XWYNjOj;_5%Y?D<7T{q9{HTPzE}Tf6W; z}+j`tFDd6asF$Kt4nLv~8Wi$;IYdk9o8Uh1A&nyy` z6ALl^Ko*6cnUpLQmm=vDsl zuJmj2&^LDj({nCgzIyc;Lj{C?@(^Asq3L$9O98C_=#Z2pC4NDB6w~du0c?Pdn-8ot zIQ;pME~n(lm&^vLhAli6u1jc0L1Rp2~DkK)%JVZik8o7Wzodt`|5+xC*l?(aLfw4?)!V&Ym% zab5^oxOFzzEmU~)lRUo9ddBW#VJ@cIBPHl@S`pBr?5__jtu@J+f;`%YRCx7LxSbh+ zJW@fa<2_dnuraAl@_F95RR7l7Uqr#dBb(l!8vzde3MD#9${a`w&^M~Mhyu7Pg%D4G zp%+~o=YD^^HF??id5iRhX<>TG9u3+MJe$+s*Jp?nX%Gl~|IX&!{Hkln-^m(arPAw& zLMQ#k9u3$p`eG$~G_lWGr}rW29bFTDiL z^YT`$B4N0_Q<5D-5>n8ApK!Lpv9LigQuWXWpq+I&{H(#tj$|cY(bbfy52e}DG1udaa-jG6#YI@OgE`H|O{qsM@($M)bbLo%2C(ATV_$0&V(jp$c)C$&aFDyQ}+jqrh$eAP@j}p+0M2?tHm- z@A{1fTsuy0$L6vme*yDA6=`KspVCeOP@mOy8*#gVdm-P+j)#&e4G$)}(Nq9b&O#7A z`LJx)uQQ-Hkljjd;Mw;H9{iR4Yi%jeyfqK;nnpzgV+Y8k0ijpF_vl9kKq?~G*WX`m zaEttRE58`8!?C?<8X2#~isAn%aqQ~gRa$Luwg~xF&u$Ui?7^8>*wOx9gp~iOwWQz4 zWQu)XV-@?n^(vQFYRP1<*%Bp`IauLLZ5(zwe^*2EwPs6uF^7s(|Lsf2s+8B3vc^SzK~ zi6iy^JBde*6~B&Qr!el8jHvvAU@U`mEAuP#%FvL2nQz!VE6Cve8RW+8%ea&X_?X`A|RUvaY7m{)xK-pd5lBEu^9N;Npw0`+8 zf+o@0=Sk*Zs#*6`yfV79_M)$>lA=fB``3=auSef`M{ClHRKhv-#;2LjTIXzAr1>vg zx?i}hx!mw{xW{H!(az8PY%Qgd;Mf;P?R6Y9a&y+hxI>#571aUpyhgAY5c+)SdgUKn z7b+~)zoyE~@d80(axpYo7p8Bt)INxM?o1(*>HWWo5^Q=fz>|gc_H8y$Z4(lzezf>I zFj%Z3@$1;I%~~!myzsR0Sl&Ta+@H-N51<$cOZE>MKKGVsZe@LAkeN$T1wxK$nV^zG zYQ7uk(tw%6c=MgV2xyWk{=bwZ^bUHA9POT~gaUnDtW2hNYn*p4WZHdO_;xK2jAqTm zWO0b}@tFeA|$DMg_px=l%t3yRx zs2FgpLaFZ(A;aZK@P(I!a4pr;zo=7u#z6`ukdONIpi8f7Th8Gu4)l4L1#j+B>yW3g za$mDV$KTfx*c%?vt+to@YO?}D)96Q-i-3!xgQY#~A9Ye>fBw(=WLAol*PlumDJw6h zpu%9$yRXUg`=jJG>WkkDm<^_Ex225#63Of;vn15z^5z!T=>p0U9a-&*S^>m2VK^_3 z)qgdJBzI}0cjD+Zo%+&+QlqTe^f)-0;C`mVuinz|`*h#cnG1Cogd>}(tT=P{T zFB5V&FrO(SxyQWWsIrKQ%xP>SIrbE#>{PHuKI(9e^eXK zI!(}_zmm9WooV(L{(}uOled^;;oozRKKc}kyF9!e?>G8)n>A({VxSrRL&~tOp5k;- zgJ@f5wV55yZJi;H;DDmc1Q;j;;pWu|mTlBT`;ao>> z15V9gBmF$1+MYqfiP5XzR+|VB;So=rP^SGC0Ig9fbwcg`sn);PyVNnwElA`Y5D)+$ z5ly(TM9)7t6hB4>4$bA{ICOL!{=)LuXRAU&okQ(S!($Ozh%V0ODo451evLLS{rPr6 z#(+-0s)A|N9T13)UAm&gW(A&T!H>8caGT(0zNQu=Mx>`hkhZ;yu>GUI8BXoC=Iq99$8JXv+pq%tS67c=D3%CG5*X+ zaf`nDfVXGQJ6frgBpG+ZekQ`P@rmR8kQ9GK=-~@l*y0ooze%+1>$jY_z1{TOaU}pE z?-MYTFVS~$%1w2Ae0;K$gE3b|snvm-j!x3*7MST;c*$+M{ME8qD3lWyf@B0h%z;P= z*#DJ*%wOc<9WpK{8plFuj(AQH7uM)+P%>}aLSrYz6JRIcdwhOOH{dN?h|l@i@8*c1 z&Rqr22C02uzq7RC0D6*^H+(3^lfP6_dc;6JQr88s<}_WujwHXa6O2rCE7;>${iz0^ zvk)~ftRDJAPzgjE^oyS2wvTbA9-Hl<7?z608jn%<*)^H5bQ9BhVgwt;%q+E9py=8Y zj#YRHq{|XHSX($qSLLGI2{|vBkSvj#6aWgR0cQF5*6YtUv1b0p5*4BI0u&!aBS9Xq}Y!wVZDl6R*@VLkUoI)T0C~y*d zL?ik zlli^0iuE`$BMAi{KRtvyG_q#$NuLIr4BkqlE@o_Cy>^r~O27aB>fMs?LJxJ-frbcY{_nm}972*k6S z_UU9gschwr!E|!{+43l2m)g4#xfo9E zJaUHr@z7lRjOvnBrxD(h_jZktE7(Q5U8p{#Xj@Yt@LGq2m+zM#>`GOz)5X2iWvjXj$B^~eVj z4~_E8s|y+3QuJ|NE4STYjEk7Fdn6ow%b$m&DDzW!0z|{It!?F$wQC&+Hs||ZC>^P> z$^9^C>#|!uHXsPKgqhJzm1=-Z(mXH$W^0_fP4U2h)P-kXo%8BQrU?og^X(d#-*9hZ z!RrBbd=lA@Lj&w5J^&e@@aV#S49Ew~+zpMvLtVRi_%mRUU*1At0A+Wn z(6xws96of}A8qaZ zQVr$V#F}MhDWPiM<-)(G?(|pMu~V$VX$XrC4|+I;w^P<{`O=hR+hm5?)x!75t;t(+ zTuJj3-{B$KFjoQ?b)+(6FUGAqU2xs!I@o36ij->N)L&xFq+;`g)A zv>5k$Rw#NE&dG~5AL*l%%2Q3v2(f}kfG;pcB_AQ10pM7Hj+&w760n=eRuJhdhSg*8 zH|a@w%}RkTA=sGC3Xm0RwCw;moywf-xmEa%XGXliK|MB>Xi7-@)2WRK8-HXtc)bYu zo$NcvCs${H%DR-E|9S!I3pkKk97xEdEG%qM^Gij6Mpu7XT@nD*?*m{xBWXwdDh^`ekJf5nfK3-37|`6U zOTfJP0fR0r-XDAu)LCgsCL(B3g8S8s$ge=sR!uUrPDU*m5XkTem?9Bu>j(xMJBJ=N zx9ZbIPp1VXP{5dMe1}Zcm_1+txv3p^g0QgNLHmy3f4O>F-?dHhVTpGBS7UD|kiR%B z(6{So%71wy^Uf3+10_vmmF$@iVn*wA-Sw(slbo|Th;faC-x zv*axvn?1r9G@hO{CM~BX`+!d2Ml9knFX_||Vt{Q&aOtnx55%ixC5g95un((1Vu|OX zs`J9433^2!CM=U@a$piZ1UxD5w1|;tMMP6i-ch}=K8Y$S3#>kuP&$=&bZVXfzP47l*6CWcQDFdI2Ws7Tz%CV%=)b%;wX`H*`1-NO4$#_K z9`0{M|NIkRIj5-YYN{i;~L@%8C3sOp8kiqRQ=#>P$y9eVKa=ffI?;LL+A$5mr zeNKV}0#NFMd+zjc4ma++pk#fEB2Xdf@S?jJ?Y%OWKZ4KbATPXl-^q}UO;bq~(yMXi zhp^}SrAs()l++%wxWU@eArVFADOCzZ91Lo2E45TxTo~pBMW|0+{qnIo`r4>ji`&3n z*S;U~W6)MqLpIvFr#(hY%cl82nGJ;W1;C}FP6E06MZ3R6;9u=E#ebZP|CxaQV|I+M z11f9})>h1aXUC$Itc3a=kHAt{hSs~&kUR6Opn!UI$;agW_u(wjB|cNmi(0QCR@=YSt(HxSl62pQ zK%v#fY!$`x;=%eQ0WaM64V%c2SF2EL?}>UQlS#2%XgW3z>GOrVm=%aW_ z!u{W_9(Ho8?V_bMsQz#Bs3uUn$xshOo4UGkskUX{u@hNszrXk#92`6_r4!N_8I(b{ zJ(BLzpoz$p&**7tz|)XVE;7eX2ln{#X!F)R_I~re*si zkSOANfIy|n9=p&SWBM_@7MLeLnA|)dyc*i@>ulrOII=Y1N`N_6DJh! zw1l;45uYw+>W2rk!s+!N+f^%qtsGyP@dM1@jJ&M`2RCIYY{H#RuHdjF zH%=cC3^FMBN@+*S5txt|YGU!;a!&o9<@Ue4wQB02L2C4!QU+6x-s8u5jcrxpDv5E+ z9T1ehODapeRsS#R4Ol1ttj7P_Mg6b861a6)a&01YZgivmyHfPu>qAJT#&)xBcZ4FN zaG!b}nv{9T5}tK*j5PCqrb@M#p)aPB?xe} zkrKM%7Z_QaVwtISLcr_-W?h@i-f+&KvuN;TPum10ZHzZ47m(iqLNuKFxC{QriL-U# zztv}&-Aerq1S*kbo&ar1nW_-z0|*1Anvrq?(Rolno#Hn732p{9M#xNvNkC0TY z^#ZNMd58BI3h#Nu{1~^}Wl;li1~aH$&(zek`Y41GYdrglkXO#@*^p^oyY;}Ed8SnW zDvs^R_sC938Wyet_Jcy0yJiS5lIW-(XupGYC-MtwEUq>2frfj@^b!`xaur)T;no9f zi+*Tf2EczI%E}J9s8!pmolWAB!>GhPbgBbX`zPl=lvFc!w4dMVGnBOFZ2*HQ8nF^} zG^$zg5EL*o^bPU5oTjziHNxVRTs9@ngX0582&&2a{FXXNo$5KdhF%2>Rr)(>z8*)z zOG0do!}?)=-^#?&h?0>hI3X`=KTy1;9+?z+a+FObv|}L0{k@KG&ewH3?#Xb6-l||< zeb02`Y?+oc0(&!-A4M+w3t{YOS;H_yFKn6!?Dxqhx1b&sCXyhm@`e7EuE+mJ0tiZlFta zbo4R+n3~?FLdP6ODb1BlQ+}t#z9`$&az$)?zrKb+iJqZLFCW;5nfAG@)aGLRe zD!6_r4luJRbH`aP0D{&w>0t^RXToqy0%2q094%q&(*e|ZP%e8yX&4FN(D6~opA^)a zY!&E&XV2VTQ0|+}VZe^q`hM&-t_|4WTsbW<)Rpe>)>Wq#sVGthjqj`66ICSDbo=nt zKB2l?-II1Zp6gV8xjl9|mL*_vR<5UpdwB!xE`x7g3CGyfk-VO5mUk_FyK!h*V?j0V z6F}0DyD4cTyAQ)ny1Ys^@!F^}TnLl4{@F=XyF53(2r>Bh*XguJc#K;T$$CCtog|kg zYYT#j^TSu73fWB8xFJ)s)6WzdQ4tZI*bGFk1@lU;nrQ`P`kuL$9nwSiT(E?&3h?&U z{MY!&3{2p7P*0zzFPgg!3=v)vjnzI)AyR4?y0UM*#lgR4f8A+CB=R$5(?Blq0dCBz z<*%n6aJHfhf~DbiJd}KrfAO2cqBu(~Z%OO=ZUeAKuFX5AUvAG5fO&5?{wVF~x7F z!N0&&ekQ^s>{*m#jZJuMItZd1jujcWBARdY7pC%t?V?TYf&2I=ul4kFl7V%H5-OmQ z(5OP#f?R%V{b7A<_fGhJGe-6LjO&V*3wiDKhPJmdRg4_Vy$;wJ&rS>B^>&&+V_WMMOmW0 zD)_@})m&Hl8Qr1Z#qn{3#?%^K_P_XdDzt=vD_i6g3osg<6XPyqXmOrBBD4Svay4a% zfEgjXd-GHN4P&y0_^9}rW5EFUFC^q*@HT?V6c{Q1lJcBJD}-W4joO>z&auxE4E5HT zBvu&=qLVQ(5MLLte1#w4O6FjU!S0iYu9Chl#?GEq+L<$WEjK3X;=CWK4ZajCtuYpX zNSsAhpNLxCEHSPVpgE_~-qs#`wMMxR8fI)cX03myvRrymG;oE$#UIl0&A8>mmGhp@ z(@!mswQ6ExHmVYT^8cr?a}S4VT?2Ucry8C*=pL5nxf@Srve2$En2X@^b6{?H$IO7RK7GFcPqmLgKW;`4-m>>- zLh5hR1LOljf?IR1Jq~o5b;9 zNx^-kU9F6f-=ss0wH@nKLk)gV~d$%(7OY}3lKYc&OPx62&7S=||W8po2{ z#$ZQVZjg=k?kDHLu}ABFVX6NZoO>>)NN)%zxnRg5IlAI%5JW|-n>oAWRY4Kn-Zhv& zd9QkaA?7$H6tMbB1Xi18{_#HldFYPHD<$kb|519!c&8gBbHugd?TIN{NVu%;!z_Ss zQ=}JJMU=kC5P~JLBceI#vr8nOcbA=ArS29 z&?0Y+PEU7hUlENC>MkZ@Qc_bR&FRgGN&$WeOQ6xJv2-oe<%;!AmAy+d-Z@w@#3HlB)*L@6Zg4ftS`q4j8(9HgCppv4 zDx9lo*5tpprAZU|4I&(tUJ^Nzmc*?Db-_x<+78}}l#2qxWU){48i_rx&2(f-H zCphb_2kQkbmZV?t80hXEwV$B&)(qj3i6NUF|0&ap{uK6NI12|VmU{DEIYg7nHhzncBWxr4tcWbGEtAC*ZQ=0{ z2g9R&aJNJz3uGQd*wYSYWGn2|_*F57sg}v|P|4j*yW44fhRBXpA^&Hi< zb=Ix6`@`wcNkc^%<20O$Q785^2%HcL6L?s#wK)qkK99QSq`}x^1>#AF#2FbG{Ujqp zU`sW&_Y*har>BlGkKZZPK0qq5(;;jkuO|$K|DaJ2IVeHLf}$6WcQ|)?N^`RV-D2xvcF2GW69|nCGpsTbe!R=wKq-TWCWW9O~p4`^5GAE3dn8eqM z#urDKnc{GjpfCX_feLVm>LtD>fSgu$y6*!Dk6~}}n_+z}OQdY}%PVkDT85|kG8xLO z9weP@1cbYkk!YI&I!I>y-X;0AU5$(X zE2@BxnFUZq7M>=D40b&+Ej3>38Ajwl8}dg=tGa|}qvYHwG3flKIg_pmn)(|wHA`(F zNoc8WkI%-lV{gJUX%;d3!psuIJlt92v|PO&{v)K+4?#`%>nov!$sT!eMH@U>WxKx_ z^}L%PsV`towStKdZVQ)1b8b#f&Otrj5Xfj+4`)2I*J#+(*IpSL_Zt$I)b!ZyS|*1f z(aInkmPNYUPNzNmy7qzZSZ&Q!aqz< zDMkTjcve#%9!k006e3ft{Wu)Xz}i}ZJ3AIw4T4w3FjOs3>GPlv7_h)m{BEPtien5P zxz5TE=AlrbUkfVv_;g15Ky^wsLL#9ctR+auN%PnWDe7a3Ap!x?Lk5r~*^jIJY7To@ zakCF`3qGG4+|9}n(|ql z&m^|7JkzGz^BHZgdjt7a{^uPk?@S-3YAj^jw#Zyh>_Ii_`rh*kaaJwcz)%ceYtJM; z*pTWd6g+L-Rl)2ywl9}2=LH4`>{u<5cU(@htf-t7Ib(F)VJYxAVEgeX2Huw61kaI6 zMe$f3b45~&PbNtLQNnpCLGofqO?z^u&(oxx>3Ur|cbzgcTxwV3sa%xvj-OcfPq0?F zv1)_~Zmh1&gw)1|q0VQu1G4JJUsB~nrd56e0~&H=IrC~PU{a{h1hhn)B7-ce<{DPI zLj%0Q5o77bE-kP^w@qFd7;r(38jyk4SYKZWgx@R)C-{(8WgMN(Czt_(nrcY(r)tAnd{&)1Cuumt9~@(F;II>tH5O zX&5&gxp&Jm3aBtHsA~CTQx{E*YmqZ*c7cRAzVzVh#>U292EBth@J@onR~nV)Q7C*m z3qN)8yBYp8!_P~wB8S{gw7+Yl1F6+vcF+GbTn_%Hoo7E70GbsNwioQP|Ja_qRvye@ z^@eONQB;YyG#-#drWJ2fGc&+#EQ$gN2aSxDA*E~+6Q=?EX|$PD+xHY`z0vIqwAuMB&*9f9Pypja2XDgpx^Qp6%_0rQ=6k#W3(n#4~+ zY)~>!){$}yV8?X72oe`PGFCJFKI?Ec2U<^B+3x;+ebS;s3|SZc1|8-7jNdU10YI7( z$d!U4>KnZKB6rjp92|sl9Wd?9KdDXH+R`FA<4fRyAXuBuOGp>8AQJCD|F2_x&v0FAPX6Fahdm*o^)F&|o7As!GoLIMdj%%8T69bp zjLHJ6z~a#1EkpmMf26HMN%W5QRlB!kMDiAan!39F`bZ4YCBqrH_SqD=!-Y}x`LT?g z3OrBQjq)kniALuifd#U6bhLTW3f-E4s2FXVUc9h^j;Yi;x4ds>`~ezq#m6OZ?cHr* JOf@=s=|8B6AJG5+ diff --git a/docs/Diagrams/CashierClassDiagram.puml b/docs/Diagrams/PUML files/CashierClassDiagram.puml similarity index 100% rename from docs/Diagrams/CashierClassDiagram.puml rename to docs/Diagrams/PUML files/CashierClassDiagram.puml diff --git a/docs/Diagrams/CashierCommands_SeqDiag.puml b/docs/Diagrams/PUML files/CashierCommands_SequenceDiagram.puml similarity index 100% rename from docs/Diagrams/CashierCommands_SeqDiag.puml rename to docs/Diagrams/PUML files/CashierCommands_SequenceDiagram.puml From 6ce1ddff6d89fddb4d7e2dca6d86caf8f7b6dddd Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:33:15 +0800 Subject: [PATCH 202/421] Catch unhandled exception --- src/main/java/command/ListCommand.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index f1050588ab..21824f3762 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -31,8 +31,12 @@ public String getCategory() { //@@author Fureimi public void execute() throws EmptyListException { - if (arrayList.isEmpty()) { - throw new EmptyListException(arrayList.getClass().getSimpleName()); + try { + if (arrayList.isEmpty()) { + throw new EmptyListException(arrayList.getClass().getSimpleName()); + } + } catch (EmptyListException e) { + return; } if (category.equals("NA") && !isListMarked) { TextUi.showList(arrayList); From beaca9c8bed4f9b63ca697d0c6b407d4d7482004 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:38:20 +0800 Subject: [PATCH 203/421] Add unthrown exception --- src/main/java/seedu/duke/StockMaster.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index c52f343931..8869cd6713 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -3,6 +3,7 @@ import command.Command; import command.ExitCommand; import exceptions.CommandFormatException; +import exceptions.EmptyListException; import exceptions.InvalidDateException; import parser.Parser; import reminder.LowStockReminder; @@ -28,11 +29,11 @@ public class StockMaster { /** * Main entry-point for the java.duke.StockMaster application. */ - public static void main(String[] args) throws IOException, CommandFormatException, InvalidDateException { + public static void main(String[] args) throws IOException, CommandFormatException, InvalidDateException, EmptyListException { new StockMaster().run(); } - public void run() throws IOException, CommandFormatException, InvalidDateException { + public void run() throws IOException, CommandFormatException, InvalidDateException, EmptyListException { ui.showWelcomeMessage("StockMaster v2.0", STORAGE_FILE); Storage.updateFile("", true); Storage.readFromFile(STORAGE_FILE); @@ -45,7 +46,7 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } - private void normalOperation() throws IOException, CommandFormatException, InvalidDateException { + private void normalOperation() throws IOException, CommandFormatException, InvalidDateException, EmptyListException { String userInput; do { userInput = ui.getUserInput(); From f1d9b2a321f58650220cec00bf32330db2ea3b8e Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:44:08 +0800 Subject: [PATCH 204/421] Fix styling --- src/main/java/exceptions/EmptyListException.java | 6 +++--- src/main/java/seedu/duke/StockMaster.java | 6 ++++-- src/test/java/command/SellCommandTest.java | 5 +++-- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index 7c0d7ce324..3501081d38 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -1,18 +1,18 @@ package exceptions; -import common.Messages; - public class EmptyListException extends Exception { public EmptyListException(String error) { switch (error) { case "Item": System.out.println("There are no items with your search query."); + break; case "Transaction": System.out.println("There are no transactions with your search query."); + break; default: System.out.println(error); } } -} \ No newline at end of file +} diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index 8869cd6713..b9df5afb70 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -29,7 +29,8 @@ public class StockMaster { /** * Main entry-point for the java.duke.StockMaster application. */ - public static void main(String[] args) throws IOException, CommandFormatException, InvalidDateException, EmptyListException { + public static void main(String[] args) throws IOException, CommandFormatException, + InvalidDateException, EmptyListException { new StockMaster().run(); } @@ -46,7 +47,8 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } - private void normalOperation() throws IOException, CommandFormatException, InvalidDateException, EmptyListException { + private void normalOperation() throws IOException, CommandFormatException, + InvalidDateException, EmptyListException { String userInput; do { userInput = ui.getUserInput(); diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index 88d5d226c6..a71e8bc090 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.EmptyListException; import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; @@ -9,7 +10,7 @@ public class SellCommandTest { @Test - public void sellItemTest() throws CommandFormatException { + public void sellItemTest() { try { Command sellCommandTest1 = new SellCommand("testItem", 1, 3); Command sellCommandTest2 = new SellCommand("testItem", 7, 14); @@ -17,7 +18,7 @@ public void sellItemTest() throws CommandFormatException { sellCommandTest2.execute(); } catch (CommandFormatException e) { fail("Unable to sell item."); - } catch (InvalidDateException e) { + } catch (InvalidDateException | EmptyListException e) { throw new RuntimeException(e); } } From b1ac64c7bb691522bbd784b8899e1abdb38dcf71 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:46:56 +0800 Subject: [PATCH 205/421] Fix test exception handling --- src/test/java/command/AddCommandTest.java | 5 +++-- src/test/java/command/DeleteCommandTest.java | 5 +++-- src/test/java/command/FindCommandTest.java | 3 ++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index bef39423ee..b9599854e3 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.EmptyListException; import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; @@ -9,7 +10,7 @@ public class AddCommandTest { @Test - public void addItemTest() throws CommandFormatException { + public void addItemTest() { try { Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); @@ -19,7 +20,7 @@ public void addItemTest() throws CommandFormatException { addCommandTest2.execute(); } catch (CommandFormatException e) { fail("Unable to add item."); - } catch (InvalidDateException e) { + } catch (InvalidDateException | EmptyListException e) { throw new RuntimeException(e); } } diff --git a/src/test/java/command/DeleteCommandTest.java b/src/test/java/command/DeleteCommandTest.java index 551e070a6b..f1c5636f96 100644 --- a/src/test/java/command/DeleteCommandTest.java +++ b/src/test/java/command/DeleteCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.EmptyListException; import exceptions.InvalidDateException; import itemlist.Itemlist; import org.junit.jupiter.api.Test; @@ -14,7 +15,7 @@ public class DeleteCommandTest { Command deleteCommand = new DeleteCommand("testItem"); @Test - public void delCommandTest_success() throws CommandFormatException { + public void delCommandTest_success() { try { addCommandTest1.execute(); deleteCommand.execute(); @@ -22,7 +23,7 @@ public void delCommandTest_success() throws CommandFormatException { deleteCommand.execute(); } catch (CommandFormatException e) { fail("Unable to delete."); - } catch (InvalidDateException e) { + } catch (InvalidDateException | EmptyListException e) { throw new RuntimeException(e); } diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 2b96c7b879..a4f575ee2e 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -1,6 +1,7 @@ package command; import exceptions.CommandFormatException; +import exceptions.EmptyListException; import exceptions.InvalidDateException; import itemlist.Itemlist; import org.junit.jupiter.api.Test; @@ -10,7 +11,7 @@ public class FindCommandTest { @Test - public void findCommandTest() throws CommandFormatException, InvalidDateException { + public void findCommandTest() throws CommandFormatException, InvalidDateException, EmptyListException { Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); Command findCommand = new FindCommand("item","testItem"); From 8545483d6456922d21daa4d44ae009bbbad197db Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:52:47 +0800 Subject: [PATCH 206/421] Change FindCommandTest --- src/test/java/command/FindCommandTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index a4f575ee2e..f6e17617de 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -11,14 +11,18 @@ public class FindCommandTest { @Test - public void findCommandTest() throws CommandFormatException, InvalidDateException, EmptyListException { + public void findCommandTest() throws CommandFormatException, InvalidDateException { Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); Command findCommand = new FindCommand("item","testItem"); Command findCommand2 = new FindCommand("NA","failFindCommand"); - addCommandTest1.execute(); - findCommand.execute(); - findCommand2.execute(); + try { + addCommandTest1.execute(); + findCommand.execute(); + findCommand2.execute(); + } catch (EmptyListException e) { + throw new RuntimeException(); + } assertFalse(Itemlist.itemIsExist("failFindCommand")); } } From fab391753e537f7319ff5cd1168404e459f68065 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:55:05 +0800 Subject: [PATCH 207/421] Update FindCommandTest --- src/test/java/command/FindCommandTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index f6e17617de..9b89595100 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -21,7 +21,7 @@ public void findCommandTest() throws CommandFormatException, InvalidDateExceptio findCommand.execute(); findCommand2.execute(); } catch (EmptyListException e) { - throw new RuntimeException(); + return; } assertFalse(Itemlist.itemIsExist("failFindCommand")); } From 7c5e8201ee8f967fd7d49f62adcbb6e2e2345d22 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 13:58:51 +0800 Subject: [PATCH 208/421] Change Help message --- src/main/java/common/Messages.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index f4c1483c2a..a1ce20c450 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -11,7 +11,7 @@ public class Messages { "|----------|------------------------------------------------------------------------------|\n" + "|list items| list_items |\n" + "|----------|------------------------------------------------------------------------------|\n" + - "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] |\n" + + "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + "|----------|------------------------------------------------------------------------------|\n" + "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + From 4f8feeba0171689bb2dcc527994bcedfeb092d0e Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 5 Apr 2024 14:12:09 +0800 Subject: [PATCH 209/421] Change UG --- docs/UserGuide.md | 58 +++++++++++++++++++++++++++++++---------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 12645da455..d4f7606731 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -29,6 +29,23 @@ add apple qty/50 /pieces cat/fruits buy/4 sell/5 add phone qty/5 /pieces cat/Electronics buy/100 sell/500 ``` +### Listing all items: `list_items` +Lists all stored items. + +Format: `list_items [marked] [cat/CATEGORY]` + +* `marked` is an optional field. If used, it will only list marked items. +* `CATEGORY` is an optional field. By default, it will list all the stored items. + +Example of usage: +``` +list_items +list_items cat/Electronics +list_items marked cat/fruits +``` +_**Note**_
+_marked **MUST** be before cat/[CATEGORY]_ + ### Deleting an item: `del` Deletes the item from the list of items. @@ -42,7 +59,7 @@ del apples ### Selling an item: `sell` Sells a quantity of an item from the list of items at a stated price. -Format: `sell [ITEM_NAME] qty/[SELL_QUANTITY]` +Format: `sell ITEM_NAME qty/SELL_QUANTITY` Example of usage: @@ -53,16 +70,17 @@ sell apple qty/20 ### Marking an item: `mark` Marks items in the inventory list. -Format: `mark [ITEM_NAME]` +Format: `mark ITEM_NAME` Example of usage: ``` mark apple iphone ``` + ### Unmarking an item: `unmark` Unmarks a marked item in the inventory list. -Format: `unmark [ITEM_NAME]` +Format: `unmark ITEM_NAME` Example of usage: ``` @@ -72,8 +90,8 @@ unmark apple iphone ### Editing an item: `edit` Edits the parameters of the item. -Format: `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] -cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
+Format: `edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] +[cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
Example of usage: ``` @@ -87,6 +105,7 @@ Example of usage: edit apple qty/45 buy/3.50 sell/5.50 edit fish name/Salmon qty/1 cat/fish ``` + Expected Output: ``` Edited: @@ -112,22 +131,8 @@ find /qty/cat Apple //search for `Apple` under `ITEM_QUANTITY` and `CATEGORY` find Apple //search all items that contains `Apple` ``` -### Listing all items: `list_items` -Lists all stored items. - -Format: `list_items 'marked' [cat/CATEGORY]` -* `marked` is an optional field. If used, it will only list marked items. -* `CATEGORY` is an optional field. By default, it will list all the stored items. -Example of usage: -``` -list_items -list_items cat/Electronics -list_items marked cat/fruits -``` -_**Note**_
-_marked **MUST** be before cat/[CATEGORY]_ ### Get bestselling item: `bestseller`. Reads all the Transactions and returns the item with the highest profit. @@ -138,6 +143,11 @@ Example of usage: bestseller ``` +Expected output: +``` +The current best-selling item is {ITEM_NAME}. +``` + ### Get total profits: `total_profit` Reads all the Transactions and returns the total profits. @@ -148,6 +158,11 @@ Example of usage: total_profit ``` +Expected output: +``` +You have earned {PROFIT} in profits so far. +``` + ### Get total revenue: `total_revenue` Reads all the Transactions and returns the total profits. @@ -158,6 +173,11 @@ Example of usage: total_revenue ``` +Expected output: +``` +You have earned {REVENUE} in revenue so far. +``` + ### Add promotion to items: `promotion` Creates a promotion for items that changes the sell price. From 28f16153efb6a9eea444afdee4bb52a8234267c1 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 5 Apr 2024 14:14:23 +0800 Subject: [PATCH 210/421] Fix Leap Year not allowed --- PromotionStorage.txt | 3 +++ docs/UserGuide.md | 14 +++++++------- src/main/java/promotion/Promotionlist.java | 4 ++-- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index a7866ed801..51ad8f2d73 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -4,3 +4,6 @@ Time: 1200 to 1500 apple iphone have a 10.0% discount Period: 1 APR 2024 to 4 FEB 2025 Time: 1300 to 1600 +apple have a 50.0% discount +Period: 29 FEB 2024 to 4 APR 2024 +Time: 1200 to 1500 diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 48ec256779..035ab7a0aa 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -42,7 +42,7 @@ del apples ### Selling an item: `sell` Sells a quantity of an item from the list of items at a stated price. -Format: `sell [ITEM_NAME] qty/[SELL_QUANTITY]` +Format: `sell ITEM_NAME qty/SELL_QUANTITY` Example of usage: @@ -53,7 +53,7 @@ sell apple qty/20 ### Editing an item: `edit` Edits the parameters of the item. -Format: `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
` +Format: `edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
` Example of usage: ``` @@ -129,12 +129,12 @@ total_revenue ### Add promotion to items: `promotion` Creates a promotion for items that changes the sell price. -Format: `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR] -time /from [TIME] /to [TIME]` +Format: `promotion ITEM_NAME discount/DISCOUNT period /from DATE MONTH YEAR /to DATE MONTH YEAR +time /from START_TIME /to END_TIME` * `DISCOUNT` ranges from 0 to 100 and can take in up to 2 decimal place. -* `[DATE]` must be a valid for the specific `[MONTH]` E.g. `30 Feb 2024` is not allowed. -* `[TIME]` must range from 0000 to 2359. In addition, time range must be valid. +* `DATE` must be a valid for the specific `[MONTH]` E.g. `30 Feb 2024` is not allowed. +* `START_TIME` & `END_TIME` must range from 0000 to 2359. In addition, time range must be valid. Example of usage: ``` @@ -143,7 +143,7 @@ promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 12 ### Delete a promotion: `del_promo` Deletes a promotion for an item. -Format: `del_promo [ITEM_NAME]` +Format: `del_promo ITEM_NAME` Example of usage: ``` diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index dc00bb6ba8..aa985cc323 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -128,8 +128,8 @@ public static boolean isVerifiedTime(int time) { public static boolean isValidMonth(int date, Month month, int year) throws InvalidDateException { switch (month) { case FEB: - if (isLeapYear(year) && (date > 29 || date < 1)) { - return false; + if (isLeapYear(year) && (date < 30 && date > 0)) { + return true; } else { return date <= 28 && date >= 1; } From 777e2a19cbe3c71846a81788d416db43604b95f6 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 8 Apr 2024 14:50:38 +0800 Subject: [PATCH 211/421] Fix issues 168, 167 --- StockMasterData.txt | 3 +- TransactionLogs.txt | 24 ---------- src/main/java/command/BestsellerCommand.java | 9 +++- src/main/java/itemlist/Cashier.java | 47 +++++++++++++++----- src/main/java/itemlist/Itemlist.java | 11 ++++- 5 files changed, 53 insertions(+), 41 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8f40839bc4..8b13789179 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1 @@ -1. | [X] | apple | Qty: 45 pieces | Cat: fruits | BuyPrice: $3.5 | SellPrice: $5.5 -2. | [X] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 + diff --git a/TransactionLogs.txt b/TransactionLogs.txt index 61ad4e6de1..e69de29bb2 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -1,24 +0,0 @@ -Date: 2024-04-03 20:24:38 -Transaction ID: 1 -Item Name: apple -Quantity: 1 -Unit Price: 2.5 -Total Price: 2.5 -Profit: -1.5 - -Date: 2024-04-03 20:24:46 -Transaction ID: 2 -Item Name: apple iphone -Quantity: 1 -Unit Price: 250.0 -Total Price: 250.0 -Profit: 150.0 - -Date: 2024-04-04 03:59:13 -Transaction ID: 1 -Item Name: apple -Quantity: 10 -Unit Price: 2.5 -Total Price: 25.0 -Profit: -15.0 - diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index 375bcad143..4f7bb0de3e 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -10,7 +10,12 @@ public class BestsellerCommand extends Command { @Override public void execute() { Item bs = Cashier.getBestseller(); - TextUi.replyToUser("The current best-selling item is " + - bs.getItemName()); + if (bs != null) { + TextUi.replyToUser("The current best-selling item is " + + bs.getItemName()); + } + else { + TextUi.replyToUser("There is no data available to find bestseller."); + } } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index e1b32798e1..65439656b5 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -18,19 +18,27 @@ public static ArrayList getTransactions() { } public static ArrayList getTransactions(Item item) { ArrayList results = new ArrayList<>(); - for (Transaction t: transactions) { - if (t.getItem() == item) { - results.add(t); + if (!transactions.isEmpty()) { + for (Transaction t : transactions) { + if (t.getItem() == item) { + results.add(t); + } } + return results; + } + else { + return null; } - return results; } public static float getTotalRevenue() { float totalRevenue = 0; - for (Transaction t : getTransactions()) { - if (!t.getIsVoided()) { - totalRevenue += t.getTotalPrice(); + ArrayList allTransactions = getTransactions(); + if (allTransactions != null) { + for (Transaction t : allTransactions) { + if (!t.getIsVoided()) { + totalRevenue += t.getTotalPrice(); + } } } return totalRevenue; @@ -38,16 +46,31 @@ public static float getTotalRevenue() { public static float getTotalProfit() { float totalProfit = 0; - for (Transaction t: transactions) { - if (!t.getIsVoided()) { - totalProfit += t.getProfit(); + if (!transactions.isEmpty()) { + for (Transaction t : transactions) { + if (!t.getIsVoided()) { + totalProfit += t.getProfit(); + } } + return totalProfit; + } + else { + System.out.println("No transactions found."); + return 0; } - return totalProfit; } public static Transaction getTransaction(int index) { - return transactions.get(index); + try { + return transactions.get(index); + } catch (IndexOutOfBoundsException e) { + if (index == 0) { + System.out.println("No transactions found."); + } else { + System.out.println("Index " + index + " entered is out of bound."); + } + return null; + } } public static Item getBestseller() { diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 10494ee1c2..6c5562555d 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -40,7 +40,16 @@ public static ArrayList getItems() { } public static Item getItem(int index) { - return items.get(index); + try { + return items.get(index); + } catch (IndexOutOfBoundsException e) { + if (index == 0) { + System.out.println("Itemlist is empty."); + } else { + System.out.println("Index " + index + " entered is out of bound."); + } + return null; + } } public static Item getItem(String name) { From 30585e353418f20df99819ee86c1b4a06b3d49e8 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 8 Apr 2024 18:15:46 +0800 Subject: [PATCH 212/421] Update help message --- src/main/java/common/Messages.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index a1ce20c450..33216de5c0 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -20,12 +20,24 @@ public class Messages { "| | cat/[NEW_CATEGORY] |\n" + "| | (use AT LEAST 1 of: qty/, uom/, cat/) |\n" + "|----------|------------------------------------------------------------------------------|\n" + + "| mark | mark [ITEM_NAME] |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "| unmark | unmark [ITEM_NAME] |\n" + + "|----------|------------------------------------------------------------------------------|\n" + "| delete | del [ITEM_NAME] |\n" + "|----------|------------------------------------------------------------------------------|\n" + "| find | 1. find [KEYWORD] - to search the entire Item List |\n" + "| | 2. find /filter1/filter2 [KEYWORD] - to search under the filters* |\n" + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + "|----------|------------------------------------------------------------------------------|\n" + + "|bestseller| bestseller |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "|total | total_profit |\n" + + "|profit | |\n" + + "|----------|------------------------------------------------------------------------------|\n" + + "|total | total_revenue |\n" + + "|revenue | |\n" + + "|----------|------------------------------------------------------------------------------|\n" + "|promotion | promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] |\n" + "| | to [DATE] [MONTH] [YEAR] time /from [TIME] /to [TIME] |\n" + "|----------|------------------------------------------------------------------------------|\n" + From c4c27e428a49208337415d906412aba90b1c25b4 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 8 Apr 2024 20:22:21 +0800 Subject: [PATCH 213/421] Catch EmptyListException --- src/main/java/command/BestsellerCommand.java | 15 +++++++------ src/main/java/itemlist/Cashier.java | 22 +++++++++++--------- src/main/java/itemlist/Itemlist.java | 4 +--- 3 files changed, 22 insertions(+), 19 deletions(-) diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index 4f7bb0de3e..6cfd9e7c81 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.EmptyListException; import item.Item; import itemlist.Cashier; import ui.TextUi; @@ -10,12 +11,14 @@ public class BestsellerCommand extends Command { @Override public void execute() { Item bs = Cashier.getBestseller(); - if (bs != null) { - TextUi.replyToUser("The current best-selling item is " + - bs.getItemName()); - } - else { - TextUi.replyToUser("There is no data available to find bestseller."); + try { + if (bs == null) { + throw new EmptyListException("Transaction"); + } + } catch (EmptyListException e) { + return; } + TextUi.replyToUser("The current best-selling item is " + + bs.getItemName()); } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 65439656b5..17b7db12a0 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,5 +1,6 @@ package itemlist; +import exceptions.EmptyListException; import item.Item; import item.Transaction; @@ -34,7 +35,7 @@ public static ArrayList getTransactions(Item item) { public static float getTotalRevenue() { float totalRevenue = 0; ArrayList allTransactions = getTransactions(); - if (allTransactions != null) { + if (!allTransactions.isEmpty()) { for (Transaction t : allTransactions) { if (!t.getIsVoided()) { totalRevenue += t.getTotalPrice(); @@ -46,18 +47,19 @@ public static float getTotalRevenue() { public static float getTotalProfit() { float totalProfit = 0; - if (!transactions.isEmpty()) { - for (Transaction t : transactions) { - if (!t.getIsVoided()) { - totalProfit += t.getProfit(); - } + try { + if (transactions.isEmpty()) { + throw new EmptyListException("Transaction"); } - return totalProfit; - } - else { - System.out.println("No transactions found."); + } catch (EmptyListException e) { return 0; } + for (Transaction t : transactions) { + if (!t.getIsVoided()) { + totalProfit += t.getProfit(); + } + } + return totalProfit; } public static Transaction getTransaction(int index) { diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 6c5562555d..9d4ff8a81e 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -43,9 +43,7 @@ public static Item getItem(int index) { try { return items.get(index); } catch (IndexOutOfBoundsException e) { - if (index == 0) { - System.out.println("Itemlist is empty."); - } else { + if (index != 0) { System.out.println("Index " + index + " entered is out of bound."); } return null; From 4b76f9571f96f26f51105aec554e1a26060268a5 Mon Sep 17 00:00:00 2001 From: Shu Date: Tue, 9 Apr 2024 05:40:52 +0800 Subject: [PATCH 214/421] Fix 1st batch of PED Bugs --- META-INF/MANIFEST.MF | 3 ++ PromotionStorage.txt | 15 +++---- StockMasterData.txt | 2 +- TransactionLogs.txt | 24 ----------- docs/UserGuide.md | 8 ++-- src/main/java/command/AddCommand.java | 8 ++-- .../java/command/AddPromotionCommand.java | 3 +- .../java/command/DeletePromotionCommand.java | 3 +- src/main/java/common/Messages.java | 17 ++++---- src/main/java/promotion/Promotionlist.java | 40 ++++++++++++++++--- src/main/java/storage/Storage.java | 2 +- 11 files changed, 67 insertions(+), 58 deletions(-) create mode 100644 META-INF/MANIFEST.MF diff --git a/META-INF/MANIFEST.MF b/META-INF/MANIFEST.MF new file mode 100644 index 0000000000..5dea56cac4 --- /dev/null +++ b/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: seedu.duke.StockMaster + diff --git a/PromotionStorage.txt b/PromotionStorage.txt index 51ad8f2d73..fd9d054271 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,9 +1,6 @@ -apple have a 50.0% discount -Period: 2 APR 2024 to 4 APR 2024 -Time: 1200 to 1500 -apple iphone have a 10.0% discount -Period: 1 APR 2024 to 4 FEB 2025 -Time: 1300 to 1600 -apple have a 50.0% discount -Period: 29 FEB 2024 to 4 APR 2024 -Time: 1200 to 1500 +apple have a 10.0% discount +Period: 2 APR 2024 to 3 APR 2024 +Time: 0 to 2359 +apple have a 10.0% discount +Period: 2 APR 2024 to 3 APR 2024 +Time: 0 to 2359 diff --git a/StockMasterData.txt b/StockMasterData.txt index 0a90bc735b..1b4a2f7a03 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,2 @@ 1. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 -2. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 +2. | [ ] | ITEM | Qty: 51 kg | Cat: null | BuyPrice: $100.0 | SellPrice: $15.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index 61ad4e6de1..e69de29bb2 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -1,24 +0,0 @@ -Date: 2024-04-03 20:24:38 -Transaction ID: 1 -Item Name: apple -Quantity: 1 -Unit Price: 2.5 -Total Price: 2.5 -Profit: -1.5 - -Date: 2024-04-03 20:24:46 -Transaction ID: 2 -Item Name: apple iphone -Quantity: 1 -Unit Price: 250.0 -Total Price: 250.0 -Profit: 150.0 - -Date: 2024-04-04 03:59:13 -Transaction ID: 1 -Item Name: apple -Quantity: 10 -Unit Price: 2.5 -Total Price: 25.0 -Profit: -15.0 - diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 035ab7a0aa..adb59e4942 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -15,13 +15,14 @@ StockMaster is a platform aimed at helping SMEs track and organise their invento ### Adding an item: `add` Adds a new item to the list of items. -Format: `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]` +Format: `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/BUY_PRICE sell/SELL_PRICE` * `CATEGORY` is an optional field. If blank, it will default to `N/A`. > [ !NOTE ] > -> Addition of an item with the same `ITEM_NAME` will edit the `ITEM_QUANTITY` instead +> Addition of an item with the same `ITEM_NAME` will increase the `ITEM_QUANTITY`, and update the `UNIT_OF_MEASUREMENT`, +> `CATEGORY`, `BUY_PRICE` and `SELL_PRICE` instead of adding a duplicated entry for the same item. Example of usage: ``` @@ -73,7 +74,8 @@ Finds all items that contains `KEYWORD` Format: `find [/filter1/filter2] KEYWORD` -* Filter will specify the parameters that is being searched. +* Filter are optional and will specify the parameters that is being searched. +* Filters can be `item`, `qty`, `cat`, `uom`, `buy`, `sell`. Any other values will show an empty list. * If no filter is applied, it will search all items that contains `KEYWORD. * The search is case-insensitive e.g. `apple` will match `Apple`. * Partial words will be matched e.g. `app` will match `Apple`. diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index ede89e5b39..9d6487f402 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -17,7 +17,7 @@ public class AddCommand extends Command { public AddCommand(String itemName, int quantity, String unitOfMeasurement, String category, float buyPrice, float sellPrice) { - this.itemName = itemName; + this.itemName = itemName.toLowerCase(); this.quantity = quantity; this.unitOfMeasurement = unitOfMeasurement; this.category = category; @@ -64,7 +64,7 @@ public void execute() { } public void updateQuantity(String itemName) { - System.out.println("Item already exists and quantity has been changed"); + System.out.println("Item already exists and item information has been updated"); int indexOfItem = -1; for (Item item : Itemlist.getItems()) { if (item.getItemName().toLowerCase().equals(itemName)) { @@ -74,7 +74,7 @@ public void updateQuantity(String itemName) { assert indexOfItem != -1; int currentQty = Itemlist.getItem(indexOfItem).getQuantity(); int newQty = getQuantity() + currentQty; - new EditCommand(getItemName(), "NA", newQty, "NA", "NA", -1, - -1).execute(); + new EditCommand(getItemName(), "NA", newQty, getUnitOfMeasurement(), getCategory(), getBuyPrice(), + getSellPrice()).execute(); } } diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index 770d1a04c9..bc99ba9b29 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -35,7 +35,8 @@ public void execute() throws InvalidDateException, CommandFormatException { "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + " to " + promotion.getEndDate() + " " + promotion.getEndMonth() + " " + promotion.getEndYear(), - "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + "Time: " + String.format("%04d", promotion.getStartTime()) + " to " + + String.format("%04d", promotion.getEndTime()) ); } catch (InvalidDateException | CommandFormatException e){ System.out.println(""); diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java index bdac5adaac..1d55aed7d3 100644 --- a/src/main/java/command/DeletePromotionCommand.java +++ b/src/main/java/command/DeletePromotionCommand.java @@ -1,5 +1,6 @@ package command; +import common.Messages; import exceptions.CommandFormatException; import promotion.Promotion; import promotion.Promotionlist; @@ -22,7 +23,7 @@ public void execute() throws CommandFormatException { TextUi.replyToUser("Promotion for " + itemName + " has been removed"); PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); } else { - throw new CommandFormatException("ITEM_NOT_ON_PROMO"); + System.out.println(Messages.ITEM_NOT_ON_PROMO); } } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index dc42c8015b..b196eb54f3 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -37,22 +37,23 @@ public class Messages { "|----------|------------------------------------------------------------------------------|\n" + "| exit | exit |\n" + "|__________|______________________________________________________________________________|\n"; - public static final String INVALID_ADD_FORMAT ="Invalid command format. Please use format: " + "\n" + + public static final String INVALID_ADD_FORMAT = "Invalid command format. Please use format: " + "\n" + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + "buy/[BUY_PRICE] sell/[SELL_PRICE]'"; - public static final String INVALID_DELETE_FORMAT ="Invalid command format. Please use format: 'del [ITEM_NAME]'"; - public static final String INVALID_EDIT_FORMAT ="Invalid edit command format. Please use format: " + + public static final String INVALID_DELETE_FORMAT = "Invalid command format. Please use format: 'del [ITEM_NAME]'"; + public static final String INVALID_EDIT_FORMAT = "Invalid edit command format. Please use format: " + "'edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] " + "buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'\n" + "You can edit at least 1 parameter up to all available" + " parameters. For example, if you only wish to update buy and sell price, you can input:\n" + "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'"; - public static final String INVALID_SELL_FORMAT ="Invalid command format. Please use format: " + - "'sell [ITEM_NAME] qty/[SELL_QUANTITY] price/[SELL_PRICE]'"; - public static final String ITEM_NOT_FOUND ="Item is not available"; + public static final String INVALID_SELL_FORMAT = "Invalid command format. Please use format: " + + "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'"; + public static final String ITEM_NOT_FOUND = "Item is not available"; - public static final String INVALID_FIND_FORMAT ="Invalid command format. Please use format: " + "\n" + + public static final String ITEM_NOT_ON_PROMO = "Promotion does not exits for this item and hence cannot be deleted"; + public static final String INVALID_FIND_FORMAT = "Invalid command format. Please use format: " + "\n" + "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + - "2. 'find /filter1/filter2 [KEYWORD] to search under the filters"; + "2. 'find /filter1/filter2 [KEYWORD]' to search under the filters"; public static final String EMPTY_LIST = "There is nothing here! Time to spend some money and stock em up!"; public static final String WELCOME_MESSAGE = "Welcome to StockMaster, where you can master the knowledge on your " + diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index aa985cc323..c95328cf1f 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -61,7 +61,7 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException if (!Itemlist.itemIsExist(itemName)) { throw new CommandFormatException("ITEM_NOT_FOUND"); } - if (discount < 0 || discount > 100) { + if (discount < 0 || discount > 1) { throw new CommandFormatException("INVALID_DISCOUNT"); } if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { @@ -70,6 +70,10 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException if (!isValidTime(startTime, endTime)) { throw new InvalidDateException("INVALID_TIME"); } + if (!isValidDuration(startDate, startMonth, startYear, endDate, endMonth, endYear)) { + throw new InvalidDateException("INVALID_PERIOD"); + } + if (Promotionlist.isOnPromo(itemName)) { throw new InvalidDateException("ITEM_IS_PROMO"); } @@ -101,8 +105,10 @@ public static boolean isPromoExist(Promotion promotion) { } public static boolean isValidTime(int startTime, int endTime) { - boolean startIsValid = isVerifiedTime(startTime); - boolean endIsValid = isVerifiedTime(endTime); + String startTimeStr = String.format("%04d", startTime); + String endTimeStr = String.format("%04d", endTime); + boolean startIsValid = isVerifiedTime(startTimeStr); + boolean endIsValid = isVerifiedTime(endTimeStr); if (!startIsValid || !endIsValid) { return false; } @@ -112,11 +118,12 @@ public static boolean isValidTime(int startTime, int endTime) { return true; } - public static boolean isVerifiedTime(int time) { - String[] splitTime = String.valueOf(time).split("(?<=.)"); + public static boolean isVerifiedTime(String timeStr) { + String[] splitTime = timeStr.split("(?<=.)"); if (splitTime.length != 4) { return false; } + int time = Integer.parseInt(timeStr); int hour = time / 100; int min = time % 100; if (hour > 23 || hour < 0) { @@ -125,6 +132,26 @@ public static boolean isVerifiedTime(int time) { return min <= 59 && min >= 0; } + public static boolean isValidDuration (int startDate, Month startMonth, int startYear, int endDate, Month endMonth, + int endYear) { + int startMonthInt = startMonth.getValue(); + int endMonthInt = endMonth.getValue(); + if (endYear > startYear) { + return true; + } else if (endYear < startYear) { + return false; + } + if (endMonthInt > startMonthInt) { + return true; + } else if (endMonthInt < startMonthInt) { + return false; + } + if (endDate > startDate) { + return true; + } + return false; + } + public static boolean isValidMonth(int date, Month month, int year) throws InvalidDateException { switch (month) { case FEB: @@ -147,7 +174,8 @@ public static boolean isValidMonth(int date, Month month, int year) throws Inval case JUN: return date <= 30 && date >= 1; default: - throw new InvalidDateException("INVALID_TIME"); + System.out.println("Date does not exist."); + throw new InvalidDateException("INVALID_PERIOD"); } } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 6474e7a889..65f78581aa 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -114,7 +114,7 @@ public static void readFromFile(String fileName) { interpretLines(scanner); scanner.close(); } catch(FileNotFoundException e) { - System.out.println("File does not exist."); + System.out.println("File does not exist. Creating a new Text File"); } catch(NumberFormatException e) { System.out.println("Invalid numbers found."); } From b5a0b7e147d50bb510021b76218421103cd83b4e Mon Sep 17 00:00:00 2001 From: fxe025 Date: Tue, 9 Apr 2024 10:59:54 +0800 Subject: [PATCH 215/421] Fix issue 154: displays 2dp discount --- PromotionStorage.txt | 12 +++++------ StockMasterData.txt | 2 +- .../java/command/AddPromotionCommand.java | 2 +- src/main/java/promotion/Promotion.java | 8 ++++---- src/main/java/storage/PromotionStorage.java | 20 +++++++++---------- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index a7866ed801..7463afdde8 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,6 +1,6 @@ -apple have a 50.0% discount -Period: 2 APR 2024 to 4 APR 2024 -Time: 1200 to 1500 -apple iphone have a 10.0% discount -Period: 1 APR 2024 to 4 FEB 2025 -Time: 1300 to 1600 +item have a 30.00% discount +Period: 27 MAR 2024 to 18 APR 2024 +Time: 1200 to 2359 +item have a 10.00% discount +Period: 31 MAR 2024 to 7 APR 2024 +Time: 1200 to 2359 diff --git a/StockMasterData.txt b/StockMasterData.txt index 8b13789179..109402b820 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1 @@ - +1. | [ ] | item | Qty: 1 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $1.0 | SellPrice: $0.5 diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index 770d1a04c9..64ca08f27d 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -31,7 +31,7 @@ public void execute() throws InvalidDateException, CommandFormatException { Promotionlist.addPromotion(promotion); TextUi.replyToUser( "The following promotion has been added", - promotion.getItemName() + " have a " + promotion.getDiscount() * 100 + "% discount", + promotion.getItemName() + " have a " + String.format("%.2f", promotion.getDiscount() * 100) + "% discount", "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + " to " + promotion.getEndDate() + " " + promotion.getEndMonth() + " " + promotion.getEndYear(), diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index f58671e00f..6f78d76eac 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -90,10 +90,10 @@ public String getItemName() { } public String toString() { - return getItemName() + " have a " + (getDiscount()*100) + "% discount" + "\n" + - "Period: " + getStartDate() + " " + getStartMonth() + " " + getStartYear() + " to " + - getEndDate()+ " " + getEndMonth() + " " + getEndYear() + "\n" + - "Time: " + getStartTime() + " to " + getEndTime(); + return getItemName() + " have a " + String.format("%.2f", (getDiscount()*100)) + + "% discount" + "\n" + "Period: " + getStartDate() + " " + getStartMonth() + " " + + getStartYear() + " to " + getEndDate()+ " " + getEndMonth() + " " + + getEndYear() + "\n" + "Time: " + getStartTime() + " to " + getEndTime(); } public void print(String args) { diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java index fd64cf1233..99ade26a5d 100644 --- a/src/main/java/storage/PromotionStorage.java +++ b/src/main/java/storage/PromotionStorage.java @@ -92,11 +92,11 @@ public static void addToPromotionFile(ArrayList promotions) { assert promotions != null : "Promotions cannot be null."; Promotion lastPromotion = promotions.get(promotions.size() - 1); String descriptionAdded = (lastPromotion.getItemName() + " have a " + - (lastPromotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + - lastPromotion.getStartDate() + " " + lastPromotion.getStartMonth() + " " + lastPromotion.getStartYear() - + " to " + lastPromotion.getEndDate()+ " " + lastPromotion.getEndMonth() + " " + - lastPromotion.getEndYear() + "\n" + "Time: " + lastPromotion.getStartTime() + " to " + - lastPromotion.getEndTime() + "\n"); + String.format("%.2f", (lastPromotion.getDiscount()*100)) + "% discount" + "\n" + + "Period: " + lastPromotion.getStartDate() + " " + lastPromotion.getStartMonth() + + " " + lastPromotion.getStartYear() + " to " + lastPromotion.getEndDate()+ " " + + lastPromotion.getEndMonth() + " " + lastPromotion.getEndYear() + "\n" + "Time: " + + lastPromotion.getStartTime() + " to " + lastPromotion.getEndTime() + "\n"); updateFile(descriptionAdded, true); } @@ -105,11 +105,11 @@ public static void overwritePromotionFile(ArrayList promotions) { int length = promotions.size(); for (Promotion promotion: promotions) { String descriptionAdded = (promotion.getItemName() + " have a " + - (promotion.getDiscount()*100) + "% discount" + "\n" + "Period: " + promotion.getStartDate() + - " " + promotion.getStartMonth() + " " + promotion.getStartYear() + " to " + - promotion.getEndDate()+ " " + promotion.getEndMonth() + " " + promotion.getEndYear() + "\n" + - "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + "\n"); - if ( promotions.indexOf(promotion) == 0) { + String.format("%.2f", (promotion.getDiscount()*100)) + "% discount" + "\n" + "Period: " + + promotion.getStartDate() + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + + " to " + promotion.getEndDate()+ " " + promotion.getEndMonth() + " " + promotion.getEndYear() + + "\n" + "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + "\n"); + if (promotions.indexOf(promotion) == 0) { updateFile(descriptionAdded, false); } else { updateFile(descriptionAdded, true); From 523491a0aa7214971900917f3c01408164926cd6 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Tue, 9 Apr 2024 15:20:13 +0800 Subject: [PATCH 216/421] Reduce line length --- src/main/java/command/AddPromotionCommand.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index 64ca08f27d..4f9aed88c3 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -31,11 +31,11 @@ public void execute() throws InvalidDateException, CommandFormatException { Promotionlist.addPromotion(promotion); TextUi.replyToUser( "The following promotion has been added", - promotion.getItemName() + " have a " + String.format("%.2f", promotion.getDiscount() * 100) + "% discount", - "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + + promotion.getItemName() + " have a " + String.format("%.2f", promotion.getDiscount() * 100) + + "% discount", "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + " to " + promotion.getEndDate() + " " + - promotion.getEndMonth() + " " + promotion.getEndYear(), - "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + promotion.getEndMonth() + " " + promotion.getEndYear(), "Time: " + + promotion.getStartTime() + " to " + promotion.getEndTime() ); } catch (InvalidDateException | CommandFormatException e){ System.out.println(""); From 4adc598575b2f1c7c82ea6ade715c8cd34c4724f Mon Sep 17 00:00:00 2001 From: LowTL Date: Wed, 10 Apr 2024 10:56:34 +0800 Subject: [PATCH 217/421] Overload ListCommand --- .gitignore | 3 +++ src/main/java/command/ListCommand.java | 36 ++++++++++++++++---------- src/main/java/itemlist/Itemlist.java | 2 ++ src/main/java/parser/Parser.java | 2 +- src/main/java/promotion/Promotion.java | 1 + src/main/java/ui/TextUi.java | 9 +++++++ 6 files changed, 39 insertions(+), 14 deletions(-) diff --git a/.gitignore b/.gitignore index 2873e189e1..983c840134 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ /out/ /*.iml +#Compiled class files +*.class + # Gradle build files /.gradle/ /build/ diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 21824f3762..a4fa9c5794 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -11,20 +11,26 @@ public class ListCommand extends Command{ - protected ArrayList arrayList; + protected ArrayList itemList; + protected ArrayList transactionList; + protected ArrayList promotionList; protected String category; protected boolean isListMarked; - public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { - this.arrayList = arrayList; + public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { + this.itemList= arrayList; this.category = category; this.isListMarked = isListMarked; } - public ListCommand(ArrayList transactions, boolean isVoided) { - this.arrayList = transactions; + public ListCommand(ArrayList transactions, boolean isVoided) { + this.transactionList= transactions; this.isListMarked = isVoided; } + public ListCommand(ArrayList promotionList) { + this.promotionList = promotionList; + } + public String getCategory() { return category; } @@ -32,33 +38,37 @@ public String getCategory() { //@@author Fureimi public void execute() throws EmptyListException { try { - if (arrayList.isEmpty()) { - throw new EmptyListException(arrayList.getClass().getSimpleName()); + if (itemList.isEmpty() && transactionList.isEmpty() && promotionList.isEmpty()) { + throw new EmptyListException("There are no results."); } } catch (EmptyListException e) { return; } if (category.equals("NA") && !isListMarked) { - TextUi.showList(arrayList); - } else if (containsTransactions(arrayList)) { + TextUi.showList(itemList); + } else if (containsTransactions(transactionList)) { showTransactionList(); + } else if (containsItems(itemList)) { + showCustomizedItemList(); + } else if (containsPromotions(promotionList)) { + showPromotionList(); } else { TextUi.replyToUser(Messages.EMPTY_LIST); } } private void showTransactionList() { - @SuppressWarnings("unchecked") - ArrayList transactionList = (ArrayList) arrayList; TextUi.showTransactionList(transactionList); } private void showCustomizedItemList() { - @SuppressWarnings("unchecked") - ArrayList itemList = (ArrayList) arrayList; TextUi.showCustomizedList(itemList, category, isListMarked); } + private void showPromotionList() { + TextUi.showPromotionList(promotionList); + } + private static boolean containsItems(ArrayList arrayList) { for (Object obj : arrayList) { if (obj instanceof Item) { diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 9d4ff8a81e..ab55ffaf80 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -45,6 +45,8 @@ public static Item getItem(int index) { } catch (IndexOutOfBoundsException e) { if (index != 0) { System.out.println("Index " + index + " entered is out of bound."); + } else { + System.out.println("There are no items added yet!"); } return null; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 23572de462..d45a9d231c 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -328,7 +328,7 @@ private Command prepareItemList(String args) throws CommandFormatException { } private Command preparePromotionList() { - return new ListCommand<>(Promotionlist.getAllPromotion(), "NA", false); + return new ListCommand<>(Promotionlist.getAllPromotion()); } private Command prepareMark(String args) throws CommandFormatException { diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index f58671e00f..c8773898e8 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -89,6 +89,7 @@ public String getItemName() { return itemName; } + @Override public String toString() { return getItemName() + " have a " + (getDiscount()*100) + "% discount" + "\n" + "Period: " + getStartDate() + " " + getStartMonth() + " " + getStartYear() + " to " + diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 960bc294f6..dbc0c7843a 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -6,6 +6,7 @@ import common.Messages; import item.Item; import item.Transaction; +import promotion.Promotion; public class TextUi { @@ -140,6 +141,14 @@ public static void showTransactionList(ArrayList transactions) { } } + public static void showPromotionList(ArrayList promotionList) { + int counter = 0; + for (Promotion p: promotionList) { + counter++; + replyToUser(counter + ". " + p.toString()); + } + } + public static void showEditMessage(String item, String editedParameter, String oldParameter, String newParameter) { switch (editedParameter) { case "newItemName": From 4ce94aacd3fd65d12a19e0d694e38920bd7e2011 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 11:36:00 +0800 Subject: [PATCH 218/421] Fix issue 141 --- PromotionStorage.txt | 3 +++ StockMasterData.txt | 1 + src/main/java/itemlist/Itemlist.java | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index 7463afdde8..e04df83312 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -4,3 +4,6 @@ Time: 1200 to 2359 item have a 10.00% discount Period: 31 MAR 2024 to 7 APR 2024 Time: 1200 to 2359 +ESP32 have a 0.00% discount +Period: 1 APR 2022 to 2 APR 2022 +Time: 1800 to 1900 diff --git a/StockMasterData.txt b/StockMasterData.txt index 109402b820..8abf315e5b 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,2 @@ 1. | [ ] | item | Qty: 1 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $1.0 | SellPrice: $0.5 +2. | [ ] | ESP32 | Qty: 999 amt | Cat: electronics | BuyPrice: $6.0 | SellPrice: $7.0 diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 9d4ff8a81e..6a45b91179 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -29,7 +29,7 @@ public static void editQuantity(int index, int newQuantity) { public static boolean itemIsExist(String itemName) { for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName) || item.getItemName().equals(itemName)) { return true; } } From 27f2ee32278d7e24113773be7fb4807268b3fc89 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 12:02:14 +0800 Subject: [PATCH 219/421] Fix checkstyle --- src/main/java/itemlist/Cashier.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 17b7db12a0..e83cc65c7c 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -26,8 +26,7 @@ public static ArrayList getTransactions(Item item) { } } return results; - } - else { + } else { return null; } } From fcec88303bba6b880b8d60940ecf677e430b416c Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 13:38:56 +0800 Subject: [PATCH 220/421] Update AddCommand --- StockMasterData.txt | 1 + src/main/java/command/AddCommand.java | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8abf315e5b..0e246a43b5 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +1,3 @@ 1. | [ ] | item | Qty: 1 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $1.0 | SellPrice: $0.5 2. | [ ] | ESP32 | Qty: 999 amt | Cat: electronics | BuyPrice: $6.0 | SellPrice: $7.0 +1. | [ ] | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index ede89e5b39..1cfe50258c 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -67,7 +67,7 @@ public void updateQuantity(String itemName) { System.out.println("Item already exists and quantity has been changed"); int indexOfItem = -1; for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName) || item.getItemName().equals(itemName)) { indexOfItem = Itemlist.getIndex(item); } } From 6f1aa1fb0dacd15110e70ecace552dd1c4a0ad65 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 13:43:04 +0800 Subject: [PATCH 221/421] Update DeleteCommand --- src/main/java/command/DeleteCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 8ae8629e34..2f0ab2c369 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -16,7 +16,7 @@ public void execute() { int index = -1; try { for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName) || item.getItemName().equals(itemName)) { index = Itemlist.getItems().indexOf(item); break; } From cc0b9efc896ba44e154ba0e0b200a6e9c715d772 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 10 Apr 2024 15:38:39 +0800 Subject: [PATCH 222/421] Handle exception for extra large numbers --- src/main/java/itemlist/Cashier.java | 3 +- src/main/java/parser/Parser.java | 56 +++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 17b7db12a0..e83cc65c7c 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -26,8 +26,7 @@ public static ArrayList getTransactions(Item item) { } } return results; - } - else { + } else { return null; } } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 23572de462..a758434a6a 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -179,9 +179,25 @@ private Command prepareAdd(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.ADD); } String category = matcher.group("category") != null ? matcher.group("category") : "NA"; - int quantity = Integer.parseInt(matcher.group("quantity")); - float buyPrice = Float.parseFloat(matcher.group("buyPrice")); - float sellPrice = Float.parseFloat(matcher.group("sellPrice")); + int quantity; + try { + quantity = Integer.parseInt(matcher.group("quantity")); + } catch (NumberFormatException e) { + throw new CommandFormatException("Quantity is too large"); + } + float buyPrice; + try { + buyPrice = Float.parseFloat(matcher.group("buyPrice")); + } catch (NumberFormatException e) { + throw new CommandFormatException("Buy price is too large"); + } + float sellPrice; + try { + sellPrice = Float.parseFloat(matcher.group("sellPrice")); + } catch (NumberFormatException e) { + throw new CommandFormatException("Sell price is too large"); + } + assert quantity >= 0 : "Quantity should not be negative."; return new AddCommand( matcher.group("itemName"), @@ -209,7 +225,12 @@ private Command prepareSell(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.SELL); } - int sellQuantity = Integer.parseInt(matcher.group("sellQuantity").trim()); + int sellQuantity; + try { + sellQuantity = Integer.parseInt(matcher.group("sellQuantity").trim()); + } catch (NumberFormatException e) { + throw new CommandFormatException("Quantity is too large"); + } if (Promotionlist.isOnPromo(matcher.group("itemName"))) { float getDiscount = (Promotionlist.getPromotion(matcher.group("itemName"))).getDiscount(); return new SellCommand( @@ -248,19 +269,34 @@ private Command prepareEdit(String args) throws CommandFormatException{ // check if itemName was edited. If no, newItemName will be NA String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; // check if quantity was edited. If no, newQuantity will be -1 - int newQuantity = matcher.group("newQuantity") != null ? - Integer.parseInt(matcher.group("newQuantity")) : -1; + int newQuantity; + try { + newQuantity = matcher.group("newQuantity") != null ? + Integer.parseInt(matcher.group("newQuantity")) : -1; + } catch (NumberFormatException e) { + throw new CommandFormatException("Quantity is too large"); + } // check if unitOfMeasurement was edited. If no, newUnitOfMeasurement will be NA String newUnitOfMeasurement = matcher.group("newUnitOfMeasurement") != null ? matcher.group("newUnitOfMeasurement") : "NA"; // check if category was edited. If no, newCategory will be NA String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; // check if BuyPrice was edited. If no, newBuyPrice will be -1 - float newBuyPrice = matcher.group("newBuyPrice") != null ? - Float.parseFloat(matcher.group("newBuyPrice")) : -1; + float newBuyPrice; + try { + newBuyPrice = matcher.group("newBuyPrice") != null ? + Float.parseFloat(matcher.group("newBuyPrice")) : -1; + } catch (NumberFormatException e) { + throw new CommandFormatException("Buy price is too large"); + } // check if sellPrice was edited. If no, newSellPrice will be -1 - float newSellPrice = matcher.group("newSellPrice") != null ? - Float.parseFloat(matcher.group("newSellPrice")) : -1; + float newSellPrice; + try { + newSellPrice = matcher.group("newSellPrice") != null ? + Float.parseFloat(matcher.group("newSellPrice")) : -1; + } catch (NumberFormatException e) { + throw new CommandFormatException("Sell price is too large"); + } return new EditCommand( itemName, newItemName, From 3c7ef6b6f17769d4403122931b5b4005ac31c39a Mon Sep 17 00:00:00 2001 From: Fureimi Date: Wed, 10 Apr 2024 16:24:39 +0800 Subject: [PATCH 223/421] fix list_items feature --- StockMasterData.txt | 3 ++- src/main/java/command/ListCommand.java | 3 +++ src/main/java/parser/Parser.java | 5 +++-- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 109402b820..1cd1085842 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,2 @@ -1. | [ ] | item | Qty: 1 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $1.0 | SellPrice: $0.5 +1. | [X] | test | Qty: 30 pieces | Cat: food | BuyPrice: $3.21324354E14 | SellPrice: $2.4 +2. | [ ] | food | Qty: 200 pieces | Cat: fruit | BuyPrice: $1.2 | SellPrice: $2.5 diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 21824f3762..6b782a22c2 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -40,6 +40,8 @@ public void execute() throws EmptyListException { } if (category.equals("NA") && !isListMarked) { TextUi.showList(arrayList); + } else if (containsItems(arrayList)) { + showCustomizedItemList(); } else if (containsTransactions(arrayList)) { showTransactionList(); } else { @@ -47,6 +49,7 @@ public void execute() throws EmptyListException { } } + private void showTransactionList() { @SuppressWarnings("unchecked") ArrayList transactionList = (ArrayList) arrayList; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 23572de462..8179ab2b46 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -178,7 +178,8 @@ private Command prepareAdd(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); } - String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + String category = matcher.group("category") != null ? matcher.group("category").toLowerCase() : + "NA"; int quantity = Integer.parseInt(matcher.group("quantity")); float buyPrice = Float.parseFloat(matcher.group("buyPrice")); float sellPrice = Float.parseFloat(matcher.group("sellPrice")); @@ -322,7 +323,7 @@ private Command prepareItemList(String args) throws CommandFormatException { if (!matcher.matches()) { throw new CommandFormatException(CommandType.LIST_ITEMS); } - String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + String category = matcher.group("category") != null ? matcher.group("category").toLowerCase(): "NA"; boolean listMarked = matcher.group("isMark") != null; return new ListCommand<>(Itemlist.getItems(), category, listMarked); } From 180ffd57b7c8f6cb534e46b339a3af059ae0a198 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 16:45:10 +0800 Subject: [PATCH 224/421] Fix NullPointerException --- src/main/java/command/DeleteCommand.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 2f0ab2c369..c74e6264ad 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -28,8 +28,11 @@ public void execute() { Itemlist.deleteItem(index); System.out.println(itemName + " has been successfully deleted."); Storage.overwriteFile(Itemlist.getItems()); - assert(!Itemlist.getItem(index).getItemName().equals(itemName)); - + if (index == Itemlist.getItems().size()) { + assert (Itemlist.getItem(index) == null); + } else { + assert (!Itemlist.getItem(index).getItemName().equals(itemName)); + } } } catch (IndexOutOfBoundsException e) { System.out.println("Itemlist is empty."); From 73907f6f7c124f459bdb8d22985d46494d740f16 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 10 Apr 2024 16:50:56 +0800 Subject: [PATCH 225/421] Handle blank itemname and cat exceptions --- StockMasterData.txt | 1 - src/main/java/common/Messages.java | 16 +++- .../exceptions/CommandFormatException.java | 15 ++++ src/main/java/parser/Parser.java | 75 +++++++++++++++---- 4 files changed, 88 insertions(+), 19 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 109402b820..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +0,0 @@ -1. | [ ] | item | Qty: 1 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $1.0 | SellPrice: $0.5 diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 33216de5c0..aea016fa6d 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -9,9 +9,9 @@ public class Messages { "|_________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|----------|------------------------------------------------------------------------------|\n" + - "|list items| list_items |\n" + + "|list items| list_items |\n" + "|----------|------------------------------------------------------------------------------|\n" + - "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + "|----------|------------------------------------------------------------------------------|\n" + "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + @@ -106,4 +106,16 @@ public class Messages { "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DAY] /to [END_DAY] time /from [START_TIME]" + " /to [END_TIME]"; + public static final String INVALID_ITEM_NAME = "Invalid item name. Please input an item name."; + + public static final String INVALID_CATEGORY = "Blank category detected. Please input a category."; + + public static final String QTY_TOO_LARGE = "Quantity is too large. Please input a smaller quantity."; + + public static final String BUY_TOO_LARGE = "Buy price is too large. Please input a smaller buy price."; + + public static final String SELL_TOO_LARGE = "Sell price is too large. Please input a smaller sell price."; + + + } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 55c1dacd5e..30263cb316 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -59,6 +59,21 @@ public CommandFormatException(String error) { case "INVALID_DISCOUNT": System.out.println(Messages.INVALID_DISCOUNT); break; + case "INVALID_ITEM_NAME": + System.out.println(Messages.INVALID_ITEM_NAME); + break; + case "INVALID_CATEGORY": + System.out.println(Messages.INVALID_CATEGORY); + break; + case "QTY_TOO_LARGE": + System.out.println(Messages.QTY_TOO_LARGE); + break; + case "BUY_TOO_LARGE": + System.out.println(Messages.BUY_TOO_LARGE); + break; + case "SELL_TOO_LARGE": + System.out.println(Messages.SELL_TOO_LARGE); + break; default: System.out.println(error); } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index a758434a6a..2bac4ee4e4 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -178,29 +178,41 @@ private Command prepareAdd(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); } - String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } + + String category = matcher.group("category") != null ? matcher.group("category").trim() : "NA"; + if (category.isEmpty()) { + throw new CommandFormatException("INVALID_CATEGORY"); + } + int quantity; try { quantity = Integer.parseInt(matcher.group("quantity")); } catch (NumberFormatException e) { - throw new CommandFormatException("Quantity is too large"); + throw new CommandFormatException("QTY_TOO_LARGE"); } + float buyPrice; try { buyPrice = Float.parseFloat(matcher.group("buyPrice")); } catch (NumberFormatException e) { - throw new CommandFormatException("Buy price is too large"); + throw new CommandFormatException("BUY_TOO_LARGE"); } + float sellPrice; try { sellPrice = Float.parseFloat(matcher.group("sellPrice")); } catch (NumberFormatException e) { - throw new CommandFormatException("Sell price is too large"); + throw new CommandFormatException("SELL_TOO_LARGE"); } assert quantity >= 0 : "Quantity should not be negative."; return new AddCommand( - matcher.group("itemName"), + itemName, quantity, matcher.group("unitOfMeasurement"), category, @@ -215,7 +227,11 @@ private Command prepareDelete(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.DEL); } - return new DeleteCommand(matcher.group("itemName")); + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } + return new DeleteCommand(itemName); } @@ -225,12 +241,19 @@ private Command prepareSell(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.SELL); } + + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } + int sellQuantity; try { sellQuantity = Integer.parseInt(matcher.group("sellQuantity").trim()); } catch (NumberFormatException e) { - throw new CommandFormatException("Quantity is too large"); + throw new CommandFormatException("QTY_TOO_LARGE"); } + if (Promotionlist.isOnPromo(matcher.group("itemName"))) { float getDiscount = (Promotionlist.getPromotion(matcher.group("itemName"))).getDiscount(); return new SellCommand( @@ -240,7 +263,7 @@ private Command prepareSell(String args) throws CommandFormatException{ ); } else { return new SellCommand( - matcher.group("itemName"), + itemName, sellQuantity, -1 ); @@ -265,7 +288,11 @@ private Command prepareEdit(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); } - String itemName = matcher.group("itemName"); + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } + // check if itemName was edited. If no, newItemName will be NA String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; // check if quantity was edited. If no, newQuantity will be -1 @@ -274,28 +301,32 @@ private Command prepareEdit(String args) throws CommandFormatException{ newQuantity = matcher.group("newQuantity") != null ? Integer.parseInt(matcher.group("newQuantity")) : -1; } catch (NumberFormatException e) { - throw new CommandFormatException("Quantity is too large"); + throw new CommandFormatException("QTY_TOO_LARGE"); } + // check if unitOfMeasurement was edited. If no, newUnitOfMeasurement will be NA String newUnitOfMeasurement = matcher.group("newUnitOfMeasurement") != null ? matcher.group("newUnitOfMeasurement") : "NA"; + // check if category was edited. If no, newCategory will be NA String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; // check if BuyPrice was edited. If no, newBuyPrice will be -1 + float newBuyPrice; try { newBuyPrice = matcher.group("newBuyPrice") != null ? Float.parseFloat(matcher.group("newBuyPrice")) : -1; } catch (NumberFormatException e) { - throw new CommandFormatException("Buy price is too large"); + throw new CommandFormatException("BUY_TOO_LARGE"); } + // check if sellPrice was edited. If no, newSellPrice will be -1 float newSellPrice; try { newSellPrice = matcher.group("newSellPrice") != null ? Float.parseFloat(matcher.group("newSellPrice")) : -1; } catch (NumberFormatException e) { - throw new CommandFormatException("Sell price is too large"); + throw new CommandFormatException("SELL_TOO_LARGE"); } return new EditCommand( itemName, @@ -314,7 +345,10 @@ private Command preparePromotion(String args) throws CommandFormatException, Inv if (!matcher.matches()) { throw new CommandFormatException(CommandType.PROMOTION); } - String itemName = matcher.group("itemName"); + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } float discount = Float.parseFloat(matcher.group("discount")) / 100; int startDate = Integer.parseInt(matcher.group("startDate")); String startMonth = matcher.group("startMonth"); @@ -358,7 +392,10 @@ private Command prepareItemList(String args) throws CommandFormatException { if (!matcher.matches()) { throw new CommandFormatException(CommandType.LIST_ITEMS); } - String category = matcher.group("category") != null ? matcher.group("category") : "NA"; + String category = matcher.group("category") != null ? matcher.group("category").trim() : "NA"; + if (category.isEmpty()) { + throw new CommandFormatException("INVALID_CATEGORY"); + } boolean listMarked = matcher.group("isMark") != null; return new ListCommand<>(Itemlist.getItems(), category, listMarked); } @@ -372,7 +409,10 @@ private Command prepareMark(String args) throws CommandFormatException { if (!matcher.matches()) { throw new CommandFormatException(CommandType.MARK); } - String itemName = matcher.group("itemName"); + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } return new MarkCommand(itemName); } @@ -381,7 +421,10 @@ private Command prepareUnmark(String args) throws CommandFormatException { if (!matcher.matches()) { throw new CommandFormatException(CommandType.UNMARK); } - String itemName = matcher.group("itemName"); + String itemName = matcher.group("itemName").trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } return new UnmarkCommand(itemName); } From 9bad87fe1f2bd803d78dd32c2388811890e71535 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Wed, 10 Apr 2024 16:51:52 +0800 Subject: [PATCH 226/421] fix issues with case sensitivity in list_item command, as well as edit funciton --- docs/UserGuide.md | 4 ++- src/main/java/exceptions/EditException.java | 29 +++++++++++++++++++++ src/main/java/parser/Parser.java | 23 ++++++++++++++-- 3 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 src/main/java/exceptions/EditException.java diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d4f7606731..ee0d3069be 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -248,7 +248,9 @@ the application. | Edit Item | `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | | Find Item | `find KEYWORD`
`e.g. find University` | | Sell Item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | -| List Inventory | `list_items` | +| Mark Item | `mark [ITEM_NAME]` | +| Unmark Item | `unmark [ITEM_NAME]` | +| List Inventory | `list_items [marked] [cat/CATEGORY]` | | Get Best Seller | `bestseller` | | Get Profit | `total_profit` | | Get Revenue | `total_revenue` | diff --git a/src/main/java/exceptions/EditException.java b/src/main/java/exceptions/EditException.java new file mode 100644 index 0000000000..39c9a0785e --- /dev/null +++ b/src/main/java/exceptions/EditException.java @@ -0,0 +1,29 @@ +package exceptions; + +import ui.TextUi; + +public class EditException extends Exception { + public EditException(String error) { + switch (error) { + case "ITEM_NAME": + TextUi.replyToUser("New item name cannot be blank!"); + break; + case "QUANTITY": + TextUi.replyToUser("Quantity cannot be negative!"); + break; + case "UNIT_OF_MEASUREMENT": + TextUi.replyToUser("New unit of measurement should not be empty!"); + break; + case "CATEGORY": + TextUi.replyToUser("New category should not be empty!"); + break; + case "BUY_PRICE": + TextUi.replyToUser("New buy price should be larger than 0!"); + break; + case "SELL_PRICE": + TextUi.replyToUser("New sell price should be larger than 0!"); + break; + } + } + +} diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 8179ab2b46..9596bae23f 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -18,6 +18,7 @@ import command.TotalProfitCommand; import common.Messages; import exceptions.CommandFormatException; +import exceptions.EditException; import exceptions.InvalidDateException; import itemlist.Cashier; import itemlist.Itemlist; @@ -125,7 +126,7 @@ public Command parseInput(String userInput){ case EDIT: try { return prepareEdit(userInput); - } catch (CommandFormatException e) { + } catch (CommandFormatException | EditException e) { break; } case FIND: @@ -240,7 +241,7 @@ private Command prepareFind(String args) throws CommandFormatException{ } //@@author Fureimi - private Command prepareEdit(String args) throws CommandFormatException{ + private Command prepareEdit(String args) throws CommandFormatException, EditException { final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); @@ -248,20 +249,38 @@ private Command prepareEdit(String args) throws CommandFormatException{ String itemName = matcher.group("itemName"); // check if itemName was edited. If no, newItemName will be NA String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; + if (newItemName.isBlank() || newItemName.isEmpty()) { + throw new EditException("ITEM_NAME"); + } // check if quantity was edited. If no, newQuantity will be -1 int newQuantity = matcher.group("newQuantity") != null ? Integer.parseInt(matcher.group("newQuantity")) : -1; + if (matcher.group("newQuantity") != null && newQuantity < 0) { + throw new EditException("QUANTITY"); + } // check if unitOfMeasurement was edited. If no, newUnitOfMeasurement will be NA String newUnitOfMeasurement = matcher.group("newUnitOfMeasurement") != null ? matcher.group("newUnitOfMeasurement") : "NA"; + if (newUnitOfMeasurement.isEmpty() || newUnitOfMeasurement.isBlank()) { + throw new EditException("UNIT_OF_MEASUREMENT"); + } // check if category was edited. If no, newCategory will be NA String newCategory = matcher.group("newCategory") != null ? matcher.group("newCategory") : "NA"; + if (newCategory.isBlank() || newCategory.isEmpty()) { + throw new EditException("CATEGORY"); + } // check if BuyPrice was edited. If no, newBuyPrice will be -1 float newBuyPrice = matcher.group("newBuyPrice") != null ? Float.parseFloat(matcher.group("newBuyPrice")) : -1; + if (matcher.group("newBuyPrice") != null && newBuyPrice < 0) { + throw new EditException("BUY_PRICE"); + } // check if sellPrice was edited. If no, newSellPrice will be -1 float newSellPrice = matcher.group("newSellPrice") != null ? Float.parseFloat(matcher.group("newSellPrice")) : -1; + if (matcher.group("newSellPrice") != null && newSellPrice < 0) { + throw new EditException("SELL_PRICE"); + } return new EditCommand( itemName, newItemName, From c433b6e9f61e9611a54ab5af7b042cea97af0edf Mon Sep 17 00:00:00 2001 From: Fureimi Date: Wed, 10 Apr 2024 16:57:47 +0800 Subject: [PATCH 227/421] remove promotion storage --- PromotionStorage.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index 7463afdde8..e69de29bb2 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,6 +0,0 @@ -item have a 30.00% discount -Period: 27 MAR 2024 to 18 APR 2024 -Time: 1200 to 2359 -item have a 10.00% discount -Period: 31 MAR 2024 to 7 APR 2024 -Time: 1200 to 2359 From 0e904ba62d3dba07d50caf55f0a3fd2957156f11 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Wed, 10 Apr 2024 16:58:36 +0800 Subject: [PATCH 228/421] remove all local storage --- StockMasterData.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 1cd1085842..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +0,0 @@ -1. | [X] | test | Qty: 30 pieces | Cat: food | BuyPrice: $3.21324354E14 | SellPrice: $2.4 -2. | [ ] | food | Qty: 200 pieces | Cat: fruit | BuyPrice: $1.2 | SellPrice: $2.5 From e5d3617afed2a7190d1efb92f17d6ea7ee69ed07 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 10 Apr 2024 17:00:06 +0800 Subject: [PATCH 229/421] Fix Issue 128 --- docs/UserGuide.md | 1 + src/main/java/common/Messages.java | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 4d58996743..8ddf62249b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -187,6 +187,7 @@ Format: `promotion ITEM_NAME discount/DISCOUNT period /from DATE MONTH YEAR /to time /from START_TIME /to END_TIME` * `DISCOUNT` ranges from 0 to 100 and can take in up to 2 decimal place. +* Format for `MONTH` is 3 alphabets `MMM`. E.g. For January, `Jan`. For December, `Dec`. * `DATE` must be a valid for the specific `[MONTH]` E.g. `30 Feb 2024` is not allowed. * `START_TIME` & `END_TIME` must range from 0000 to 2359. In addition, time range must be valid. diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 283cfacf11..e35f2b8de9 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -38,8 +38,8 @@ public class Messages { "|total | total_revenue |\n" + "|revenue | |\n" + "|----------|------------------------------------------------------------------------------|\n" + - "|promotion | promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] |\n" + - "| | to [DATE] [MONTH] [YEAR] time /from [TIME] /to [TIME] |\n" + + "|promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + "|----------|------------------------------------------------------------------------------|\n" + "|delete | del_promo [ITEM_NAME] |\n" + "|promotion | |\n" + From 353ede2f2f3d03022f57489bc41580d3637e830f Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 10 Apr 2024 17:33:45 +0800 Subject: [PATCH 230/421] handle merge conflicts --- src/main/java/parser/Parser.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index e457f4c78d..806e53b741 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -284,7 +284,7 @@ private Command prepareFind(String args) throws CommandFormatException{ } //@@author Fureimi - private Command prepareEdit(String args) throws CommandFormatException{ + private Command prepareEdit(String args) throws CommandFormatException, EditException { final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); @@ -295,7 +295,7 @@ private Command prepareEdit(String args) throws CommandFormatException{ } // check if itemName was edited. If no, newItemName will be NA - String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName") : "NA"; + String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName").trim() : "NA"; if (newItemName.isBlank() || newItemName.isEmpty()) { throw new EditException("ITEM_NAME"); } From 333377e118a2535ceec0538abc1df31ed0453cc6 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Wed, 10 Apr 2024 17:41:40 +0800 Subject: [PATCH 231/421] edit junit test --- src/test/java/parser/ParserTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 19aec32622..6b2822e0c4 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -79,7 +79,7 @@ public void testParseListCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(ListCommand.class, command); ListCommand listCommand = (ListCommand) command; - assertEquals("Category", listCommand.getCategory()); + assertEquals("category", listCommand.getCategory()); } @Test From ad888f3449e778e5e46e3fff879e762ed1c1dd9f Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 10 Apr 2024 17:48:47 +0800 Subject: [PATCH 232/421] Fix time format --- PromotionStorage.txt | 3 +++ StockMasterData.txt | 1 + src/main/java/promotion/Promotion.java | 3 ++- src/main/java/ui/TextUi.java | 18 +++++++++++++++++- 4 files changed, 23 insertions(+), 2 deletions(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index e69de29bb2..410a9c7319 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -0,0 +1,3 @@ +apple have a 50.00% discount +Period: 2 APR 2024 to 4 APR 2024 +Time: 0 to 100 diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..21b07b9ba8 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1 @@ +1. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index 6f78d76eac..1d65dcd763 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -93,7 +93,8 @@ public String toString() { return getItemName() + " have a " + String.format("%.2f", (getDiscount()*100)) + "% discount" + "\n" + "Period: " + getStartDate() + " " + getStartMonth() + " " + getStartYear() + " to " + getEndDate()+ " " + getEndMonth() + " " + - getEndYear() + "\n" + "Time: " + getStartTime() + " to " + getEndTime(); + getEndYear() + "\n" + "Time: " + String.format("%04d", getStartTime()) + " to " + + String.format("%04d", getEndTime()); } public void print(String args) { diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 960bc294f6..ce6b7fe156 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -63,6 +63,22 @@ public static void replyToUser(String... message) { public static void showList(ArrayList arrayList) { if (arrayList.isEmpty()) { replyToUser(Messages.EMPTY_LIST); + return; + } + replyToUser("List: "); + int index = 1; + for (T item : arrayList) { + if (item == null) { + break; + } + String listItem = index + ". " + item; + replyToUser(listItem); + index++; + } + + + /*if (arrayList.isEmpty()) { + replyToUser(Messages.EMPTY_LIST); } else { replyToUser("List: "); for (T item : arrayList) { @@ -71,7 +87,7 @@ public static void showList(ArrayList arrayList) { } replyToUser(arrayList.indexOf(item) + 1 + ". " + item); } - } + }*/ } public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { From c12ee02c4356b5ff85ddafe23570b1235aef9a0f Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 10 Apr 2024 17:53:28 +0800 Subject: [PATCH 233/421] Fix Junit Test --- src/test/java/parser/ParserTest.java | 2 +- src/test/java/storage/StorageTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 6b2822e0c4..f4433dae34 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -30,7 +30,7 @@ public void testParseAddCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(AddCommand.class, command); AddCommand addCommand = (AddCommand) command; - assertEquals("ItemName", addCommand.getItemName()); + assertEquals("itemname", addCommand.getItemName()); assertEquals(10, addCommand.getQuantity()); assertEquals("unitOfMeasurement", addCommand.getUnitOfMeasurement()); assertEquals("Category", addCommand.getCategory()); diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 87850a4cc2..cc13f54f6f 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -23,7 +23,7 @@ public void readFromFile_fileNotFound() throws InvalidDateException { Storage.writeToFile(directory, "", true); testFile.delete(); Storage.readFromFile(directory); - assertEquals("File does not exist." + System.lineSeparator(), outputStream.toString()); + assertEquals("File does not exist. Creating a new Text File" + System.lineSeparator(), outputStream.toString()); } catch (IOException e) { fail("failed to create a file."); } From af36d7ea79a6277bf1ad1852c2e8a275309b0970 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 10 Apr 2024 17:55:54 +0800 Subject: [PATCH 234/421] Fix Checkstyle Test --- src/test/java/storage/StorageTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index cc13f54f6f..ffad3b7410 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -23,7 +23,8 @@ public void readFromFile_fileNotFound() throws InvalidDateException { Storage.writeToFile(directory, "", true); testFile.delete(); Storage.readFromFile(directory); - assertEquals("File does not exist. Creating a new Text File" + System.lineSeparator(), outputStream.toString()); + assertEquals("File does not exist. Creating a new Text File" + + System.lineSeparator(), outputStream.toString()); } catch (IOException e) { fail("failed to create a file."); } From d726bbb2cb4fb0f30584006fab8839e3ce5fd281 Mon Sep 17 00:00:00 2001 From: Shu Date: Wed, 10 Apr 2024 20:22:36 +0800 Subject: [PATCH 235/421] Fix Promotionlist --- PromotionStorage.txt | 3 --- StockMasterData.txt | 3 +++ TransactionLogs.txt | 8 +++++++ docs/Diagrams/PUML files/AddPromotion.puml | 11 ++++++++++ .../PUML files/Promotion_SequenceDigram.puml | 21 ++++++++++++++++++ src/main/java/promotion/Promotionlist.java | 22 ++++++++----------- 6 files changed, 52 insertions(+), 16 deletions(-) create mode 100644 docs/Diagrams/PUML files/AddPromotion.puml create mode 100644 docs/Diagrams/PUML files/Promotion_SequenceDigram.puml diff --git a/PromotionStorage.txt b/PromotionStorage.txt index 410a9c7319..e69de29bb2 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,3 +0,0 @@ -apple have a 50.00% discount -Period: 2 APR 2024 to 4 APR 2024 -Time: 0 to 100 diff --git a/StockMasterData.txt b/StockMasterData.txt index 21b07b9ba8..0a4691b5bc 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,4 @@ 1. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 +2. | [ ] | ESP32 | Qty: 27 amt | Cat: electronics | BuyPrice: $32.0 | SellPrice: $32.0 +3. | [ ] | ITEM | Qty: 51 kg | Cat: null | BuyPrice: $150.0 | SellPrice: $30.0 +4. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..5a8c2eeed8 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,8 @@ +Date: 2024-04-10 18:21:50 +Transaction ID: 1 +Item Name: ESP32 +Quantity: 5 +Unit Price: 32.0 +Total Price: 160.0 +Profit: 0.0 + diff --git a/docs/Diagrams/PUML files/AddPromotion.puml b/docs/Diagrams/PUML files/AddPromotion.puml new file mode 100644 index 0000000000..ac2c2d3913 --- /dev/null +++ b/docs/Diagrams/PUML files/AddPromotion.puml @@ -0,0 +1,11 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +Alice -> Bob: Authentication Request +Bob --> Alice: Authentication Response + +Alice -> Bob: Another authentication Request +Alice <-- Bob: another authentication Response +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml b/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml new file mode 100644 index 0000000000..c20c46bc64 --- /dev/null +++ b/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/sequence-diagram + +participant ":PromotionCommand" as PromotionCommand +participant "<>\nPromotionlist" as PromotionList +participant TextUi +participant "<>\nItemlist" as Itemlist +participant "<\n Promotion" as Promotion + + +-> PromotionCommand: execute() + +alt promotion + ref over PromotionCommand, PromotionList, Itemlist, Promotion, TextUi : AddPromotion +else delete + ref over PromotionCommand, PromotionList, TextUi : DeletePromotion +else list_promotions + PromotionCommand -> TextUi: printPromotion() +else invalid_command +end +@enduml \ No newline at end of file diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index c95328cf1f..3a77f1a3fd 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -32,14 +32,7 @@ public static boolean itemIsOnPromo(String itemName) { } public static boolean isOnPromo(String itemName) { - if (!Promotionlist.itemIsOnPromo(itemName)) { - return false; - } - assert getPromotion(itemName) != null; - if (!isPromoExist(getPromotion(itemName))) { - return false; - } - return true; + return Promotionlist.itemIsOnPromo(itemName); } public static boolean isLeapYear(int year) { @@ -61,7 +54,10 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException if (!Itemlist.itemIsExist(itemName)) { throw new CommandFormatException("ITEM_NOT_FOUND"); } - if (discount < 0 || discount > 1) { + if (Promotionlist.isOnPromo(itemName)) { + throw new InvalidDateException("ITEM_IS_PROMO"); + } + if (!isValidDiscount(discount)) { throw new CommandFormatException("INVALID_DISCOUNT"); } if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { @@ -73,14 +69,14 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException if (!isValidDuration(startDate, startMonth, startYear, endDate, endMonth, endYear)) { throw new InvalidDateException("INVALID_PERIOD"); } - - if (Promotionlist.isOnPromo(itemName)) { - throw new InvalidDateException("ITEM_IS_PROMO"); - } promotions.add(promotion); PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); } + public static boolean isValidDiscount (float discount) { + return !(discount < 0) && !(discount > 1); + } + public static boolean isPromoExist(Promotion promotion) { LocalDateTime currentTime = LocalDateTime.now(); DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); From 99697ecfae4993d55697e9709709941ad6cbc464 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 21:53:09 +0800 Subject: [PATCH 236/421] Fix issue 140 --- src/main/java/command/SellCommand.java | 2 +- src/main/java/promotion/Promotionlist.java | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index e52dd058cb..473321d813 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -54,7 +54,7 @@ public void execute() { Itemlist.editQuantity(index, remainingQuantity); } Storage.overwriteFile(Itemlist.getItems()); - Transaction newTransaction = new Transaction(itemName, sellQuantity, toSell.getBuyPrice(), sellPrice); + Transaction newTransaction = new Transaction(Itemlist.getItem(index).getItemName(), sellQuantity, toSell.getBuyPrice(), sellPrice); Cashier.addItem(newTransaction); TransactionLogs.addToLog(Cashier.getTransactions()); } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index dc00bb6ba8..77ca63b805 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -88,6 +88,9 @@ public static boolean isPromoExist(Promotion promotion) { int year = Integer.parseInt(formattedYear); int month = Integer.parseInt(formattedMonth); int date = Integer.parseInt(formattedDate); + if (promotion == null) { + return false; + } if (year < promotion.getStartYear() || year > promotion.getEndYear()) { return false; } @@ -153,7 +156,7 @@ public static boolean isValidMonth(int date, Month month, int year) throws Inval public static Promotion getPromotion(String itemName) { for (Promotion promotion: promotions) { - if (promotion.getItemName().equals(itemName)) { + if (promotion.getItemName().equals(itemName) || promotion.getItemName().toLowerCase().equals(itemName)) { return promotion; } } From db6631e0c1b2ffd875e18518da86652b592335f7 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Wed, 10 Apr 2024 22:19:17 +0800 Subject: [PATCH 237/421] update input string check --- src/main/java/command/AddCommand.java | 2 +- src/main/java/command/DeleteCommand.java | 2 +- src/main/java/command/SellCommand.java | 2 +- src/main/java/itemlist/Itemlist.java | 2 +- src/main/java/promotion/Promotionlist.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 1cfe50258c..015129f8fd 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -67,7 +67,7 @@ public void updateQuantity(String itemName) { System.out.println("Item already exists and quantity has been changed"); int indexOfItem = -1; for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName) || item.getItemName().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName.toLowerCase())) { indexOfItem = Itemlist.getIndex(item); } } diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index c74e6264ad..4156ac26a3 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -16,7 +16,7 @@ public void execute() { int index = -1; try { for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName) || item.getItemName().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName.toLowerCase())) { index = Itemlist.getItems().indexOf(item); break; } diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 473321d813..8b38bdafa1 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -32,7 +32,7 @@ public void execute() { int index = -1; Item toSell = Itemlist.getItems().get(0); for (Item item : Itemlist.getItems()) { - if (item.getItemName().equals(itemName) || item.getItemName().toLowerCase().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName.toLowerCase())) { index = Itemlist.getItems().indexOf(item); toSell = item; break; diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 6a45b91179..4bfba445ed 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -29,7 +29,7 @@ public static void editQuantity(int index, int newQuantity) { public static boolean itemIsExist(String itemName) { for (Item item : Itemlist.getItems()) { - if (item.getItemName().toLowerCase().equals(itemName) || item.getItemName().equals(itemName)) { + if (item.getItemName().toLowerCase().equals(itemName.toLowerCase())) { return true; } } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 77ca63b805..9858a4b0fa 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -156,7 +156,7 @@ public static boolean isValidMonth(int date, Month month, int year) throws Inval public static Promotion getPromotion(String itemName) { for (Promotion promotion: promotions) { - if (promotion.getItemName().equals(itemName) || promotion.getItemName().toLowerCase().equals(itemName)) { + if (promotion.getItemName().toLowerCase().equals(itemName.toLowerCase())) { return promotion; } } From 9f47833a337a7624ef95524037f263e848ab1bb4 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 01:35:33 +0800 Subject: [PATCH 238/421] help for specific commands --- src/main/java/command/HelpCommand.java | 27 +++- src/main/java/common/Messages.java | 130 ++++++++++++------ .../exceptions/CommandFormatException.java | 5 +- src/main/java/parser/Parser.java | 24 +++- src/main/java/reminder/LowStockReminder.java | 3 +- src/test/java/command/HelpCommandTest.java | 2 +- 6 files changed, 141 insertions(+), 50 deletions(-) diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 597948b929..5ec1196ee4 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -1,11 +1,36 @@ package command; import common.Messages; +import exceptions.CommandFormatException; public class HelpCommand extends Command{ + protected String command; + + public HelpCommand(String command){ + this.command = command; + } @Override public void execute() { - System.out.println(Messages.HELP); + switch (command) { + case "NA": + System.out.println(Messages.HELP); + break; + case "list_items": + System.out.println(Messages.HELP_LIST_ITEMS); + break; + case "add": + System.out.println(Messages.HELP_ADD); + break; + case "sell": + System.out.println(Messages.HELP_SELL); + break; + default: + System.out.println(Messages.INVALID_HELP_COMMAND); + break; + } + + + } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3bdef546e3..34e5548781 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -4,51 +4,89 @@ public class Messages { public static final String DIVIDER = "----------------"; public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; public static final String HELP = - " _________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|_________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|list items| list_items |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + - "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| edit | edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + - "| | cat/[NEW_CATEGORY] |\n" + - "| | (use AT LEAST 1 of: qty/, uom/, cat/) |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| mark | mark [ITEM_NAME] |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| unmark | unmark [ITEM_NAME] |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| delete | del [ITEM_NAME] |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| find | 1. find [KEYWORD] - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 [KEYWORD] - to search under the filters* |\n" + - "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|bestseller| bestseller |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|total | total_profit |\n" + - "|profit | |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|total | total_revenue |\n" + - "|revenue | |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + - "| | to DD MMM YYYY time /from TIME /to TIME |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|delete | del_promo [ITEM_NAME] |\n" + - "|promotion | |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "|list | list_promotions |\n" + - "|promotions| |\n" + - "|----------|------------------------------------------------------------------------------|\n" + - "| exit | exit |\n" + - "|__________|______________________________________________________________________________|\n"; + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list items | list_items |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| edit | edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + + "| | cat/[NEW_CATEGORY] |\n" + + "| | (use AT LEAST 1 of: qty/, uom/, cat/) |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| mark | mark [ITEM_NAME] |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| unmark | unmark [ITEM_NAME] |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del [ITEM_NAME] |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| find | 1. find [KEYWORD] - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 [KEYWORD] - to search under the filters* |\n" + + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| bestseller | bestseller |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_profit |\n" + + "| profit | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_revenue |\n" + + "| revenue | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del_promo [ITEM_NAME] |\n" + + "| promotion | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list | list_promotions |\n" + + "| promotions | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| exit | exit |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_LIST_ITEMS = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list items | list_items |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_ADD = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | add apple qty/100 /pcs cat/fruit buy/1.50 sell/2.50 |\n" + + "| | add flour qty/15 /kg buy/5.10 sell/7.45 |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| remarks: | category is optional |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_SELL = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | sell apple qty/5 |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String INVALID_HELP_FORMAT = "Invalid command format. Please use format: 'help' or " + + "'help c/[COMMAND]'"; public static final String INVALID_ADD_FORMAT = "Invalid command format. Please use format: " + "\n" + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + "buy/[BUY_PRICE] sell/[SELL_PRICE]'"; @@ -111,6 +149,8 @@ public class Messages { public static final String INVALID_CATEGORY = "Blank category detected. Please input a category."; + public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; + public static final String QTY_TOO_LARGE = "Quantity is too large. Please input a smaller quantity."; public static final String BUY_TOO_LARGE = "Buy price is too large. Please input a smaller buy price."; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 30263cb316..a9be45c6fa 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -24,7 +24,7 @@ public CommandFormatException(CommandType command){ System.out.println(Messages.INVALID_FIND_FORMAT); break; case HELP: - System.out.println(Messages.HELP); + System.out.println(Messages.INVALID_HELP_FORMAT); break; case LIST_ITEMS: System.out.println(Messages.INVALID_LIST_FORMAT); @@ -65,6 +65,9 @@ public CommandFormatException(String error) { case "INVALID_CATEGORY": System.out.println(Messages.INVALID_CATEGORY); break; + case "INVALID_COMMAND": + System.out.println(Messages.INVALID_HELP_COMMAND); + break; case "QTY_TOO_LARGE": System.out.println(Messages.QTY_TOO_LARGE); break; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 806e53b741..26b11c1eb6 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -30,6 +30,9 @@ import java.util.regex.Pattern; public class Parser { + + public static final Pattern HELP_COMMAND_FORMAT = + Pattern.compile("help (?: c/(?[^/]+))?"); public static final Pattern ADD_COMMAND_FORMAT = Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); @@ -90,7 +93,11 @@ public Command parseInput(String userInput){ case EXIT: return new ExitCommand(true); case HELP: - return new HelpCommand(); + try { + return prepareHelp(userInput); + } catch (CommandFormatException e) { + break; + } case LIST_ITEMS: try { return prepareItemList(userInput); @@ -172,6 +179,21 @@ public Command parseInput(String userInput){ return new IncorrectCommand(); } + private Command prepareHelp(String args) throws CommandFormatException{ + final Matcher matcher = HELP_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.HELP); + } + + String command = matcher.group("command") != null ? + matcher.group("command").toLowerCase().trim() : "NA"; + if (command.isEmpty()) { + throw new CommandFormatException("INVALID_HELP_COMMAND"); + } + + return new HelpCommand(command); + } private Command prepareAdd(String args) throws CommandFormatException{ final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); diff --git a/src/main/java/reminder/LowStockReminder.java b/src/main/java/reminder/LowStockReminder.java index e2da385833..e1e681cbaa 100644 --- a/src/main/java/reminder/LowStockReminder.java +++ b/src/main/java/reminder/LowStockReminder.java @@ -9,6 +9,7 @@ public class LowStockReminder { //protected int QuantityInStock; //protected int QuantitySoldPerMonth; //protected float newSellPrice; + protected static int DEFAULT_LOW_STOCK_THRESHOLD = 5; public static void execute(){ outOfStockItemsReminder(); @@ -33,7 +34,7 @@ private static void lowOnStockItemsReminder(){ int count = 0; System.out.println("Low-on-stock Items:"); for (Item item : Itemlist.getItems()) { - if (item.getQuantity() <= 5 && item.getQuantity() > 0) { //low stock condition + if (item.getQuantity() <= DEFAULT_LOW_STOCK_THRESHOLD && item.getQuantity() > 0) { //low stock condition System.out.println(item.getItemName()); count++; } diff --git a/src/test/java/command/HelpCommandTest.java b/src/test/java/command/HelpCommandTest.java index 731cb135d9..6f706ac237 100644 --- a/src/test/java/command/HelpCommandTest.java +++ b/src/test/java/command/HelpCommandTest.java @@ -13,7 +13,7 @@ public class HelpCommandTest { public void testExecute() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); - HelpCommand helpCommand = new HelpCommand(); + HelpCommand helpCommand = new HelpCommand("NA"); helpCommand.execute(); String expectedOutput = Messages.HELP + System.lineSeparator(); assertEquals(expectedOutput, outputStreamCaptor.toString()); From aa536bbe8e49b265c011c647794c3a40d270d019 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 02:05:30 +0800 Subject: [PATCH 239/421] fix help format error --- StockMasterData.txt | 2 +- TransactionLogs.txt | 56 ++++++++++++++++++++ src/main/java/command/HelpCommand.java | 1 - src/main/java/parser/Parser.java | 2 +- src/main/java/reminder/LowStockReminder.java | 7 ++- 5 files changed, 61 insertions(+), 7 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 21b07b9ba8..4dc4f77cb1 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1 @@ -1. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 +1. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..5d1641c3ac 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,56 @@ +Date: 2024-04-11 01:48:39 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-11 01:58:16 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-11 01:58:38 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-11 01:59:21 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-11 01:59:34 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-11 02:03:01 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-11 02:03:27 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 5ec1196ee4..868c3667aa 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -1,7 +1,6 @@ package command; import common.Messages; -import exceptions.CommandFormatException; public class HelpCommand extends Command{ diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 26b11c1eb6..eaa69bb803 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -32,7 +32,7 @@ public class Parser { public static final Pattern HELP_COMMAND_FORMAT = - Pattern.compile("help (?: c/(?[^/]+))?"); + Pattern.compile("help(?: c/(?[^/]+))?"); public static final Pattern ADD_COMMAND_FORMAT = Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); diff --git a/src/main/java/reminder/LowStockReminder.java b/src/main/java/reminder/LowStockReminder.java index e1e681cbaa..c310922ea7 100644 --- a/src/main/java/reminder/LowStockReminder.java +++ b/src/main/java/reminder/LowStockReminder.java @@ -5,11 +5,10 @@ public class LowStockReminder { + private static final int DEFAULT_LOW_STOCK_THRESHOLD = 5; + protected String itemName; - //protected int QuantityInStock; - //protected int QuantitySoldPerMonth; - //protected float newSellPrice; - protected static int DEFAULT_LOW_STOCK_THRESHOLD = 5; + public static void execute(){ outOfStockItemsReminder(); From e4232c9b80014ab5b563769fe7a7bebf3cd8c678 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 02:29:22 +0800 Subject: [PATCH 240/421] add add command sequence diagram --- .../AddCommand_SequenceDiagram.puml | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 docs/Diagrams/PUML files/AddCommand_SequenceDiagram.puml diff --git a/docs/Diagrams/PUML files/AddCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/AddCommand_SequenceDiagram.puml new file mode 100644 index 0000000000..7f3481e79d --- /dev/null +++ b/docs/Diagrams/PUML files/AddCommand_SequenceDiagram.puml @@ -0,0 +1,25 @@ +@startuml + +actor User +participant "Parser" as Parser +participant "AddCommand" as AddCommand +participant "Itemlist" as Itemlist + +User -> Parser: add command +activate Parser + +Parser -> AddCommand: prepareAdd(userInput) +activate AddCommand +AddCommand -> Itemlist: itemIsExist(itemName) +activate Itemlist +Itemlist -> AddCommand: false +deactivate Itemlist +AddCommand -> AddCommand: create new Item +AddCommand -> Itemlist: addItem(Item) +activate Itemlist +deactivate Itemlist +AddCommand -> User: Output success message +deactivate AddCommand +deactivate Parser + +@enduml From be7c5dbeba2e96fb011bbab74146c9b2f471e238 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 11 Apr 2024 14:01:42 +0800 Subject: [PATCH 241/421] Update DG --- PromotionStorage.txt | 3 + StockMasterData.txt | 2 +- TransactionLogs.txt | 48 ++++++++++++ docs/DeveloperGuide.md | 71 +++++++++++++++--- docs/Diagrams/AddPromotion.png | Bin 58044 -> 39800 bytes docs/Diagrams/AddPromotion_ClassDiagram.png | Bin 0 -> 54195 bytes docs/Diagrams/DeletePromo.png | Bin 26796 -> 0 bytes docs/Diagrams/DeletePromotion.png | Bin 0 -> 20815 bytes docs/Diagrams/ListPromotion.png | Bin 11172 -> 0 bytes docs/Diagrams/PUML files/AddPromotion.puml | 31 ++++++-- .../PUML files/AddPromotion_ClassDiagram.puml | 56 ++++++++++++++ docs/Diagrams/PUML files/DeletePromotion.puml | 21 ++++++ .../PUML files/Promotion_SequenceDigram.puml | 3 + docs/Diagrams/Promotion_SequenceDigram.png | Bin 0 -> 18654 bytes src/main/java/parser/Parser.java | 2 +- src/main/java/promotion/Promotion.java | 2 - src/main/java/promotion/Promotionlist.java | 39 +++++----- 17 files changed, 240 insertions(+), 38 deletions(-) create mode 100644 docs/Diagrams/AddPromotion_ClassDiagram.png delete mode 100644 docs/Diagrams/DeletePromo.png create mode 100644 docs/Diagrams/DeletePromotion.png delete mode 100644 docs/Diagrams/ListPromotion.png create mode 100644 docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml create mode 100644 docs/Diagrams/PUML files/DeletePromotion.puml create mode 100644 docs/Diagrams/Promotion_SequenceDigram.png diff --git a/PromotionStorage.txt b/PromotionStorage.txt index e69de29bb2..e21c82d075 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -0,0 +1,3 @@ +apple have a 50.00% discount +Period: 10 APR 2024 to 14 APR 2024 +Time: 1200 to 2300 diff --git a/StockMasterData.txt b/StockMasterData.txt index 0a4691b5bc..95132e69fe 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,4 +1,4 @@ 1. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 2. | [ ] | ESP32 | Qty: 27 amt | Cat: electronics | BuyPrice: $32.0 | SellPrice: $32.0 3. | [ ] | ITEM | Qty: 51 kg | Cat: null | BuyPrice: $150.0 | SellPrice: $30.0 -4. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +4. | [ ] | apple | Qty: 40 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index 5a8c2eeed8..be7e25f802 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -6,3 +6,51 @@ Unit Price: 32.0 Total Price: 160.0 Profit: 0.0 +Date: 2024-04-10 21:17:22 +Transaction ID: 2 +Item Name: apple +Quantity: 1 +Unit Price: 2.5 +Total Price: 2.5 +Profit: -1.5 + +Date: 2024-04-10 21:21:58 +Transaction ID: 3 +Item Name: apple +Quantity: 1 +Unit Price: 5.0 +Total Price: 5.0 +Profit: 1.0 + +Date: 2024-04-10 21:22:46 +Transaction ID: 4 +Item Name: apple +Quantity: 1 +Unit Price: 2.5 +Total Price: 2.5 +Profit: -1.5 + +Date: 2024-04-10 21:33:49 +Transaction ID: 5 +Item Name: apple +Quantity: 1 +Unit Price: 5.0 +Total Price: 5.0 +Profit: 1.0 + +Date: 2024-04-10 21:34:41 +Transaction ID: 6 +Item Name: apple +Quantity: 5 +Unit Price: 5.0 +Total Price: 25.0 +Profit: 5.0 + +Date: 2024-04-10 21:36:41 +Transaction ID: 7 +Item Name: apple +Quantity: 1 +Unit Price: 2.5 +Total Price: 2.5 +Profit: -1.5 + diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index aad48c4e71..5d08c4db43 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -57,41 +57,90 @@ own business given a certain period and time. Additionally, it implements the fo * `list_promotions` +Given below is the overall sequence diagram for the `PromotionCommand`. + +![PromotionSequenceDiagram](./Diagrams/Promotion_SequenceDigram.png) + + The PromotionCommand will execute the appropriate command and prints messages to the user through the `TextUi`. -**Add new promotion:** +#### Add new promotion: -Alt Text +The add promotion command has 5 compulsory arguments `ITEM_NAME`, `discount/`, `period /from`, `/to`, `time /from` and `to` Example: ``` promotion apple discount/50 period /from 1 Jan 2024 /to 31 Dec 2024 time from/ 0000 /to 2359 ``` +#### Add Promotion Class Diagram + +Given below is the class diagram showing the class structure of the add promotion mechanism: + +![AddPromotion Class Diagram](./Diagrams/AddPromotion_ClassDiagram.png) + +#### Add Promotion Sequence Diagram + +Given below is the sequence diagram showing the add promotion mechanism: + +![AddPromotion Sequence Diagram](./Diagrams/AddPromotion.png) + This command will add a new promotion by calling `addPromotion(promotion)` method in `Promotionlist.java`. The `addPromotion(promotion)` then calls `isItemExist(apple)` in `Itemlist.java` to check if the item exists in the inventory. -Next, it subsequently calls multiple of its own methods, `isValidMonth(1, Jan, 2024)` and `isValidMonth(31, Dec, 2024)` -to check if the date is valid. `isValidTime(0000, 2359)` is called to check if the time is valid -Lastly `isOnPromo(apple)` is called to check if there is already an existing promotion on `apple`. If there is an existing -promotion, the user will be unable to create another promotion for `apple`. +Next, it subsequently calls multiple of its own methods. +1. `ItemIsOnPromo()` checks if there is already an existing `promotion` for the item. If there is an existing promotion +the user will be unable to create another promotion for the same item. +2. `isValidDiscount()` checks if the `discount` inputed lies between the range of 0 to 100. +3. `isValidMonth()` checks if the `date` entered is valid. E.g. `30 FEB 2024` does not exists. +4. `isValidTime()` checks if the time is a valid range. +5. `isValidDuration()` checks if the duration of the promotion is valid. E.g. A promotion that starts on `1 FEB 2024` and +ends on `1 JAN 2024` is not valid. + +Then, `add(promotion)` method is called in `Promotion.java` to create the promotion. + +A response will then be printed to the `TextUi` to inform the user on the successful creation of the promotion. **Delete promotion:** -Alt Text +This command has one compulsory argument `ITEM_NAME`. + +Example: +``` +del_promo apple +``` + +#### Delete Promotion Sequence Diagram + +Given below is the sequence diagram showing the delete promotion mechanism: + +![DeletePromotion](./Diagrams/DeletePromotion.png) -The promotion will be deleted by calling `deletePromotion(index)` method in `Promotionlist.java`. +This command will initially check if there is such an item in `Promotionlist`. If it does not exists, it will print an +error message. Otherwise, it will execute the deletion of the `promotion`. -Example: `del_promo apple` +To execute the deletion, `getPromotion()` and `getIndex()` methods are called to obtain the index of the item in the +`Promotionlist`. + +The promotion will be deleted by calling `deletePromotion(index)` method in `Promotionlist.java` and will inform the +user on the successful deletion of the promotion via the `TextUi`. **List promotion:** -Alt Text +This command lists all the `promotion` in `Promotionlist`. + +Example: +``` +list_promotions +``` + +#### List Promotion Sequence Diagram + +![ListPromotion](./Diagrams/Promotion_SequenceDigram.png) All of the `Promotions` will be shown to the user through the `TextUi`. -Example: `list_promotions` ## Product scope diff --git a/docs/Diagrams/AddPromotion.png b/docs/Diagrams/AddPromotion.png index a8820e2d0732498c3aa633e3c0a4f94ce9998b47..bd0ecaa138833ad201fb74fe37b2dc1c70a2f242 100644 GIT binary patch literal 39800 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
oQjh1E20w8ODF8C)+^HC-1*TeBt} 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 AWdHyG literal 58044 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 E08SY|+yDRo diff --git a/docs/Diagrams/AddPromotion_ClassDiagram.png b/docs/Diagrams/AddPromotion_ClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..d771cadf802f3e95d70f70f1d58e1b1d9f047321 GIT binary patch literal 54195 zcmeFZbx@V<_ddE+1W^zL2|>Xiq(MqrMLXU(QV3=!La`rj{8(Q1iK_$ul!ejcaPw*L2LxUYK&w)4woy z_T0?e(11?e$k3v(mIN;IMps(S?9c0n6L1}?@L8EhM!gIeMbokux}MeM#2SZMgfU)v zwEUQ~4nLInuJ`AL_>%_gek0KpY5P1ifmb=}(t5=fug4RUL_KgLH%Vdkv?o6u zvDDOPaS;bk_q32*{DPp{jZ&@ZZkdeW3)l}tDJS0kk|Z~dw!X0?bcN~SH}R8W)@Wb9 zo#640tzW;mfa@fE)9}5@TWKNJyjHQ;eEi1(aTH{>VG8THzV@S+az9nwD3`S{Q|x$= zb>U{a+)&mTrjhjK)9(5nReINN6K5x}ySF$81S%Pb1cu(|<-X>((y-HhNiL3Ig+zNu z@B0nn^Lb}|rF957zB@nmXL$PYVaq%Q4<%YZM83*{dn=kVmg0q7cZ6e^H|CJl8*i~o5xuc z#QL!rIOi_jlD?vRiBKu-s+~j}m4Zm&RM+@?vqH;S7vn31&Ck(mJXoixf@=u)3C9)a zx`m9yiV7db{KA|a8B4YlY%zm1C^MR0Dcfy zy;p@Fs)P4lgQL8Bg?8+ZeOpU)^rj{zCg#`a>5Zm;q>%dw75gnny+t{N_#n>D&rf2v z@JdKORe3cA#z4qIAGBLME z;>&@VI&-ecxKFGdb$YXXc-n%gq!Z+)d@M~*K4d7pUWPzS_;sVSwY2!88|cow5yVQ^ zI~Rv1Lc%P<-7d7dbp6U%bksY@C%2a*Cvdx2vQ?3+9WPp3#3B-+5Q{bSQEbZc^93iA zQ&+Gt5HEQsaYQTKG@C?S4g2%&g~--BNKmY{DYqJ5IrHZ#zS#AP-rg1OJX8Bxw~bWF zv8ED=bW|24&cFF{4OjH|q$KLeapT(Y;vEC4m+q$vo!6r6JNBky+Y-d<$V}g>zT`u$ z8wF#Te^8LPx0l48+o;cnejE(@=3+CH>kos;#lrKnn~2lzug&!lUA%Z5*KlNRuCZ#R z<827>u}>%O+AGYZj#0q}Z!NoJ+~01!_~zQ8eYK05TY>5L`BVbW%Cs~F>R;bEj0LID zV8hQJY)Cl@ld0bQiXPnBjT>VDQJ7d(q_;k#Y~wRA zrYBp!A(Vy7&dkC>OG5+Y^l57w8?i9fl+T~t=JQO)8yVFr^9l;i6LW1ef8zIAXkNJY8Cfjc#b2AU&CL>Pia3$1c6N4FuRm4~ft$=# z%L_Bu(HP$N;}mMIYiet2cZ0P37b^lgojzh6J|wne#Yl~xl$6va$>U`k4UO21TiE;R zy8YJ--ONR}$w>(=fLno+tk^KPE~eL_s1HwAKG2 z$3{aVs`sAN-p-Crxv=`acN{SeHpZC)=M@rV7$_m1_qaU2zn5Ekp=}y%mVa9~wWdz0 zVs*N6{_A{kl5DE*YGY$#Ru;30iV81p$>#F7O1=p{T#)jVwXLnKwYB^t`&|;};JZ5Qwc}+^kX2MP&AK9ZDt>fKIpUR$>I%glx_~esVX5;ct{EL6C zsXMdIz@f$=AV#g%ZG5Ff>)RTQSX5S5B4h$QX#Qrc^kp5qL>DzSK%i@Fhh~t3vAK&_4 zZsdRWQoH_ZV`JlsZ0F9MOEej&zL@?npvZPz7?+2Rl2S-a43GQ~{EHFr#HJP!5^5)x znLGVw@!C64m~7W($V39`Lzo00$llauoD@@nFOg3e{Cc_yQ0Q`7DV3%jk5@$4+{ zrN63cYD&;b?BYGz#98!rw}oH4SQxDf(iM%;6~#>-ANJ;Tm`Y5DEsAx1e@F9mVsdg; z=P99MpBP*C^<64n^p`myJ|3PhH$=$Y5kK*Ax75_s7996 z&LGaS87m^5sny_X^F=9Nje&rJgTtz#p&_NHD8iG!@Kp?}UZC6VQB)0i!~l!@IVmaT zo~dc3w>K8%m#1GVBfr<#Dkvxjcn~~(`qXghvS4dl8>H$+>b<=^_&Jst4&VOc2Pz86 z!(-oGPafRW)#XXV#>&hL!Ht59>@nHRo9b=xk0gm!HMF!sZ7O{#E0L*0+11O7$9M=O zYSbV7T@MDTlk^M;DZ$`jb~kvXS4^fbq`F?QDJz{m}yV zpuc>R~qE%{~b0j7_Sk4bjPpRK0A#1;i(Qd5gonsp^~b9W!rb3F1vLQ;a+qhF4^ z?|*0X8kA*e>(BjHbZe`s#$72Q^XxWn^J;;Co0!}tVq;?~S@?GD)vH(E-(e~iS~1!Z zk^B1lKQOcl`n$u)qy+gZrxfEkI63$C)=N?qvZ=VZ!kYy6`6Jj(-+4m#US3+dRrNF9 z6qaAJC7M53470t`a`I?-h2l`YOWd^{e1+DPmz+#PN9QH(d4)YAJ>AE1dV1R4-hNXW zl83c5`@js^pDlsUv~_emk(GsP$Fb-2gOZXmuvo^>aJDO5eN)T9frsVXvOR>OL+m3j zjJq>Q6COZ`Z`$N^-3b-5=c^@s7&gg$-%FP+X=rFHG(h^XwYvt$?hsIA_^OVyVi|;} zl{j^0Xx42k4$D_`c6RD8?{#fCg|QhmhA<_hqqpPcHy)~I&^fT`|UZQ7cg|N!eZha;XHY(X=y>-jQb9Z;wXrP$3 zvA@84y0c_&wNu5B7VlA?xI6lpGw4nZ)R^tbPLfH9zGq`&11Tew8b?%7 zk;w7uq`&{AOqG>NPol)cM0n>&z|M}H9-e{$pti${g<#?UPQ#SK{eY?q}an zlqs%Wy;@dQ=5L~NkQR(pDs`A8=W42}2jw5wopB9g()P;DT?ar+O-*g>Q@Lw<%xfZ5 zGcq&5;dK|F+DcU^iR`TT_1!r^H00a1u9BQwb>#rBlPrVH$^?u4k1PO_@_?q?SnLG7 zPBt%%)`1;YQ?IVBIygAocTYK5%4ziY&!4Fn7}AQ0xS5&#cMIN91XD!WNeWXzO2J+y zll`J3^zh*w%egDP8b5#joOr4BHYq8|)Y5W1tX-htTjB33rG?R#?A)fHpujJEU07I{ zqL|xyn?{9WDlJmA`UquaZb3fnGPSaH6cMR&xp)(@kTn+Uba-&E)nMrf<;C^&68mk| z0Swr|m~>-^H=iEIY+N#2(r)@=Rcnu>rB}+(NU8^(pRoCynmSNy|J82wQ%om{UsRO% z@XU-sdZdp}x^5eJf4#xaJVquazx5Yj8Zm<2dt+fnU0P;lE3P;c8#7ZKNtD-Fn3qEDQWbN(#2<&1sSbwa90r?G9-0(91a`v@Rgq3o@#~$i-t)!VUzCe#r(p{}e*Eaq z?l3baP^Q1LvB*qKMj)xA#HCs5-`FTdn5vY2n~g0FjnVDD1aLZ{}(@FfYvYmoe-YFZq?%rf#=$KfTe;_7Q$tPAs zGFiH|SQ34sqod2qALRGouw25&uY1y~W3g7c2{E(FIiMqYLe6-neM89mk;8S<%^WO? z;wOvGTO5gF4vXzTn~}b|3CxO4DN25)f{t!5_$e)*4w*e3mK)?lacmis*>YPSv`PTQQBlY7k+)NUH>sdi&SDG)w){L?wo;q5~>nV6qc3Zj+L`TX@i}u&} zcRo1uxUb=2o#u$?CiFPO&#ELtdMzCt0Sw$_Tc#>B_RUZ}(Cu?fu1vO>Oi~DCvJf1y z52ZZi9npn_c1!+pnjF^q)6x9Yc-{m|t$p8jKQ3O^&q=YLaizpj`xeUzwbV7cwmsgX znCU}-QX3?yX|=nZJ2}m&(|nDDB&xz4zw^hBwV5aG8iGBY`O z8S3<6dha&u`BW|av{e-KHIobz>jlc8u`#?$m$Ec!d@Cyjij59I!+^%xZ14DupX>iUnwPWf0E04~M^N!{#p5g=H**ad`D11m3!l-8;DKYWcJi!$t zU{_AaeuL)=L9T5k%&53V_MC`0r9f6z7G#~}#NjG$G*nb_QqpFv!(_DkX?Ajw-LNMM z0$P8L?fP>^$NiTtU*--taB_0?HZ>V743;^czp93*WvQ|5|13-0=R05;+SJ4;miM;j9amZeu}FC8EtzdOX(Jr{ z-sz_Wpr}upU>hX}8C$zZjlkv<7Z)2S9aI+-jTUBRq7fXc0M1&ypuW&@tkAjH&`5lT z7b>*v3$pHMuD^^T?pz!79ds6G$z96k+^?n<++S*eJp z-lkqWIwd(-SwWFv0NSQa+=9HxBwSYSe;EBx)f8mCP$d&e`S59hSz=O>2$z+P&O~>n zc6acwI8ny$g>Z3kG3?E0srk6|4wL8>>EhLfeld~pf!JS!24rP&1>wmm#6y>K_4Q*) zt11C8wg$z}m-UZ6?qTHRjRIH}^*7FJ%-XI@w2&xmNz{_9=l2N?)DG-VeUg@SK+;&h z!q(P#8(W)dv+zO-953Hh-^*YG90n0sdsw~7Yq8^-2_1tzq~4yB}OzGJ9p3?A^C`bp{q9OPtv4HWvITr8dYt zq3Z1pmRb2~IiIl@!D(3@&~MN;iuUEp7eN0*evFA-t*zfGSt88NxIxU7g$ z+k*G^oE*`qIWu0}$!Qhk9m-_v)i^~@PoGYgez+&7QtO{Z_19p7E4{8#&*`lF<1t2- zPGtr;yR`laWzpZTUte8~llxxD4BMz$Qlrk9aY9N(Wqy2|LT2m1u_$tbl3i$%EBNI_ ztk&G6pn;#s9yF~;+U-KIZdjzD%k`+Ukm4S{4R5x4bN8dvLL_B_$*zpy+z?MAJgh zxUF@QO*ao!QJ6u7j$(4oWuqN1G&VMNxk~3nsFNJVqU_h?7xOz>84n=-F#g_N&WfRJ7}63DsQi(lSV1X_ z3uNryXE}B1)Mm_md^#nDuQ7SLlRII|N=^;r1k*u&W|j|zq)kmtp{m@loH;C{wbb!V zttfU+Edru(I!d1|N&MEt5A#Qg+y(3RSXN^vm#C|ni-$<`n?s8L%@o)CMl+}Y z(i<8Z<8en}W&J3`EjFJerb&;VBGc8Y^13>dsRmKp-%zV6&|+nAG2d$Oh6q6ss|edW zqaPg|P^r^_FD|`m(fJ8gecH3{#T!HCSoP~#>b)B9DvTdKJQE?QFayvtg^MZF=(k5? zqE~K>lJ;HoVSXYd#RTxusCe_8p@5)Z)E(pd27|Fz6B|?+TmpFhA`#>4iK(ejAAkQM z3PCsWw~n-XoxC*mcMQT4aw%*de{~ev$Hc85hU7fj^nGGt;tVF{6CTU#;$q;_7H80d zv!o%ex85(-tivCzvcb%G<5fu?x2K2hT9LDR&V;h~+4yL3lsL)ab{|XBYbaVVM z9zJ=}@%r?+iE%3qC~0>RzJ)P#nJ{OnXYw1{?Q9rtIWMfN#BSUu77h#O)m=N-sQ~o& z&N`t2&KslB#>R`_suSUDR-?56GxXm6@L-;Mp5@2mR+d8ZYc@&?N#1^ZS77EV_+B*v zc%#Pgun`s!QCCwN`OJ>$^f5a6{+FJ=iP=AiUrTFjKa4F`eE!j+-I<`x14vY>FZtxx zuU{16k^V{CkNJT9fC}&^IY@lL1DNTKPw$|&M~@Y;e>X(-u<0g^mVsdM`Wc&t1q>LlQ%%+8U!3EkbN z#-a34C6SSFhg{kO(XD4iSD#g5W^;je&t!=q4sT0T{j)@b*5c2gsPphK>dukUxTBB# zkadUnwY0PZ;joItk?Z#D+fZm9^jXFotxYa01{%mnwAh^v$DsC-j;PFn<8RJNmu?CEB}~aLvFkHGtsfx-$i-=K8*}-MDc- z`4S#pL0;Y!c9S=!0x;ipH(P2gB5K^6e4w^477r>q5(mRb#j zjAiZZ?P}j9*X&Hjb1?P*PL7ySood0SVdA)HEIzy|H1nSR}IjH(dYY z!vAcEl%w!%s&{;T!u(KNya_5`^9+OTjMuME5*qXsm~SqP7DoE|-f*ap&(tC#C*RuM zMmv4_F&DNu4Uh1#n*oKFR$Xmy|4Kx>|aAdb+xTgM!wfa$QaYI>>?deeBWB2Fjd6xPl49 z>HCre%*@QRw@VXB;E$J0LBAn8(R4 z%+1ZQxK}O=B&VjXFE0Zq{#!j9TOScB=$Sya1>F6peb-hy`!7lgi2 z|AVV_*i&gfDrKpYPP@}TNjMkIRIZZ~?XFU-!#oEdy1&qxS1d^=b6e-!K{SdL{ufK8 z$8`LrTuSWI_reGiG@)5cY`0MMkV;2S-n9-z1%<+*qRsZw0`K+v2R@S+`LA+2>~C4r-Esf2yg#lNUgP3$l}e#i zIskf^AGp*q3tQ3r?w_jn2!Lv%pr=pG?;UFhLvoP)IWK;FD=6Sl80O~UinN_$k7==5 z7`&(8B<~b(wfpWBMcw%K#;{*szR)cW=3FSbple`og~#qrRBM%e)?09~ZheyvZAa@o zs@Kxp@{O3wcWUMr=_rn^?yp#qXWe-K?0^dDY>MEl>iyIh#bW{;{gxQP z0vt&FH@FOmb*X|Ku0I>+NlbF;rR<6%{x2gN3O-L7zj#QukvVb7`d(zOM1l zgsX6F91p9#G|7`m7I)6lee;!`!GuqXqk*fz>LruDVyeHH7~gywb6yP z&-pCVJ?qX~n^z7qHCsw%YjW5hqx@%zJU3lp|4b*&!__t4W>rsJUERipV_!sF_jF&n zy7R_P8}vpr!@ASsuKsSF{#a5Do7XhYJ-Xm@XRJ`3e(m-xvDv<_oimr9u!3$GP+29r zYrw{Hb8`;^w}}(x>+Ac;bN%Pv@^ZpFTY|@2_Wrr=#rE6pEEUt$-fmpEn4XfE$wW)r z0CYPP#CtoNGa)IG2RD$JnR$ezG|kx*ndQHPU6RVNGtX2P;q2Mv=?9-1R8AFg==5KI z93E}Z+1?%-e&etO_iQ*LBLk2e@an1lXL1d?zu{a*QnsVSN5(Fgn#7;#pLAxzS4;mz zYGfs! z%*>1c19f!%lcc0%IX$DrjGV|kZvZfW4JO$tM|D|DXGgSb?GqF;Aa?RP^;;`Z_@a3C zHii=-ZG=OiKXC(W4KTu7p7AiT)!-|Bcf5|yPGou#w&gySo{GNUAv_N68v1(m5uEFO z;yf3r57Lj1XN~=OU#`{S5a=E5ywV=dEqCrSY-uG>6Xq8S<; zpr%fah6ogY4sY@9J%XE{46%NwDs$nuJfDp_^kxM}g5>S@s-4 z0OHCF3%g$Xt+m#sOH#00a*Q`_47Ddp6^;WnxO0zWv6BhXLvOCpI4)2i@N>C4Q7Xa0 z!XhJmMFd}%^~8x2cFW3t%kl1xlXqc>;HsC2h`t&RSH64q4$?4COfq(}*`1&EI%HL{ zv$DduZCUB)<~-T@Ri)HkLuA1?cWyWUwjGB;Y@s{1-)6eWanDpr%CAL72^vT0-rSW5 zpP)8aXt4cwl(PMs?=M(d zt~--Bd%Dov7dE-z2kF4*eaUiQR7RlV`=xRBRxKgp5d~!lu9J=T3Ur4J3>qG`Q zB0IGPIxoS&1o?ViWvZV(rLDbg&-okwvSrUTW5U}oztn&P1FEUoj>u2fZ{LO%;a_r7 zCr#lc50ayO@dytW7r+woO&{~}I=P>92E9S z^lSz5+S$;loRri!#h%s<8!er{ZH{AFfkF>FlO=Y(lXr75T*v!M2btUcXxd%ork^+eXq$D)U zAzA<61UN$fQN8BkY67o+V4VZU2$$Re*uQkq8Tzlew@YDczO7^z&)71u!?Hy!0 z9(M5}>A(gYjDxR%I@$c9m6cVRji4YJ83qVyfEbgXk3GSX$vCdY_d4C|?q?!TfqsEo z6V0?2sheg0{XN&l8zW*+ZsN|`9^2=*jvGU(1HvUvAKiYo8&V7%Fy~#|DSdTHvZc7w^1mK&z7&f(v3aJD{Nf zpSjVyy1Lrki|&{PL6R8?HJS%fA`x9hBHj{Trh4IUTL9Mp6}^@FTt}xGT1&#hYWxL= zgLvFhVY)WcotKx#)^FwX2oztn`c7Oc&3pj?0snE|Td|p$%j+fkyTJGWJk@TBv>&d- zlv>BihW2st$4{SJc3HB!#iZ87JH)wH{hgiBb{{rGX$mdAy${%S8q#CG?L2q!wU(0t zUy))g_QBc!YGAgygFil+q_ZdCL=EHut3+~pl0$@;*@2WuDO0s!Gm5M1c zbKDR=C%rv|tfcU(VovOC^qUfIiDt6M&FV`QveKk)AM-)IR6H-q1B#@&l6eqI_g)F| ziuRA(I^U65l>Gg6zS)kGW_)mspw8H%?Vd2nMzBECKOWG%p)MFGw3gblIM*yCD;uPx z&w!0FL4<74?F^IbS65fxbvZHZ=H@0A#Y3yYJq1c6qy#H1Y=1LqAK3J!q-$r+p7j;s zeFmi!G>n$aV?bPTpx2VPNJfy4qL3b`dP^k#fXaA4lOdawDg7+ft6HVA@%#7T7--3) zcW6)@06?u_0Du;N-ykMmWi{vmcDp-?*ALkh+BS~j`K^bOeuFZ6_Xkcrw10wVE0eHW1R|`-P7l0;?;XbGOlFf685NaV3Bd|9;8h%VR|B6zZzz_&YO1|-z$}sE zce5DxdfA=#0VvRcW%j~_n<2UQ7|3j$D>pay~aSPf?ejJob4NPK_?^YZTS@Ebdq z{IWJRWwPBrOU}bnTv!-xwDwyd@Zkn20UAg_AX|LZ>!2cxO-Rtz)Lew?#f0BBFNwj6 z!(kN@61rHT1{zQ3D`}qv9XMmn5|W3<*C`OY{&zc_?XaC*8>|NM9i4A! zhZ3w2Ow+OYn#M-Zojf-%Kq4HV-8ZD|?Te6LZwBX3y>XZSA;Wo4J|MXTwY_W5L|2ni zR#x75d|hgNSr)vnJD36&J@spTJ|xCvj;o(PethLgnSpWn_8alXL`df4x47$I@3e60 zk$g3@%zyLMAV+2Pa&ft1K6NRI!+MF-F|TTd$+~+$HZ%P<-*9QSZJCijq_p&Iu{=l> zE?g*O+eSH5-bh@;_BaIsu*;V(hp`&^x)HHGudlCq`!lmV!Du zw;W$MA4<5mY*~79oZNtZ3~Ovie52I^+b}?DaWX4hu`|D1CxUk2#zQvg#(dpncOi! zhX}_bar-LB35&Y_2*_GmZhcK-)QkXsSx!8}XvN)F$JV)8@-;dpCbCaqa9#YCn%l!r zJp+T07E&@Y{v8D%lZMeJ;RfdB=Ip4D&B4thY1F|YilC1{H3PlAqW!(?D61h?kdrtp zR^Z#Y@pki%zwMf<(YabOk=piN#KMFSQ+-^$#B`wt}}z$PYk zSQ-&R3Q?fpR@?E9tffF6{7>TS-+v}(_^qb<55EJYI8wiS;P5bhaWGAC@SVTKoB!e3 zkks0Mo(>FTwOP@DvJ+q>sD2?b-!u4>lmyHP|BDxC;1qxrU!6kR@Za$*>f12*Eyy4R z4)#E{3@YTtaQ6QGek`tqQs_g0DRLe(8~Q55$c_aW*mjUG9P-DjNvXwp&@pFT?$(ZK z2xfFbO@4*??AbHL9D{u8Wi3uNJel)zzxQ5cq?XZG^(PfjcoUNS0#^ z5n+Iw2oh~IC~*%o(b~{NgLX#O#=PVHHf(zZf{%+*_2|%vwd!EMxIJ)^KWlR4n`$J^`Om5r|WZaFIhwU#`r=A$+q^BDL zU!hhJTTK=}r_8onhR25RQa&wf>ZLpL22omoNwZeSd&H zq3=-ucHwprx)_#oKiR=DKv&)vwJj+t%l7l+#ZV3o(A!;FoC13>FOS`?^_HsW;GAzgoz{jC)~ z$eo~Q4)8w|yLA*Z5Mbcq;+i~pc_^Dacte&r1L<#>TL){F`ax&(w|4jd!LXB-0Z)M> zVxIIidmSiXDUSKq$a|C+)?>f_kNNq3j1!Oo-QDYeG>AJ(!Up=lxHwN@?$DC1tF|f1 zTU^h7-q~{yPy+561f});q8|Wsv$M;G8|vv1vgrBCrAs3_jC~bu^2hB#_%-^ub1@j# zWx8ITtUXjjmTXN?yOH~A@odjzUS`s2eyK&-0E+2_qF|`$)FJU3TschLJetgeFzAqI zH>sRy-s59|Ppx%4seu~yXs!V%4RxQFEQjeU>YF#ex9>hjT(U1HDA>5;VhBFm0$CO4Ug}B9Q;<<#Jj%( z8KNn{>k9i46b>22$T0|9UKoS$8+zoE+`hcLJb6v>@ozo#pAFyIfteTH)pjYhw^lYb zORQhAvpeeQ+&$@)3xnUkFHMLSi?CUnk!KAgzCYwI^!D)&&>+~_|Ixl4?7F--g9bE# zqU@Gj&~kBvT# zfLB9Rk0vF`1${t;>S!=(T2g-&*;-DuCxQwdTB)p4hatz zjj9+rtl}%q#)wjRWQctQ5><%*AH|u!s5%44=lYuy>V)g57X=&-R@9${A8qZfF!FJZyE?vBT=9cmXXaP!I`E^|& z6gQpiaSseGG=#BHy4Zmx5TK#mbV{xj-|yrc-=YILfq1i0z-2J<)w2sIkdl(p9gkM+ zz<)U#j;9_NJCw3?xy)t7Kt!#b|2r`!U*WW%VPy^ctzIwh2AR_Gc#{ZPY%`yb%fClA zn9m)n@VX;a%cHyHp@+8ug}-EaQj$9+Ja=p=WMPufWa6}(9O%iX+c5$3K7XS=?A5W@ zyA`48-{lWj2Ozfh_6jNYoASlJfU{@Mg1Tcv3jjjuKLGUy2a4cGCSDMM0E+QT;$2u> zWg+x5=~y~p)L+OBe8b|)Ka%sy$Lykd?qKLZHdPsy8X6r3;xIP0+_g0e<3L8+Qs}uQ zL^*6h+g#1ZBEiW8_aE@d_I3JVNFmg)z-r=BLpnXsV;wd++%r9vUP6Z3T1^ESqf

z^|0NZcurq z$NhBxmn)alAn;4d%TxXt;zpLnKX~^Ry&-1}ix<52^Fs<{>((zgd;@7DvQkBSfZT$B z7>0p znM{n!*sdVbi0t@aUDHu;h=^1|zY5Cy283!@8!o<>X{M`_a%prQ%qwDdA^Lw`5LT*r0-ft*c6bhQB>rw|P; z<--tX0NPzTp_@bz{&oWSw{CjJ%{pje;;G5KW;dT|hYpiWsxocvNyG|1^6&COLg=T1 z1c|NR+{eJYRqO%C5!9$KM&%Ee*aFu>%*?k4l6bCawBl=unPF+KN3tiO55P zRabRPEnGUQ83e;RzC-6Q$sdK9O|?_zqay~1k;@KL(Ec8M9UbY78#iE9Yz~3QV?*wh z8x&-Lsz|)GvGB~A5HZ+~d^c53Z!gSyT?TsY;>AU8#~r>%)ZZTngc1-H4Go6po<_n& zw2>DH1YpRuRDIJ5mlGl3w29Kz-Mu-LlsX0jv?mcioj|{pkAi3xghertO!rrXsRBtA z6(i(vEibZQ5(f|FTjeY4UVkjSIgbf14qn^b+?13-h6DscJJ)<#hB6863Qn2G1ZJu^ z#jDXPTHHM-MR?PCNd4olkN57~Td@{a`{q8G7!}|EN)obp1cKoOd}N}{mW0^rkxST0 z*9iXYAfs*7aYfvDyxnm|q?A!K^!Da>8!_iv4Wl(1;^m2x=%{y%=5hvhXG`eA2yhl# ziMst2U?{`@W=KAFB*93_2p2f>#*9i}D z3W_?kSs{gab3D+>x;JvL(2!$CMZH+b`0iV+qA^Q#DK;(%>~Q{ zCD3xA;jeFRL3rq|ev6H3{imrwj8Dax|1w8$XTS$b$Bht7>HHO-kg;zxoP5cIG-}t! zF@p9lCiy6XevVs^q*Tp2noEDChPeS~lOvZ%sfUP=@D?)-2-d`5V8E*hIJ~8V>YoMX z?j#{SP`})F0+NIfR5%M9L~`9enC0mKV=#!A#@L(1ys*BWKvPi(gNUUsp|bvfgG2s~ z(h-dbrjZo9dGlx}h(^(7k>`VuWKjf>z$qN4sHk*@1D@g_^jHuB5)8l?Yy2zd1sV;T z6E2rH41FxC^)k5TmBO5Ra8N}S^DP>hSYtUkIV~-6M|s{w{SzN3SsN1@>` z4Bb=kR&g-Ryq)oogwuP+8fNric{4JyM5K6lc(@cLf&*J`KMfJYpID8kGumo62zkP>ZXw#?n5a~iO^>W@diwsIax8@-c2yeC9gc0 zEnmQBC&f;{>#)N)U)a{)?=aDPeeaFR-&FuMd6Ee`AhkwuqjSh{_j{}J_eyIU+YJ2d z?VyzbiN`b6tGqenWMr#bp@lgV!T&n{B2#-__&~*9-`KbY|CW|A;=0#R_&(Bdas6y) z@Z5cjP3`u_Zym1iI&j(eeoUQrU)g&blb)V#r9z4zkV8Hqav=W)y>{?xcm9X{t z!uopA&ASLhBOJ1GR~8J@A$vpCG;*)v<8skH`IwVCNu#aS9`vL)Nw7~LFfKv7x8XA; zWnwaI9T8%;T@FZmYkx^))2eFkHMFJ|%_ZQ3pbM}`_8f=DVZ@7th3>UZ^;K;5b8iyI z1v(|1-H*|59IMQ3!%1kPiQGPkI0Y&2<#X^JP=7$nj~f&OFprOn>LHcVA8k@WJ&qWx zhr9nDjvIorh_>FV0y`dsJf~<-XTES*j0D@`iUa(HxPru(|Ep7r;4)^Bs>oh#(1%_G z2h*vE_>+j2TJRc@CG4uG;16yQd-m+Q{Up?P)i@SvlMeEqnTA5r-~MMrZCvm^18XWU zj$U~guMp~Pdie|upo5p*M6As7teMlN4;=&Ui{XR6pu-m$-Ki zLL1K=vx#QSxB~RX&~!~nOuWo)LfSWQ*v>VpifaHRxzy0dtMeuMd%!=hz`+zS;1bO6?BqZM%(qK@ zhk!(5Z>}uc@9?WUcpzvKs+;avM#?#L5fS&?T(&5aJ;w(HhGv#saD0+k>3JBka7(m( zdKsJryeBL)ROgp`y4vYfdW9?(H|S_)h4}gTfe`4YAa}jl8b`lZdsM!*EL32}Jdq z7lH8MAAdDl=YB((&32o1wjyoj#+NNgN00--^KSYt@86`FzlcC!==6|5E8+$#@G;QS z8eIiKW|8&tvbHS5Vtp86E1ZS8j#rJqT)UJYX9Hw!|;Bz)jxIbd%IHDRF`WkO-$&)90b@YP-; zU3wAfqOO7F=DQ!C!9fXjwVV4FFN>_72kX8vi;c0n&`=3v614DttpXd}KQ=c9-3K^M z=tESyHFA2)p>Rx{H7(;Nk&8NYgIO=~Zcf-zJwFWD-q&*O9F3<pV{lXA70=%B*2K%98%L4AaKIo4~OwFhjjWIleD= zDdp+c9|l*E0Re7LWnn__1q|9N@2A&jEG;hns>4p<%aY4T?`9FbvaTzr7#jDe7E{oh z*wfqF5x)0rpfa*)PR9+WM!7$d-&Ba76LbLu36Kxa=LPb4gGSTcac|r)z6`o6IdD3O zTWfK+92lX9t^5}4+c*b5wc5ZoeTzTp-U3TNg@ZalsxX|>y#dEj-4yT`TqOw;jR(Eq z;>Qzv+F4qi41dJHzK|F+Td)hlX4nf0K{R;ZGMsmDv`VHzOI39cW;VJvKx1LI2BZX1 zGtsoa(*zw_LQesiEHgiU^Tjo4ZT{MTe&G^k&ALez&I4sIWHeh8IH@r7D#(iXo=+)1 zR8v!f5pv`#L}X;+{smbDBVb~#^KiG#oFYTcY{f>k10`A=SfCt6OX~nrIgaBImJ<|v zKvyhkzgwgFeYy%rG(AH?Ldfe>+|kj|yWzMEGUD1RFikW>6H!oJUJiS*;Fd+Ny}RbF zU5TADm6;xwswOGgZDP~lMLVk#K&kf%w4GgOtMTBBzO=5m);J%77>W(%@IIA3r{WCM2{o11KQCJE*-^Ma4EU zng`bh9@rYHi$My37^poVYrtt4@PlFDpo%Chh0|}~*Hhvo*!9RGlaOV`m01|}ndE!z z^BsBS-Aku`z7q>-G;n>c|9Y7}e-sNnOdbv=9nP+ACA=Uxfw+4LUOdVklTTH)LqM1f z%y9na6x;kx`=KSLe@{f%tTTd8bMN9P6&$wZ??+BxY&bp5(b?%hPDM2ZdK{A{io0J& zcdt2Ik7+?3n`XT{wtFXqe0A>T?s5xnw9;wV$PB*M*6Y*a6qk0i9yUs~7{y-M922qL zLW47lkdqtd&-cSI33(n!_Z%2-+*tSpM_NF8nhm|=x~gGe2x`_3uY>$x{(C~&yhk4* ztl1kNo{Klf!hT@wxvT69O|--qtQD>Ihq0TIW5Ns%@=y(Bvp26_zeXdmdoj`cu`ZBS z-_US$73}sOli30i67Lfd#BSVfn}PUhNFc34p$6evVM(;vo(Z?iePS{8;jB| zu{KAkWE(l*(6h3z5DdbyJ_Q-l!;_lqa3HtLDC5*eo)g^NUs*X+d=|}o&yLBVVN$w&vByBGPJ4Ax$0FI=ycyu7e$L7;N0QPsA zEWnsP$eTfO#LCLr+G_Rd+i5D0g6>R;JF3}+6qGc>$u;1v536DW%q!e*3yXDHZcw$} z(_#7_r#5s0?C0{wJp^K`oKgrTH5em9uOpK)`COIfaizMC+9OV zKHkPlHULrN>eo&boTZ+jIDW@!cAxJ&t-K8(S+;RMHEy>w)ehJ#V-h(o)lk??M%#eI z)F=#+HBs=>ah=kW&e91FOm?@-S$Uw3%lJfjEXI#A`q@~L%;dw#3 zQ0M^VUB7_&-ii;9tH`ET?$dmex2P#8Da`RV{}virncCm+)J*yKPQ85xSY?rNyu=&o zH2-j`h@|A?@>4 zt#RW>J}z$V&Bs~Ik}Rb?p-%X{PdS=HHQF96*OPMAvVio3y^!|TenmVr>-+Fysxr84?~mqD%*o46v^yX z>3wmhQiNFhn43g1)Ss%$%ZCueitWH*PrI-nMzA37z3IZydzU|tk3|XErzvIHArE*2 z#Voj~bd^L|nQR1fo1on+8U7;@&Ljd2Z^oTn31xZt8X16Jw(CK^FrMCmemF zQ@jkEm4ukSGmvs?tnPpcAu!us-7nH6BwZD#`XZnCZa+Sq8A0V#z8)oM6t5d<*zqb< zHbq#b;T;PsT{#P=ye&Wq0EP$Z%^}6$Npb-Jfu%_O7BLKI!(Mc64-{LLN)U^`(20sfo)J z29*Qf2L)9*goS>lUObtIMwS20944wlHi$1qs?SU~LJ9;T0)QT<5r2u_*8MV}rfB|Q z>`9VuL;btW509_1h0bJ*%^+`|+r$&jUIo8~;&LX)*Xm^7gDGdA;qLPOu*Jo&gqW~b zM{W@fvu~jOGzyg;EQ^Gq8QG?L3{T~4llU4P1EapC21Y$VE-xl3YB%i3HsVn%z}prC zV^OSB1cDE8>AAR+ypY%I5W%g7Z2-Oz&Iy983Y|Pcr>wTH;d)f4 ztfdE+?k^NxJ~emw&WjI_Sl|G^&8RP(VRyLPJJl*-ICyAyc=VIG!DT+#sbqsL;Ov<*FHB9tZfgoZd4ekrM-D_sLVp?%m^K3eh(n=jK!k?a-OBeNnT zE7@ePqO6o;@9%L@_uc*ed_KR=_wo4s_j~;Qx$nx$>vg@Z>-l`1=XspRah!L`?nVYy zZjH;K6Eu%TebizLUXZLTxiJrvMpL7swx1tK5y|6)(7`W>r4d4E{?}@W1vK1pD0>QA zVcqb`U0W$>0-5gc>TTV*^Bhij0F5LcuO@>g)1K{+Kb6M7m18>F|FP0vd}emBf3JHs z8fTO3rqG6Izr4O15IX>&|vGB@1ZOs zDQzNS&H8+-JF_*FUOQOXAR_fvEk%b zb2KXB4b;;wZ|GKq`_~kp?Xef{I$oN&IbYrOEKOm@RU@OPli;J;gz#0;zoXM_mrYk+ z^TT0~g*m5^a6ZUV2o-94#@=Jn_$tTFEp9v5bZ8iZUe{-TF#QO*S!Hxm5;+(1DiRmg zbNd67g!>Lw+wad}_FFhTUzA&?ao^mhZlJI4qAus{)Rdz{y_k;rZsAUHDg{fjL)Zv!S~Lq^ zn%ebsO0G`TsXz6?)+Fp8+l>pmz?hhk$89~*|UZ5ExtFOEjkcXyWz z{xsZLjGa$%$(WQ!uesn}P2p9}>UxAcWVy2wUz4<8U`CVh{P}aFVx2X)WwUFdZU}BQ zRI{;pIXz3U6ndd*kHqf}*4FMudNMi<8D9B?`aNhKXa((2z5hla*Uk;ShIC}fIIAt^ zRGE!?c(qW+=puh|Ny~Dbng06JMLX}u?EQ&&7Q^@wCXpP+$i6wkSMASWfeTp)E@&;( zY5Mv29KJE6Lj5A(z2Q6PW`4Fn1_DJw2DX^=n}T&>+K2HpydQn{elRt&>nkp zz25;W5=xUWIc>fQnmbKb5g@=nh4IcPRbq0o396#)L@q37(FdNIdWY^`2VZPAv$huS z-Fwh?k0H&(bMr5!0Q{pc!b^U{3KjEKWe-W1*--ncRtPrkug`>f#tO+gVeq7<7vtfv zabp6fwgq{D#g1Haw=mnjK&0;(x1i7YzQCWQcb=XnvLbdzZaB`4>k5=A+!4M=_+daO z*!Bs}ZC)*KHVwiD_)iGJpx=e8wEFg)JA`P~N=HWrw*a&jglt{i9x%%51YZ7#C(tB@8+`mY>d9ar{DdXs2+M?;<)`^96h$N(I0*mo>mqSF_}`n+ zh~+j>nHw1a^U+iO`eB|{A@qr7DQ>p8acfb&QqtOcL&O|~s$%I$NnD(w{W)k;+KqkQIk17*fHyjy zrdtxeI3A15nxF@;QPiZ3*XUh*=>5)m_goaSC|~DtZ}4Aydkf1}=IEH35z7!WGjnu) z{sqtVbM{4ugAEN0Xurwbt^k2>;5*DIgTB>Y;^y_`4L9Eo!{SGbaXMZOTJ(!wS;B&y z8U3=(PrQ=8>Ze@SYt!0{)0@JmTh!H<2`gE}T>~dr@1EdSuelq&t5B45`b(2j0>Vpd!2q z0k>(LKM(ZF0xiifoqUBTJ8qGq$D8**Q6yAlbG3$pbn7g`^t;+gN)GP*ck~Mr<>$|a zfN43a!P#Q*qg!4)M6BPh*Z2(CrbPJ#^Ust1ydJb>>^+5$v|?MMj{_hIhiRgn+ zM&OV4ly9W#6uN@QdNxTqRPk2N_@xB^rEadS>f8qo30(kIVks>*>-uHTWxelBAwDr4&x<`N%z5WjKy{8?HfDb5NC*Ain3muc(;0py@qx?lRb< zh2od%dfut7JH@rzkfOYFa27akI7|l&{qIpQ9l5^C_}uUrK3YF8WpqEpDZw(7@be!$ zWDNyr{%Lwo-kKg3gRaALr2^d!MQwy-M=ru$dQD-dKH-U>du|DX|7wg z6<^zdS{rL{_ET8FjXSQ`a`O-I5A91yH#W% zLttTMR=mBNQ8!}IW9y{PAHTI+~uP>bP#I}7_ zCrF58@1c`-Z?;5x|c2?HLBi& zylt3oeH|7)-vkcPvg}irC9ZPr2$%p3z)(OXi z&1JMd(G>yGhXfk^(3rb%Z3%_ygZL)Ebo5NB7N5zf&PU#5?4go1F-ZK7iHW=$U#X38i9?SDHNkJ3_EN*vhnse~72Iq4 zcBA0XQ9;^YOxXanVnmNy7T=sdzv?K#PbhfBCN8cm8)d6!N{u|;sl18o&T#S(F(d*u z(PBGsa0PwwP*OKXU#%!{%*CgRt7}DH_KJu)`t18 zP|izb?Y@K2A~?z)hlX~xv`Di=Ov|fRITdGPGpYz;g*Z+$A_Q4#ldmlTOaHyqePUzw z*%VhHMT37P-P*=Oa6izctJ1%GnR$6p#H{0>HU9DJ_7hITxXCAvv$L}s6V>LXrxh=w z_X(q0UmsPIu6-OFPj57Xgt?%+wI-ScW$jE_8Dp<=o&1;nF!yVN6>al~mgy%S8c})!^1%;J`MU-K*k;K^Ms%$>DEod5DYk7W?jFpCl z1`mgD5}}DKHhxUeOz)lf3LOtX)?%nov7$Z*dN(-KtBeu#t3E2dRbxolpt$(F&yw)v zpBb@wv=Y`Yieo6p{y3fC69xtbhKBL=J`$ogXm@#Xawl}1aKA#7&b!tC@F!=dae6! z%fP>XC|hs?>|jA;akbjx%A`@VXOcZ<^7!qbxFNI;GKJ^>&G*n0Jap}}fSECDk^~dP zJ$y^WE$_>Qi-nf5593#_U(Hh~4A3__lwE?v8_+-j1R9KlEeCwhN^U282WIvbWS7rz ziwER`0wnfEn~@QfAN@IGJxoqFhNW^By`_dSdZ%9NjruZxgush_I`Adb7{EsiQ{#af z&dknIKxcu}0yx0|AcnVLF0_eBtfQplN@c(y*cRxS4YBd?jDd>DC}cU{!*Y7MTY%sR z1M1ZX#!HSlNIp%BjkpK{8igR<`}~BGSXbARfoT}b^OyEoi&}u)7^;Vu&&fvy(U0=D z5zJ-t&(b&tgWBPmO#NA16IRtqN?XL~kuF67OSv32_fEiMa(`KK%yzm93y$@B+b?`L zpgS$}Ud%NOI($$naLm+SkO9R4rp|tU{ax(AH*FOD5s*=&#>b<~fmybW*^oZiqu};r z?q_E=L|^Lleh!1Umxrv*|M;3(P~F>kqy%N*J}1a9+s@}$8p83U{RHXVX=@#TdwDvA ze??WrDt_`kxk+dO+NJjPc8#0+Sh&%1;MFARl8-Nu1v9pf_Vm1dp?q4owZJcye7S6T z9yB{U3kvFuF80){^YHOS7jimgoOxZthY!5hKT0&kIAO=A&mmePn2J0gyN3k~5!vm# zch3Zu<(j#}Ng)5U!-hdfyJ1n^n;R!_vBtK=hKwrBH9jt`)^ltZj>P5gRBQTYam4Qz zy<8k^NE`$p9>=hCD=5SrZEYOi{FcKN_!B?1z|WU~@q)B8Ei?cx_0-hVGO#(v2z#6S zwBClrxKq)s~VfZ@BO}WRdsXJeRo6CU1EHF^x z{Q2{$sw^q3$h(s|KYT!$XtfkT5yLiA%3jQiqHQssIvrXs$bZUPMmH*gZveAZi9+L zR~%&ABsoC;Yt#Al?Ver>>2Xpn^Uwt!wZ)Vx%w2(umGG(Z1<&bU4zNOEMCvrqxuQeADTgDk{elvp`Xrd&ZpK zyuGBotqpv>Zy>6C`g90L91{671iyLo(BXG5#KFdPmnFl=z(V~lfsd;_J`z@bqj&oh zB|pgY+nxmqI?nQbQB-=nmp|;SWu<3{gIl45zNNLbelTw}u!pW1oQl^k;26ws(r<+$X9W zOFW3mI#V(4>QfE|V^?{?JuLsb!*vv;ClFuCo&26w5TpBZ@g%&=q~PP{x3jVNp@k5H zHU+-^VXOIrOVQEME-obCowJ{bQGxAOCdMPI44^?K0XsF6&}i0u>FY~hQ?*(+?8x-G zY(v&SmfD{pE5~ix*xR>n;Vsj|-x(c+sWXJn0Rk*Rq=J!G*|(+oSh<7Sd^>2!Sk4XZ3zA?PfEZ-61MtJ!6ZUBtm#J~?H zWQbS8_yNlg4H;>!H)Pj@FS?KY5fTrfT(CME`rtaK{~ zCy@wg%s~s|V5n45aw853x3i%{n_3I_mxC!R1f9K00Ou1nTMfv7&s{3xj&uC-o{CX_ z6VJNzJ1zXa=arNS+phZZRTkVjZb+zhk+jcB+Rnh6D@9h%9qe}>}2|)t6e1_*$ zHj$M&Ht>v4)7g;vp3SK;9=j?SUj)%4fPe5@A^#}xUxTMlc=8fZ+`-ay9lcQTjEoeZ zkGHt$!*+zx%O;n~gavT)s0Y)Hj|nOCni(}vw!W^S)1$b&Db0ixm2+TLE2}XAK_jSm zFEeEfQBWqy-KB(}pI8D(hdwf{%X0*cBGO7)S{gIbP;4lmkqe*yj0UZb$tgy1qXTIlm3N8aBFJDr~tW*wWPaE$&k!@-^UtVnGPm#&0 z(E(L+-%L#K<5IP8xVHtZVeA(?`Bgrl^?UuzCg$L4LHew%N-1ftU(X|l20si0pZ=pm zx2_SLMHk`w zw_}!t8>qj-O_!y^$$h6-vvVyY_{w`?Qd38OP}rPri_V1KM^nD#pfZM3d5_UY-C%26 z0q^7ls(5^d)tlANo@HGdzYRiaBEKA{ZX%1x%X2gyGwO;hTE;vnK^I z6M)bt?8cL|9rQU#{{-p`4qeN6a=ktUnSi@#J^61WE;_uKC?i}6JZ{a&Wjro?kD+gU zoMqJM6bO2ekuAwxy8DvXI6%hgo-vd*|HPM)7u*eUfC-k{V#MxDdW;?y@fjzV?LG_Mhp{UmI8j z%%akX{XSc*T(r|PD>8A{3kf@Zq&cULy~kCsjCHjaRS}h}at>wO zmwmXwoTf0cZsaqp)Q22T(6#((*_=G$LDRl5X@^@NJx^}sHp=LkNR6%N^}KOQ zT*nd6F-97ht34{aVEcJp1+REO+rFe@DiY+dUVxJz=#LOV?Ll&~al-~sy!*>PP$0EI z;*bRthugR*2|VE3moG8Mg&5Ctpe$1YiK@nHn^9Ql?6XBa8?%9a=W65N9khlP+dt#kf=&xtW$hKf=`YQe|#D;1!R#zf`X&^E^F6&GK3c}Y};1k zon>>-QCM?OU7kvSELWws?sZ+gt;|XuZ@d~`1*ch`fb*=Iw%yy6JpRejr_e1UT(!vK z$%@6crv7s>zl2AmxApFE%=E{=K&xU1~ z>LSBWc#*4SkI7%Ua)l*1$iV_-ytdQKv*$}p$OzU_(7$Vo@v!?NYQ${V(~uXm8l<#g z?Dc3JjMf4XTVoDvEWo)sCOmvc0Yd17tb6AF@W6%B-Ck#}xNI<^F^((UTmQOFRzqXQ z1!>e4QQ!VSo%;Ms&b{WZdE$HP#sE;w4-^|Vz*rHA?k^h@Fw&+!d}*OP7%>jY+#g2( zrOV=B!iWauQ8wZ+oBoI!a@&r_*z>LH!{|K7ym`Z=LTHtv9ZkkH(&wM%WAqRRio9f)LiA{sFC~5dPlpEm zjH$xci*pm=4$k?%l7D4xR#tFeE~CuWt?lj(F9=gsQo4wbKlw+5;JwMSG)ZBmgX$|8 zO~BXPw2X|L`4n%RJJp7V(5+2aWl##0ZizO-i$%@Z%YQ7MJ6^E(-nN&7yN3Khd*VlYm2^E+ z0{dV-hzT#}U)wx-zpG)*o$9YR#7}r;s#)luMvqXcYjvJ$@4f@-=ts1EOQxRwJYsKc z0=+NQ8u%b2tok9hY@K{6n`r7NPLx`#EUgnlXN&RtqH?fB4WGdCN@FJp3FBo^#X@yA zE@^b!GsOgjg)^vBDlrVf!`s{c!nzf-CML+u>wS6oAuWRvRo}D6XO+6({(|1WuB)^V zmqG(QZE|{z=u`;q81Ru9VH3k!f5Jf35GGah497FDvBd)CB4$zakf51CjxwQb zphwh`C#Kxy!+unzh;`q2TPtBS?pmhJ1<8!#cQg3$Xy5${>IuLM8B7Fwf_4lzR-~7> zUC|Cg}Q5(U4j_q$K$m`QVG zENvOu#Di?t4WF*GkemTgCcXir^`}PRd;;_E^Yh2%`bHO9nT){9*z9(8>rz56J9`=R zO33h!`fKsUWHKA$9?HDc-6ainPfEga&6KoQF2u02$ChafYlPf{D`G>DL<`Vyt%lQ7 zo;yI(d0$!i*cFp!3js@Tk|rPhavG!K2G`MR7Fm)WelUIy)y9v4z{L2S{f#2WdE&Nt z^rr{t2sfMwI5~c4^t|q0q9g+scL6zaNf|^V$$3Pt<`GJLNJ9Jj`_Fs^SPDZQFd{_) z+ko)Wa9y|@jO-ldd+_6;Z4{cn^dSD2PzU&Spjuz`b^KyeE6esl9b?`|fdb`Qk6dV= zdMA5}4jjD?vFLiir4@7WkQ63{+obo&tiV1tUW2!!)y!5Zox1h^v`MT!l3ZLHee8(g z8Bg+o@6&Q~my5$NR^b;A)D>xTD@KKl?^{EQlyz;U!pY%Q%gm|Nr3-%`Lpjk1jtu&g zVqs}-_D;0ccBZP&UzVB_6a(1{E_IkrsapsNvlEp2A~T@=!Iv){Hi+5#-ro1lQCTFvdQ6G(j8=?TTm4 z>~$K-8j41<7kfQmjjF>Z&R3B@PWh`n;-&ykxzrM;fwQQ1^!|n zJV5;S(F`uotNxnR2rP*|n7^cE@#v$8DjVF32)-O@7gLY2!+Lu@Y}P*eG1XN=guP@? z-?53GgY~%3$iE66>rIN4xTX6TyYfa8?}-AcFfO%KJaI!=HQdpB9d0w9RK-qmKPk|Q zh@N?pzA#!atXTjyuardDNqiLUO>MJnmdAPm#6T!$HRMiHPH$+aIMQX$%A z_eSMYJTBnp$?9>lZ%<)+f_(8rDw>%?4F=}ahcNLxEm7z6^! z6pma~RlhzGSpn6fRYgdGM-vSuud=4d{JuI~d;V>)cUOth5DPIgo_?5}cH6cy%F2h$dX68WrKYwTtYS zX)DpT@S4_BHN4uhJA|=Ut!`MO;{$!<@qg|ZwZO9-5qFRNg0lw50I^B3oc^$`f~ieJ z7;7)X;SgDOF-i@C9RPpz3f%VgVRRhaT~0f{zs(PU{=Xrvmqw3j&%3LHK9mdQpP8F$ zNC7V)P~)5I-XONE?FqiDtgP<7@q)WEIU1Bea{GWj@~ZlD&#Vl>BVUd0TOSQaMl2O&Rd{MK+lIXgl-8|4Z#^ z*29O>;k`>#E;kel$8X|x)z>Qv&bnyi*=5n&J*-{5YlV>J(n$PxgbKqnY4D= zQsiXYdi!t3?Vh(6wtssweAn;H2gIPEngEz2qBv?B9~*Qm@U%2P;xv_8E&N~|1^sjhm(y<28@gs|bIfjNm6X*E zI_rtg78r_(t<808!A0iW3{B~tXBvJ+R_Y0t-Ya@~rwS>>ra!_o!QXX{M{~`#=t`&# zfNyAwiM|DO=;E_q=$sc>j@h2khu`HS1>_UTb;YT-so?5(5Au!?lVTqsfrpFOHOq>C zz%kCW_M2v%1GktYo2lsNW-$U`R10hBS>m=-H8tvWriTix=C{|snyp%r`+EP(#c)dd zTn2T4=M59VOKwP~=ok9N-cdf$n0X~VzU1rl4wD{M$O*CUzD=5j`~j7I)f^g!TY>}ya$nRw!kJvyaMcZl$#Zkbh$SB<%DBH*urci zb2|4p?U4zml#MQ{4BzK=afpOOF;3?AQI#WRy67CvZ$}7-Sl|7@AzH(Nx@&be%L!UW zCY=(?z(_&)DzOKh3u~X*HpcAzK!5+;_yNx&Rmq>|78{)3Ecyzkfx0@~NxQdD**u6JxBs#Z!y5!&tBi(R26ouBUY zw*84*4JIk1O^o0zh+e}~*7!a-8JWnt>piee=s?ACocs2I-B+)*Qvb;5qlT%p;TS77 z0fzCFD5|2(?O;W~&&+V(Ip!GU2!%-qOrr!)d3wJ)8Uy5lAcScM%fR%mYi!1>`BLpt8f3VT9wJHPwKP0mw9UtmjuG*(CY?u z4Glq=xXuA9C!9%d7o82@{6r)H#N8PGkz+T(VT=o^=RF$Tw!ajivP3JSkGt3kAZMpd zQ$8Bon0;yUm*{{-uu1xz@vT06+YK+=uDi_L6Tnx-T2G#k;^nlMZ_!WDO)qeb-t-)E zbwVGxf!Fb;-IiPTqyl+g8Ls)uk=H6BrQv>Ms@_}#T7(}cAVLk;sPE#*ZQE~~Bn8sEw}_`Mz6csfjDOkA zKN1tvqbl|#FUJ>k$FLNLlTIO5sR$z&*@#KG{Oy-Ffvm=1XnWqmJ=!c`?Orbpi>rGM z#SJ}VtKGG3{qzZqW5bFTYm2wV4+tDw>vj<`iw`yb5sD_=*P&b{!EEl-W=pgY2h9 zUp7`+q$#LSI=GLmFo*)0hWf^`eX*^PfiK!E!fc$|ddjK_Wc#aopZ@0**|#->V3*tdFT>2cS`%*Z^CDO#a(j#hEj z4cE$ch=^k2-WYG7TI!T$92rXfFnr#kL1d0zowE9MV8qHEjTAad)f`P1n^5!J(Jj3% zL3MB19lg7HJwYm~6(Ec4`Ejk;#@Xg#_k2GDNmv z!$q^kWcPdbBI+NM@!^?1GU8TV3c7SDT1N54zR8FG$zDSEYXU~*^ z8O5(=w7*c!uwXBvv*P0x)eGYh&HejkSmdav^r}p>=9wxcBxWZr1ryIU^9a@CkKad@ zV8gwk?Fmv*hLqItUX3ApcnC4VTBfrg0BF6!O54v+9D>LOPQ)z7TDY^hxw#D%@G|)M z`d+eY?U`secGvy*3c>XLhCPF?hs*xJ7lJzJ8jB*N?%ch5H#axeX1&&1G}ke14VYDb zW#AYwO!?&pwr*Kj+3m4v7Vg-kYxhoYJ&@##X!7Oo#2qbXgds;ZySdmO#gy-C(W#I90A-|l4N-m3Q*_f&FK z%8cawX=&ndb~m&n|9LNX6JlNY>}D>SiWv;&-Zb=zjnxb0c@QTbX~!Eh`6k|K`JNo& zLtMfaaq+3&^};ib@Q+Foy;e$bK~-E1E2&KRekvA2@xO_mi3^cmM_2i0oH(vqv{?T?4Fzd#W&H| zIcz~)#>!f|+FMTscuOtigam2Ehyt4%k2a&vY{xC_f@`41wDxa)^)Ij_^DlzDe%YwO zyKOjw4dWL6E4qHy`rS^@X27Lq1cbse(wVC!3!mO1bmv-Q(t7v4B@(A?0FThY!?1P8 zOk!jMl~q+sC_9i3u254ADv`1tcsIJ7S5+Rea#&+Ph$c>}^nQ4)JZO1&MXzCbMAd12 ztYhZF2JZ~BpaN>DwqQTM6Kud9QA>vx>in3Tq~<#7y+LJ@p@epa+!<7bfC#qjg%HAW zMBVV2tvByTYFcmfI8)&-fM@K2f9Q{wd^D0^{h^$i{sbbFcQTc1lbV!cgMNXzgUPAL zPg&h;OFtH72uPyzz1WMS{{^#eFjv*qRuDIejgGE;U)<9pVA<4y-hR7jfm~pwiZoNO z%%gkv)@REY#BUbgAp)b4d37Z^a`A_UK~Ytp@|(7unwMw_`;{8KRtrg+hUgDuV%s2T zK6wu{qhXs@%zO8`l|oWl1&<@e;E{S}dDjwSrN|KQpkQ=%hT+(=en>bBZt1ew$wr(C z?~s%G(2mMuhLuX0m*?b!=wS=ze%K|BqM`NdzGY;GwMj)x!L+)O&?bWDGfW+O3d zyN#HSxRscD0kce_TA@NGyS@#e_ss8oZHn>Uy2b0Ab{%|>RK@>nt#N}Z$F=l3f&LFw zdXZ4E-^X|lB8hq&ww9a4tFq35T5Ug3a!OG5; zAtke~E()@T7Xp|>)pLCJR%hGn{-x)TSkn6w3{mmv%d*W5VRo<=HUGRm>zJe@8Yf7e zZQnKkpa(C_`DaXKrX^U-BJ%Ko@P$V0;X`f=?P(Zke*FoQoT=|xO~CvxY>=B4v!IVY z0N>ga(xRT5%SqD286rtyYU${xY`c2K=y|pcm4iPh91C$(y?YvuJb04wp{4E{$ttD< z_m=y_BcmVv!m((_Bu=c_iyQJB1o)KtF+5Mdqzr?VPEs0D3s`uoOf`>(4#yNbc+g13 zxr1Fu4WxaUP29U7>56{@5DmzVrL)+CHLoVtf}Erex$13?15Qh5JS! z)TxhQcwZdU=+!V>EPLK}$nHj{1l5z;3hOgh7G@{7^2WFFg*h+Ifcf)0Vu(@0!nsQE zOJWc2hVfn7e_wIFc;Z!9aRg+Qs`n!_VZcIbB=jug!l~L)D8b7)}5|WBwLrK_hX0c1Tk952`<1oVJEGUtsQmZfn7T(oBl`qH9p5SBs z-h)&@E8ZsOAMuLb3O&m9MUX7p(YEcvYFoS;uYNsrlS3p@U?gS-%maYB!IrXTOQWcA zr?zpm?)G{Wx5w95MCZ}h80lX{GA_K_*KiI8W92D47nYTT|0Sd7?C2PX1H{uX(u-3{ zGi`uPYbB=$WUW#r(AWJy-{}`Vj843iQ)74>p=g>j@`9ZP!mjy;?|Cr8HeW9kr+4QR+Ic6-m4r9{ z&8M2(qQY$#$&_{a^yx2gj^_wa$(16A=ghft!2tm;p{B5v(vDhpVTD;WpsiRqz=8sX zlT+SHQoILTFvI$2aMPDx6gJ&Fi4SM_x3=*=P$%JJo#n>*tfVPLlt4|R8sjZvv>duF z#!`_lUHVb#RnS`Uk2CRP3pF6vU2ZL7Pzwx!7*GepI?3{QK8hY?Van%Jt>tk)k zsibSxU^dJeQc_~f)_m{Qs`Hm#l!0|-8KgkybQVHG&vN(Jv1S|IKX{}!Dbh)nuV0qRGPhS7rVIaCx=0gLvTFviI@gRFpI@wo|fqtuo{XH{h)E{ zJhj3k?E-YP`Y`~c71Qlr`hW}qM8p~)9Nie*aE^}ATNUEZ<-%mqUB>)E^8n9-pNl5vH&RAXe15|glhe1cQ~j$xS2&8@)Q9jhct8@B7I;g-{J z7$4x}SR7&bV6{-UFd;YLrE8>&Y-wqM{|h0!p!^E}e)eSc2OmnQZvp-JgW+X*oU@;e zzj^aO99e^*jrmK9_L@>9-dPpcDevBaGW`-$6uu}1my}GP3j{{H=Bb$!1l&41TY?}f zDyaTybZ@SgOq`XAdMxwNm>?ZfSAbPHm%R+5k0egBoz9R zhB&+RQ0;tqq~{0m%p12iO%P(3Juz(?R`W`gW9O}HexqI0IB!EZApF)nmiRNdcVjAU zESOqee7vXET`KD~i+y?#(-N??uogoDrh6_6Ru;DS$~Dgc&LrPwjyXih(%uE$v7$tv;Ekz6f#h?5Z@Z!iw@&_N4Nv_e)%VJCAvi%z~CDQp9EUW#Q zmU}2*=2Fu%v*kCV)q?)D)8^E~#NJ%2NZUSChcm|XA2!=>)1Hf9`feNiTLFqS$77r! z*A!vA9g`sVZG&t$m#^EV7qM87?omy`vaD&=m;zvU$BZvG*MVa*$NB>F7OQKN*kqe21d9BrpNRluuvAGVof_^6F$VWA< z19L@ps={Mq9m5s|CT|CgxZx2ZX27d9>I763?p)%~D#Ob+`p7{^;89Q>Trpee;Gf+m zeL6_GEz6=`epECYeYRiv{vt(|#3xT>ra-SY-6SY#f7ULM}3Qo4+Af4NlOW6fqwEZMBI=H)xKr*4@1sl)yK}G1 zpCSKy@nQ;So2)aFRO4BOI6-pNbfdv%H`GEz4Si$p_bbbJ^nEPJ=DkBHKL1ea=W?-+ z&>ZIw`Cla>ITe7I_Mc7q$R%l5%@!rdXn1C9_i+QUL9ZXsgxG8zmmqCWZBEthFDMw> zwNg1Nn@9>sQ%3%w3vovMx(37AYZk^cZ2s1H?$#eShU)-YmkDyu?+ooe&a;D&u}ct^ zL$d{l#PXp+R9m(n2kz_d$E?u9qoHAxt}AtQBdhwciOo*~MR0`mp9gPkiQp@so*p>* z|5$8WX|AY0TScYlK{Rl2OK(8OzGbsDAs$=376YkO$b%MlH~&lN$>TZB>ZLI;Wt9A@ z@zMm2jgW~|7vTsrsaY6smIQOS&qJ6Fhxy_NJ<_77rVk$oXZ_u~Z%SES5$gLMxFQ(= zIW)7?7DPsp@#Cap$orrX>3cQPucT2?<-l1Foh(cs7;Qgq8C~sLjtUN$CfX6%P@uxM zE9!>`nL@7lm-ir;p~F0I-DvER+(w#sPlKyhq4fQji|2^mB%55&<>Bd<;r|_Lna=0G z50do(GmwdD{H3Y}2Rlo1^R2>M2M%Bs?L`yTW!a=O!Mk@s+x+IzlvKg^t(BAi_2{7e z-WLVY8pY6_>eoFz(T(9npaK+Ao&Ib3|7!3oJRU zz#kv7QRCJA)W1v0rK{&G&pr*g%nMS6^H`NYk|Qi|^WU7A2c1X6 z1fu?=-Dg)LE_#dnT<<6LAtv=h%)Q5YZMz`*RpC9Lk$!80gNv)*9+22?!6W;_`j#>| z0YWq>{-wyC-(r{XJrkaCoaCr6HI6xKxc^%tLb4S({*+wJ>vIMlsVZZ9cvsHsI+!y$ zKg3L!P1?_al&xKVUQ0{ke9~IXa+>!IpTA|QJO`j6sj8uP?cZc$j0_jbPlR?M>j8u5 z>nmKETa50-_L&*I_;1zz+a$+|dT()vAQK?;G9)Ooy}#KgIZ)^|#%qH=JXU**a+E9v z3~R0ySe0!_B$H2C>ol1W-nswuB0(&8QZKtRW|>I*Iy*ww6%s`12HxMtHgswIJee{_ zf4_ABr+CjYQry?r&9*>*7b9-AFdAw-&BF}pBv%W#FaDfbIpNln3K4n3qOTojR7HTX z4(A<+x$QAQCHqUjuVqjrdHml3{`KHx{*MdEAK>6Zq7eYW#$Yn0|fe zP#PHSLjh2n=j(uba<${-qn=E8Kq9iCLVhKX9iZrA$C#P%3hl+8PErg54`H_zb@r34 zBWcEe9QO{DP0WcL0W10sGa3{4x408l5(7Z~PW|7V${jk~ip8CsqDPKkp!uW|7Xy+u z0%V34Ys1@;S+YCwdH>em-{VcB2IJwOcWcmPRnlWO!gw1qWki=9EC%w(?&QKjXUUKL zA?AJ@KXKyzFU{TZEm=8Q`#yh$y&kX_HdfaB(bApfYdf~l(P?UGzHj@m9*VoyO!xwJ ziG<1YzZCSv)_tzTlu=GjudH}8$hfNKaE?a2SeDDXFy2~G&(~mPP_*WWTvr)6xi8M4 z)OfE5O05DXM=)EJlb>o8IzVDajNIrT4q=IrSqz>4xn~MP&EyhPGxyV)!vGO!e#~l; zmR-AcNl>gJQGami5o9z=iz7= z{_0H}8FuwBgCO|r9<&z<;ggU#<-|eavI%!Yf-+dx`kJER=KZ?rq{qGywz05zczk9R zNzO(*@bTx+R4IM>8O5}4kBkN^W;B&S+jW9FpE(DKgmt9rDi_8{;`t!s23;ObtIwdY zFJrXtxzE;D6V3%Fs)dAjqt~!;Rs8l7cJssm#k!?XNvDD=ffi!rj=iX>tk{>3UXIr$q#SvNj8c#eOH3n}%( zV_vCANwWFQB(-00Yg%rDCDr-LqHMj_M-amx1$tzHf_!&o4n$@blmr zm#*7nYu|82xSAb+??b-B##Ir-oq4`7PKSOY2d#_PUE;?BnuVD!UN~!BH<}6hBJMRO zbKT%NWCo54W*y%CDHp7I#+eLK9Z1w&$<{{HEdTnfDtE!s_*9zj68mh~Hf=d4$2qoK zr!x+_Mrzmw_h+$7jt0o2h0lKqaG(vq75w@wI~8u^PD|ERJA0!_3+8U#OrUNQZ`(=D z=QNmb-bSj<^?knj$R z8-Y>GfCVmbSd#KAH)z?1e060LeZ7~oyIx-zTP;PwG%PfomUh(mMe5wBg7aZcj^n31 z7R!s@K9zjcV86D52byA3kI*O+Gk@jl%K#792Cv;UJh=Lw@9jnwb<^CaDl?}I+r5W z@rx{+HWv2JO2I9?b?5eC%;yLdf03Upl!i*$FTOG`3QkTiF;eajwUT`PSf=dGt=sQH zyY{Mb4v(&V;oqqvZo#|IjAG-^N;6cI&rD}!wJ46emJjTc2cF+r1-Wwu+ zqSGhQw7Ff+C;lOry$<&Fxh=K|*pRjT%UgyqNrxD8RX)>w`bIfrh_i&pY?-qVYl+-a zUD^k?jzLk~9ZKiUojy@SDCkoNX}7?UBLM{``XC8;t#E1%K4$TC{}cN3x^pi+WL$80 z_paL?@O<=QOidwR)`w?D6*%AdJs2$T>erF{B0sX@x;MPnFj^Pb9^62uQxNsS1mQ@E z!mTOh4hA+5lEATU`<@eb0#|DsyBaJ5@{68Hc6qz#U;nJ<=dSm|x0ud~(H6Y9Ye?m6 zI>OrEb7EGitW?h1S2(XsmVMW^pX1}7vq-77sf<3)*4w>jMN=0OoQ)0f&n>|;@g--0 zq{l-(f~oVaXU$9tA`|PoI;Lhu!~~b-JYRQi>kV^o=rCZnD9^b9oc8ydlM&X7-Jc3J zCTrZg_l=XmKrVeS=G(vS0Xih%vVqKvEKI75jq@f$1Mv!{0+)Da!sFHv+ad1sD#PYw zl|;*(Tl2l0g}Om{@Eu&9+02rtc7XM?+aaFe@Bey$;O7CD4+{!q^<$M<{5D--deBMa za%S*dxCUD-rT1yG@9Vo-*~V)!%gf{J+f3XAxU>BW>1fHdezt62f`fUFl(yp@szZHC3>@NH`3|{z`Q@(O_RmJkpdyF1$Lae_xb4R22)4{PT??$odfJzUf_GgW+3J ze=o5r8;a7%zt7FTIB3iM`JjKrARmG*!0OX^8FZJIm3JbXeBA|joVQ&VXE z{>qhV+%Hn8X&g4oX@6muBB$kc;e(F6!&bps(G;Q{<>MX0R{$2I=1po!NVs@-oK{q< zB_=PlwY|3re04#q%=7QCpvOUbHeV&QidVasTQvRZ88+a3;CbsFZ|QE=s|gDY3xmwS zgya0R&YUa^hyzC@L(7qm`|s7DsLI`w!KD{=|Ki3Ol2sn5e|9m93=Kb(L$a}b>JO>_ zBd>uX#7GJtc+Lfz=9lwp+~WI#;4r^5`JF5C+tiT&G~BhcPp74)Pl}H>J3^mu z+HPrK3hYJaaU^ZXj<|(#Ik%I$T;E4a!ahLl$*+;Q&As4U#zleBbyt=EimQH#Ww=F3-_1R5U3yHFjhACOO~a zH9tHDXxVQ@D(}&m@TSd9Jyi*Q(8(JQ+f~+M2WT}XVk2D3-q%wDbFHb&B z&_QE1OX1N8=B;(r^ zj^Ba~!o3wu<$zPqS}xnzwDgXWZ`uSf3alDK>qDA5wJJI1F&b~eF3&RAp0n{-)C_#= zm!7-M^ouXWw^b6~yC>Pnw5b=;Io4kx;fLk>z(a!MT zj`vc#f=JMyz3S$;Wjk23G^HyfD0nMrN33pG95uSI$ZepLVt7ioY{=Vjb?Vh@` zLmNxJ=K~zJu&_u|_e@%SQvzN^5cS#)jLkrhtFm)v^33kmyvWF#aw3ch+_bW+z96m4 z$7i{0~m0^{t9-Nq^$C&%jQ>a4qL@1EZ}NKE;Q z)FCn7NIalE(kOLDHm=+`pIm!1y_J+6{rr)!7x)ommX|RT6Kth~wibir9Dl+``|4JT zyLlHS8EBWC`x5w{PsG!B2;xk8&-faISX8V)b{+RpH6rG=YT?j!- zb^77PG(TM?&PYeMXI+1Gx{K?o%@kN7q!q3=V~NSf@W4;9Ga~=JYW4*T&tYpF5fTcL zWgY1*Sc0wK{CDeuGo}~+^%_(=n&-}GaW=yTh0rYiWTMW#_4~cI%U(NLNV5K}>#B!; zk+Hsr&>^{XtdK-{6{#<=G2Y@1M7y|_AH=@>L~Im^!q3#dpNBfN=Zrv`42&R8ioVZ@ zwchmmMciDp71~sahh~M^u5uhWpyDn2t*$7{&hlI?;}qR6-hTPxTxAMdX0Ay2X?6cB zkn*Dzi&mvIqtU0 zb@FkTZ4eH)pV8ab{?&JdlfK!zw)mcUhQUfbqc#IS;3)$|A66cGqL_6Dz`zq1vHpI( zClaBHu*6R|7SHH&!rp!k&QGkqk)hFTZ&-c5wVpZI+|?oxrZfim|a>EqVbcdUl%K88Qt7-igx+lHlE$LIWTgyx_3j~dA9c^az7>Hifr zc$RtD*`?n*u9{&KU^-mcjsPU&@OyeJwxPU9_Tt4))zuVQzND>pQdIfggzMs@AwD4B zYE9VT9DZGM^K=9SSbSkzXmhg;)9=r)+;}o=L6A0Ir)Tu#_k#`~>cesdm^QSU5x%gj zuoSA|kHE+c4VH(zh$EI&Ozu}B?8z2C^)|VcPY$z38Si9doU{?aojr5r40sl~`D^EX zKOG$vZuh)`6KIds0%;hWMeBt1#gD;3Lw<;--k@a^RkI(5*}O2{Fs0ATv8tMyouO|H zu9aW5pTx6&1>bd6P3Enw6MQY$4l7&F*HuYY+cDC$Frs@zfq5&yC?SXG=aba(x?fSP6?7Co)7Y@v6Oy^-MWPPhp>T!N20f;)AHDs3(7{c^wVzT~xpKe1y*O zfw+9mD{{Xg{pT#|aQ%JH{x6P{AG~A`?VS`&PxsJL37cQff92cpoWCEV2KSS0gV>UM z%Wg3ze^GB#tdzGUJF;i3%#^iQwXaJ#YO}R5{Jx?98qY7OWCQ7*BnO>n8o$FbmearD zurBf1CuM0JALIW%PFBvFS-&Ou*bGE-dW!wt`L2?ToXdMYGbbkp#wl=lb#MszE*-|w zp4<5yHq(uq;{_si)HzL}5ku>b!zKn;0BU4-=FVvthD{#W9_(9!F1VcBgQ8D5sjCeY z9$)$U804T`Y^3p3(;Y}go%U+jFa{s5dE02eIZ`-A4QM3p}+7y*gr^r@PiB6~}QI;mrV{0)cOi?6RT2Piy zN25p!MkRzJgd=518BAJKma%7_#&ZpRlX{-s_k7;>ecr$NC(LiYzx#V%_jTR(bqf_J z2?==eMoFb9uU;Lg>b&gA*3#%ksr4!<47jdg8`R#tMaMN)^)aKRP;cP# z%8mdR*3#eEV-fq#U+lw95?@7$XuypgKYz+oY$Ssfyd-wd!{3SgwDu#q!!@K{Vh|6t zeOX!1jtOnT&NEL>ZI(=oi8=F#6))fc9vu!`aoS>!!=IGrA=5JZZn&>c}7qP+V>xy=DazSnQos=}aak z(o9yRX)$LW_GI#_IN@Hi zZgs!)bkYe;&cp_CT5K#tIbyT$&Yi@>?Hcr_t!1xXeZ`iCBLGD2d;U?<|Wz5Qs~BG(Z6R!TbF z$zAD}2Cu0&SzB73iaO}x(u-v?w3o|-J-XxYHpa*Q_32m!I)acgSYgm?Q4R|EcvD3Gu6qnBnbLu<22k5}w<^Us6-E z&9RS&Uv6>o8Pu#*CY^qx%KNTv57*my((Onc>8FqSko;dpsfD`KgH}W*)RO8zdlg8Z zg;s}5lT^$~x&$#Ak5PzagT)Hnmlw~L=OMQ$PuZhA~U06`YjJ{-kb+-vOZrD zd(JZmhUVr{X2A}qEf|LJRF%HNm{WvP?nY7RqZqO4b9iEYSWcAIgb5=JwCUJyDVs^w zn-?!i)?0SQqu_Oj)ni5C?l>f8&jf(WDOEd+W`ecW%hs)QTj594+ldfN3 zIQnnlo+1r6Ddu7V6^o|8;_FAQ-5|qe9{;i0Xn6Z%mvF;Xdln^KcY;fXdH;v;)#!)5 z?9I1yoKH@6YeD_BqC*mDqaH$hRzOFXhyQ8~jeFDsOOyw=xQM+)dz)jW{YkX!LEoWg z?XvC!@5U*f)2&>no&QSXamz-hRr|z=`+*z1Ze8AMffOK8!Q@0MdfGr6sC90>&IqNd zU$ayU+qOja0~FOpe8BX?Sh%4sqIVB``??^)gPZRsSYz#`kwlzSqtrgA@uPnEbHJW{ z{kLc@x+Kp)_WnkbR+Uca9(^^u`E)FhyE6RzNj8ne!8Ux%AI#v@C8?63WsydFQ* zNZ48Ue$}&MaXLr#PsUU5A>Nkm5uKv*KTXQN!ug|fzMSAQwnQ_z`1$j=ExRd6{<0*6 zSp)|7%zvQo4qsYj>sUrU#TAo=S%|kS*NxU;<>?!9s@|FtTLUtugfjB7TByAGBiPgR zt_7veMEjIz^+EU$CndFmC}iC}w7Lqb>pt6e7@3$q`6OU4i#VqM^yYNs)m;gLHVFJ2 zTh4g>T2#pAijT6(S@nH;_N;aLdI;1qlpr%RW^eCWW}y1-kB+A^F^Cm!mWk$FT>TWk zP;)omZIwANHS+WGLt%k|^Qfq~st=q*DdW2@+iE4Ld@mF_4o~scA{SWLeovIdy)a?! zsC(gf4}ciD7hKdclak(d_F-RDr4med7Ij{^GOI#9ckkhhHLF+0s6W}C1(#-fsVM@e zUKa+Q%OhcRt(D#vrI(}$7K$-cbT<7KK4t2f3IQ#m9Q!#l-;0ZTjJf6YI|5qUxpM=q zu4KJO;Zacs4Q^8woIi%G53qB=+fKLc1S8Sa<=l;`;M%>}!O4}`|1RzOy~~b_rPhe*NW}($WpwWAQ1?WJR~! zw4O@5grnk_1eSRyp1%%!gVQ$Pq19ZX{ExuI`JAq?S%S3Yi)2-1dAXsvxxP{hi-o?P zn@$ln?`LZqe4s#$quw_0BG7Y@=h)lCvHzVad~|gF3XvCiu7rPg5+L_0TI?b_89Fcg zIz5xv`fp`&Jx)q0pq)l!vPRmy3s0YFbsaJ`vM`VBIvG`8NPw^G7)z<9U#;EY@+xCf+uzYr+rpdOq-$BTU3%^ z&s;v8kGLKQk}nSRnTBL+x$YM$Fj2)y2l(F|OO;Z0(R^cPXZP9nPhm7Jfw@2ko6HLlTI$zx#>fxetNL6|3X-mcW zo`IRZxoGS`+nW95iP75&klM~g3u{OTGggLg(>E|cUkK{(sECL~vAY8ja)oF`B^rTy zh;s#fl-H={THZj$6cDa95NSj@!iw2( z%iExwndUrz@m%m(hcW-PX#-`|xbzIx_0^Ti40g^Ok7_VJS`V{D_6|e9neroWX7!%w zP3Xit(-)W}RvO~91w>1KoNvg!kiPER!dh=$c*a@w8e2TK@NH;ng0(^1-McL8bY(E2 zHy%4IMG*5au?1uCqEG<4<7FgJYhW6{S0N0os<4{yqm|a|K z=MLbPJ_@}qiP~DGe9_3MpAyvQl>uH0mba|^SYv2*iTYb=ak5IfL$Js>Z5sI`9Ii4g z3p_BR3ldI(4kLzWACd&{B8cX6XMVczdiv zi{ODiF3o)JUPI=apONtatbnHa`^m`}QcMiOEz7fb*6U(U}e6(tXP_S&>T9fs#mjv9mldcJ%YM z92j?Y&I@xmbZEQ7A8vbwYU(Z3Pq`5N`$>VPA$3JPA!=Q0?s*Ja7i+v<=(QBrDWQfd zl*djNOQ%OTte5JYQyL^HA|vZz`?3Pe0^DJiCp>|9Ph6E|*QFSN)EMwr!47ghe&fY% z@tCLoMD7#`n2WBj#=!Z+tBwn#^Y8pL}bF6t#$n4eXdW9Xw986B#K5O9n$+$47 zcJdH?I3(^2!(xMTw{ohgOtByuv;URqbIvQRUVW+Wc*Hur5dH(H8(tGBA4!(QrY|am zBLe2lOiUO|X0iLt@S2VZ6DHW%+DZy-!AdF=txoi8jM5gO6S@K&w4{S=n1Th!DqGWD z_PavhBwz|ZTq$VI3;Kxm&{q`|Sd?6@qGG*Pk}`yaSrb`HE6$Ldm_=`MT&>MeTp9+yKD2OwQLZZ!NiCUE4u|{ie$BMZ3 z!i&j&JbbtYY)==4wR>01{{iDV(G1&=o-uY?e^t_nLg_C3vZ9TjMrGj0Eb(CfBJaV8 zh12=@FAtR{eN~wzVAe;omya10$5%!n+>&~cTr>rvVH&q3rfJkfOr(P^_B0%Dw_p}o z3vyMFA(iBh72=y)XNfhRS+;a(X)%Arit8G6f=i?>+7)T4tyIlxYfH@kID5_vTj^UUrARfwcr=nlO9R(xR zsFsF?r9&OT1bU^3%*PeoG!nKYug_9QWWOV8SzT^s@?wRdrKLM)lSlBaPP~6)2KFp@ z?4C%RG;V{A%UQuCaoj_nZ zZTc*RC{Em6oscjMwJp?Jd>r?F?Cr@4B| zeQA-&N#_Up`wIkk@Y(*wp^FCXHnWK|&U&Y995I);kw%iQNNPgxIo+E(p+vO1sFMq7 ztA?@ehxXoQ&(01h<)mu(RR=sb-o4uh#m<6S(S$5cKRix!^Dnu(VLxX<`#IC9d7!*!|0k!J6Myh7+_l#BtrvT5v1D>JhXk0?wGYYHVq z<7T=)r645_vO`B(m=)v+hYEq=Tus))V%p?~i#c+`8kGqzr8#8Fx+Oe5B=ZVQ7KP1E zqNCqKSi5cHC$vks7sFdaTKIk3sq6TH3R_7!DU%*-bU)txY?=wA{t5w*^whQbvB58z z-@T+~WZYA;$&up`jKgVnVtq0Lqx_yNR4qx^DHH#+Li(j<&X@=H}L&KmS~erN|v)i*r~!voG_6tBs8e zPFy$*b?}Sg;yltyIs~q4OU3YQLAltTy4r7yyO_4blGJdSuLhqdZfE)5;}3mTfoHGMc$>+Ko@rm=ij%dSg|io)v0JN6RV)Dv5K zaNqMQ3vjY*ha+u)ggz>))+XEc>NWZhUNDk z%x9KTyeL6)L%uw$nXksXz=qP<=Y(ABpxT9&sNK6M$B(zNSS1TmYvC?9qy%4Jv)Pb> zzgT%;d13H*JidZiT1+ut@FWwi`){Nj9D`w7b-T8;Hs$aGEe_5@HpBjLk3XWWw@e5HB5f`A%xhf5& zD0P=Ob81YTvuuR>Jbm*&R>>)bw;43tKaZbbCWk%WOtc<&?#Pzy=7_@V4cd)~Mnz34 zBM1E#Ol)wypJ0)7ABW-V_^{0mpLt`C+!Ci9yz?DNQ1hqNx3<>S)CA;_)?H7a(Y#)q zSDi0D1@g|MdG!WUYCph+Aef-XpgdnkQZkj)kSDvo#DDsO=G zHSh!oS`4j0?NU{49PljwK2b-7blka$2NSIAA7>Se_=5>i+f7rw9M=T+`PK1cl(JAm(ln^p3N@&miL9HM=6R-!)h5Z5VH?8U=6OtoM9Dm>5E2X;O`91IZd;h=R^StkKKIc>WUiVt-zV2&X8Z_i_HZDQ$YV&}wzL^y*XaNiDPZf#+WFyEd7 z4}Lx{EFcelfg8et+dtif1=+!foV~p*LKk7GW)0|277`HQ5fBE$Y-$&@HPo453gEY` zwG9INrGhZCK|xCttQ=8xU__Z8Ccp!>-g+k7#KOeUde;`vJ0YA+EVtiBP7G$RWd#@E zw>8$VRIxO^Dk|!>{T{9eM<;6(lJMGsJTM-x5?bu+VUO4zHAlEwn}G*HqfTZfwuE8+ z?GaOyqdCHnupSx`P-5nj15=@Y1r!LJ1{X*ZK=sxMTmsDFCM>t!;kcf>tLrrdTU{p= z7n{o()}Fcu`#FZwYjs^_FPdR0(sE*1%$Pw)y|Xo`3QIHOm-#{2Ar%+ zfCz4{-x}I|D%*VA;ie-B1@_x@XuEIkOtN!VK-fae-r*zRIY8q6@2~yE4aZ+P^xxUe zL_^Hc!&SiDRRm`5fO5aAc;$l9j(EA6*t!r{4m9`@&>WOA5O)QXot+8NeEW!Rs$?)vYZMw$@0nSl%AtXl;jZ-jZ@#!tkZv#^l|step{XdlR4}0*Y=xG{G7x zXFFSP#SeZ0X>m3IJ3&eU83J=hl)bizqa`ps+XH4OU_R`ftWCGbfTlPi%v^w8x+1P1 zoVKMD8b!G{Lli0el0InA9_8o^Mx2}-!84#85hhN~ZV1TQ$s-YNO6EYqc3w~f7$IQ? z7wEj@5x;Ky8Uh^Jb>G$$wQKcnlOUt?YZGYFZ5Oxf&ezv+0g??_|Ebj zts~eHerPgeB;0<}Onw2vnAI+=6xdNp6M{9c{Ixf<{GZVnFo&RUe@{Q;-~OPNf2j;Y z+m!EC2AHskojqWsEhG!z6n0&i*_t>3=S3K@{N03|tF2|`)~;aM*3gz_*;)gsg9#J1 zRNi%a`}zM-G=lE^PEQd3KUXvXVS*C+wxkO7U^qRecdp=@YXt8J40!lpW*TpYJN8<_Ez)`ehuop)T?Kbl9dLJ-a16~L^mg@141 z{?bA_B5X~Zfpgro3yklttnELu_isWve~X)fe1zlQ z(Q+{{9N9l@!x z0Xy)^2>gFu{na&WMMTtXxVe#9qONd<3!=7~o;wlwzl-|+QD9+$e=D&6;>O^QwrnT3 z{ogSLu${;6*ruK9e<$_-J0aht{@Mt4XB~jd{K4V>C)50u`TZeq`8EE#Y;Zf6`R(5B zRP|SY^V{v+iR8a}rYR`)dr$qBndVOL@vjpA|E2s3`~&xQQCmsFSW`>eSWDCR(iJTY ztv@Nmzibt z{GOoyg1i3?0qtLEGyziI<edYy$jd-Ws!GVTmC-=DgUFm-d~;#K>~N3&7Tft7ifS)ZK2ubCQepc zbuI{--eq-v4+kLJt(~udW8nt%B|c~-G@u8a6OW)6;ZhNTN}+Ru?kPgC+|I==bbNaZ z39waYJASa60JH)c*xByaz;7Euw}0Cay87dm|4>%``__7wBs{}8~Kok04(ZPfpSD+u%P^N0!kmbr^=AH)thB78hB(ckWh zfodic`R>s3Z)*k#@3C9egyccl$L^w&7IG`IXBL9a1H9`lSPv8y?Kz%~nMdD)%?7l=qXNfK<%4xeB%_blFuJb|XL#YG9f!-_JRytgix$+6LQ5Tc$ z`)^#}x`Br$vMKJd3B7kPm@>pwcH{V=4t81&;)tuCPhl*nt{eFQZL${oNsfq^ z++VhegdD!KfK);SXJ0MbbAF48v*g6V*|H2`ANk1Pfo&rO5M5v@ia0tX`?+p@!oI^N z;)HCz#7%ZQW6kX@b9ky(>1y}H_WfP5<$m7}^^vU2gH>M5C3byHS(l%}v|_7cx%Dl+ zhR2ftZuQ9R&HH0j>xZtsY$Bj3|3xr5}^D{3g-oEJPm?Y}(PCZfh1zgx= zO55q{n>_+1?`|iyMB3_=&css*xed6)zPfmH5A*12M~tdgW!-%`vl81LQ@fY~Uc-vd z;U+`XKEk6+L9JS%7h`7I9xGT3zq_+M@0jxyZ?_7pz^k^N;gu+-1M3Ny-A`2bokcBZVqGx{D zJA~AE$#u5Zr6VP~IZ-50=lNB-(wT2FsbWr<4)Fr9&C{<)8WxORM!^$r@#bfpAIJ$F_@43%c3|BHsP;ghrHBibkGPIlK^mz;j*H=2Mj?~jg zGiKtsl8YKc(vhZ9--q9iulyKICi_|4)<6lj{`Bp3rmZ#&e{>12jgxevSEnZ9^&m)D z1Ii8pA@epbbaokjx335seI+k@vRr-d$K>evg(6vNlM(DhAul5=y)~D0**hZAXkoE$ zYN^H~CT`)5)>VrJ8kh?rb2WrL20N1S_5SHCHs-MMy^K>me8{gg3g3q?+}|S*?VG^M z?U-&z!GYYo{3V4wmOHZQLg7S%pU^Gd!S)HVNAXjomK+b_9O=6odj&eR)C*qgt}{J3 zu%%GJiErMRs@jKSIcTMnBcyx2C;295rPz8+NDPU6_R7R(D3;c+YT=eV6Iy3Mzs~FL z?+(XnEtW6tZ&uHU6sX7fKx8sKjb0K={qAINzz0kmR_%MUVALO(_-UK%QY3dN z;Y)GKyh@}mU+dmJ?Lv@P+`+S%3q@C4SQ@=@`tKBMNl989k*R9IVnuw*f|0)_;=o04%Bqv8;+o$#rhb=r z%ZA=0HNTgwkE-h2xWFI8Lwx@H`Q>NGm02l6-}l$IxX`BI-xP)1G?Ch|x@1(c>OwO_ z6z+O5>__X!WRG0*_Yh<%JM>(LqP0fu&e2nalPn`QF2E1# zDyUN{i+b;s#t-X1&U7WNk>fx1E}s@%Xd{Aokh#j8Xv{WSJASN2J1~M?|D{lHMW-Rv zf!hAPXj6Pc-awR0!c?iP@8e>cL>Y28nKIJ$?U%DtSKTxijyoO0-}}K?=?dSl${8xe z-Dx+n-2jZCEic%oADE>-AmnhVN$NXiUH(k32JUILZ{s+Ps#gJSFMsEavAPqsWKWPT zU4R(uoBuIluCExPeFt){6};oRUi?u#Rl2G>P2ZrB-A}L+6>9h?%X*u-vf5qLSq%rp zag0y+zIs(7hjzHVfbGTy#NFg`G&@|f|8i-C%}83D*VM>FO&id9;CF2(l`YrpM(e^X zW_w>Pzoufa(^S5B#Gu_Ym+fJ(X_x z5t|QANeG+h=A)^f4pzAuZd}lB(?;t!d>%w@Gq+$jb9EM}5ecR~h+nDoaT%TbWYk6tJ>zZj zq=+nu;W6}#{2nP@wQ;rSaDHcA!TBz1UNhmUL>z6d~P^~tG`r@+T&$iL6BCBW?Ct5`;TaqsRoEOfDG1YES#)sl=AEZ+C80*_~ zP2R{%>B#+(#3G`yY0=a8Qf@R&D9|?KoZT2}b?p1u_($uP&#bluHBo6vnqbv&rZ<0n z`{cUu@mxH6kG_y~J5y!xxB2+qS2ns99-bW@9Z2hjGa5_Ni<&apUpJejZanOgu|7BZ zAt+3I=bK^j zsAblYB$kW`G7{P6c7CP%gY*|%9k-VR{z$@54CxWKqKEWBo6g!X_Nw#zlbw0CgQo;6 z?)MZTLSGrfhzk#Pg=ru)k?a{m9`8QPMn?EaNEq(dJRRn?riW*J=Dn6~u-fQpAazRG zV%3qY!j4vNf4u>hoExupnrLZ}Kq``!Nu7c@8{3DZd43HzklU63LW^}*E~<49 zT_rCXtSwlT_B9UkE^5TXYQH#X$!1J9db!|Hlhsmrtz5C`0=nzHRqj8YP{Sr#lBc;! z>(L$SZW67=Pn?GMipp@3?W4--odV_ilU0_kQKNVXB(uxFF)}*rU9B$DU*c;+Y5Fq6 z%UQ~qjr`CIjoz~o1QtRaJ~ZBU4X!RbOy;;OW-)a=Mbm&Me=xqes&60dFqeq2UhaK=qJY zujYqlt@n+%Nr#C6G@liNAZ_7`nUlV=j%r(iA!*97e%tcu7ekWh`)_AGPCCawkb*b2 z>;)XeA4taQ#j_9Li``XulMz*tZQPAG5noniMZS=>?`M82Z^lH&Q+j#79Wy33FRXN% z{CGMG$;jNuZ2h?V`GApW!#ujr1F7)RYwxS>^Np_7pJGeio^j)KsDl}oMiec{8YU`1&Wv8H%7R zIHsv-^70Ixr+SRjtzC{;8xx|n=8s-#zq+Z$5}$1`aU48vBT#cgu2vf@1z)exruNFL z2+2l*&}fK(N@S@wG+Kp;?0hB&GA-7kj~L}QMfHh{&kLEgYD-1hfR}lo^JBSv>tP@; zqw~U{y$tWZ9#>v2YLJFwBjp%_&FSw-4zPEfHuldLGD`KG?>XD^UHnOr-A0yYQ*d_9 zL9CUG*2^WYgjSUFbgkcpmsY#hB8CD!kRt1V;eGx67TuV2HPW;pWN)x7DiU3T#->k{rRZx*n9=>jEs>s>yPFW#Tg8@0_DdTq)veIU1E?MlXr zpUVfz>netBtD`?~tP45}`Xsp2Soh&CFU3*7b*OmQGEWLV$g^Q2?^Akao9ptuaWy2) z2>nWTnRb17|11r^PKJn8C4GSSI3n@e`OK3)m3M_CTBq<8>w_tc3_~tmhRb&<9D}7E z89rpD$A<2k#J<3I@Fo;@@)pflX0{*G{5WobB@byV9QT;l<41jOZ+U{3&o=(>+LnqF zNbF$nZl@M#48rb4#m{9@e8_|D53w&0Rr5_D1<3i3NQ?#WCxKK8BZfVZqnk%G2IwQF zzX#n#RGVIYfd=hOZO6rGwBcj)_?|oagVej|NK7lgMV%sX`96)c@>(5!SU4CuKL0}v z&6*b*w?J3ar0ZJq$>=n(OH-qy>t~mvra3(A{fhKV19N$1VBu_-_==1ExRcq%!!fYI z&=_AOl`mc+?euMko=@waBfR2yO><^~pH@kdOvS}|%w$b7)My)~Q^3g{A>FzP44oU6 zl~3XKZz+OD3Wo-|;i<7jgWt{KE{V2=@l<5~Q9tvr$JxHm$FpCpZ$~;;cKhO~uOeA- zQ&{~+9yOoSyfVjB8V5M#x&?H&GP4YmWKS&?mPKP;`NwfQz`WrGQPkeO_tJ?$82HKM zJH0mWy7#JSG+-KmlFh6>tMk@QjovM;I0>yq>QJGZ6Rej$ylz5iELk#U=2-T>3hKV~ zLhkd6xdc(R@zX2Rqq?rMnfOoIXvE^-jHa7tqakPx>6 ziNzM`0|wI~L5lWl=vF~Olq+AJ`PqF3`DhLiA4wN?Nb86QW>5A#Tz6AgfB&fJ{woiO zoF1QjBb!5YK>QT6Yw3;L@plyWIq5FQ5jWkrMYK0tli`~)(?8x$E;L)O$RghCL-^#+ zCi1IVNur+&07ej;pdGMH-e;{F=H@jFQl7;d;c9dIR{YfZ6@n!{VkBt@xWi2r@&=#7 z{5nowwR@85(wH&~5sGakEPx*xgE=iD(a^>?w0w2l57Y3b>Dge(S-Lfmfb3domKM2~phOv0Aw5Qc`!~z~lSCVhto^RUyLU z==4=9m($V|gh=8J-!#z4eq2x+P`7rX(K}i*V4VIKGg~5S$iA(d_R@iXOLO|>nNz_r z39F>cY&P$dM7EP%KIlep_T9bNO>;u~5w`5JuyqZ66Y#{_m{t=NDt!j4*QkOf5nE@@ z>}ULJLcO_641939J>$1vK|1EhEqd$Kb@9$t+Qe# zkuOI@#B-3_LzxmlIt3ZC>cUUiY;u2Si00HA=X?{Lv&8}O10dTbmg$;hqR;_p4oLFJ z=>aJRWZ!2;04^wwf9H80#(i|ET1%H2VV-&Dp^Mj3bGp`3Ac?V3R8N-j`hs+p@%(8O zK+$O|6cwT^Bj$M|3>>H6gQFrT-6LnCelTX<4RzC3gI)gc;EYILiJibx<*>rk#0K@< zaN#~>ZNJV-ELYaYzVQnJ2DM3w_q&^h241QQjXTLRh@ymdgF5Gu2mfF(JFPD9}I76SqP;XviXubIVIc^R0>e5nj!3LpQYK0 z@b_n?qd9d~!?R;G9@P(2xIFim_ZqUn(lk6*Ft7e8fq!PUm^5F?>RSdtUc1+;VHsUR zLM?X~M>CMZ0o@}&oo}#c&oY&N`lz9y*pwvZ)b#$CjBSd~vR;wLqD9foP7bf4IAObl zf%_Zp4)b=it~UUPCk8uLHhOe%B$PLy4}~@i(EXWsEhf(K7}rlKxO`Kx(+1w7$Q$Qa z1k%@bGxkOS#4_uM!$?g?IY|^sje?(f_QLqe#@c-Tomh}7l8|S`%64KWE0h&1fG?w7 zdg|hl&&UuhG(G=7ztB9y1BZ!~;5A(;QsJ=~v&=N|oMaa8+wgW8Z=&O@P|{A4aBG2p z*j}%ZnuBYOx~xqDoWhFk&-TUga;49OpOUbpNBOPwNzi@z`CK$zW^yfB*Qg+W@}ZAU zB#TC2{!jbmj~!X2MMd>PYpgEjO>;VD7&XTp@*dRlsc$be4;)jwTYO&r63I6ZjOB*q z<$3o!Tr6yfbz%KON3Owqxc15m62X-YHqaCos44MO&YnCdM)4f-o`z9NQ*;> zOmhr3J{GeaXLV6{;o;F5c2P~WZ|IEM>QCz;=gBLH){-t$Q3I?KB!OOiRr-{Xjuhl` zWGfr(Mqi!_DsrvJtH;!ieQZ#_c%~)1`1?X_?eP1cW}u3>RgS?gy=DqN+$VLQpl@F; za~Kt;F#|u~{RL)gAhtKgY;#@P<9$_@-o+Zr}S}n{^r1}jmV-CxMK(ECu|5QYU z=_0^nU#uf>pJ@=9<~XNX?mPD$>Q{Nb>M6F4^tp3U{}{K^;}>}O0?raqQjD~Qh3e#y zBM1+z_lk}peiSs0fy=SDv5Z_juLN^3HRNjH&$T%>bf3lD{^3HoN7)gh5h|xA%`^JN zcqBSs_!PXS;Ri*9xz~N_x9^~yl1gLKZqLj*-D(YCssFmdSnC%jUwFCt>?3|$W4Ff| zCA~o%8+T@*ZKQ()MZEM-6;oG%V-Guyi+BbkPa#z|ulNCBxA-wq`@(3dgO4W4h({;> zls?04m{Cnsj`eav!DFs@>$nT+HBnsg86vkUXC4J-AM^bl=qkpOOzjZQ4w&GJF6gSx zxmFw1NRs(1Z!yxmvOm-r!%!2|9%_(oVN=EuGnoLXD~ABb&6}LJF;YRQYO0l8uvGm_ z$9S4jCRWS>sy?`EUBXuancY;y?}uOcvFvTkR6e8gg=Gne`l?lWuF)H$6bPP0#8RhC ze10EpAO_dpo{45)H@({3a86IIG@UI~Z~Xb>J4KNU@-{~eF2u_^+8S*=CQe({#vlDeGash#U6+~0k00*U~x5m1I2n?ukd8wkZ0mZsVUgN?O2T| zUt`8E{ngBV7u)S*wNmGo{p%@jrjUKxpuH1eE9}--_^zHtH=2YrOdcu`ZJq2*Hmry) zdlaT>oV48uPIA{rNdB^y2l(UG=O9@Z;KMr$xL;r{C5`#tE`B{xcN}=C;;&b`FHtqx z*)^z2Vf&qybq`gXYT9>4&M=_9pjM6zYYl@_tKa2FIO5{L3+(8fR%-zUVz(im(g-o{ ziDb84Hxwd-V_aTzg9rAAU{~)c`h>YC7!DprFm}=&a?W_@KO^EbmHjLiV^(*czjVO0 zPvgnG^0c-B>Ntk&v)0}h`FMs!!C=rVK7WSoag{LD_u8l;0qz`A{Xy#@bV4zAi6{Ua z>FmVTs+Yd#&$jAV$tWu;&v@OF$InW|UtpMJIs3zHrn|tEzQ=KT?4Yto1^;vzCPu&M zd46^80>zEfBsu5&<8toWWWTsOl78iJ8!gG%OA-N+@!7p$PZUUt{bj+M#^A1#tMez4 z>#Isw7=Mslmh{SuJIt^0(Z=in_fc~Ap%Llhtn9K<#UU$JR?gbmivG`V$HktTz|AUI z?!t^w(+@O=VbOyiQdPn!W>exj1N<0Q))1FP;m z+>_GKtG#0S?io*UFY&+YBDzzfxPj)Y9@00@5jsOfC#&)$|IVKWv?0%Ph zp-L4f9a#XoY%xDrrR;lT2^5dU-`zQE0dUHUYb-J|38hjvvI05*3+Gkpz7t&6+PcC4 zyp@PsoJbU~Y+-6?)<>fb>`nSw_tLzcve5~^Z9X<1V%p~p-==!P{Kg>o%Th?dhZ6^a z+4ngNsi|{sW2#d8_vC7{Qidn&v|6a-SU1l=g|k~IpgTTyl7q7`jj@TdeWi(@@TXri zb^t-B_6@N&nxW_>f~5db!S5*d@qDIy`~}3zr(tCvejHgw)B9`%A5Vcg$k&Fj*JlPl zjKIF>2jV82f(g37EP=5M#oIR4h0!tW%hvUClTueLvm zZUnOo zyq1NRu6>v*1!vVvdO4!p8|&InX<8w(IbZ2I+aSba8Qa%^Is8$sHY!DpAqH3zP}uDO z#sWe0BCQH2fw#jjN|xrwxklFwe#;gHPE|$c;Exv%C;n_Vx-N@TGpp`)p#QoS!d@yE ze*!+)6oqoSE}5b9B=}5^KC?`ElBEHsZeDQ@7wb$quU}Gd_95bU7O46|q6*@cHw8+y z+NG>N@J;H2O;HaT^94W^vZ;AQ&nvTm90GDY6iwsfv%9bK9?B$R5mxjsZzErcaiP~| zIGcI>gumYSaSHfk*Z|{M9>WUr*md)G-Ur{l3kX~98DCbf@9+YMhZ-t@cf0;IU)Ino zK;58th3^z!0R}|p+-{dN#%rPIJyr@nn8J>Y(*M%ojSSJMY2}M=_Fa6m(+j{(AzR4B zrnOl=3=BVhW+^2bRvY!RYnr`Q(p0tgt95lkUam70S->SE$0yO;Cjna-frux+&L{8S zk{&s%dTmU5xG*2ByD^9%tAn42o`aO0opf3fCEL0f1jJsgd?q|<3Sxe3yT?M_Dvw32-HAVM$MU4bv5?gS@M#!7SKxLkMxp_o zY1L!Vi+iRXYux9~kP>9$*sldhcpd6Q#zzQ1ICR~euIP{e-Pif?c)%T`79&4g@*@a& zR4v{v3L@`vu=8mWKpr`gOEQ>XLJtK=lN~FP)GRAb9Z4)Ys z*fya#T#8n-+XZN%03#sShepm5EICLig7z!beg)>|mYYM~9*BhgXZ7lsLnzIhdk_^I z(#7=002Pwe;pgCyU5Srtq)a*TKZxa15(iH$48-JCQUTq0A)s^_l+F*a8e710SAHTj=hZl+ z&=c{XjlxpcZD~rU$hHSo>B5X^`a|1S@t-_)N zIdJn!o?)UW0=R<^;n47W-F0B*`}k+O3*Lk9I?t>NbYASAx?1PBxsG+~KB65Td9IBT zIFuOCC$V(9Pb`a+^WL{>)!yYj)jpNfM;H@8rh>SdXJG9;%zrOph`7RlKu6@M9=!XY=P3@qF)%;9)i9Ip?kwT%MqaJ=m>r!$HD77@SJ_@mGQ7)JbIB@zUo#3S9 z)aUH+HvxMs-rYV}V%uA6eYL;-TB_Ha*y7I)E!H|tpOume%QgTV7vAd%oQX|e6?U+% zUfrDz$@N7 zbtz!jF>nYJET~U|(qIv>Tul@ywcgD|rCU^RwOF32N$>1w7@YA2=(?~x!E0n&q^%hj z@)7u-Vuz)CgYtF?R+wOE6x$|<$3Z<^Gg-W|;BukzBRR*3iu>&;QeNU1&9U+ys+&C1 zOlt0PL+y7*&u%WaQdB0ngN!dzsx_=NIy7!!U-nPV9K8Kl&WtbXguHM>UNvUS1l2}2*n|B8PSgrqHyO-qyA%POzy_?` zp-X0rB;q6qASiz5q`Y)}e9Q-}7`~|8yhh-Q^Kaa*)m6I$2 zLLWgKzu@GR$n^YtPa3k(d!Q!D+|!eLaj8)~y1c22Tc8$Z{Jn#HWe;QK@iNifTAz{i zBslwlAAWRv0n_N}ZBYHWw-)z|%q3k<0gps>yKkcjHpsF2TWH8C!8 zywTC+4}x^}Fr6ZM5VOzs;y9!qh}Xf{k64JBkEnoog8kp#=jueqQC@E^Y1F)Pk#{re zqbkO-GgAN~bh5~@b?)XB+pZcYjk(#u71|a9{2@g}+&R!&v8nZSu5w=3vNc7>ZP4SH z;YJIk4j_U8ekfCgP4kNXNvbW^k#;P=V{ttGS&C;vijYMUty7;}sSCAE!J92T<%kJJ zByA&4Y8rX=z^-8H-SL@lBngjv@BXl;B&t7vjzq#Nk5LKq4j#(0&(2>i+>!_DoKEdk4G8d5%36Vr}7E}UGN z03ylGx$NdL2shHvw;~(5%%*uVg-D1HV$3oFur#4b+so`oBcaJg4z$9s+oK?H^0cBd zQ?ouscJJO>svA5c^CJd(?}L!ETqdwMw+j=6v0EyP;*f<;D5Ujd|9F`6{f@8t&Vt zry&aw5fp2)^KC>ks%AHjd4^->gLLWP0`D~ty0+T z*3{L{&%o@T8bjtXo0F*<*3a;eUV&cBm#LdGts7hp8z4TPnE*H+tEl&=i0@PG%~148 zs3PujHrx*POlEyj5!dCn-qp82W9-d;*>`QWv~K~u`W&qqHRRf7SAqxcaL^01JKD-@ zHV@%7p5SfJ%QmwUt={7TAq)Aqg#3b3UW2lSY-lLMod~7jWodwx_xk!yX2eorP(IUO z*l+cjpK8>DGctp|8xwvT6N)%p?^@mN*3H%Y%>*{TM*Trk8NcPCRE;RV$ynd)b#F{V zv?308XYe4OIj4{XUfd(zg4E4XnT_+8H!?-4>V18ILk8P>kJ8UhY~out)uYfGOZla# z`G%D-Y-faSMy-2;_L6X8rZ4Dkq17K_HnD!2Zcp%s(ccf-;h+Uf4d}0jtKY<+SErtb zIEtW{=J3=0Qsr;YMs64f7S#d5Yzv2ia*%hEsXp zDKsbruV5Ip(+zHi8uPqUZczFLE^mX&2yl6^LFobr5v)KW%z1h4c8?EsAePNde(uz~ zyUG)T+o=oyeY_YIdMRqO553+;g<<5v*h?lED+V|GFdSMk3|aJ>F7<8f-E48I7P!2T zh{h$B;0@|6k%sHqL$;w(R4TV|vDM`#_|Y?)W!!$)%AsVo%}(QW9sP|I>}%G`8;yVqCEfrJ z3t2E;%`h&+$SjstUpB~!y0P|MZdfXghwLl$1>m-a4vIPJxCdE@ah zpO35S&wyA_Vb0*c9WoZzx?Y_|n5bs1b zW3+D-ckJex@4TyT>2hUHNApJRkA~W7B$;?WAaV!2eCH;7TViBD%WcSlU0+GhLMpyK z74Qql%WH1qYHyDxcpBef8e3c;qLC6K;Wk%{c_6uP;R!y3HRUBnX4y<8hHa?ItCV~5 z)0y>8iZ~US)yw)D?`81sLlyvh(7k}I##R9?;i8QTFfuteJ?CZl;u07#4e!1?5Rno7% zv4)uoE%AQ4+=vM+VVIoODVXhsHjBC}btIwRP)V%Aun{hFE zNgpl5&x2L+0u8|-U>C2|pOYaAGOJHz3K`n5`7}oEZ(|zQTf%fJDUTYdU%cc9(k9^7 zmOUAfjbq}&mbv{d3LEp5Wq3!K^W(8=bb{#q*0O_k*wRl=RrFUtZ*|E?TQqu@4D}L| zx{05d-896-@te&|#2WjGUEToFP`kW{-dsboHVom%MfzGn%|RpT0q6nq-6-{2D^FtvJ57 zz8gV)D?y4l5O2>;K>KS&X@RzE-;GLOd=+thgUiBeIMn7ciV99)%{LHa$RHF;a&~WTd6B(qN#pBXCe*a1@9zz833UJR~Y>5Qc^n6 zQX9+2(?10hb!rwjKl(qrE(WEyn6|X&I1mz;E^lmsi1Kv2ruT4tYylvC3wxKjcoq22 z;$Ep&bTkm2ar5wtVTnVv7vEE*v21strd4fcus2cnP3X3V&RP)zByR4-yNe4W5+2j9 zUI$z?y32y{ZWbSV#y9q&ZGmM5IpM6p#+w)^;?StJFxFf>XDN03?3wNw@X)<`pU4Y> zSnE?+#e^)#S2^Z7G!!Z0v-f0&#yv_keW?4ja_AoeY4`nG^cu^rUNW{yQPJowl!uM_h1q>L|KV**q`(;`Jr5g$5OQ}X(0 zo6;)?R0hmE_}nyEdzcACvwN7(Y1}<*VoYkxGEMAgp1EZxQ#=#FTf;=p42acnrmz4; zEz~qVKQ1VHJ5ozHsO^x7ymbI#4QL80^`1!ReQ6S?SMG=~-CKb^{!KV9H12wty~#Ub z9Kw!0_WWHb_}-BT=PlVH4F(ZifWUM6D=~2mo~HSI9p1j{@MoGXF`Mn8W<3Jb`l|YG zi{ApIH%$)87@n7Di404_;Crvkzp_+~88KZagM`z_H|Y^=M=&KD~T%V@+ahW2{k5yn|!5K9CwJ z$YKZFhBTVhVq6=d*pm^Cn>uIbsLvgfUP&8J>24I(W5iBd^l+}xwI+#~B}U8?6i-(F zOfPD54EKsl*GErQ@I2@8Vi*`o&-2P+nxDRc=PH@*>lu-GIkG|c+99B&qqb_sG2bYS-tY3Hi~NB!j0hK*%_x}US+NrNe@gts28qQhci7VE6`n*Y}izJaC*SwR#!6? zB;?&=BMC?GIdxEOLnTLJFY#4Jhf&HwR;|;6#PJIwlK( zA^1^g)b!!%T))*Ud(f=YV-z?*Q=3_(TzBs(P5b8 zTv2};=JBEWD>xBP?BFYt+RwRqMNQMjo2xC)l^_%#Xsu49x&UP{wV1m3TFMRhePM;s zPLWMkiUPkX%L6;4){IJnpT7Z#iVj9D%b*+?eYV za+@=l9`(&#gwZpd785zMjX8NceEO!RBg#Hc-xhjAGE*dtW>|4xki_5%9Cm(A=hP#^ zNAx-R;W3+)2x$tqZ+Ye8iXe6a3)QViIuS#ss9uiE7JHs73hMMpRc|4;xg2t}JpQAN z^72fN+2C?XX?$ZWFP0kKp4rW$HudP!MH!uG8HYY@FX7-gRhf|Ky0L4kP5ndoj7=l- zy@w}Yf##X3Js1)v-Y?dE5^IYVU*clPX>ZF?V<+WSd8Z9PjV&Vm6lw8&|I~tqx~O!e z$l#;p*;r02Dvyzr$!rWJ8yE~a%)Mn61!T;me}rgtmjDbRTym{^%z*BJ`JnlkE)arI z<+E8|Q9mf4cfzODYtT&kd%&@u>mk_yg~j#lUAUKRluH5UPW%{<7#Mfu>sNv$uZw9v zeeyFo^{Wu}o_r?8DfGrPy2(;{F+M!&B={<&Eb@K~!z0`yb^Sr+=W+m*j>RPfM=nCW zfr|~C`D2uDO@_>YlsOTp5?|MHMD^B5Fmh$L2gyQtJCtF@^%8Q(0<{T8Gs6n!Y@hZ< zzqh&i7n3{UNtsP+;KC$`o%QUubX;lvAuTp2s+qnnc}zx z(s4WIKq@%Oqfx)fsZ}br+n?tNTYj9Q*TWRwRcp>B^Su>)iGm+t#-6QFe37h6{nDoa zzMiVnu-3cZSiRgQtngD`Rm0n%>2IqVXru`_KL$U`TaTzZ`IZK59nj8gv7Z9oe%A(D z@Zq!?o-%N)s_iHIou>MdS#ppb{iso;20_16*P7r+KM)3q4|GnukSNW3Hx46Tm{&ew zqG$*jkpN!BXnM2zLUw@>n`RCLo#8&kG!A~|;B>p#Y(puCy=&fB2+EodX{!5d%&?OMPGWpl3=H7jev zvS6-$W1wCBrx08MLD6rMgcy#ZDPhzXjBR>wK|X@=%(K?jfG5BY7Bc;2S;XILeLKFEW* zm;@L?&$XT1J(W9}E*6^RJCf4;H_&YKqgv>6m2|A zM`gX4q^A%N3^Hs;dK}0kEH4xR)d+n2H@mlX(r(@p2z zHV;rvlRO%L1V>eKmmIv-uc~fX$d-%{1q2)f6&3(2zMRh9{-zEfNOVv!>{4!7*rg2izG0Y_{SkA%M|5AAl!1>{QBMX;6qaFp@VYzN;i>Qw2PTxY^UIbpooq>1&a6Om|)Hpy8bG&99@)!kXAC6zU zw?pB|mLLIKI_HdgTRi*Hpb617?VwR51vIKG@f_-V1NJiUiu^&fG`4Bc>c89Gbbeh-kt&vf4A1L3do35%|t- zB+Wb1r8qb)ClKc2%q**#_|^Z-CTPJTKUfnmNGq#8xpXS#7nDT|>Io-A_fQdlBl0#i zP!H;Ile^Z^u1tL=%3)pkDS6kpAN&v=>}PWS^aJ>xEXSuZ!e(+wI>6WcpL z+o|8_d=_*_`>1EAuB1MReOy8Dee9litckr6bTdHb3ztJ$lL_58W9HAbhZH-l$G~%f z#{KV;zX(_d+O+DEg(OKY?kqnN$jSJ|Ad57&&?00n;;31?7W%zB?Vdz#h3|}JY=OXM z9l5vKclIdp_jCEmZS#tD=fA#t+-%mZPYpC%$K2(W8pF2*-I!Ngi(3ReY`;1IJCdiH zoU~3vL~<1R?*asaJs4j$BrqS161$I(UO#F^^2_{&62)h`;`Z9?*qlqsz~(fWoQqRa zl_24T-Gu?$-jJ4sCL57OAEVf&+O|X+dc^K+x!xPpMERb{q2EJu)P?8$SEzi#LHs;d zZ$vi!J$TtuC*F}>unzjFRCj4VAe-*^QmGunH!S$TY+c&?7d3(xKnuZH?~0u!Zdn=7 zQoFS)yWO95g*6e5;APL1j#O#m$DT;@*+uG{~Q zNQJRYp#nuo-vmiEKN||^RhCuNPyFz*lmpz#`8ahmRL4B z_l(djKt%ErlsR^v`d=SOBKM!9OhJ9p?HVbNB#K)!bP9ApdJ&gC5AAm#_dn*5poOM- z73LpRBK*Jvr2}s1M09rYIHWZi>wPI~dNvevAL_S(x+enm1Ad&mt<|+7PTyGl~U~{^5w>%h}wzdeduzt=TnRgc~dr7YR=Fa)w3*A|wGYf*L zzN|Ot_psa9oqj)<0|YCF@%eMZ5!qODVJ-q_%Q3n=JAR7{d|NFC^S(%ncY-5@0(Ad-qS(nyymu;>m+K|vZsK}AX>q&p-P5TqL<7rp3j zF2LIFd(Qd4^MB|2|9xHi+G{_o^*r;LbIg0(;~rzoaCKD$Tr5f~1OxHIzj9#?mt9OuyC+=VDiwyoZb{dZ}sq@lgl-3ZYMhv zhlh{s?YPVw?OnS+(}7#OwZ5zK@aJ^|L~tMX)YYdGN{u}DtrP2oB3{LwLu$Er(k)IY z@2v;323Sp+cHjB4yivTiT`N3RG@O+=neB}+_aI|^jM<2LuBKtTtF#Wo z8d+rsG3|SA#=a0(LwRJo{Cb)#v}NxL`>oq<-Jx1)dHp+g=U$U4Iz7F%dRt(pB=qk3 zTU_6#*{|f53H1`onb-n8pW4qqSN&G`ZKZ_Ov#@h~`B-Ah{eG?O{au4^2NvIki;3=B z$44PB2qH&Dk;X^71c{;#GY+hh$G=e|ZFm`jafrT<0ENIVb`T=~L#WLbMH+=_Rxp4* z0C$s88owUxKlnQFhMu9}cw&&M7i=o@$B!S-!VLszd^tpK=Vv4vl+=|`^cai?`%8I+ z<)4+S(5Qk6F(mv-GD#RPL|6FsZ>BC|YDN`f_eGG&Dpq zp!oLPd38%pPHty;keijYRi{lVY-~$}H09!UC!5Kz2dl#+Q&Us41NVoYhP5K0%5}`n z&Aoc{YUf9vg2*Cc-wXbX|Run;u~5?Ck7V zwGr~8IWjO)$m(&e*Hkc>si|q^liUm+N=kF-Vp1+A7rI?4Eeo6|ghXzm=*Y;~P-9}v zJgw@zanGqa@LC5)TRp8UEeYI4HD;~Rp?Gxj&4#|mkE}jDnEUKlz4LA5`v-Q-w@ePA zD(sXMt(7Kv&q)v#SeTfea^2H=pTS&65TsDGMQPxeS-Lz}SZG*Xp_+D$1NND{P&w_| z&UACc;oiFA*O%e-mvJCY&5ubUNI5GW{vaG>;JQ~qyg5!EPWG=&ryM(43o+?u)Y z{rh+5=3JtYs-oilt5{K&dGU=VqN<_n7)g({QPCnQk!s)5lcIH^YK}K;e5QtX%4I_@ z9qz7HI?seiA20%gfrhym21;NXjF=*3%0-Y$9d8qL_-=nuco3X~X0n%Qp4d%U3Sx7p@PwBi^^?Ais_PZqyqi+A(I zJ?6MP&m3HPysMvJ$qg|Kf}6rdx9xiM9<7066s2IYID~IyScgYk{Ag()kHdF&MYj+8 z4(&UgV$(2$mGCM~dhSNQL$UHXYH@cSyYDcDa?Ux!-(@p!SY=GYWlf) zERw5XK2t;7>c)kUh>cmVU$Z$-tK+!G&Z+D$%~!v*%H{ECcR$%*FcF*OYn5K z!D<_M5A zAWRZ=t#^0d+?lBH{%(mHVwwZVdu+NVPAc?J-b?Y$WsE{-w{6fC{8jaf%G+!yrNK2+ z_@|2N;FBQylOFt&MN#=<_ti!`sj7Uaer_!jbw9a1b0ac76hfK|A=J0T6--hC?9|6+k5bhW@w! zrvQ4^p+!Vg$y=%ToD861lXj)p(Fon zNZ$TRWJWztbr=hs&+i^P$P`}HayIM(8N+y{O-l5$yJACB;@WJf;p5HXo)uL5@BiTG zQ-HKGPU>Yh3}?>Az)+}22#E@8mNUG(-Hcdx3~g+moegbhY+N2t@;W_M(~b39-Rf~0 z^*yC?tmG6D_-F@^D1pm6qPee6JK+iuC8<_{?gvuaZ+5XL$BDm2S+g_zLatB>dYzjW z*?MItSK|&Tjfm59p>G#Mno@y_J^8tq2bpzGSvRJ7PykS`>pnW5HFtu(9Xhd0~G%B^Qtn>Wiw zAFvPgs@Dlv?bI}@%?e(EuWc_Goky3=1WH*{Q6nEQX?4Prjr!-jM3rv7MeX z8L_on-3LWuGXpAt-$@Ufrdi=r-w|Wj(bbhA;n^L*-JN{x5exHi-$&~Y4-c`l(5pxZ z2%KS1U0IX0!bC$4k~KEV9v_RbikSEBYY4o{oM*H<5(^!^yx7T&B!#iR zUUS&4{``=gCFgUg{lteO1v>lsz1-zNUoJeoYR8TEQCr(@Ra*zkjx&1KURHa?{#tR3x9V)KU{UC7QYE9?CIbu4oU3+?HXS1}4jIPR|19dA8HkWo_ z9(vc6l8B`st+}%-JnPKU-w@mZK)c#~L+bNW%x5V1yW!1h4+{5Pm%P$v)AmR?xTHK* z_ZMl|?MlXdv^=g`;{}Nw zW-olX1*=^5!Fa+~yD?&!8JBq)XMlT2`JQuJ)z)|bu*B@UOrN@J{ZnRbdcBs;pS4N( ziZQ&3lufY!tt(e`9O4MyCAY7FZQ&pHKlZgf5BtUt6_K0aRr9=}kolYAN(E@XYH2Uc zT+c_U*u^E{D{OoYm zO-w^0afYvgx!oPP+1B4@9{PBbv}uoz=@aFOavBB~i`u5*B!O2LGi0F}H6m}ex@F6A zk2X!h({OJM4}N1U{x!{mwaN@aBC0Cbw33+X%1G^LQ;K5^6_x(#fOg_!oE~%g5OSNX zI9-@!beB9+^Q=v*GL2eXiv&wCmjk*2j^f$OT}3QZygys#PeedKaMYVDNM&mJ_M^kt zB|}ZBO9R{I>AxzqV=1cB;_O7Glmd2`+cPWJI zI8uf1e~f+_*__M!{)Jg-e5E%lKFh3}hPFObC(dmgxRP6Swx)bIRHafpSx4#*9!#v) zoMk2DS}*xyTeaU)(V&1xQ$LTT<&9yLh4kGQ$-7vpO`#Nsi~^j zi85rdTYauNST_n$r;`HtbBxN^b+3G)WYTCQa-c4KJna^-!7Yz&p_VK_BJ{Fox%JQC zJgXWcFH#Dn3RR%}(Nl|q9pL0ruav+^)#BRxJ=jeXikv_;1^Gvmo~!}p6Cc$%2D?u#qmc?E^E7IC+SMI}&h)}^A%#-@EG&k|Lxaj#6MfxMp~mpER!$Xga>+X^?;L{iF5QL8Eoc z{m95D_&_8JuM`GoldKYx8cpMcbb8^Tw`C>Hy~V-wd^_=iKK8* zS(l{}usSOA^=>h$IX%e*?6|qP>D*etNR0KG7v6`5<2v#7RcXq>5Dzz6^@lz!78ebC z-(M|Luo-x})qwq>juL>0_uRAXThAQ)#cupHI?P~Jm1LwbzcGugc~0EsCSor`4MWtt z$C9EhPA%KZuFYp41vi)U#w31?bRQ4CQI|R~)l``HA!ao&LlH~k4m8Y`W?HhxG=X}G ziuscJ=Ip7lNl7X3acjw9Zdn8RMd#yv<~OL^!;p#-dWlZ*uwNs4>V(c=({uageKjxK zGhRA%Ep&{}E^C#z^qLq$z5QgyN&n$DeY4Cf<$*dSOWr0|y5ETf?yQ>GYo%Ixbg(D;r9kJ&K=zhtBxG^*)Fdk+6qegDQNZF~Y zTJI;9GU0KZ4lEE-_Nj)NTdEo&4w$9yB*MCntM9>%P@hX6Wlpvc}3>{(in&g||D= zuUliG8194tc}NpW6mywZ0&@ZaVTz{$Y8pA6?i=Q_?_RDQHrLXXDsnVd0zMwq)|-mDe)>o=JLvTO|$qg9K^F*JbL z<^;@lD8rEd`1?K|(MerbM8W=0G2q)*t!g@hq@1>1*h;#>B?PQwDS752{}i%&Tg7Jo zHK|uY?V`&j{Of)v#lll~|A(Ic#?yXpZR|2qLK45_2~bAvwRd+5QMOWYa6KyYr;))3 zpg*c(FRU^Zh!)f_Xx`BSU$#Ue4n)TbaRAZaCP@JOcD8n*A@jN*PxE)bY2b!VGe(#rfBV-b5N>w|Q%T#q+vA~(?gkGYFl&kg^wg4gm z`%?cKB1%fVGKaCbjzlUvY$$C4r+%qoJj+O#qi_QB%F${hdH@Y;q5YWCgO&Opg1qZ^ z{Z;o_7fCir`S|!I7vXZk!S;_}jji34;)jD_UN@d>IxNwz#+mVtLwY z4>1D38w6!fcx~a%!X<{b36~y;s&898Qg|IGD)|PV?$|8>IVBbo4{xFVaJ@D|v&w0z zAyYaq6It`^UH{-iAeyW^{Q5Bg7L79Hg4AQnsrOOmqt%xlsner&){N_8Fqk{3D(Rp(JpPWEcoM?b~S_4W0+tq!A7 z^kxjn%zb{wfGiwSbU9FY`CC4N4&cUZMimb+H=*3KAoA8Sv~7=LhPuZ3SBSUm*}9EA zBEu`tFIxlB0+etYg&WM`qeVh<=!SFl)h1})c!Ss@;?8o zY1bYdOa|f&mDEpbK_*_%mmpCYnqB(b(J`ZmgQ~nGj;yy2n~70~q9h?BLw|Cxvn*R= zKT;YSnol(Q9qsMCN>|zxLS7VIR%taSTTBWa3t5W3Dr-(zlK?2E|3XPv7{==dFY#UN zi^?^}LtiWA*G&gl?uF;7rUh^gn8iq-?eA|b_yTn%)+8f7`5WPucq8%d$>BP`@4)NZ z$N?+S?;R&(yI1&^g8az6JE%sIsEC*W1^!&j==i+6l&Q$eWhjWTo3kmCGfXSTNr~! zU=*P^6iAhvMZ3s&;!t3F`U7AvF58P=(j`0_y4m>n2&u~~I!Lu1Y)m&lTI%=L?-(wz zl^s{rU<{$RV@1D2-6n}h&VRoXY)f1VKxayDg2w{mYnL<6$5RTnz~^V|jdBgNH$$I8 zIKe+aEUP(OJFM2*V2kd@;wUg-P1KcDUSL{u-g+S>x?8uEyhW^GgDPBT(rB?V%eNfz zBd8ql3_Vy2A(^l{9~#;%SOn_3BGzVy+HLucSWA#B0fr_|&da$ySkZI0hfda?=F+Vs zIvz6t4dp15)Ub~%^=K%i7v*dS+W6RT$rzP2G3kH*O7OIlyoHfj2gX@I_Tt40 zU{;Co@t2?ONQAhNMGsj3!@UO<7yoU9{aZwpe4XM3d;%lV47lC*MBVlz_WgoP#@bpy z4+7gwz4p2qs}u&qY6t{kZ4DxZ?I{9Z`kG2gMMcGx2#9F2Bhh>oK%FBoAKe=wYsi^B zy)I@?dofXq;iAedw2jAt2G!>ZG4W-|+~+lZ{4arphZysYaIo2#)CZvUNFKf;Cx|`_ zaa|p@u&|)W4iaJugKJ3hN~#%>W5B2Y)HUq17b*?~Ftf5MC@AbL4J-qjLJdx24 zyV}}}QJpyR+*+Bx-yV|sR&Y<>4sMTI^Ib%FRKrcO_bq1c1tSd>8aaM{KL-F95@b0*MN_FnT;SZ!n8U=qeYRj-i8vH|<^ZrieforqhBG-h`<&Ozb$#3$ zsPfGbWHEG7>8Sg+Wofx;fdGA`59-v+*{+6_iJiu z0y1-*D(OLsqq~HV)o>Jzm}_tT>+bVe%?TJV>n|@acUkC`MsuY;N`9yNfyF>C7EuD| zoDrzF_f3ETPr2&>_s+}lbf&(s#5Zr=G#+6qkDHm9!9|_qr0+RNC5h;;Esji!t3s|a z2aa=p;?0!w#ZdT*+7AHkH(@LQvDy>@3CtPu%eb}@;|Ylvcu|S?)3B1UwCFq=RT0-- zf|vhHTw4Kh95N1fO6_z>i3@eSb{@!Jo$|1C$cnvlhG~z^K#_9n^#-o0w)0th<}nJB zE`B)>J9lr60`>;MEqlcg^F7Asq*{s)u9w^4YFWhG9B#5Jvd5+4h2T}Ql0}EQ_F{Hm zQ+aJ9!FWpQ?uVK6Hc7Vquj|(+@aQBv3%Q1x>bbISibgEsU#2znm9NNz78BSlJ0bQ} z9qa8XHKfspwcrygc?g>Kk+P^HqX)0MsQA#fT{z5JyU%!kpz%(UCR>=NVXM}V)k>hAN zZ_Et^1pwtVYa0M6t@OqP9EWiiMeWcaCWktl6;yz%z+va$*p7`yj6-^AH4rV&BII5t zNY-FeWentLZ>6LGN4LH5ou7~IJ&@x8u`sEx@jeU*4gFB%u0n~AS1+HfU*-T*5@4WH zwdJ-R5)qI-y_|Iiy{{j;!2a(_6B`6JDM0hyTEldl2d^WMd*KPN!~Q&Nyj`O!SFYsD zscZpDNLPE#<4;x^^V<{(7%d4U&j%F~bNiX2D^fsLig20Dz-Mw?eB%!-r#IPWfU5@y z6LUJ)O=$U|bY#5QIY4$L0&(5q_+TfI>t3>mv+08e?>C(Azr0k82M|M%J&f!fQk}x9 z2TN&rwET@m$d0_WmgN@KIW&2JIHgJ>Pb(kfqaLjcZGc=%OQUpC2rkvNM@#0BHh9~j z{QQ07oU=x!2ihQ$VQOXuCLk?6ea-n$9(I9m7}HXI!_(8#lY~}7MN_L~6RIO+gwp4D z9sr{$5JD&&2NdL^w+s3CQ|}rtNKBzUpI`cxe>iMgNYR5lcs+xv9EnwGmnGG_D_Ib1 zLNj^WyEj25Zpf$W%=?fu!IeObdf<?fbmTexwko{t5Ul~px$azFNk??O2JL;16bE}3LvVQC>}47+~);{Stot#0_e zICEdgE_Dw%b>F{~3C41p@ZM{WXNB-EGrzL#%RvqHZ7lQ0LZA{G%+y&-Ypd8$X2heUrVdxu|{0oYfcZR$=RU`i<7obGO38B5kpJr%T)uT zPD6(v4#^fD-!(Ke1a|6t0gr^_C31L|QmHF{P6;Q!@?aRjesaQ`4@sG_Xg z)OQmU2E<&j3@YQmg!J@r0IfqqLqS0(eWFb87!2mI zv-CandH_Ao#kN8qY8JL~8+BGNFre<#2YS>^8vsx}-H#g2eGXW@1~3^8Aod!;NHh`0 zGeAC04`uhW06CC;Ko0;%ZdN-0v6_%oZ{7R~0b*$UV5!6JrNd8zj8#0^8+B2$v*S>{ z2PB7^_Vthd{!U#-XPG0t2yAeknh+7i@ZsJcYq&{HQtEiRC3R|caA!%cg<}L$6H7q(=GFYwc-;IHE!*4dmb{& z#l^+Bu8mrQFFN~;BUJ}WQe_8;oxi6FoGX*yT1;r|Dm^e394WQ8jXa)N-O5k|%5%Xvx#@D>e5!5!Uf5}G2js{e9yb8jBH<0xN zr~#widt>9h6!ptO4dOO`$9bErU-Ak}EAc(lyN&u?aC)=WFCr-j@En5?*sNM+^% zMLIuf9Wh(4GF zOch+lCKJWJL@8he3PXT*4T!Ajs`lIqNar%D8GU^_+xu|0IMba7Ykcfbjyz%^+|N zhWY5ZtOI{!bS$hrm9nv;-|Y%Z4RokrUL77`c)uSnnucj9G0vkcDA>_G5Ew6v+VcRgbbzl_ku@+cZ8F-t2AiXlW6(EQzi!L1roRCx}ymQdpCmcc_ z19DsuyKc3IU~SYjmwDx$bcxHCFQ*7Q)>!t?lCA*3&D~w3qoX<@C1s?1D;`g7iyIG1&8HjA{Mgs!4kS$c{K^Q!!xt|H+F0-QTz9;fn{AjJ@^ zUC^`I%pUvx`K}cG5}W4D7t#XgLbm#)cD(Y(jp0PBS_KB}l2C?Q)E8V)@!3^PP#)v^ zvszwD`McDBA|-g}Nr&8G7WCndfXi(hlB<=k z2b8Ymq2d`32tzuww@~KeQmr(_cwh% zQw;##n$;!YNhLV2GjVZs7kRtD<&2+x-swRSCM&@J+TA>@D94GvI35h5h9ZoKiMco7 zD`gJorx>7*GmuHjHrs+az${bEk6;^}R>05nfUOK>A1`Tp`{8gQg{+V4PkjQgL=m)` zoI*mRLRN6eXe4vP$ePP(@Am*OriB5>7-h>xm6wauNb@JqQ~zSat1|&jO*b0RqSy$| zee31XOUJ&*`Tz7d|KIzW-@d0yRL0I1x9m6$g~0shYSz+a#|;WJO+*y%|K7q!$Hl@B z71^We#cMNv@~2Pv^zjJ^T7b>>_Vz|b;*f$(2}%&m?%wT>V^(r+ud1q=ot*_@tzorC znv^e)2PUKpYkj<9XeD%Fp~C;d;=b4dh6n(A8c;rIdkzt+-b}z{K}?3pSM_hi27vG* zAFca9FeYr%Zv{9L$4wa3KiS%c#gcedHOheE;$k3<26n>5j-vZr$@GG4sn;I81!l{E z;YSMY!|yOELd$RzHT(h{{r9W)(`G+5Y^(=yxk0rD2^=lO$w^5`AH=`6=-AW)WqP4) zK*Mnl`p4U(%C40F83Me{brvx(eH^~;6n@8gpyUoN(28HjM~pt_ZQTq%aR^>BheIV4 ziGGe)To^e3ucBD7Hy3PGk_GmGuBjVKAAo$mW#P9U9UTR{ssYU&kX3Q_`OYN3DCOnl zg&fDd0NQZ0N#Pv>Z5DXZmH-q2>I*tZ24t`@5EBxys*>a3qcF%_SU*$DZDG5i-dwc| zV8tnYH&L+Si>id_Bea2Gc-fSsMN1^5)GO5KtEaF&Tuh#^Z1%dPZU;7$==JzkmA8 zH6M2XOwVwi4yP2fsk?OPgt>&^hV%LM>=K5q>H`9b(GA`S#pFEF5~Kq_0j#BO9S~;9 z3us3LVI)dc$VDt5@=sm|b~gxhFLc#EBHRDYmDbmPGfj{y3Oax8fBxy}5G0b4@#xEy z$fMV-r+y?4;{Q=sn;Uiy6jD3}l?ko@@#|8Sc9q}^v-9LmqEyj`ML@qV1PB#WF*?tV zLdE?r&!3ZrYl#hK|s>-ns}eXB-7iS%&cEwNOv1# zfzA{ucyO0ykzf?xEUM>+Wl-ZK%Exyn5=I?!FAkYi6Y$Zf+iGl8)&M_1Sz_dEBV)@i zfh2!OXdO7hfq(-AQ8h9vB|vQncQyW`qT<-MqC-ZT-umgJIZrj9>WKKT{R)1yK7ru3 zH{%b9R9Bhd-zcQAiSB5L<_adKI+d>W#a(a>D@C|ReeC1QW6@b(IuD?}^dgc5^%0Io z%z6KzeVx-d@jn3SD47~4_#iC+OtBO|*v3rjhs>^QSFE~6l9t`6PcAEL%AUv0ccrH$ zO#DzQz?Z(hQUbNZ-PkzfJP0=VpbQu!(m?J7krV7}(%A+qodHt{UPn#BYsf%<++ex8 zP03~LdkNqk_CZLs4RAyt<<}Yjl2XvVe<7JMw@qeTR)%=bNhZ8FHwc@MZ!%f0#HJVw zEDk9WJY73q?-7vtCs}+JK>;sE2H1I}w~dQI)=L)AigdGRVcHqOnNX||=jN9P(&vmT zpKzr6;&vDC5jab&`|gjHJB!Dqr09b*)5+J+Kg2l3!u_~EF!LxG=QqQgzb%G}Q`)}$U+r^z&3w|RhJg?}Y!zCinLqtBD9OZ>Fi?xxzMG-Q_tYnh`r5-Vg~@xFs3&n4 zBIkR5iy72#D@0TKE4#W1)v_?Oaor_IQNXq%=AowzkRTpWt2e|feFTrCeK-%9%}h;! z)^3lHobXX96gBv;1k73tjaY)hg9i_;Y8P-2Ga%u>ah2qgIMf6a%aLvyhfeY+$ub>Y z&0S>D2on^2xY!F2Mw&-Zki;QbN8N{bSF$yRE|C~N%J{mt08l(nj`Bc>^;z_uFvJW| z>=V-eXjS}ZSxdI}%$9lvLD}u*@!rG-`YI(r7j@GyZv1=~pr?bI2X{3CdJ7YT{0o$` zNe!1dPC%hfiijzOfn7=Cq2nxa*e4PjTSxm=2UOciD>}j_(gNsL=Q^{Uj(jd1a zKn^>I{KJ0ZmY~Q`6~qMygps$U5K>A&7L`2vj%un%F?eMlo>SlvH~%fq#Z(8PmFtg| z+Nba?X=Hj2^-^RD`MJ~p&wg1xa#Fa1{2!?uQJ@)`$bx_=@^%K&s^$Irl-awW5J7lq zz6@9(@DXkv9)JOU`e$@)<~Lkt3yjqczyk;{aYuyzapNQ>!kp3(EX7;50z55i{$_}0 z`lIn7+9`ngy^=vg{&e&Le@S8bFogL)Jjt+_7)$xQ+u8CUlm%n3I4F;T5}gA(L6h&~ zoyx6lF(N|3kV`aI_uZfV{*$9$KUf)3Dk>$ak8u|sGXS=_H@H?lb7?s9hu`mMeFhcY zKE)NE{>75&+heLRRX}OO-!%5Wab=VDY8Ix0;lrQ!2uhkMv(EH@|NK)jma3#Y^FKY% zzl=)Va2|iTHbz?=Mn}?|2sY=+*H;nbSD^g?N3XNImD^N6-7N_T2`E^XIvLzL3IayH zz?&xKcHh^shvF%j1jdC759jf@7SZA11V${(%&ViHG$M)JD`0a9xT|JOOTY4LASFf% z+yFv6vW9u&0j?CM$MxT`PQ6+OhYhM$76?EZ>QCu~wVk6$Gm(Df*;>sKXMaiI!bB5OJc%18F{J{~HaCp1|KEcuHnYI^hbN z2hp`ZJWW;SzvkWSX-hN^%!MtxsTY}~niP0J_@m>tc=R9om&e&3-Zt}@j=yC}F9se~ z1j2qxM0|P-4YOvTP=iJL{W3$o;h*!1VVd!5?2#x9iy$|#*&`D{-9KfNCncMtq z;SyhfP|PhXo?Adl0VE7?roa>!!}t`C8%v{*BAQ!Usj#kphz+HfJa;C9J>*9iZ|=S! z>>#SY&@aJ5nWUs@GoizzZYIJGqmvNXma96TOJSZSq1I#Ps(GffAqxiw$1DrT4p>O1 zD6A6m;4?-dErD=?h7Vfk^&Gs5mh-I!;`&*r2m#6k-BmJ{8ERPqYQmX}Q0&)btgMV9 z(6IT3_uxjBW)b^`^N1$=?L1u0d_?EW4ScxxR=~Kxdy&q`Ykkeb0I<)mGB?r42h#ug zwm2JUEQ*Qa1EBsUIDUD7dP>FE7>egRpJZ78lnS6S7`iX^W&ySnU~FS!1GG-yNbcHA zeDoV)N1o35hl~@Bk?{qn2{|HjQ&C`= zSFsJh7ndktPn2T?8a>3}}sHDw&Nym``+`I}GXS?p#F`hg@PK=&?kW(TBrNd>-Eucmq%) zZoS0bsM&#V)^F7nJj$`U)TA*42oMz6O)AC@fHD|$yVj&+vA+K46^+SZ@aEpYn*-eh zIE zxaV;eMgR=A{0R7j^1iRIg;SZrt0~D5h4`n zwx8qwj}`Gm?rPEpL|JzUW))O6hVF+$Uj^3ss8|J@CFIPC-BBVs_6&(0lW*wM5tr!s zH2>k|I7nlRo%cIzL7y0%xVw`w1D@0o&tXJqRUMEFw)@y$q}l`o_dFgJdFeuln^N4EdbFL_;@ zuY%S)(#6qF{N^&UvOq?EZ{8jUGQc{TyaIWczh^SKc^Y&q`a<&IC1wl0vVH2HRO)ml zMv7L@<}OHh+*lecbkvl4_X_V15Bh6>yF+HN8B)F{3mLwbl0Y*{80v7TJ$4dMpnQSA z9Q)>Wc8Dg4><7?@B&@>$njbe42fH(*qySeOiU!#pacCVfC^Gw?GYN9D5}vz3xO(R1 zOd`?8*7|*5PA~&79EvXHVjo{hPzgUM#Q0*`xAFszzOYE+4+osRfRRU+#Q#4dQ8p=g z+$SfYML=x`;|8cc1T^!2loFZF*d~AAKH%kfR-3}(?lZVyQ~`|Y-k{bZ1fz#e(yQEU zeHp)^vA9Vd2C?Vr-?@ zvdcgGu1tUV6&X*;0=xI!XeI+x45U zQf?WY;8OdM>GIY@MkkDdSyS&c)kKBxt=?HFj z>T(b^eY_$+8^u4ndh?p`<0-Z<7CyeO+xV|>OSL)Hi}6CA7pwgLNImTn`4fy!?Q8d6KSC0$$I$Xm5wcXJ9dx;ra4a!Gva6&pVtk| z1nahRgQ@!HI3YQ72)zjx%lGH06rTk&=sAUh;-SsS`atmpKG41^1?s5Q<*=tF5I)BW zcc0HtNH(Zr^6MK~!XM>-U)3r}o&(ySY^M9$^BM;b*>$#!5zHPn9G=NrB)X5hbOPWo zsMUc(vUxxXclLxX-ah;llIo7YrPed+Yj_Y{v0 zlrw;2=&UpQ(3cpg6SzT{qOfTfP?LuynuB_h2=2L`bLUR%Y7Umz|C1nfKpC=-3>~S9(o478Hk39BW%=b2V{k&uqx+}DjG#}xZ0;X>_u)v>u^?}UfStZb-Kc=Yb3c2}YBjXMkrvWz};atx)e}04c~cmHQ|{Jg2lrWKz8NWw-fjct zs9j?9#T1A?AxN%391)>=u$w8l;m@KaOEgH z^y2jesVhKd9=w}8q3k<)-kW&s&=O>Z_u^9|XYc)f308y>T!!aiEHmGoMg>}CKUk{u z<(i2*QvS^H#83%eO6DUj@(AaB+S%RBrTMlWctqo{6jPB3ul)zSNK{`#>3m=b`VMeT zY(8{y_r|!0!q@03Wb*dgjaeWE$;->T0XU`!_bPnm=!ixi|3!QH{jJLm;&P7m_xN@O!MObt7_yM3DT>teXg!Z2Jx9;-WsX8XK-V9C&hU-hJn@T_?D zXY)jS%*Zy2Ao^3x0o}x`XMXuo-FWl?kXOT zJa%!v`}Ctqr5oK%H8o)_^Y&undPa%DPC_*&i>_4B5fLM#Yien&-JaN_iFDPwM_YXx zv251qlS1{N>$Vj%YCGdyDHbpbQU1Ht$9gB_mecMG?H$wqt39ay4;x>9x2m4?$oi_? zC@DF^yG5_?hIrRfyzvKna-HCN=leCxN!7*1s0@q%Vw@v5RxH53Om}O0lnz0BMuR`xSaaAs@1QQ zCgS$~O|RTu)Y0^r`p714tRA$%QsAmwP4=T z-tbG{wnTZNsfvqef+|bwT-+NVr&8**Z{zx~Jx*Bc;o|mTv&QyjJ?D%p$9WSO^Q0gz zMF{Q)-E(yxHqlS(@E&=K4qEs9QI|eY9`ng@!uh7}eg{am(9Si}dKKY~;sjt!K0R1J z^&#K&wzhVxqiDgp`JeQ$PEVLJp0|ijhPWMUCz?EecP<+FC8e~saEP!;!Fwo!e)6Coy*T4C z2Z^cGrpQ9j1m~J_DFbb5{#AEs5|SHjrR%YXWj83=qc`xo=zrx>gFV^5Xn>t9nFy_R zTjwo@q2rJ@;MtGDNTjgPreelj*TnJ3wA08AH#>YS$xbGNkG|!5;&Lio-E3JUzTaWZ zW(0a?7KLJ{;$EIDCO*;AE1GYKxs8X_M7YcB57XyN6s(6YDb+8Pq>1^K&qRw&8Ks*z zx2^kUq{v~XbjOJF6lEh)QDQwu%O5X;f$c4(5gLjqrs6DAzBtvo^-@t|Y9873xSY#D zK|CJ!SHJPNEl#;(fPOb`wkTq%*`0dRtFVdn?wuzVcBCg8ts3Rx zqqSkqvT+|-)<3i&#q#k<`fa`Q+(WnRzlqPDy!&^HY|+`N1rbPM9I_@cTUB=7r5Jn{ z(soQLTk}%TK5(A(;|mTYUGt*6Atx7#0p%wRLH-;OU4S8#?tE|bQq1Hpi&__?7LXvO z(DgT3a{3W~?hG15&wEcn`Q2h(p=(5FT?aPl(U{M9Yo+gxSK3pmmb)w3pkSAceVMB7 z@wCzxTPJM`HWrpL2#|!Pp;I418fX_N2uGDUjA|<6BEA8d7>^Em&!0SbGJQXQ6*^3J z;v}VvI^p=Mh4yflhAbm)=G%LTNAP}aq!wFH3qr8|0|t6%6RUsr(83fY?T4v1@C}ex zhsSJd1wreNdS~N!!i081RIat$hDBeFqLFWP#vDJN5ar|WD>`S#BtU#3>f&1=^VY`) zJ#*4|dz?OTdG+1>Q|XO8Ki<7_bXF|KOA}mn1gSW|YCQYi%#GTU9SUENKF<)c=_e*5 zia+b=B;hd(v?j@@XJrwpJ8MQY;okwxw9nndNlQ1IK{x*!&Ae`G?oK4zl`+rlXWC!c zH7iip3|7kSCkx{~hQQiI9SyG@Sp_TIJfg09o1yOh_2rdb+@X6Q`TkX1Ss56hU4(ZZ z==A&W=1qqQi%BAGSuDq*b9%ix(2xVWVAIW~lXTs{4F6c$&eWvM?Y?;FZKr$6|LC{v zHrYkcuJX#%x^pK_P4YVy(X*saqE~(td~zYvt43AYgu6IxO!uyBndWvU3+E>d4L-a}8|L7qG&8`56>r@^HT1h@Sdr@%E$DJoP46&d7 z(fImgkc~ufw&c3v|LE5Q0BxO-NuW+PN@WITRy>!yxBMpl>_~#6Wx*4=(krMphCjLZ zdU#YgGbmk>sMhK%tlPb+2u_m-88p=Y=zS<@pcIOt2h{t7;?`ya__-s8&_*>Q(3(q2 z!Yn~#fJVe3o_5ZHWT#7FQ&1L#+w_mg2xJN24bFy@AU8KuOtgJ>gv#;V_($vbpLanX z_wf|$lzioP6PQl_?dlkMk;76;8Q ztQU{us!3#cGAIJ4u`)(p(}Hu3W@T>|;~isLL0>q5u-91W^Isz+EWG{eM*qi7;E9+w zx_|HeuhV?qJDI#qpMdF2{{Zxq-!g9SfKz_n3 zjeo-r;q&GSh+)F~8o%0tOr8+|7#Dpecfor`P;nlBf%M1ub5W;wB_z#Dw+b!uz{!RP NigKzq3S^7}{udPTo38)> literal 0 HcmV?d00001 diff --git a/docs/Diagrams/ListPromotion.png b/docs/Diagrams/ListPromotion.png deleted file mode 100644 index a3f5d9826c0c3d4793f2ca9cf9bae9558751dcec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11172 zcmeHN2UJtr(hkT~tRP+$#H(DDYoSPTAc#nBDpjh80)gZ}OhOfo7!eK_cZp92->oJA*T9bm)7nHIlUB9#4F)3_!7|#;q6NTYDhVSG z8SqE)I2BJilO+!s%HwbZZ*OHHnc%@7(3r|zBo-inc^aKahRGx%p9iOcQ&my{AIKJ` zA`j_d@!(4ZudIeu-NEN4c#ymV0?p|`WGa;)k26+NRso{cIFP-FbblroTG)awtO_7Q z`d|bm@T&Y_0A6)1py+vfQ%MdaH&Zgu!&nVcSBCI_yvB61t+|;z&H#+5WC{uVn2_8l zbaaV0o1KMbkIJ z^3UN%Vlc^cFTt@@m2t{oCAydu=uP5Ni6lR=JJ=AVGTjMO0a+lxjm{vF7=raE6J#W> zq6b*f4`d*)GEEi7AlA zC$Z>sDvRv>HPM~!&p?^ml!CZq8=m!P(spGtT=mFadtv4G9-OGBX|+{SIlGu3Vj-wjpy~gG^!aHCQ->=V6nb8i9x23SUfMM3dmMp zX!`!1WERQBn*f3YGV}+o3D$VBXjJfo1w-I1ECP^(1_=rTLM^N~Qa

l>edml>lrZZT8!elYP9;ieTfyweGp=hV? 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 diff --git a/docs/Diagrams/PUML files/AddPromotion.puml b/docs/Diagrams/PUML files/AddPromotion.puml index ac2c2d3913..4ce90b54e2 100644 --- a/docs/Diagrams/PUML files/AddPromotion.puml +++ b/docs/Diagrams/PUML files/AddPromotion.puml @@ -1,11 +1,32 @@ @startuml 'https://plantuml.com/sequence-diagram -autonumber +mainframe sd AddPromotion +autoactivate on -Alice -> Bob: Authentication Request -Bob --> Alice: Authentication Response +participant ":PromotionCommand" as PromotionCommand +participant "<>\nPromotionlist" as Promotionlist +participant TextUi +participant "<>\nItemlist" as Itemlist +participant "<\n Promotion" as Promotion + +PromotionCommand -> Promotionlist : addPromotion(promotion) +Promotionlist -> Itemlist : isItemExist(itemName) +Itemlist --> Promotionlist : isExists +Promotionlist -> Promotionlist : itemIsOnPromo(itemName) +return notOnPromo +Promotionlist -> Promotionlist : isValidDiscount() +return isValid +Promotionlist -> Promotionlist : isValidMonth() +return isValid +Promotionlist -> Promotionlist : isValidTime() +return isValid +Promotionlist -> Promotionlist : isValidDuration() +return isValid +Promotionlist -> Promotion : add(promotion) +Promotion --> Promotionlist +Promotionlist -> TextUi : print(AddPromotion) +TextUi --> Promotionlist +Promotionlist --> PromotionCommand -Alice -> Bob: Another authentication Request -Alice <-- Bob: another authentication Response @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml b/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml new file mode 100644 index 0000000000..4b31a001d3 --- /dev/null +++ b/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml @@ -0,0 +1,56 @@ +@startuml +'https://plantuml.com/sequence-diagram + + +class AddPromotionCommand { + # promotion : Promotion + + execute() +} + +class Promotionlist { + - promotions : ArrayList + + getIndex(promotion : Promotions) + + deletePromotion(getIndex : Int) + + itemIsOnPromo(itemName: String) + + isLeapYear(year: Int) + + addPromotion((promotion : Promotions) + + isValidDiscount(discount: Float) + + isVerifiedTime(startTime: Int, endTime: Int) + + isValidDuration(startDate : Int, startMonth : Month, startYear : Int, endDate : Int, endMonth : Month, endYear : Int, + + isValidMonth( date: Int, month: Month, year: Int) + + getPromotion((itemName: String) + + getAllPromotion() +} + +class Promotion { + # itemName : String + # discount : Float + # startDate : Int + # startMonth : Month + # startYear : Int + # endDate : Int + # endMonth : Month + # endYear : Int + # startTime : Int + # endTime : Int +} + +enum Month { + JAN(1) + FEB(2) + MAR(3) + APR(4) + MAY(5) + JUN(6) + JUL(7) + AUG(8) + SEP(9) + OCT(10) + NOV(11) + DEC(12) +} + +AddPromotionCommand --> Promotionlist : 1 +Promotionlist --> Promotion : 0..* + +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/DeletePromotion.puml b/docs/Diagrams/PUML files/DeletePromotion.puml new file mode 100644 index 0000000000..46df9611f1 --- /dev/null +++ b/docs/Diagrams/PUML files/DeletePromotion.puml @@ -0,0 +1,21 @@ +@startuml +'https://plantuml.com/sequence-diagram + +mainframe sd DeletePromotion + +participant ":PromotionCommand" as PromotionCommand +participant "<>\nPromotionlist" as Promotionlist +participant TextUi + +alt itemIsOnPromo + PromotionCommand -> Promotionlist : getPromotion(itemName) + Promotionlist -> PromotionCommand : promotion + PromotionCommand -> Promotionlist : getIndex(promotion) + Promotionlist --> PromotionCommand : index + PromotionCommand -> Promotionlist : deletePromotion(index) + PromotionCommand -> TextUi : print(deletePromotion) +else else + PromotionCommand -> TextUi : print(ITEM_NOT_ON_PROMO) +end + +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml b/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml index c20c46bc64..854d02ea24 100644 --- a/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml +++ b/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml @@ -18,4 +18,7 @@ else list_promotions PromotionCommand -> TextUi: printPromotion() else invalid_command end + +<-- PromotionCommand + @enduml \ No newline at end of file diff --git a/docs/Diagrams/Promotion_SequenceDigram.png b/docs/Diagrams/Promotion_SequenceDigram.png new file mode 100644 index 0000000000000000000000000000000000000000..56bf72af987187771f446bc659448d8e173d72fa GIT binary patch literal 18654 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 literal 0 HcmV?d00001 diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 806e53b741..84b3484a0e 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -255,7 +255,7 @@ private Command prepareSell(String args) throws CommandFormatException{ throw new CommandFormatException("QTY_TOO_LARGE"); } - if (Promotionlist.isOnPromo(matcher.group("itemName"))) { + if (Promotionlist.isPromoExistNow(matcher.group("itemName"))) { float getDiscount = (Promotionlist.getPromotion(matcher.group("itemName"))).getDiscount(); return new SellCommand( matcher.group("itemName"), diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index 1d65dcd763..ac2ab9e92c 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -22,8 +22,6 @@ public class Promotion { protected int endYear; - protected DayOfWeek weekly; - protected int startTime; protected int endTime; diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 3a77f1a3fd..8bf8ef2174 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -18,6 +18,7 @@ public Promotionlist() { public static int getIndex(Promotion promotion) { return promotions.indexOf(promotion); } + public static void deletePromotion(int index) { promotions.remove(index); } @@ -31,10 +32,6 @@ public static boolean itemIsOnPromo(String itemName) { return false; } - public static boolean isOnPromo(String itemName) { - return Promotionlist.itemIsOnPromo(itemName); - } - public static boolean isLeapYear(int year) { return year % 4 == 0; } @@ -54,7 +51,7 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException if (!Itemlist.itemIsExist(itemName)) { throw new CommandFormatException("ITEM_NOT_FOUND"); } - if (Promotionlist.isOnPromo(itemName)) { + if (Promotionlist.itemIsOnPromo(itemName)) { throw new InvalidDateException("ITEM_IS_PROMO"); } if (!isValidDiscount(discount)) { @@ -76,25 +73,31 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException public static boolean isValidDiscount (float discount) { return !(discount < 0) && !(discount > 1); } - - public static boolean isPromoExist(Promotion promotion) { - LocalDateTime currentTime = LocalDateTime.now(); - DateTimeFormatter yearFormatter = DateTimeFormatter.ofPattern("yyyy"); - DateTimeFormatter monthFormatter = DateTimeFormatter.ofPattern("M"); - DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("dd"); - String formattedYear= currentTime.format(yearFormatter); - String formattedMonth = currentTime.format(monthFormatter); - String formattedDate = currentTime.format(dateFormatter); - int year = Integer.parseInt(formattedYear); - int month = Integer.parseInt(formattedMonth); - int date = Integer.parseInt(formattedDate); + + public static boolean isPromoExistNow(String itemName) { + if (!itemIsOnPromo(itemName)) { + return false; + } + Promotion promotion = getPromotion(itemName); + LocalDateTime currentDateTime = LocalDateTime.now(); + + int year = currentDateTime.getYear(); + int month = currentDateTime.getMonthValue(); + int day = currentDateTime.getDayOfMonth(); + int hour = currentDateTime.getHour(); + int minute = currentDateTime.getMinute(); + String formattedTime = String.valueOf(hour) + String.valueOf(minute); + int time = Integer.parseInt(formattedTime); if (year < promotion.getStartYear() || year > promotion.getEndYear()) { return false; } if (month < promotion.getStartMonth().getValue() || month > promotion.getEndMonth().getValue()) { return false; } - if (date < promotion.getStartDate() || date > promotion.getEndDate()) { + if (day < promotion.getStartDate() || day > promotion.getEndDate()) { + return false; + } + if (time < promotion.getStartTime() || time > promotion.getEndTime()) { return false; } return true; From 7a8497df6853c3a2cf56fe9a42f9dac53e2df0ee Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 11 Apr 2024 14:08:37 +0800 Subject: [PATCH 242/421] Fix checkstyle error --- src/main/java/promotion/Promotion.java | 2 -- src/main/java/promotion/Promotionlist.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index ac2ab9e92c..fc65084239 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -2,8 +2,6 @@ import ui.TextUi; -import java.time.DayOfWeek; - public class Promotion { protected String itemName; diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 8bf8ef2174..61d3f809b6 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -6,7 +6,6 @@ import storage.PromotionStorage; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; public class Promotionlist { From 2a33d5e6e3659a5e9751595f5a1d72348dd68ce3 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 11 Apr 2024 15:27:14 +0800 Subject: [PATCH 243/421] Fix checkstyle error --- src/main/java/command/SellCommand.java | 3 ++- src/main/java/promotion/Promotionlist.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 8b38bdafa1..314380560f 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -54,7 +54,8 @@ public void execute() { Itemlist.editQuantity(index, remainingQuantity); } Storage.overwriteFile(Itemlist.getItems()); - Transaction newTransaction = new Transaction(Itemlist.getItem(index).getItemName(), sellQuantity, toSell.getBuyPrice(), sellPrice); + Transaction newTransaction = new Transaction(Itemlist.getItem(index).getItemName(), + sellQuantity, toSell.getBuyPrice(), sellPrice); Cashier.addItem(newTransaction); TransactionLogs.addToLog(Cashier.getTransactions()); } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 10c6214af4..be405c740b 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -6,7 +6,6 @@ import storage.PromotionStorage; import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; public class Promotionlist { From 1f5213f5e9c03ea28cff17c96e293ade491aec6c Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 11 Apr 2024 15:49:38 +0800 Subject: [PATCH 244/421] Create md files --- docs/team/Fureimi.md | 0 docs/team/HengShuHong.md | 0 docs/team/Joellimjr.md | 0 docs/team/{johndoe.md => Shu.md} | 0 docs/team/fxe025.md | 5 +++++ 5 files changed, 5 insertions(+) create mode 100644 docs/team/Fureimi.md create mode 100644 docs/team/HengShuHong.md create mode 100644 docs/team/Joellimjr.md rename docs/team/{johndoe.md => Shu.md} (100%) create mode 100644 docs/team/fxe025.md diff --git a/docs/team/Fureimi.md b/docs/team/Fureimi.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/team/Joellimjr.md b/docs/team/Joellimjr.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/team/johndoe.md b/docs/team/Shu.md similarity index 100% rename from docs/team/johndoe.md rename to docs/team/Shu.md diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md new file mode 100644 index 0000000000..d539a01385 --- /dev/null +++ b/docs/team/fxe025.md @@ -0,0 +1,5 @@ +# Fu Xueer - Project Portfolio Page + +## Overview + +### Summary of Contributions From 22fe0e2703b88bc30a8587994c91fe0bf05c4298 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Thu, 11 Apr 2024 16:13:34 +0800 Subject: [PATCH 245/421] Create md file --- docs/team/LowTL.md | 0 docs/team/Shu.md | 6 ------ 2 files changed, 6 deletions(-) create mode 100644 docs/team/LowTL.md delete mode 100644 docs/team/Shu.md diff --git a/docs/team/LowTL.md b/docs/team/LowTL.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/team/Shu.md b/docs/team/Shu.md deleted file mode 100644 index ab75b391b8..0000000000 --- a/docs/team/Shu.md +++ /dev/null @@ -1,6 +0,0 @@ -# John Doe - Project Portfolio Page - -## Overview - - -### Summary of Contributions From a951a281d695fe41447fe23e9482ac26ca77ec21 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 17:08:43 +0800 Subject: [PATCH 246/421] Edit ppp page --- docs/team/LowTL.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/team/LowTL.md b/docs/team/LowTL.md index e69de29bb2..8185622ade 100644 --- a/docs/team/LowTL.md +++ b/docs/team/LowTL.md @@ -0,0 +1,5 @@ +# Low Tjun Lym - Project Portfolio Page + +## Overview + +### Summary of Contribution \ No newline at end of file From 29d8fea5d57d61af720d424ba10dca67b2d9d3dc Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 17:19:07 +0800 Subject: [PATCH 247/421] Update Cashier class --- src/main/java/itemlist/Cashier.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index e83cc65c7c..cb4a0d5a11 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -17,11 +17,11 @@ public static void addItem(Transaction transaction) { public static ArrayList getTransactions() { return transactions; } - public static ArrayList getTransactions(Item item) { + public static ArrayList getTransactions(String itemName) { ArrayList results = new ArrayList<>(); if (!transactions.isEmpty()) { for (Transaction t : transactions) { - if (t.getItem() == item) { + if (t.getItem().getItemName().equals(itemName)) { results.add(t); } } From 614a490788349265e2581421382fa6ac114ef0f1 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 17:33:14 +0800 Subject: [PATCH 248/421] Remove isVoid from Transactions --- .gitignore | 3 +++ src/main/java/command/ListCommand.java | 5 +++-- src/main/java/item/Transaction.java | 10 ---------- src/main/java/itemlist/Cashier.java | 12 +++--------- src/main/java/parser/Parser.java | 6 ++---- 5 files changed, 11 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 983c840134..42244d896a 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,9 @@ #Compiled class files *.class +#Generated storage text files +*.txt + # Gradle build files /.gradle/ /build/ diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 69eaaba468..23f22aab67 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -22,9 +22,10 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMar this.category = category; this.isListMarked = isListMarked; } - public ListCommand(ArrayList transactions, boolean isVoided) { + + //boolean overloaded is just to overload the function + public ListCommand(ArrayList transactions, boolean overloaded) { this.transactionList= transactions; - this.isListMarked = isVoided; } public ListCommand(ArrayList promotionList) { diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index d857a245a3..48e8a9d227 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -14,7 +14,6 @@ public class Transaction { private int quantity; private float buyPrice; private float sellPrice; - private Boolean isVoided; public Transaction(String name, int inputQty, float inputBuy, float inputSell) { setDateTime(); @@ -24,7 +23,6 @@ public Transaction(String name, int inputQty, float inputBuy, float inputSell) { sellPrice = inputSell; totalPrice = sellPrice * quantity; profit = totalPrice - buyPrice * quantity; - isVoided = false; } public Transaction(String name, int inputQty, float inputBuy, float inputSell, String storedTime) { @@ -65,18 +63,10 @@ public float getProfit() { return this.profit; } - public Boolean getIsVoided() { - return this.isVoided; - } public void setDateTime() { LocalDateTime currentTime = LocalDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); this.dateTime = currentTime.format(formatter); } - - public void voidTransaction(int index) { - Transaction txn = Cashier.getTransaction(index); - txn.isVoided = true; - } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index cb4a0d5a11..c40e7507a2 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -36,9 +36,7 @@ public static float getTotalRevenue() { ArrayList allTransactions = getTransactions(); if (!allTransactions.isEmpty()) { for (Transaction t : allTransactions) { - if (!t.getIsVoided()) { - totalRevenue += t.getTotalPrice(); - } + totalRevenue += t.getTotalPrice(); } } return totalRevenue; @@ -54,9 +52,7 @@ public static float getTotalProfit() { return 0; } for (Transaction t : transactions) { - if (!t.getIsVoided()) { - totalProfit += t.getProfit(); - } + totalProfit += t.getProfit(); } return totalProfit; } @@ -78,9 +74,7 @@ public static Item getBestseller() { Item bestSeller = Itemlist.getItem(0); float[] profits = new float[Itemlist.items.size()]; for (Transaction t: transactions) { - if (!t.getIsVoided()) { - profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); - } + profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); } for (int i = 1; i < Itemlist.items.size(); i++) { if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 4e106069f1..20df5d8199 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -72,7 +72,7 @@ public class Parser { Pattern.compile("del_promo (?[^/]+)"); public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = - Pattern.compile("list_txn+\\s?(?:void/[NY])*"); + Pattern.compile("list_transactions"); public Command parseInput(String userInput){ final CommandType userCommand; @@ -474,10 +474,8 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio if (!matcher.matches()) { throw new CommandFormatException(Messages.INVALID_COMMAND); } - //is true if void/Y - boolean isVoided = matcher.group("isVoid").equals("Y"); - return new ListCommand<>(Cashier.getTransactions(), isVoided); + return new ListCommand<>(Cashier.getTransactions(), false); } } From 838a9408aeff91064467804caee6d3f929dd5751 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 17:35:01 +0800 Subject: [PATCH 249/421] Update gitignore to ignore storage logs --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 42244d896a..9b2fa6ec4b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,7 +7,9 @@ *.class #Generated storage text files -*.txt +PromotionStorage.txt +StockMasterData.txt +TransactionLogs.txt # Gradle build files /.gradle/ From eed3536b35716df23b0c10c3137b6cf3022bff79 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 17:46:25 +0800 Subject: [PATCH 250/421] Update list_transactions to filter by itemName --- src/main/java/command/ListCommand.java | 11 ++++++++--- src/main/java/item/Transaction.java | 1 - src/main/java/itemlist/Cashier.java | 1 + src/main/java/parser/Parser.java | 6 ++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 23f22aab67..280ae38264 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -4,6 +4,7 @@ import common.Messages; import item.Item; import item.Transaction; +import itemlist.Cashier; import promotion.Promotion; import ui.TextUi; @@ -23,9 +24,13 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMar this.isListMarked = isListMarked; } - //boolean overloaded is just to overload the function - public ListCommand(ArrayList transactions, boolean overloaded) { - this.transactionList= transactions; + //Overloaded command to get a filtered transactionList + public ListCommand(ArrayList transactions, String itemName) { + if (itemName.isEmpty()) { + this.transactionList = transactions; + } else { + this.transactionList = Cashier.getTransactions(itemName); + } } public ListCommand(ArrayList promotionList) { diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 48e8a9d227..06f08cc1ce 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -1,6 +1,5 @@ package item; -import itemlist.Cashier; import itemlist.Itemlist; import java.time.LocalDateTime; diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index c40e7507a2..ad5c402c76 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -17,6 +17,7 @@ public static void addItem(Transaction transaction) { public static ArrayList getTransactions() { return transactions; } + //Overloading of function allows for getting of Transactions with the specific itemName public static ArrayList getTransactions(String itemName) { ArrayList results = new ArrayList<>(); if (!transactions.isEmpty()) { diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 20df5d8199..792eca29cf 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -72,7 +72,7 @@ public class Parser { Pattern.compile("del_promo (?[^/]+)"); public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = - Pattern.compile("list_transactions"); + Pattern.compile("^list_transactions(?:\\s+item/\\w+)?$"); public Command parseInput(String userInput){ final CommandType userCommand; @@ -475,7 +475,9 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio throw new CommandFormatException(Messages.INVALID_COMMAND); } - return new ListCommand<>(Cashier.getTransactions(), false); + String itemName = matcher.group(1).trim(); + + return new ListCommand<>(Cashier.getTransactions(), itemName); } } From 0ad21078e37b42a2c8a41a8c51b4001106db6f45 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 18:06:32 +0800 Subject: [PATCH 251/421] Add Javadoc comments --- src/main/java/command/ListCommand.java | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 280ae38264..c40ac09032 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -10,6 +10,11 @@ import java.util.ArrayList; +/** + * Prints out the various ArrayLists, full or partial, based on modifiers. + * @param is the Type of ArrayList ie Item, + * Transaction or Promotion + */ public class ListCommand extends Command{ protected ArrayList itemList; @@ -18,23 +23,26 @@ public class ListCommand extends Command{ protected String category; protected boolean isListMarked; + /** + * Instantiates a ListCommand with the ArrayList arrayList + * and any other modifiers available to that type of ArrayList. + */ public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { this.itemList= arrayList; this.category = category; this.isListMarked = isListMarked; } - //Overloaded command to get a filtered transactionList - public ListCommand(ArrayList transactions, String itemName) { + public ListCommand(ArrayList arrayList, String itemName) { if (itemName.isEmpty()) { - this.transactionList = transactions; + this.transactionList = arrayList; } else { this.transactionList = Cashier.getTransactions(itemName); } } - public ListCommand(ArrayList promotionList) { - this.promotionList = promotionList; + public ListCommand(ArrayList arrayList) { + this.promotionList = arrayList; } public String getCategory() { @@ -42,6 +50,11 @@ public String getCategory() { } //@@author Fureimi + /* + * Runs the list command with 3 cases + * Depending on which ArrayList is not empty, it prints that list. + * @throws EmptyListException if all Lists are empty. + * */ public void execute() throws EmptyListException { try { if (itemList.isEmpty() && transactionList.isEmpty() && promotionList.isEmpty()) { From bc4957b4ec171118d5448f8d434e032094e000b6 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 11 Apr 2024 20:39:27 +0800 Subject: [PATCH 252/421] Update DG --- docs/DeveloperGuide.md | 63 +++++++++++------- docs/Diagrams/AddPromotion.png | Bin 39800 -> 33637 bytes docs/Diagrams/AddPromotion_ClassDiagram.png | Bin 54195 -> 40769 bytes docs/Diagrams/DeletePromotion.png | Bin 20815 -> 19011 bytes .../Diagrams/ListPromotion_SequenceDigram.png | Bin 0 -> 17478 bytes docs/Diagrams/PUML files/AddPromotion.puml | 17 ++--- .../PUML files/AddPromotion_ClassDiagram.puml | 27 ++++++-- docs/Diagrams/PUML files/DeletePromotion.puml | 7 +- .../PUML files/Promotion_SequenceDigram.puml | 13 ++-- docs/Diagrams/Promotion_SequenceDigram.png | Bin 18654 -> 17492 bytes docs/team/hengshuhong.md | 37 ++++++++++ 11 files changed, 117 insertions(+), 47 deletions(-) create mode 100644 docs/Diagrams/ListPromotion_SequenceDigram.png create mode 100644 docs/team/hengshuhong.md diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5d08c4db43..62391700f9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -48,7 +48,7 @@ The Cashier class extends the Itemlist Class. This section describes some noteworthy details on how certain features are implemented -### [Proposed] Promotion feature +### Promotion feature The promotion mechanism is facilitated by `StockMaster`. It enables the user to design and create discount offers for his/her own business given a certain period and time. Additionally, it implements the following operations: @@ -57,7 +57,8 @@ own business given a certain period and time. Additionally, it implements the fo * `list_promotions` -Given below is the overall sequence diagram for the `PromotionCommand`. +Given below is the overall sequence diagram for the `PromotionCommand`. The reference frames are shown when explaining +the operations. ![PromotionSequenceDiagram](./Diagrams/Promotion_SequenceDigram.png) @@ -81,7 +82,7 @@ Given below is the class diagram showing the class structure of the add promotio #### Add Promotion Sequence Diagram -Given below is the sequence diagram showing the add promotion mechanism: +Given below is the sequence diagram showing the add promotion mechanism. ![AddPromotion Sequence Diagram](./Diagrams/AddPromotion.png) @@ -98,6 +99,9 @@ the user will be unable to create another promotion for the same item. 5. `isValidDuration()` checks if the duration of the promotion is valid. E.g. A promotion that starts on `1 FEB 2024` and ends on `1 JAN 2024` is not valid. +The sequence diagram shows the successful creation of a promotion. However, if any of the `boolean` values do not follow +as per the diagram, an error message will be shown to the user via the `TextUi`. + Then, `add(promotion)` method is called in `Promotion.java` to create the promotion. A response will then be printed to the `TextUi` to inform the user on the successful creation of the promotion. @@ -137,28 +141,21 @@ list_promotions #### List Promotion Sequence Diagram -![ListPromotion](./Diagrams/Promotion_SequenceDigram.png) +![ListPromotion](./Diagrams/ListPromotion_SequenceDigram.png) All of the `Promotions` will be shown to the user through the `TextUi`. ## Product scope -StockMaster allows users to use the following commands: -* add: add an item, quantity, category, buy price and sell price -* del: delete an item -* edit: edit the quantity of an item -* sell: sell a certain quantity of an item at a stated price -* find: find a specific item using a keyword -* list: list all items in the inventory -* help: list all commands -* exit: exit StockMaster ### Target user profile Small Business Owners who: * has a need to manage a significant number of inventory products * able to track revenue/loss of the business +* set up promotions for the items +* needs reminders for items that are low on stock * prefer desktop apps over other types * can type fast * prefers typing to mouse interactions @@ -166,23 +163,43 @@ Small Business Owners who: ### Value proposition -Help small business owners organise and better manage their inventory faster than -a typical mouse/GUI driven app +StockMaster helps small business owners organise and manage their business. The purpose of such application is to provide +users with a range of tools and features to help them better operate their business. This will enable them to make more +informed decisions to ensure that they are consistently having a profit. The application allows users to keep track of +their inventory, promotions and transaction logs. It also lets the user see the earnings/loss of the business. Furthermore, +it also allows users to see which item has generated the most profit in the business. ## User Stories -| Version | As a ... | I want to ... | So that I can ... | -|---------|----------|-----------------------------|-------------------------------------------------------------| -| v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | -| v1.0 | user | add new items | | -| v1.0 | user | make changes to added items | change details about items such as quantity or price | -| v1.0 | user | search for specific items | | -| v2.0 | user | find a to-do item by name | locate a to-do without having to go through the entire list | +| Version | As a ... | I want to ... | So that I can ... | +|---------|-------------|---------------------------------------------------------------|------------------------------------------------------------------------------| +| v1.0 | new user | see usage instructions | refer to them when I forget how to use the application | +| v1.0 | user | add new items | update my inventory list | +| v1.0 | user | make changes to added items | change details about items such as quantity, price | +| v1.0 | user | delete item | remove items that are no longer required | +| v1.0 | user | search for specific item | easily check how much quantity I have left for that item | +| v1.0 | user | list out my inventory | view all items that I have | +| v2.0 | store owner | include new item information such as buying and selling price | operate my business and sell to customers | +| v2.0 | store owner | search for items in a filtered list | easily check the item information based on the filtered list | +| v2.0 | store owner | keep track of how much I spend | generate my overall expenditure | +| v2.0 | store owner | keep track of how much I earn | generate my overall revenue | +| v2.0 | store owner | get my overall profit | know if my business is earning or losing money | +| v2.0 | store owner | sell items | start earning money from my business | +| v2.0 | store owner | see reminders for items that are low on stock | easily know which item I have to schedule for a restock | +| v2.0 | store owner | add promotions for a time period | automatically change the sell price of the items during the promotion period | +| v2.0 | store owner | delete promotions | remove promotions when it is over | +| v2.0 | store owner | list promotions | view all promotions that I have created | +| v2.0 | store owner | mark items of different categories at my own discretion | easily view the list of marked items when I want to | +| v2.0 | store owner | see what is my best selling item | identify which item is most popular among customers | ## Non-Functional Requirements -{Give non-functional requirements} +* The application should work on main OS (Windows, Linux, Mac) that has Java 11 installed. +* The application is designed for a single user. +* This application is targeted towards users who have an above average typing speed. +* This application requires the user to have an accurate clock on the main OS. +* This application does not allow users to amend the text file that are used as storage. ## Glossary diff --git a/docs/Diagrams/AddPromotion.png b/docs/Diagrams/AddPromotion.png index bd0ecaa138833ad201fb74fe37b2dc1c70a2f242..107a9280abea3c6e869510cc55618f81bfe0d62e 100644 GIT binary patch literal 33637 zcmeFaby$>Zy9YWJf{Gvrs0fG%sFX@6sVJccC@CQrbPCd`Vh{o%0xANc5|YwABT7iO zNRHCoJ;b@+8C(LgzP!$vpaUiI=Yr9NgY!ii<_1@+J|o09n!b7ymME8 zi|dZ@O;bxN6JyTXW+v7ZB@8IkrXd5xYnH$N9JL9aWBX=ENye<{EP3uo!oDu~yFa;) zY-bZod8SxZb%FF(U1>YrjUyxR*$i$=xcH8yyk}8I(=WB?T4Nn1gp!%a;yMcLUM0!V z_MDUHRK zbXB_7O{?=}%r@4}t)zfuI!u2sB;{O>*8?iKp<~Cb^Asp$o9U|gL`w3||GVi& z8)LUiowVhT>n%dlr*l$!;ub~IrcW*}i&PHZ^epVA&yLfKY%senVe|Os?!cw(|l{7P9i*HEQoxcJMpocBQVWhK425vGkYZK1+T3U1a;C`)1YcQ0a!!5^U}z ziG8=GcVrCnW1hLP^5l`Q>l#008&;s%=T80M`^l$CrX$fs!r-73 z)hFs57ig^0DOj}Pr@J5p&-aVO;F(%t1VftfSiA>5de9>>`?Z@6c4muz$^xF{tq8^Ged*Xh?z z2aE3Bk$Vq`P$(%0DSh}C?T7!{f3dtO#?QmEK;3T8oMxhu()x=*HtoKO?trip8g1X0bAkX}AZ?PY%%i@66a!nw* zGx(1Cq=k)GOy1+ik9$HKOy?*243ESg9#SVqMru@?>7{h9)xh^ugW3ou-1K`1ucpM? zPYwz>Ob@o&U^)0oD=L;6E1jv26)w#;U_3}=g9Yl}OOjQqbogr08?;O;d3kyD_4OHE z8mxzQF3wfDXgbdIMTR=hWMj)qO0wEL*y1ru^D|f%Et6@#(1j!1+{w~`oLsq+HSfed z1#E`d`_(Ycxh5R(})9h{(Jg`p1kc0j)Z2atlsqt# zvs}dB!ajXP#;J=~{IezTena06l*3gBf26O};Zafg9p{2!Tp|+4> z-fWWY?l6{W)Zo$INmRB|r>Iqr4?UbU&}P>YJke8`jcwUNLW)A6-%0D6V~@#~=iWcz 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 literal 39800 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 AWdHyG diff --git a/docs/Diagrams/AddPromotion_ClassDiagram.png b/docs/Diagrams/AddPromotion_ClassDiagram.png index d771cadf802f3e95d70f70f1d58e1b1d9f047321..d622ee867dc74a20f97c1057df729f0980ca44a7 100644 GIT binary patch literal 40769 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 literal 54195 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 ZQ=|m*{NcCFAl$(p2{D=bS@*QP{tr*O+vxxR literal 20815 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 NigKzq3S^7}{udPTo38)> diff --git a/docs/Diagrams/ListPromotion_SequenceDigram.png b/docs/Diagrams/ListPromotion_SequenceDigram.png new file mode 100644 index 0000000000000000000000000000000000000000..bac03a57e93916c998b4d016ab7d8b41a2c15009 GIT binary patch literal 17478 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 K{YKI#=>Gw8|3Tvb literal 0 HcmV?d00001 diff --git a/docs/Diagrams/PUML files/AddPromotion.puml b/docs/Diagrams/PUML files/AddPromotion.puml index 4ce90b54e2..4ff60d84ab 100644 --- a/docs/Diagrams/PUML files/AddPromotion.puml +++ b/docs/Diagrams/PUML files/AddPromotion.puml @@ -6,27 +6,28 @@ autoactivate on participant ":PromotionCommand" as PromotionCommand participant "<>\nPromotionlist" as Promotionlist -participant TextUi +participant ":TextUi" as TextUi participant "<>\nItemlist" as Itemlist -participant "<\n Promotion" as Promotion +participant "<>\n Promotion" as Promotion PromotionCommand -> Promotionlist : addPromotion(promotion) Promotionlist -> Itemlist : isItemExist(itemName) -Itemlist --> Promotionlist : isExists +Itemlist --> Promotionlist : true Promotionlist -> Promotionlist : itemIsOnPromo(itemName) -return notOnPromo +return false Promotionlist -> Promotionlist : isValidDiscount() -return isValid +return true Promotionlist -> Promotionlist : isValidMonth() -return isValid +return true Promotionlist -> Promotionlist : isValidTime() -return isValid +return true Promotionlist -> Promotionlist : isValidDuration() -return isValid +return true Promotionlist -> Promotion : add(promotion) Promotion --> Promotionlist Promotionlist -> TextUi : print(AddPromotion) TextUi --> Promotionlist Promotionlist --> PromotionCommand +hide footbox @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml b/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml index 4b31a001d3..33f8567b60 100644 --- a/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml @@ -1,28 +1,38 @@ @startuml 'https://plantuml.com/sequence-diagram +skinparam classFontColor automatic -class AddPromotionCommand { +class AddPromotionCommand #LightPink { # promotion : Promotion + execute() } -class Promotionlist { +class Promotionlist #Honeydew { - promotions : ArrayList + getIndex(promotion : Promotions) - + deletePromotion(getIndex : Int) + itemIsOnPromo(itemName: String) + isLeapYear(year: Int) + addPromotion((promotion : Promotions) + isValidDiscount(discount: Float) + isVerifiedTime(startTime: Int, endTime: Int) - + isValidDuration(startDate : Int, startMonth : Month, startYear : Int, endDate : Int, endMonth : Month, endYear : Int, + + isValidDuration(...) + isValidMonth( date: Int, month: Month, year: Int) - + getPromotion((itemName: String) + getAllPromotion() } -class Promotion { +note right + Parameters for isValidDuration + startDate : Int, + startMonth : Month, + startYear : Int, + endDate : Int, + endMonth : Month, + endYear : Int +end note + + +class Promotion #LightBlue { # itemName : String # discount : Float # startDate : Int @@ -35,7 +45,7 @@ class Promotion { # endTime : Int } -enum Month { +enum Month #LightYellow { JAN(1) FEB(2) MAR(3) @@ -53,4 +63,7 @@ enum Month { AddPromotionCommand --> Promotionlist : 1 Promotionlist --> Promotion : 0..* + +hide circle +skinparam classAttributeIconSize 0 @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/DeletePromotion.puml b/docs/Diagrams/PUML files/DeletePromotion.puml index 46df9611f1..b6338b32da 100644 --- a/docs/Diagrams/PUML files/DeletePromotion.puml +++ b/docs/Diagrams/PUML files/DeletePromotion.puml @@ -5,17 +5,18 @@ mainframe sd DeletePromotion participant ":PromotionCommand" as PromotionCommand participant "<>\nPromotionlist" as Promotionlist -participant TextUi +participant ":TextUi" as TextUi -alt itemIsOnPromo +alt item has an ongoing promotion PromotionCommand -> Promotionlist : getPromotion(itemName) Promotionlist -> PromotionCommand : promotion PromotionCommand -> Promotionlist : getIndex(promotion) Promotionlist --> PromotionCommand : index PromotionCommand -> Promotionlist : deletePromotion(index) PromotionCommand -> TextUi : print(deletePromotion) -else else +else item does not have any promotion PromotionCommand -> TextUi : print(ITEM_NOT_ON_PROMO) end +hide footbox @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml b/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml index 854d02ea24..d559337bd8 100644 --- a/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml +++ b/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml @@ -3,22 +3,23 @@ participant ":PromotionCommand" as PromotionCommand participant "<>\nPromotionlist" as PromotionList -participant TextUi +participant ":TextUi" as TextUi participant "<>\nItemlist" as Itemlist -participant "<\n Promotion" as Promotion +participant "<>\n Promotion" as Promotion -> PromotionCommand: execute() -alt promotion +alt if user wants to create a promotion ref over PromotionCommand, PromotionList, Itemlist, Promotion, TextUi : AddPromotion -else delete +else if user wants to delete a promotion ref over PromotionCommand, PromotionList, TextUi : DeletePromotion -else list_promotions +else #Pink if user wants to list all promotions PromotionCommand -> TextUi: printPromotion() -else invalid_command +else if user enters invalid command end <-- PromotionCommand +hide footbox @enduml \ No newline at end of file diff --git a/docs/Diagrams/Promotion_SequenceDigram.png b/docs/Diagrams/Promotion_SequenceDigram.png index 56bf72af987187771f446bc659448d8e173d72fa..75333ef3801f32376b77f3ec0b8b3c101c32197c 100644 GIT binary patch literal 17492 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 literal 18654 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 diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md new file mode 100644 index 0000000000..4478e36eaf --- /dev/null +++ b/docs/team/hengshuhong.md @@ -0,0 +1,37 @@ +## Product Overview + +The product that my group created is called StockMaster. StockMaster helps small business owners organise and manage +their business. The purpose of such application is to provide users with a range of tools and features to help them +better operate their business. + +## Code Contribution + +### Enhancement Implemented + +#### Promotion Feature + +During version `v2.0`, I had implemented a `Promotion` feature inside our application. A `Promotion` is when there is a +`discount` on a certain item within a certain range. This `Promotion` feature works similarly to how an actual +promotion will happen. + +As a store owner, he/she is able to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, +`endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell +feature in the application, the discount will be immediately applied to the `sell price` and the discounted price will +be shown. + +In addition, this feature takes in the `Time` and `Date`, such that an `ITEM` on promotion will only be discounted when +it is within the promotion `Date/Time`. + +For instance, if a promotion was created for `apples`, at a `20`% discount, from `11 Apr 2024` to `13 Apr 2024`, +`1200 to 1800` hours, the user can input the following into the application to achieve the above. + +``` +promotion apples discount/20 period /from 11 Apr 2024 /to 13 Apr 2024 time /from 1200 /to 1800 +``` +The promotion will be successfully created. + + + + +This is the [link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) to my code contribution for StockMaster + From 79f27e9f59a429fc1a924117bd1fc56afd78196e Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 20:46:04 +0800 Subject: [PATCH 253/421] Change list_transaction command --- src/main/java/command/ListCommand.java | 6 +++--- src/main/java/item/Item.java | 1 + src/main/java/item/Transaction.java | 6 ++++++ src/main/java/ui/TextUi.java | 3 +-- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index c40ac09032..06f0fbfa7c 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -25,8 +25,8 @@ public class ListCommand extends Command{ /** * Instantiates a ListCommand with the ArrayList arrayList - * and any other modifiers available to that type of ArrayList. - */ + * and any other modifiers available to that type of ArrayList. + */ public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { this.itemList= arrayList; this.category = category; @@ -50,7 +50,7 @@ public String getCategory() { } //@@author Fureimi - /* + /** * Runs the list command with 3 cases * Depending on which ArrayList is not empty, it prints that list. * @throws EmptyListException if all Lists are empty. diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index d2806287d0..542222cb4a 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -104,6 +104,7 @@ public boolean getMarkStatus() { return this.isMark; } + @Override public String toString() { String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; String markString = (this.isMark) ? "[X] " : "[ ] "; diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 06f08cc1ce..0876640664 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -68,4 +68,10 @@ public void setDateTime() { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); this.dateTime = currentTime.format(formatter); } + + @Override + public String toString() { + return (this.quantity + this.item.getUnitOfMeasurement() + " " + this.getItemName() + + " Sell: $" + this.sellPrice + "Date: " + this.getDateTime() ); + } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 73189060b4..3d924709d6 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -152,8 +152,7 @@ public static void showTransactionList(ArrayList transactions) { int counter = 0; for (Transaction t: transactions) { counter++; - replyToUser(counter + ". " + t.getItemName() + " " + - (t.getProfit() > 0 ? "earned " : "lost ") + t.getProfit()); + replyToUser(counter + ". " + t.toString()); } } From 3786f4bdbda145ab50f6d3da23a6830de40469b7 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 20:49:20 +0800 Subject: [PATCH 254/421] Update Cashier sequence diagrams --- .../BestsellerCommand_SequenceDiagram.png | Bin 0 -> 12729 bytes .../CashierCommands_SequenceDiagram.png | Bin 23603 -> 0 bytes .../BestsellerCommand_SequenceDiagram.puml | 13 +++++++++++++ ... => TotalProfitCommand_SequenceDiagram.puml} | 8 -------- .../TotalProfitCommand_SequenceDiagram.png | Bin 0 -> 14105 bytes 5 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 docs/Diagrams/BestsellerCommand_SequenceDiagram.png delete mode 100644 docs/Diagrams/CashierCommands_SequenceDiagram.png create mode 100644 docs/Diagrams/PUML files/BestsellerCommand_SequenceDiagram.puml rename docs/Diagrams/PUML files/{CashierCommands_SequenceDiagram.puml => TotalProfitCommand_SequenceDiagram.puml} (57%) create mode 100644 docs/Diagrams/TotalProfitCommand_SequenceDiagram.png diff --git a/docs/Diagrams/BestsellerCommand_SequenceDiagram.png b/docs/Diagrams/BestsellerCommand_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..89db33ff2bbb7441d9cb25b2be14c75d803b748f GIT binary patch literal 12729 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 literal 0 HcmV?d00001 diff --git a/docs/Diagrams/CashierCommands_SequenceDiagram.png b/docs/Diagrams/CashierCommands_SequenceDiagram.png deleted file mode 100644 index 3bf8717f691ee540410c5e0a3ba475ea83360d2a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23603 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 diff --git a/docs/Diagrams/PUML files/BestsellerCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/BestsellerCommand_SequenceDiagram.puml new file mode 100644 index 0000000000..f84574bb26 --- /dev/null +++ b/docs/Diagrams/PUML files/BestsellerCommand_SequenceDiagram.puml @@ -0,0 +1,13 @@ +@startuml +participant BestsellerCommand +participant Cashier +participant TextUi + +BestsellerCommand -> Cashier: getBestseller() +activate Cashier +Cashier -> Cashier: Retrieve bestseller +Cashier --> BestsellerCommand: Bestselling item +deactivate Cashier +BestsellerCommand -> TextUi: replyToUser("The current best-selling item is {bestseller.getItemName()}") + +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/CashierCommands_SequenceDiagram.puml b/docs/Diagrams/PUML files/TotalProfitCommand_SequenceDiagram.puml similarity index 57% rename from docs/Diagrams/PUML files/CashierCommands_SequenceDiagram.puml rename to docs/Diagrams/PUML files/TotalProfitCommand_SequenceDiagram.puml index 302fbfbcf5..8b080cd4a1 100644 --- a/docs/Diagrams/PUML files/CashierCommands_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/TotalProfitCommand_SequenceDiagram.puml @@ -1,16 +1,8 @@ @startuml -participant BestsellerCommand participant TotalProfitCommand participant Cashier participant TextUi -BestsellerCommand -> Cashier: getBestseller() -activate Cashier -Cashier -> Cashier: Retrieve bestseller -Cashier --> BestsellerCommand: Bestselling item -deactivate Cashier -BestsellerCommand -> TextUi: replyToUser("The current best-selling item is {bestseller.getItemName()}") - TotalProfitCommand -> Cashier: getTotalProfit() / getTotalRevenue() activate Cashier Cashier -> Cashier: Calculate total profit / total revenue diff --git a/docs/Diagrams/TotalProfitCommand_SequenceDiagram.png b/docs/Diagrams/TotalProfitCommand_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..0acd680b2f5a14d730b4fecee53402a0029daf2d GIT binary patch literal 14105 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 Cbc$mD literal 0 HcmV?d00001 From d52face03431eb1a46ca2fe90df867ac0e18e99b Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 11 Apr 2024 21:34:10 +0800 Subject: [PATCH 255/421] Add PPP Draft --- docs/team/hengshuhong.md | 61 +++++++++++++++----------- src/main/java/command/FindCommand.java | 6 +-- 2 files changed, 38 insertions(+), 29 deletions(-) diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 4478e36eaf..253effeb91 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -1,37 +1,46 @@ -## Product Overview +# Heng Shu Hong's Project Portfolio Page -The product that my group created is called StockMaster. StockMaster helps small business owners organise and manage -their business. The purpose of such application is to provide users with a range of tools and features to help them -better operate their business. -## Code Contribution +## Project: StockMaster -### Enhancement Implemented +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. -#### Promotion Feature -During version `v2.0`, I had implemented a `Promotion` feature inside our application. A `Promotion` is when there is a -`discount` on a certain item within a certain range. This `Promotion` feature works similarly to how an actual -promotion will happen. +### Code Contribution -As a store owner, he/she is able to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, -`endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell -feature in the application, the discount will be immediately applied to the `sell price` and the discounted price will -be shown. +- **New Feature:** Added the capability to add/delete/list promotions + - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, + `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell + feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will + be shown. + - Justification: This feature improves the application as the user now have the option to create a discount campaign + and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. + - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, +one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. -In addition, this feature takes in the `Time` and `Date`, such that an `ITEM` on promotion will only be discounted when -it is within the promotion `Date/Time`. -For instance, if a promotion was created for `apples`, at a `20`% discount, from `11 Apr 2024` to `13 Apr 2024`, -`1200 to 1800` hours, the user can input the following into the application to achieve the above. +- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. + - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` +For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` + - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly +retrieve the data that is being searched for by narrow the scope of the search. + - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this +enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original +feature, but yet still able to provide more than 1 filter to narrow the scope. -``` -promotion apples discount/20 period /from 11 Apr 2024 /to 13 Apr 2024 time /from 1200 /to 1800 -``` -The promotion will be successfully created. +- **New Feature:** Enhanced the add command to prevent duplicate entries + - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a +duplicated item, the item information will be updated based on the latest input and the quantity will be increased. + - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the +overflowing of the inventory list with duplicated item. +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) - - -This is the [link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) to my code contribution for StockMaster - +- **Documentation** + - User Guide: + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Added the Quick Start + - Update the Command Summary + - Developer Guide: + - Added implementation details of the `promotion` feature. \ No newline at end of file diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 913c69ec17..b4d0de3e0f 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -41,7 +41,7 @@ public ArrayList filterList() throws EmptyListException { if (itemInfo.toLowerCase().contains("item") && item.getItemName().toLowerCase().contains(keyword)) { searchList.add(String.valueOf(item)); } - if (itemInfo.toLowerCase().contains("qty") && Integer.toString(item.getQuantity()).contains(keyword)) { + if (itemInfo.toLowerCase().contains("qty") && Integer.toString(item.getQuantity()).equals(keyword)) { searchList.add(String.valueOf(item)); } if (itemInfo.toLowerCase().contains("uom") && item.getUnitOfMeasurement().toLowerCase().contains(keyword)) { @@ -52,10 +52,10 @@ public ArrayList filterList() throws EmptyListException { searchList.add(String.valueOf(item)); } } - if (itemInfo.toLowerCase().contains("buy") && Float.toString(item.getBuyPrice()).contains(keyword)) { + if (itemInfo.toLowerCase().contains("buy") && Float.toString(item.getBuyPrice()).equals(keyword)) { searchList.add(String.valueOf(item)); } - if (itemInfo.toLowerCase().contains("sell") && Float.toString(item.getSellPrice()).contains(keyword)) { + if (itemInfo.toLowerCase().contains("sell") && Float.toString(item.getSellPrice()).equals(keyword)) { searchList.add(String.valueOf(item)); } } From 054ebf05d8a3d04a672a1df3dbd0ca283bbe5ed0 Mon Sep 17 00:00:00 2001 From: Shu Date: Thu, 11 Apr 2024 21:46:02 +0800 Subject: [PATCH 256/421] Update Draft PPP --- docs/team/hengshuhong.md | 59 ++++++++++++++++++++-------------------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 253effeb91..0b7683b9d6 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -3,44 +3,45 @@ ## Project: StockMaster -StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them manage and operate their business. ### Code Contribution - **New Feature:** Added the capability to add/delete/list promotions - - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, - `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell - feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will - be shown. - - Justification: This feature improves the application as the user now have the option to create a discount campaign - and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. - - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, -one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. - - -- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. - - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` -For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` - - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly -retrieve the data that is being searched for by narrow the scope of the search. - - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this -enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original -feature, but yet still able to provide more than 1 filter to narrow the scope. + - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, + `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell + feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will + be shown. + - Justification: This feature improves the application as the user now have the option to create a discount campaign + and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. + - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, + one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. + + +- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. + - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` + For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` + - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly + retrieve the data that is being searched for by narrow the scope of the search. + - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this + enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original + feature, but yet still able to provide more than 1 filter to narrow the scope. - **New Feature:** Enhanced the add command to prevent duplicate entries - - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a -duplicated item, the item information will be updated based on the latest input and the quantity will be increased. - - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the -overflowing of the inventory list with duplicated item. + - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a + duplicated item, the item information will be updated based on the latest input and the quantity will be increased. + - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the + overflowing of the inventory list with duplicated item. - **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) - **Documentation** - - User Guide: - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` - - Added the Quick Start - - Update the Command Summary - - Developer Guide: - - Added implementation details of the `promotion` feature. \ No newline at end of file + - User Guide: + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Added the Quick Start + - Update the Command Summary + - Developer Guide: + - Added implementation details of the `promotion` feature. + - \ No newline at end of file From 3013f920e5b59408bb50e2e4d5d7a718a2418c2b Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:02:30 +0800 Subject: [PATCH 257/421] Update Cashier exception handling --- docs/DeveloperGuide.md | 14 +++++++------- .../{ => Images}/AddCommand_Sequence_Diagram.png | Bin .../BestsellerCommand_SequenceDiagram.png | Bin .../{ => Images/Cashier}/CashierClassDiagram.png | Bin .../TotalProfitCommand_SequenceDiagram.png | Bin .../{ => Images/Promotion}/AddPromotion.png | Bin .../Promotion}/AddPromotion_ClassDiagram.png | Bin .../{ => Images/Promotion}/DeletePromotion.png | Bin .../Promotion}/Promotion_SequenceDigram.png | Bin docs/Diagrams/{ => Images/Storage}/Storage.png | Bin .../Storage}/Storage_class_diagram.png | Bin .../BestsellerCommand_SequenceDiagram.puml | 0 .../{ => Cashier}/CashierClassDiagram.puml | 0 .../TotalProfitCommand_SequenceDiagram.puml | 0 .../PUML files/{ => Promotion}/AddPromotion.puml | 0 .../AddPromotion_ClassDiagram.puml | 0 .../{ => Promotion}/DeletePromotion.puml | 0 .../{ => Promotion}/Promotion_SequenceDigram.puml | 0 src/main/java/command/BestsellerCommand.java | 1 + src/main/java/common/Messages.java | 2 ++ .../java/exceptions/CommandFormatException.java | 3 +++ src/main/java/parser/Parser.java | 2 +- 22 files changed, 14 insertions(+), 8 deletions(-) rename docs/Diagrams/{ => Images}/AddCommand_Sequence_Diagram.png (100%) rename docs/Diagrams/{ => Images/Cashier}/BestsellerCommand_SequenceDiagram.png (100%) rename docs/Diagrams/{ => Images/Cashier}/CashierClassDiagram.png (100%) rename docs/Diagrams/{ => Images/Cashier}/TotalProfitCommand_SequenceDiagram.png (100%) rename docs/Diagrams/{ => Images/Promotion}/AddPromotion.png (100%) rename docs/Diagrams/{ => Images/Promotion}/AddPromotion_ClassDiagram.png (100%) rename docs/Diagrams/{ => Images/Promotion}/DeletePromotion.png (100%) rename docs/Diagrams/{ => Images/Promotion}/Promotion_SequenceDigram.png (100%) rename docs/Diagrams/{ => Images/Storage}/Storage.png (100%) rename docs/Diagrams/{ => Images/Storage}/Storage_class_diagram.png (100%) rename docs/Diagrams/PUML files/{ => Cashier}/BestsellerCommand_SequenceDiagram.puml (100%) rename docs/Diagrams/PUML files/{ => Cashier}/CashierClassDiagram.puml (100%) rename docs/Diagrams/PUML files/{ => Cashier}/TotalProfitCommand_SequenceDiagram.puml (100%) rename docs/Diagrams/PUML files/{ => Promotion}/AddPromotion.puml (100%) rename docs/Diagrams/PUML files/{ => Promotion}/AddPromotion_ClassDiagram.puml (100%) rename docs/Diagrams/PUML files/{ => Promotion}/DeletePromotion.puml (100%) rename docs/Diagrams/PUML files/{ => Promotion}/Promotion_SequenceDigram.puml (100%) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5d08c4db43..b96777a86a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -21,7 +21,7 @@ the list. The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` -![AddCommand_SequenceDiagram](./Diagrams/AddCommand_Sequence_Diagram.png) +![AddCommand_SequenceDiagram](Diagrams/Images/AddCommand_Sequence_Diagram.png) ### Item Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, @@ -38,7 +38,7 @@ and retrieve information from the file when program restarts. Cashier class extends Itemlist class #### Class diagram -![CashierClassDiagram](./Diagrams/CashierClassDiagram.png) +![CashierClassDiagram](Diagrams/Images/Cashier/CashierClassDiagram.png) The Cashier class extends the Itemlist Class. ![CashierCommands_SequenceDiagram](./Diagrams/CashierCommands_SequenceDiagram.png) @@ -59,7 +59,7 @@ own business given a certain period and time. Additionally, it implements the fo Given below is the overall sequence diagram for the `PromotionCommand`. -![PromotionSequenceDiagram](./Diagrams/Promotion_SequenceDigram.png) +![PromotionSequenceDiagram](Diagrams/Images/Promotion/Promotion_SequenceDigram.png) The PromotionCommand will execute the appropriate command and prints messages to the user through the `TextUi`. @@ -77,13 +77,13 @@ promotion apple discount/50 period /from 1 Jan 2024 /to 31 Dec 2024 time from/ 0 Given below is the class diagram showing the class structure of the add promotion mechanism: -![AddPromotion Class Diagram](./Diagrams/AddPromotion_ClassDiagram.png) +![AddPromotion Class Diagram](Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png) #### Add Promotion Sequence Diagram Given below is the sequence diagram showing the add promotion mechanism: -![AddPromotion Sequence Diagram](./Diagrams/AddPromotion.png) +![AddPromotion Sequence Diagram](Diagrams/Images/Promotion/AddPromotion.png) This command will add a new promotion by calling `addPromotion(promotion)` method in `Promotionlist.java`. The `addPromotion(promotion)` then calls `isItemExist(apple)` in `Itemlist.java` to check if the item exists in the inventory. @@ -115,7 +115,7 @@ del_promo apple Given below is the sequence diagram showing the delete promotion mechanism: -![DeletePromotion](./Diagrams/DeletePromotion.png) +![DeletePromotion](Diagrams/Images/Promotion/DeletePromotion.png) This command will initially check if there is such an item in `Promotionlist`. If it does not exists, it will print an error message. Otherwise, it will execute the deletion of the `promotion`. @@ -137,7 +137,7 @@ list_promotions #### List Promotion Sequence Diagram -![ListPromotion](./Diagrams/Promotion_SequenceDigram.png) +![ListPromotion](Diagrams/Images/Promotion/Promotion_SequenceDigram.png) All of the `Promotions` will be shown to the user through the `TextUi`. diff --git a/docs/Diagrams/AddCommand_Sequence_Diagram.png b/docs/Diagrams/Images/AddCommand_Sequence_Diagram.png similarity index 100% rename from docs/Diagrams/AddCommand_Sequence_Diagram.png rename to docs/Diagrams/Images/AddCommand_Sequence_Diagram.png diff --git a/docs/Diagrams/BestsellerCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/BestsellerCommand_SequenceDiagram.png similarity index 100% rename from docs/Diagrams/BestsellerCommand_SequenceDiagram.png rename to docs/Diagrams/Images/Cashier/BestsellerCommand_SequenceDiagram.png diff --git a/docs/Diagrams/CashierClassDiagram.png b/docs/Diagrams/Images/Cashier/CashierClassDiagram.png similarity index 100% rename from docs/Diagrams/CashierClassDiagram.png rename to docs/Diagrams/Images/Cashier/CashierClassDiagram.png diff --git a/docs/Diagrams/TotalProfitCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png similarity index 100% rename from docs/Diagrams/TotalProfitCommand_SequenceDiagram.png rename to docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png diff --git a/docs/Diagrams/AddPromotion.png b/docs/Diagrams/Images/Promotion/AddPromotion.png similarity index 100% rename from docs/Diagrams/AddPromotion.png rename to docs/Diagrams/Images/Promotion/AddPromotion.png diff --git a/docs/Diagrams/AddPromotion_ClassDiagram.png b/docs/Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png similarity index 100% rename from docs/Diagrams/AddPromotion_ClassDiagram.png rename to docs/Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png diff --git a/docs/Diagrams/DeletePromotion.png b/docs/Diagrams/Images/Promotion/DeletePromotion.png similarity index 100% rename from docs/Diagrams/DeletePromotion.png rename to docs/Diagrams/Images/Promotion/DeletePromotion.png diff --git a/docs/Diagrams/Promotion_SequenceDigram.png b/docs/Diagrams/Images/Promotion/Promotion_SequenceDigram.png similarity index 100% rename from docs/Diagrams/Promotion_SequenceDigram.png rename to docs/Diagrams/Images/Promotion/Promotion_SequenceDigram.png diff --git a/docs/Diagrams/Storage.png b/docs/Diagrams/Images/Storage/Storage.png similarity index 100% rename from docs/Diagrams/Storage.png rename to docs/Diagrams/Images/Storage/Storage.png diff --git a/docs/Diagrams/Storage_class_diagram.png b/docs/Diagrams/Images/Storage/Storage_class_diagram.png similarity index 100% rename from docs/Diagrams/Storage_class_diagram.png rename to docs/Diagrams/Images/Storage/Storage_class_diagram.png diff --git a/docs/Diagrams/PUML files/BestsellerCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/BestsellerCommand_SequenceDiagram.puml rename to docs/Diagrams/PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml diff --git a/docs/Diagrams/PUML files/CashierClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/CashierClassDiagram.puml rename to docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml diff --git a/docs/Diagrams/PUML files/TotalProfitCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/TotalProfitCommand_SequenceDiagram.puml rename to docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml diff --git a/docs/Diagrams/PUML files/AddPromotion.puml b/docs/Diagrams/PUML files/Promotion/AddPromotion.puml similarity index 100% rename from docs/Diagrams/PUML files/AddPromotion.puml rename to docs/Diagrams/PUML files/Promotion/AddPromotion.puml diff --git a/docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml b/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/AddPromotion_ClassDiagram.puml rename to docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml diff --git a/docs/Diagrams/PUML files/DeletePromotion.puml b/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml similarity index 100% rename from docs/Diagrams/PUML files/DeletePromotion.puml rename to docs/Diagrams/PUML files/Promotion/DeletePromotion.puml diff --git a/docs/Diagrams/PUML files/Promotion_SequenceDigram.puml b/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml similarity index 100% rename from docs/Diagrams/PUML files/Promotion_SequenceDigram.puml rename to docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index 6cfd9e7c81..a3468b4af0 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -8,6 +8,7 @@ public class BestsellerCommand extends Command { + //@author LowTL @Override public void execute() { Item bs = Cashier.getBestseller(); diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 34e5548781..f1937b421a 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -157,6 +157,8 @@ public class Messages { public static final String SELL_TOO_LARGE = "Sell price is too large. Please input a smaller sell price."; + public static final String INVALID_TRANSACTION_FORMAT = "Invalid format. Please input the format:" + + "list_transactions item/[ITEM_NAME]"; } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index a9be45c6fa..5dc0c64db2 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -44,6 +44,9 @@ public CommandFormatException(CommandType command){ case UNMARK: System.out.println(Messages.INVALID_UNMARK_FORMAT); break; + case LIST_TRANSACTIONS: + System.out.println(Messages.INVALID_TRANSACTION_FORMAT); + break; default: System.out.println(Messages.INVALID_COMMAND); break; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 792eca29cf..1b83aba406 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -472,7 +472,7 @@ private Command prepareUnmark(String args) throws CommandFormatException { private Command prepareTransactionList(String args) throws CommandFormatException { final Matcher matcher = LIST_TRANSACTION_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { - throw new CommandFormatException(Messages.INVALID_COMMAND); + throw new CommandFormatException(CommandType.LIST_TRANSACTIONS); } String itemName = matcher.group(1).trim(); From cf02a14352e295e16ea323bb92d6160a38101c4a Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:05:18 +0800 Subject: [PATCH 258/421] Update Cashier Class diagram --- .../Images/Cashier/CashierClassDiagram.png | Bin 26940 -> 24718 bytes .../Cashier/CashierClassDiagram.puml | 2 -- 2 files changed, 2 deletions(-) diff --git a/docs/Diagrams/Images/Cashier/CashierClassDiagram.png b/docs/Diagrams/Images/Cashier/CashierClassDiagram.png index ec089f8beb6832f2e8bc1ebabad54a6b49cf796e..2c57a5abd1d1d909226fc0cfe74946cd27947615 100644 GIT binary patch literal 24718 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 literal 26940 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 JEJd^1{{gl(lJ)=q diff --git a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml index 2454dc8cf7..61a44a2d66 100644 --- a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml @@ -14,10 +14,8 @@ class Cashier { class Transaction { - item: Item - totalPrice: float - - isVoided: boolean + getItem(): Item + getTotalPrice(): float - + getIsVoided(): boolean + getProfit(): float } From 4cb076bddeb6564a4bfa862259c5d16785754b39 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 22:16:51 +0800 Subject: [PATCH 259/421] edit add command sequence diagram --- docs/DeveloperGuide.md | 2 +- docs/Diagrams/AddCommand_Sequence_Diagram.png | Bin 48441 -> 0 bytes .../AddCommand_SequenceDiagram.puml | 19 ++++++++++++------ src/main/java/parser/Parser.java | 19 +++++++++--------- 4 files changed, 24 insertions(+), 16 deletions(-) delete mode 100644 docs/Diagrams/AddCommand_Sequence_Diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index aad48c4e71..c3c90033f7 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -21,7 +21,7 @@ the list. The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` -![AddCommand_SequenceDiagram](./Diagrams/AddCommand_Sequence_Diagram.png) +![AddCommand_SequenceDiagram](./Diagrams/AddCommand_SequenceDiagram.png) ### Item Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, diff --git a/docs/Diagrams/AddCommand_Sequence_Diagram.png b/docs/Diagrams/AddCommand_Sequence_Diagram.png deleted file mode 100644 index 3e840854b500fdf54824bbdcca59ba40f6f95f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48441 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 Parser: add command activate Parser @@ -12,14 +13,20 @@ Parser -> AddCommand: prepareAdd(userInput) activate AddCommand AddCommand -> Itemlist: itemIsExist(itemName) activate Itemlist +alt Item exists + Itemlist -> AddCommand: true + AddCommand -> EditCommand: edit Item + activate EditCommand + EditCommand -> Itemlist: editQuantity(index, newQuantity) + deactivate EditCommand + AddCommand -> User: Output success message +else Item does not exist Itemlist -> AddCommand: false -deactivate Itemlist -AddCommand -> AddCommand: create new Item -AddCommand -> Itemlist: addItem(Item) -activate Itemlist -deactivate Itemlist + AddCommand -> Itemlist: addItem(item) + deactivate Itemlist + AddCommand -> User: Output success message deactivate AddCommand deactivate Parser - +end @enduml diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index eaa69bb803..cd939ab0e0 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -202,7 +202,7 @@ private Command prepareAdd(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.ADD); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } @@ -265,7 +265,7 @@ private Command prepareSell(String args) throws CommandFormatException{ throw new CommandFormatException(CommandType.SELL); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } @@ -299,7 +299,7 @@ private Command prepareFind(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.FIND); } - String itemInfo = matcher.group("itemInfo") != null ? matcher.group("itemInfo") : "NA"; + String itemInfo = matcher.group("itemInfo") != null ? matcher.group("itemInfo").toLowerCase() : "NA"; return new FindCommand( itemInfo, matcher.group("keyword")); @@ -311,13 +311,14 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } // check if itemName was edited. If no, newItemName will be NA - String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName").trim() : "NA"; + String newItemName = matcher.group("newItemName") != null ? + matcher.group("newItemName").toLowerCase().trim() : "NA"; if (newItemName.isBlank() || newItemName.isEmpty()) { throw new EditException("ITEM_NAME"); } @@ -386,7 +387,7 @@ private Command preparePromotion(String args) throws CommandFormatException, Inv if (!matcher.matches()) { throw new CommandFormatException(CommandType.PROMOTION); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } @@ -425,7 +426,7 @@ private Command prepareDeletePromo(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.DEL_PROMO); } - return new DeletePromotionCommand(matcher.group("itemName")); + return new DeletePromotionCommand(matcher.group("itemName").toLowerCase()); } private Command prepareItemList(String args) throws CommandFormatException { final Matcher matcher = LIST_ITEM_COMMAND_FORMAT.matcher(args.trim()); @@ -450,7 +451,7 @@ private Command prepareMark(String args) throws CommandFormatException { if (!matcher.matches()) { throw new CommandFormatException(CommandType.MARK); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } @@ -462,7 +463,7 @@ private Command prepareUnmark(String args) throws CommandFormatException { if (!matcher.matches()) { throw new CommandFormatException(CommandType.UNMARK); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } From 9209d912d65f0dfcf3bd84542dfff60d29bc6b23 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 22:17:00 +0800 Subject: [PATCH 260/421] edit add command sequence diagram --- docs/Diagrams/AddCommand_SequenceDiagram.png | Bin 0 -> 46571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/Diagrams/AddCommand_SequenceDiagram.png diff --git a/docs/Diagrams/AddCommand_SequenceDiagram.png b/docs/Diagrams/AddCommand_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c15e26c906b6a3b6033a4971e45f2cce23f4eacf GIT binary patch literal 46571 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 T@zXamXTXm}*-9=ZdBy$#q>BhK literal 0 HcmV?d00001 From aa43097eb2dd4a6edb4f3f49d59a040da8e3e3ee Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:21:54 +0800 Subject: [PATCH 261/421] Update DG --- docs/DeveloperGuide.md | 24 +++++++++++++---------- src/main/java/seedu/duke/StockMaster.java | 3 --- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 03eb52e917..3af307a1f0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -10,39 +10,43 @@ ### Command The Command class is an abstract class which is extended to execute the various commands -used in the product. +used in the product. It contains the abstract method `execute`, which is overridden by all other Command child classes. {Describe the design of the product. Use UML diagrams and short code snippets where applicable.} ### Exception +### Item +Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item +price, quantity of item, and others. + ### Itemlist -Itemlist class is an object which contains items to be added to the stock inventory list. Able to add items, remove functions, edit items inside -the list. +Itemlist class is an object which contains items to be added to the stock inventory list. Able to add items, +remove functions, edit items inside the list. The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` ![AddCommand_SequenceDiagram](Diagrams/Images/AddCommand_Sequence_Diagram.png) -### Item -Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, -quantity of item, and others. ### Parser Parser class processes user inputs and sieves out relevant details before calling the relevant methods. It contains command formats that must be adhered to for the methods to be called. + ### Storage Storage class contains methods to write description of items to the file `./StockMasterData.txt`, and retrieve information from the file when program restarts. ### UI ### Cashier -Cashier class extends Itemlist class +Cashier class extends Itemlist class, and stores `Transactions` instead of `Items`. -#### Class diagram +#### Class Diagram ![CashierClassDiagram](Diagrams/Images/Cashier/CashierClassDiagram.png) -The Cashier class extends the Itemlist Class. -![CashierCommands_SequenceDiagram](./Diagrams/CashierCommands_SequenceDiagram.png) +#### Sequence Diagrams +![BestsellerCommand](Diagrams/Images/Cashier/BestsellerCommand_SequenceDiagram.png) +The `BestsellerCommand` calls the `getBestseller()` command from the Cashier +![TotalProfitCommand](Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png) ## Implementation diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index b9df5afb70..24a5d16865 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -22,9 +22,6 @@ public class StockMaster { private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); - private Itemlist itemlist = new Itemlist(); - - /** * Main entry-point for the java.duke.StockMaster application. From dbf533e043079e09bbb55fe99b89f73e615cf003 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:33:02 +0800 Subject: [PATCH 262/421] Update ListCommand documentation --- docs/team/hengshuhong.md | 47 ----------------------- src/main/java/command/ListCommand.java | 18 ++++++--- src/main/java/seedu/duke/StockMaster.java | 3 ++ 3 files changed, 16 insertions(+), 52 deletions(-) diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 0b7683b9d6..e69de29bb2 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -1,47 +0,0 @@ -# Heng Shu Hong's Project Portfolio Page - - -## Project: StockMaster - -StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them -manage and operate their business. - - -### Code Contribution - -- **New Feature:** Added the capability to add/delete/list promotions - - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, - `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell - feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will - be shown. - - Justification: This feature improves the application as the user now have the option to create a discount campaign - and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. - - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, - one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. - - -- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. - - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` - For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` - - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly - retrieve the data that is being searched for by narrow the scope of the search. - - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this - enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original - feature, but yet still able to provide more than 1 filter to narrow the scope. - -- **New Feature:** Enhanced the add command to prevent duplicate entries - - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a - duplicated item, the item information will be updated based on the latest input and the quantity will be increased. - - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the - overflowing of the inventory list with duplicated item. - -- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) - -- **Documentation** - - User Guide: - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` - - Added the Quick Start - - Update the Command Summary - - Developer Guide: - - Added implementation details of the `promotion` feature. - - \ No newline at end of file diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 06f0fbfa7c..5b8d0bec3f 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -33,6 +33,10 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMar this.isListMarked = isListMarked; } + /** + * Instantiates a ListCommand with the ArrayList arrayList + * and any other modifiers available to that type of ArrayList. + */ public ListCommand(ArrayList arrayList, String itemName) { if (itemName.isEmpty()) { this.transactionList = arrayList; @@ -41,6 +45,10 @@ public ListCommand(ArrayList arrayList, String itemName) { } } + /** + * Instantiates a ListCommand with the ArrayList arrayList + * and any other modifiers available to that type of ArrayList. + */ public ListCommand(ArrayList arrayList) { this.promotionList = arrayList; } @@ -49,12 +57,12 @@ public String getCategory() { return category; } - //@@author Fureimi /** - * Runs the list command with 3 cases - * Depending on which ArrayList is not empty, it prints that list. - * @throws EmptyListException if all Lists are empty. - * */ + * Runs the list command with 3 cases + * Depending on which ArrayList is not empty, it prints that list. + * @throws EmptyListException if all Lists are empty. + * */ + //@@author Fureimi public void execute() throws EmptyListException { try { if (itemList.isEmpty() && transactionList.isEmpty() && promotionList.isEmpty()) { diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index 24a5d16865..b9df5afb70 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -22,6 +22,9 @@ public class StockMaster { private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); + private Itemlist itemlist = new Itemlist(); + + /** * Main entry-point for the java.duke.StockMaster application. From 62224cb5f575da3aed45377d2eea574eefb5da93 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 22:33:52 +0800 Subject: [PATCH 263/421] merge --- docs/team/Joellimjr.md | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/docs/team/Joellimjr.md b/docs/team/Joellimjr.md index e69de29bb2..84a37bc875 100644 --- a/docs/team/Joellimjr.md +++ b/docs/team/Joellimjr.md @@ -0,0 +1,36 @@ +# Lim Jing Rong, Joel's Project Portfolio Page + + +## Project: StockMaster + +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. + + +### Code Contribution + +- **New Feature:** + - What it does: + - Justification: + - Highlights: + + +- **New Feature:** + - What it does: + - Justification: + - Highlights: + +- **New Feature:** + - What it does: + - Justification: + +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Joellimjr&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +- **Documentation** + - User Guide: + - + - + - + - Developer Guide: + - + - \ No newline at end of file From 9c7a7cca9a5ba98ee4a895ee402c7f3c30b91f33 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:35:04 +0800 Subject: [PATCH 264/421] Replace missing PPP file --- docs/team/HengShuHong.md | 0 docs/team/hengshuhong.md | 47 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) delete mode 100644 docs/team/HengShuHong.md diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index e69de29bb2..0b7683b9d6 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -0,0 +1,47 @@ +# Heng Shu Hong's Project Portfolio Page + + +## Project: StockMaster + +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. + + +### Code Contribution + +- **New Feature:** Added the capability to add/delete/list promotions + - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, + `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell + feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will + be shown. + - Justification: This feature improves the application as the user now have the option to create a discount campaign + and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. + - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, + one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. + + +- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. + - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` + For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` + - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly + retrieve the data that is being searched for by narrow the scope of the search. + - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this + enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original + feature, but yet still able to provide more than 1 filter to narrow the scope. + +- **New Feature:** Enhanced the add command to prevent duplicate entries + - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a + duplicated item, the item information will be updated based on the latest input and the quantity will be increased. + - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the + overflowing of the inventory list with duplicated item. + +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) + +- **Documentation** + - User Guide: + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Added the Quick Start + - Update the Command Summary + - Developer Guide: + - Added implementation details of the `promotion` feature. + - \ No newline at end of file From 6b5a0c004211dc3ad70dcd7e3cd52105d77b5aad Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:41:17 +0800 Subject: [PATCH 265/421] Update SellCommand to check for OOS --- src/main/java/command/SellCommand.java | 6 +++++- src/main/java/common/Messages.java | 1 + src/main/java/exceptions/CommandFormatException.java | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 314380560f..ff957106be 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.CommandFormatException; import item.Item; import item.Transaction; import itemlist.Cashier; @@ -28,7 +29,7 @@ public int getSellQuantity() { } @Override - public void execute() { + public void execute() throws CommandFormatException { int index = -1; Item toSell = Itemlist.getItems().get(0); for (Item item : Itemlist.getItems()) { @@ -43,6 +44,9 @@ public void execute() { System.out.println("Item not found!"); return; } + if (toSell.getIsOOS()) { + throw new CommandFormatException("ITEM_OOS"); + } int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; float getSellPrice = Itemlist.getItem(index).getSellPrice(); float sellPrice = (this.discount >= 0) ? this.discount * getSellPrice : getSellPrice; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index f1937b421a..7261ed0a32 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -152,6 +152,7 @@ public class Messages { public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; public static final String QTY_TOO_LARGE = "Quantity is too large. Please input a smaller quantity."; + public static final String ITEM_OOS = "This item is out of stock!"; public static final String BUY_TOO_LARGE = "Buy price is too large. Please input a smaller buy price."; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 5dc0c64db2..d2d015526b 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -74,6 +74,9 @@ public CommandFormatException(String error) { case "QTY_TOO_LARGE": System.out.println(Messages.QTY_TOO_LARGE); break; + case "ITEM_OOS": + System.out.println(Messages.ITEM_OOS); + break; case "BUY_TOO_LARGE": System.out.println(Messages.BUY_TOO_LARGE); break; From 42f3c7b866414278352e487588f265571d011cf5 Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:45:17 +0800 Subject: [PATCH 266/421] Edit OOS check --- src/main/java/command/SellCommand.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index ff957106be..00b5e2e2db 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -44,13 +44,10 @@ public void execute() throws CommandFormatException { System.out.println("Item not found!"); return; } - if (toSell.getIsOOS()) { - throw new CommandFormatException("ITEM_OOS"); - } int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; float getSellPrice = Itemlist.getItem(index).getSellPrice(); float sellPrice = (this.discount >= 0) ? this.discount * getSellPrice : getSellPrice; - if (remainingQuantity < 0) { + if (toSell.getIsOOS() || remainingQuantity < 0) { System.out.println("There is insufficient stock!"); return; } else { From 6631dfd94841ccf26dcfab77f308a865d164376c Mon Sep 17 00:00:00 2001 From: LowTL Date: Thu, 11 Apr 2024 22:46:00 +0800 Subject: [PATCH 267/421] Remove unnecessary exception handling --- src/main/java/common/Messages.java | 1 - src/main/java/exceptions/CommandFormatException.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 7261ed0a32..f1937b421a 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -152,7 +152,6 @@ public class Messages { public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; public static final String QTY_TOO_LARGE = "Quantity is too large. Please input a smaller quantity."; - public static final String ITEM_OOS = "This item is out of stock!"; public static final String BUY_TOO_LARGE = "Buy price is too large. Please input a smaller buy price."; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index d2d015526b..5dc0c64db2 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -74,9 +74,6 @@ public CommandFormatException(String error) { case "QTY_TOO_LARGE": System.out.println(Messages.QTY_TOO_LARGE); break; - case "ITEM_OOS": - System.out.println(Messages.ITEM_OOS); - break; case "BUY_TOO_LARGE": System.out.println(Messages.BUY_TOO_LARGE); break; From 0b67e655a4143da4d97e11a6ca90f6dd512cf8f2 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 23:06:53 +0800 Subject: [PATCH 268/421] add low stock command --- StockMasterData.txt | 3 ++- TransactionLogs.txt | 8 ++++++++ src/main/java/command/LowStockCommand.java | 10 ++++++++++ src/main/java/common/Messages.java | 3 ++- src/main/java/parser/CommandType.java | 3 ++- src/main/java/parser/Parser.java | 19 +++---------------- 6 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 src/main/java/command/LowStockCommand.java diff --git a/StockMasterData.txt b/StockMasterData.txt index 9e542b6fb1..1105fd1c59 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,4 +1,5 @@ 1. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 2. | [ ] | ESP32 | Qty: 27 amt | Cat: electronics | BuyPrice: $32.0 | SellPrice: $32.0 3. | [ ] | ITEM | Qty: 51 kg | Cat: null | BuyPrice: $150.0 | SellPrice: $30.0 -4. | [ ] | apple | Qty: 40 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 \ No newline at end of file +4. | [ ] | apple | Qty: 35 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +5. | [ ] | banana | Qty: 100 pcs | Cat: null | BuyPrice: $2.0 | SellPrice: $4.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..4435b52785 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,8 @@ +Date: 2024-04-11 22:37:33 +Transaction ID: 1 +Item Name: apple +Quantity: 5 +Unit Price: 2.5 +Total Price: 12.5 +Profit: -7.5 + diff --git a/src/main/java/command/LowStockCommand.java b/src/main/java/command/LowStockCommand.java new file mode 100644 index 0000000000..3f9fb22871 --- /dev/null +++ b/src/main/java/command/LowStockCommand.java @@ -0,0 +1,10 @@ +package command; + +import reminder.LowStockReminder; + +public class LowStockCommand extends Command{ + @Override + public void execute() { + LowStockReminder.execute(); + } +} diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 34e5548781..65007b16d5 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -1,7 +1,6 @@ package common; public class Messages { - public static final String DIVIDER = "----------------"; public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; public static final String HELP = " ___________________________________________________________________________________________\n" + @@ -47,6 +46,8 @@ public class Messages { "| list | list_promotions |\n" + "| promotions | |\n" + "|------------|------------------------------------------------------------------------------|\n" + + "| low stock | low_stock |\n" + + "|------------|------------------------------------------------------------------------------|\n" + "| exit | exit |\n" + "|____________|______________________________________________________________________________|\n"; diff --git a/src/main/java/parser/CommandType.java b/src/main/java/parser/CommandType.java index 8fd34cd363..2f14586c40 100644 --- a/src/main/java/parser/CommandType.java +++ b/src/main/java/parser/CommandType.java @@ -17,6 +17,7 @@ public enum CommandType { TOTAL_PROFIT, TOTAL_REVENUE, BESTSELLER, - LIST_TRANSACTIONS + LIST_TRANSACTIONS, + LOW_STOCK } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index b8ea69d86f..804f9cdd50 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,21 +1,6 @@ package parser; -import command.Command; -import command.AddCommand; -import command.DeleteCommand; -import command.DeletePromotionCommand; -import command.EditCommand; -import command.ExitCommand; -import command.FindCommand; -import command.HelpCommand; -import command.IncorrectCommand; -import command.ListCommand; -import command.AddPromotionCommand; -import command.MarkCommand; -import command.SellCommand; -import command.UnmarkCommand; -import command.BestsellerCommand; -import command.TotalProfitCommand; +import command.*; import common.Messages; import exceptions.CommandFormatException; import exceptions.EditException; @@ -172,6 +157,8 @@ public Command parseInput(String userInput){ return new TotalProfitCommand(userCommand); case BESTSELLER: return new BestsellerCommand(); + case LOW_STOCK: + return new LowStockCommand(); default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); From 7723b0a17726e6fcf537ee01bc3f37b74ddbc551 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Thu, 11 Apr 2024 23:29:52 +0800 Subject: [PATCH 269/421] change storage data --- StockMasterData.txt | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 318802bbe7..0a1e768f3f 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,3 +1 @@ -1. | [ ] | item | Qty: 1 [UNIT_OF_MEASUREMENT] | Cat: [CATEGORY] | BuyPrice: $1.0 | SellPrice: $0.5 -2. | [ ] | ESP32 | Qty: 999 amt | Cat: electronics | BuyPrice: $6.0 | SellPrice: $7.0 -3. | [ ] | test | Qty: 20 nope | Cat: NULL | BuyPrice: $2.3 | SellPrice: $2309.0 +1. | [ ] | test | Qty: 20 nope | Cat: NULL | BuyPrice: $2.3 | SellPrice: $2309.0 From bc95755de5051124b69cec07fd84a007fcad80cf Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Thu, 11 Apr 2024 23:55:15 +0800 Subject: [PATCH 270/421] help more detailed help messages --- src/main/java/command/HelpCommand.java | 36 +++++ src/main/java/common/Messages.java | 176 ++++++++++++++++++++++--- 2 files changed, 193 insertions(+), 19 deletions(-) diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 868c3667aa..120e64aa92 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -24,6 +24,42 @@ public void execute() { case "sell": System.out.println(Messages.HELP_SELL); break; + case "edit": + System.out.println(Messages.HELP_EDIT); + break; + case "mark": + System.out.println(Messages.HELP_MARK); + break; + case "unmark": + System.out.println(Messages.HELP_UNMARK); + break; + case "delete": + System.out.println(Messages.HELP_DEL); + break; + case "bestseller": + System.out.println(Messages.HELP_BESTSELLER); + break; + case "total profit": + System.out.println(Messages.HELP_TOTAL_PROFIT); + break; + case "total revenue": + System.out.println(Messages.HELP_TOTAL_REVENUE); + break; + case "promotion": + System.out.println(Messages.HELP_PROMOTION); + break; + case "delete promotion": + System.out.println(Messages.HELP_DEL_PROMO); + break; + case "list promotion": + System.out.println(Messages.HELP_LIST_PROMO); + break; + case "low stock": + System.out.println(Messages.HELP_LOW_STOCK); + break; + case "exit": + System.out.println(Messages.HELP_EXIT); + break; default: System.out.println(Messages.INVALID_HELP_COMMAND); break; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 65007b16d5..374cc55695 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -10,23 +10,23 @@ public class Messages { "|------------|------------------------------------------------------------------------------|\n" + "| list items | list_items |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + - "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| edit | edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + - "| | cat/[NEW_CATEGORY] |\n" + - "| | (use AT LEAST 1 of: qty/, uom/, cat/) |\n" + + "| edit | edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + + "| | cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] SELL/[NEW_SELL_PRICE] |\n" + + "| | (use AT LEAST 1 of: name/ qty/, uom/, cat/, buy/, sell/) |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| mark | mark [ITEM_NAME] |\n" + + "| mark | mark ITEM_NAME |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| unmark | unmark [ITEM_NAME] |\n" + + "| unmark | unmark ITEM_NAME |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del [ITEM_NAME] |\n" + + "| delete | del ITEM_NAME |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| find | 1. find [KEYWORD] - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 [KEYWORD] - to search under the filters* |\n" + + "| find | 1. find KEYWORD - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| bestseller | bestseller |\n" + @@ -40,7 +40,7 @@ public class Messages { "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del_promo [ITEM_NAME] |\n" + + "| delete | del_promo ITEM_NAME |\n" + "| promotion | |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| list | list_promotions |\n" + @@ -49,6 +49,103 @@ public class Messages { "| low stock | low_stock |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| exit | exit |\n" + + "|____________|______________________________________________________________________________|\n" + + "* type help c/COMMAND for more detailed explanations\n" + + " (use the command names on the left column)"; + + public static final String HELP_EXIT = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| exit | exit |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_LOW_STOCK = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| low stock | low_stock |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_LIST_PROMO = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list | list_promotions |\n" + + "| promotions | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_DEL_PROMO = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del_promo ITEM_NAME |\n" + + "| promotion | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_PROMOTION = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | promotion milk discount/5 period /from 03 MAR 2024 to 09 MAR 2024 |\n" + + "| | time /from 0000 /to 2359 |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| remarks: | discount is a percentage discount of the original sell price |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_TOTAL_REVENUE = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_revenue |\n" + + "| revenue | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_TOTAL_PROFIT = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_profit |\n" + + "| profit | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_BESTSELLER = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| bestseller | bestseller |\n" + + "|____________|______________________________________________________________________________|\n"; + public static final String HELP_FIND = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| find | 1. find KEYWORD - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | find apple |\n" + + "| | find /cat fruit |\n" + "|____________|______________________________________________________________________________|\n"; public static final String HELP_LIST_ITEMS = @@ -60,19 +157,45 @@ public class Messages { "| list items | list_items |\n" + "|____________|______________________________________________________________________________|\n"; - public static final String HELP_ADD = + public static final String HELP_MARK = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| mark | mark ITEM_NAME |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_UNMARK = " ___________________________________________________________________________________________\n" + "| STOCKMASTER |\n" + "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| add | add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + - "| | buy/[BUY_PRICE] sell/[SELL_PRICE] |\n" + + "| unmark | unmark ITEM_NAME |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_DEL = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del ITEM_NAME |\n" + + "|____________|______________________________________________________________________________|\n"; + public static final String HELP_EDIT = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| edit | edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + + "| | cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] SELL/[NEW_SELL_PRICE] |\n" + "| |------------------------------------------------------------------------------|\n" + - "| example: | add apple qty/100 /pcs cat/fruit buy/1.50 sell/2.50 |\n" + - "| | add flour qty/15 /kg buy/5.10 sell/7.45 |\n" + + "| example: | edit apple qty/15 /pcs cat/fruit buy/2.50 sell/3.50 |\n" + + "| | edit plastic bag qty/150 |\n" + "| |------------------------------------------------------------------------------|\n" + - "| remarks: | category is optional |\n" + + "| remarks: | use AT LEAST 1 of: qty/, uom/, cat/, buy/, sell/ |\n" + "|____________|______________________________________________________________________________|\n"; public static final String HELP_SELL = @@ -81,11 +204,26 @@ public class Messages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| sell | sell [ITEM_NAME] qty/[SELL_QUANTITY] |\n" + + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + "| |------------------------------------------------------------------------------|\n" + "| example: | sell apple qty/5 |\n" + "|____________|______________________________________________________________________________|\n"; + public static final String HELP_ADD = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | add apple qty/100 /pcs cat/fruit buy/1.50 sell/2.50 |\n" + + "| | add flour qty/15 /kg buy/5.10 sell/7.45 |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| remarks: | category is optional |\n" + + "|____________|______________________________________________________________________________|\n"; + public static final String INVALID_HELP_FORMAT = "Invalid command format. Please use format: 'help' or " + "'help c/[COMMAND]'"; public static final String INVALID_ADD_FORMAT = "Invalid command format. Please use format: " + "\n" + From 20c69a48815893e37997200e784c9f22cc9c7803 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 12 Apr 2024 01:17:05 +0800 Subject: [PATCH 271/421] Fix ListCommand Crash --- StockMasterData.txt | 5 +---- TransactionLogs.txt | 8 +++++++ src/main/java/command/ListCommand.java | 30 +++++++++++--------------- src/main/java/parser/Parser.java | 7 ++++-- src/main/java/ui/TextUi.java | 13 ----------- 5 files changed, 26 insertions(+), 37 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 9e542b6fb1..beefe43049 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,4 +1 @@ -1. | [ ] | apple iphone | Qty: 10 pieces | Cat: electronics | BuyPrice: $100.0 | SellPrice: $500.0 -2. | [ ] | ESP32 | Qty: 27 amt | Cat: electronics | BuyPrice: $32.0 | SellPrice: $32.0 -3. | [ ] | ITEM | Qty: 51 kg | Cat: null | BuyPrice: $150.0 | SellPrice: $30.0 -4. | [ ] | apple | Qty: 40 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 \ No newline at end of file +1. | [ ] | apple | Qty: 49 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index e69de29bb2..1cce01edd7 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -0,0 +1,8 @@ +Date: 2024-04-12 01:14:34 +Transaction ID: 1 +Item Name: apple +Quantity: 1 +Unit Price: 5.0 +Total Price: 5.0 +Profit: 1.0 + diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index c40ac09032..d608f4cb13 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -17,11 +17,11 @@ */ public class ListCommand extends Command{ - protected ArrayList itemList; - protected ArrayList transactionList; - protected ArrayList promotionList; - protected String category; - protected boolean isListMarked; + protected ArrayList itemList = new ArrayList<>(); + protected ArrayList transactionList = new ArrayList<>(); + protected ArrayList promotionList = new ArrayList<>(); + protected String category = "NA"; + protected boolean isListMarked = false; /** * Instantiates a ListCommand with the ArrayList arrayList @@ -34,7 +34,7 @@ public ListCommand(ArrayList arrayList, String category, boolean isListMar } public ListCommand(ArrayList arrayList, String itemName) { - if (itemName.isEmpty()) { + if (itemName.equals("NA")) { this.transactionList = arrayList; } else { this.transactionList = Cashier.getTransactions(itemName); @@ -56,21 +56,15 @@ public String getCategory() { * @throws EmptyListException if all Lists are empty. * */ public void execute() throws EmptyListException { - try { - if (itemList.isEmpty() && transactionList.isEmpty() && promotionList.isEmpty()) { - throw new EmptyListException("There are no results."); - } - } catch (EmptyListException e) { - return; - } - if (category.equals("NA") && !isListMarked) { - TextUi.showList(itemList); - } else if (containsTransactions(transactionList)) { + + if (containsTransactions(transactionList)) { showTransactionList(); - } else if (containsItems(itemList)) { - showCustomizedItemList(); } else if (containsPromotions(promotionList)) { showPromotionList(); + } else if (category.equals("NA") && !isListMarked) { + TextUi.showList(itemList); + } else if (containsItems(itemList)) { + showCustomizedItemList(); } else { TextUi.replyToUser(Messages.EMPTY_LIST); } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 792eca29cf..98e5a3de7f 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -72,7 +72,8 @@ public class Parser { Pattern.compile("del_promo (?[^/]+)"); public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = - Pattern.compile("^list_transactions(?:\\s+item/\\w+)?$"); + Pattern.compile("^list_transactions(?:\\s+item/(?\\w+))?$"); + public Command parseInput(String userInput){ final CommandType userCommand; @@ -474,9 +475,11 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio if (!matcher.matches()) { throw new CommandFormatException(Messages.INVALID_COMMAND); } + if (matcher.group("itemName") == null) { + return new ListCommand<>(Cashier.getTransactions(), "NA"); + } String itemName = matcher.group(1).trim(); - return new ListCommand<>(Cashier.getTransactions(), itemName); } } diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 73189060b4..2987e5b917 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -76,19 +76,6 @@ public static void showList(ArrayList arrayList) { replyToUser(listItem); index++; } - - - /*if (arrayList.isEmpty()) { - replyToUser(Messages.EMPTY_LIST); - } else { - replyToUser("List: "); - for (T item : arrayList) { - if (item == null) { - break; - } - replyToUser(arrayList.indexOf(item) + 1 + ". " + item); - } - }*/ } public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { From ce160d85b92372c167290928442e190cd45fbfc5 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 12 Apr 2024 01:22:31 +0800 Subject: [PATCH 272/421] low stock command --- src/main/java/command/LowStockCommand.java | 44 +++++++++++++++++- src/main/java/common/Messages.java | 10 +++-- .../exceptions/CommandFormatException.java | 6 +++ src/main/java/parser/Parser.java | 27 ++++++++++- src/main/java/reminder/LowStockReminder.java | 45 ------------------- src/main/java/seedu/duke/StockMaster.java | 3 +- 6 files changed, 82 insertions(+), 53 deletions(-) delete mode 100644 src/main/java/reminder/LowStockReminder.java diff --git a/src/main/java/command/LowStockCommand.java b/src/main/java/command/LowStockCommand.java index 3f9fb22871..2ebe495210 100644 --- a/src/main/java/command/LowStockCommand.java +++ b/src/main/java/command/LowStockCommand.java @@ -1,10 +1,50 @@ package command; -import reminder.LowStockReminder; +import item.Item; +import itemlist.Itemlist; public class LowStockCommand extends Command{ + + protected static int DEFAULT_LOW_STOCK_THRESHOLD = 5; + protected int lowStockAmount; + + public LowStockCommand(){ + this.lowStockAmount = DEFAULT_LOW_STOCK_THRESHOLD; + } + public LowStockCommand(int lowStockAmount){ + this.lowStockAmount = lowStockAmount; + } + + private static void outOfStockItemsReminder(){ + int count = 0; + System.out.println("Out-of-stock Items:"); + for (Item item : Itemlist.getItems()) { + if (item.getIsOOS()) { + System.out.println(item.getItemName()); + count++; + } + } + if (count == 0){ + System.out.println("No items out of stock"); + } + } + + public static void lowOnStockItemsReminder(int lowStockAmount){ + int count = 0; + System.out.println("Low-on-stock Items: (less than " + lowStockAmount + ")"); + for (Item item : Itemlist.getItems()) { + if (item.getQuantity() <= lowStockAmount && item.getQuantity() > 0) { //low stock condition + System.out.println(item.getItemName()); + count++; + } + } + if (count == 0){ + System.out.println("No items low on stock"); + } + } @Override public void execute() { - LowStockReminder.execute(); + outOfStockItemsReminder(); + lowOnStockItemsReminder(lowStockAmount); } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 374cc55695..ded07d5354 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -46,7 +46,7 @@ public class Messages { "| list | list_promotions |\n" + "| promotions | |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| low stock | low_stock |\n" + + "| low stock | low_stock /AMOUNT |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| exit | exit |\n" + "|____________|______________________________________________________________________________|\n" + @@ -68,7 +68,7 @@ public class Messages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| low stock | low_stock |\n" + + "| low stock | low_stock /AMOUNT |\n" + "|____________|______________________________________________________________________________|\n"; public static final String HELP_LIST_PROMO = @@ -273,7 +273,7 @@ public class Messages { "4. 'list marked cat/[CATEGORY]' to list all marked items in that category.\n" + "Please note that marked must be in front of cat/[CATEGORY]."; - public static final String INVALID_DEL_PROMO_FORMAT = "Invalid Command Format. Please use format:\n" + + public static final String INVALID_DEL_PROMO_FORMAT = "Invalid Command Format. Please use format: " + "del_promo [ITEM_NAME]"; public static final String INVALID_PROMOLIST_FORMAT = "Invalid Command Format."; @@ -284,6 +284,9 @@ public class Messages { "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DAY] /to [END_DAY] time /from [START_TIME]" + " /to [END_TIME]"; + public static final String INVALID_LOW_STOCK_FORMAT = "Invalid Command Format. Please use format: " + + "low_stock /AMOUNT"; + public static final String INVALID_ITEM_NAME = "Invalid item name. Please input an item name."; public static final String INVALID_CATEGORY = "Blank category detected. Please input a category."; @@ -296,6 +299,7 @@ public class Messages { public static final String SELL_TOO_LARGE = "Sell price is too large. Please input a smaller sell price."; + public static final String INVALID_LOW_STOCK_AMOUNT = "Please input a valid amount."; } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index a9be45c6fa..b9c1b57830 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -44,6 +44,9 @@ public CommandFormatException(CommandType command){ case UNMARK: System.out.println(Messages.INVALID_UNMARK_FORMAT); break; + case LOW_STOCK: + System.out.println(Messages.INVALID_LOW_STOCK_FORMAT); + break; default: System.out.println(Messages.INVALID_COMMAND); break; @@ -77,6 +80,9 @@ public CommandFormatException(String error) { case "SELL_TOO_LARGE": System.out.println(Messages.SELL_TOO_LARGE); break; + case "INVALID_LOW_STOCK_AMOUNT": + System.out.println(Messages.INVALID_LOW_STOCK_AMOUNT); + break; default: System.out.println(error); } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 804f9cdd50..b9bdc7f046 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -59,6 +59,9 @@ public class Parser { public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = Pattern.compile("^list_transactions(?:\\s+item/\\w+)?$"); + public static final Pattern LOW_STOCK_COMMAND_FORMAT = + Pattern.compile("low_stock /(?[^/]+)"); + public Command parseInput(String userInput){ final CommandType userCommand; final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); @@ -158,7 +161,11 @@ public Command parseInput(String userInput){ case BESTSELLER: return new BestsellerCommand(); case LOW_STOCK: - return new LowStockCommand(); + try { + return prepareLowStock(userInput); + } catch (CommandFormatException e) { + break; + } default: System.out.println(Messages.INVALID_COMMAND); return new IncorrectCommand(); @@ -467,6 +474,24 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio return new ListCommand<>(Cashier.getTransactions(), itemName); } + + private Command prepareLowStock(String args) throws CommandFormatException{ + final Matcher matcher = LOW_STOCK_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.LOW_STOCK); + } + + int amount; + try { + amount = Integer.parseInt(matcher.group("amount")); + } catch (NumberFormatException e) { + throw new CommandFormatException("INVALID_LOW_STOCK_AMOUNT"); + } + + return new LowStockCommand(amount); + } + } diff --git a/src/main/java/reminder/LowStockReminder.java b/src/main/java/reminder/LowStockReminder.java deleted file mode 100644 index c310922ea7..0000000000 --- a/src/main/java/reminder/LowStockReminder.java +++ /dev/null @@ -1,45 +0,0 @@ -package reminder; - -import item.Item; -import itemlist.Itemlist; - -public class LowStockReminder { - - private static final int DEFAULT_LOW_STOCK_THRESHOLD = 5; - - protected String itemName; - - - public static void execute(){ - outOfStockItemsReminder(); - lowOnStockItemsReminder(); - } - - private static void outOfStockItemsReminder(){ - int count = 0; - System.out.println("Out-of-stock Items:"); - for (Item item : Itemlist.getItems()) { - if (item.getIsOOS()) { - System.out.println(item.getItemName()); - count++; - } - } - if (count == 0){ - System.out.println("No items out of stock"); - } - } - - private static void lowOnStockItemsReminder(){ - int count = 0; - System.out.println("Low-on-stock Items:"); - for (Item item : Itemlist.getItems()) { - if (item.getQuantity() <= DEFAULT_LOW_STOCK_THRESHOLD && item.getQuantity() > 0) { //low stock condition - System.out.println(item.getItemName()); - count++; - } - } - if (count == 0){ - System.out.println("No items low on stock"); - } - } -} diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index b9df5afb70..0e4b070077 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -2,11 +2,11 @@ import command.Command; import command.ExitCommand; +import command.LowStockCommand; import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; import parser.Parser; -import reminder.LowStockReminder; import storage.PromotionStorage; import storage.Storage; import storage.TransactionLogs; @@ -42,7 +42,6 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti TransactionLogs.readFromFile(TRANSACTION_FILE); PromotionStorage.updateFile("", true); PromotionStorage.readFromFile(PROMOTION_STORAGE_FILE); - LowStockReminder.execute(); this.normalOperation(); ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } From ca0a7b910fffa19959425f37188e33f3974279ed Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Fri, 12 Apr 2024 01:37:51 +0800 Subject: [PATCH 273/421] Checkstyle changes --- StockMasterData.txt | 2 +- TransactionLogs.txt | 32 ++++++++++++++++++++++ src/main/java/command/LowStockCommand.java | 2 +- src/main/java/parser/Parser.java | 18 +++++++++++- src/main/java/seedu/duke/StockMaster.java | 1 - src/test/java/parser/ParserTest.java | 10 +++---- 6 files changed, 56 insertions(+), 9 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index beefe43049..4dc4f77cb1 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1 @@ -1. | [ ] | apple | Qty: 49 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +1. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index 1cce01edd7..d71613a93a 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -6,3 +6,35 @@ Unit Price: 5.0 Total Price: 5.0 Profit: 1.0 +Date: 2024-04-12 01:35:53 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 01:36:43 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 01:37:18 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 01:37:30 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + diff --git a/src/main/java/command/LowStockCommand.java b/src/main/java/command/LowStockCommand.java index 2ebe495210..1f1cf6b864 100644 --- a/src/main/java/command/LowStockCommand.java +++ b/src/main/java/command/LowStockCommand.java @@ -5,7 +5,7 @@ public class LowStockCommand extends Command{ - protected static int DEFAULT_LOW_STOCK_THRESHOLD = 5; + protected static final int DEFAULT_LOW_STOCK_THRESHOLD = 5; protected int lowStockAmount; public LowStockCommand(){ diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 6243ec5683..1b190dc49c 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -1,6 +1,22 @@ package parser; -import command.*; +import command.AddCommand; +import command.AddPromotionCommand; +import command.BestsellerCommand; +import command.Command; +import command.DeleteCommand; +import command.DeletePromotionCommand; +import command.EditCommand; +import command.ExitCommand; +import command.FindCommand; +import command.HelpCommand; +import command.IncorrectCommand; +import command.ListCommand; +import command.LowStockCommand; +import command.MarkCommand; +import command.SellCommand; +import command.TotalProfitCommand; +import command.UnmarkCommand; import common.Messages; import exceptions.CommandFormatException; import exceptions.EditException; diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index 0e4b070077..a1cec1bc40 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -2,7 +2,6 @@ import command.Command; import command.ExitCommand; -import command.LowStockCommand; import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index f4433dae34..b974b7a513 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -44,8 +44,8 @@ public void testParseEditCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(EditCommand.class, command); EditCommand editCommand = (EditCommand) command; - assertEquals("ItemName", editCommand.getItemName()); - assertEquals("NewName", editCommand.getNewItemName()); + assertEquals("itemname", editCommand.getItemName()); + assertEquals("newname", editCommand.getNewItemName()); assertEquals(20, editCommand.getNewQuantity()); assertEquals("NewUOM", editCommand.getNewUnitOfMeasurement()); assertEquals("NewCategory", editCommand.getNewCategory()); @@ -59,7 +59,7 @@ public void testParseSellCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(SellCommand.class, command); SellCommand sellCommand = (SellCommand) command; - assertEquals("ItemName", sellCommand.getItemName()); + assertEquals("itemname", sellCommand.getItemName()); assertEquals(5, sellCommand.getSellQuantity()); } @@ -88,7 +88,7 @@ public void testParseMarkCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(MarkCommand.class, command); MarkCommand markCommand = (MarkCommand) command; - assertEquals("ItemName", markCommand.getItemName()); + assertEquals("itemname", markCommand.getItemName()); } @Test @@ -97,7 +97,7 @@ public void testParseUnmarkCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(UnmarkCommand.class, command); UnmarkCommand unmarkCommand = (UnmarkCommand) command; - assertEquals("ItemName", unmarkCommand.getItemName()); + assertEquals("itemname", unmarkCommand.getItemName()); } @Test From 6467af75ab9ad7dcb679bda032a29f6b8c129cc7 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 09:56:53 +0800 Subject: [PATCH 274/421] Update PPP --- docs/team/LowTL.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docs/team/LowTL.md b/docs/team/LowTL.md index 8185622ade..9e7ec75700 100644 --- a/docs/team/LowTL.md +++ b/docs/team/LowTL.md @@ -1,5 +1,10 @@ # Low Tjun Lym - Project Portfolio Page ## Overview +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. -### Summary of Contribution \ No newline at end of file +### Summary of Contribution + +**Code Contributed:** +[Reposense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=LowTL&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=LowTL&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=functional-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) \ No newline at end of file From c3aadb860bd76e55a4750f536980df146ba64ea8 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 12 Apr 2024 09:59:52 +0800 Subject: [PATCH 275/421] Update DG, PPP --- docs/DeveloperGuide.md | 6 ++++-- docs/team/fxe025.md | 13 +++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 5d08c4db43..2c625355aa 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -30,8 +30,10 @@ quantity of item, and others. Parser class processes user inputs and sieves out relevant details before calling the relevant methods. It contains command formats that must be adhered to for the methods to be called. ### Storage -Storage class contains methods to write description of items to the file `./StockMasterData.txt`, -and retrieve information from the file when program restarts. +* Storage class contains method `addToFile()` to write data of items to the default file directory, `./StockMasterData.txt`. +* `overwriteFile()` write data of items to the default file directory, overwriting previous contents in the file. +* Method `readFromFile()` retrieve information from the file when program restarts. Information is used to create new `Item` object, which is added to +the Itemlist by `addItem()` method. ### UI ### Cashier diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md index d539a01385..f027420c87 100644 --- a/docs/team/fxe025.md +++ b/docs/team/fxe025.md @@ -1,5 +1,18 @@ # Fu Xueer - Project Portfolio Page ## Overview +StockMaster is a platform aimed at helping SMEs track and organise their inventory. ### Summary of Contributions +#### Enhancements implemented +* Add Storage feature + * Write information from an itemlist to file + * Read information from the file when program starts +* Add Transaction feature + * Store selling price, cost, quantity and profit made of a type of item that's already sold. +* Add Cashier feature + * A list to store past transactions +* Add TransactionLogs feature + * Write information from a transactionlist to file + * Read information from the file when program starts + From 7b0c1e682e561e8846a7078acd8aa8de3385038a Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 10:04:58 +0800 Subject: [PATCH 276/421] Add HelpMessages class --- src/main/java/common/HelpMessages.java | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/main/java/common/HelpMessages.java diff --git a/src/main/java/common/HelpMessages.java b/src/main/java/common/HelpMessages.java new file mode 100644 index 0000000000..cb9340adf0 --- /dev/null +++ b/src/main/java/common/HelpMessages.java @@ -0,0 +1,14 @@ +package common; + +public class HelpMessages { + public static final String HELP_LIST_PROMO = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|----------------|--------------------------------------------------------------------------|\n" + + "| list_promotion | list_transaction item/[ITEM_NAME] |\n" + + "|----------------|--------------------------------------------------------------------------|\n" + + "| example: | list_transaction item/apple |\n" + + "|________________|__________________________________________________________________________|\n"; +} From e6188b0ea74fa1b30955097686159ecfccde8c42 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 10:07:31 +0800 Subject: [PATCH 277/421] Add CashierTest --- src/test/java/itemlist/CashierTest.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 src/test/java/itemlist/CashierTest.java diff --git a/src/test/java/itemlist/CashierTest.java b/src/test/java/itemlist/CashierTest.java new file mode 100644 index 0000000000..02a3b380c6 --- /dev/null +++ b/src/test/java/itemlist/CashierTest.java @@ -0,0 +1,16 @@ +package itemlist; + +import item.Item; +import item.Transaction; +import org.junit.jupiter.api.Test; + +public class CashierTest { + + @Test + public void AddTransactionTest() { + Item testItem = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); + Transaction testTransaction = new Transaction("testItem", 1, 1.00F, 2.00F); + Cashier.addItem(testTransaction); + assert(Cashier.getTransactions().contains(testTransaction)); + } +} From 0f27ef35b35ec399807cea392169847a32400690 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 12 Apr 2024 10:07:55 +0800 Subject: [PATCH 278/421] Update ppp --- docs/team/fxe025.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md index f027420c87..b517e54183 100644 --- a/docs/team/fxe025.md +++ b/docs/team/fxe025.md @@ -5,14 +5,14 @@ StockMaster is a platform aimed at helping SMEs track and organise their invento ### Summary of Contributions #### Enhancements implemented -* Add Storage feature +- **New Feature:** Add Storage feature * Write information from an itemlist to file * Read information from the file when program starts -* Add Transaction feature +- **New Feature:** Add Transaction feature * Store selling price, cost, quantity and profit made of a type of item that's already sold. -* Add Cashier feature +- **New Feature:** Add Cashier feature * A list to store past transactions -* Add TransactionLogs feature +- **New Feature:** Add TransactionLogs feature * Write information from a transactionlist to file * Read information from the file when program starts From 5858927ec8cc5afaf415de633c454a48dcff9f3b Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 10:12:37 +0800 Subject: [PATCH 279/421] Fix naming convention --- src/test/java/itemlist/CashierTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/itemlist/CashierTest.java b/src/test/java/itemlist/CashierTest.java index 02a3b380c6..cae260cfc0 100644 --- a/src/test/java/itemlist/CashierTest.java +++ b/src/test/java/itemlist/CashierTest.java @@ -7,7 +7,7 @@ public class CashierTest { @Test - public void AddTransactionTest() { + public void addTransactionTest() { Item testItem = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); Transaction testTransaction = new Transaction("testItem", 1, 1.00F, 2.00F); Cashier.addItem(testTransaction); From ac9984755ad19438dd1b29110f349f4e67c4a10e Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 10:19:57 +0800 Subject: [PATCH 280/421] Fix breaking test --- text-ui-test/runtest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 1dcbd12021..4f33ccf7fa 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -20,4 +20,4 @@ then else echo "Test failed!" exit 1 -fi +fi \ No newline at end of file From 4bf6afe0a66bf7aef92918fca65d849c4f7ee946 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 10:45:50 +0800 Subject: [PATCH 281/421] Change runtest --- text-ui-test/runtest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index 4f33ccf7fa..d9584f6981 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -11,7 +11,7 @@ cd text-ui-test java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT cp EXPECTED.TXT EXPECTED-UNIX.TXT -dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT +#dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT diff EXPECTED-UNIX.TXT ACTUAL.TXT if [ $? -eq 0 ] then From 0f7e41ee28d2e8edf5b56e50b916c381e859326b Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 12 Apr 2024 10:49:50 +0800 Subject: [PATCH 282/421] Update EXPECTED.TXT --- text-ui-test/EXPECTED.TXT | 4 ---- 1 file changed, 4 deletions(-) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index d4e690c2b3..0763b66a91 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -3,10 +3,6 @@ StockMaster v2.0 ---------------- Data is being extracted from: ./StockMasterData.txt Welcome to StockMaster, where you can master the knowledge on your Stock! -Out-of-stock Items: -No items out of stock -Low-on-stock Items: -No items low on stock Enter Command: ---------------- Inventory is being saved to :./StockMasterData.txt From c2d952dd14df9591e7003a5cd914f022fb4cc1e5 Mon Sep 17 00:00:00 2001 From: Shu Date: Fri, 12 Apr 2024 11:14:24 +0800 Subject: [PATCH 283/421] Fix tests --- PromotionStorage.txt | 3 --- TransactionLogs.txt | 34 ++++---------------------- src/main/java/command/SellCommand.java | 2 +- text-ui-test/EXPECTED.TXT | 4 --- 4 files changed, 6 insertions(+), 37 deletions(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index e21c82d075..e69de29bb2 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,3 +0,0 @@ -apple have a 50.00% discount -Period: 10 APR 2024 to 14 APR 2024 -Time: 1200 to 2300 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index d71613a93a..22cc8bba26 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -1,36 +1,12 @@ -Date: 2024-04-12 01:14:34 +Date: 2024-04-12 11:10:19 Transaction ID: 1 Item Name: apple -Quantity: 1 +Quantity: 3 Unit Price: 5.0 -Total Price: 5.0 -Profit: 1.0 - -Date: 2024-04-12 01:35:53 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 01:36:43 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 01:37:18 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 +Total Price: 15.0 +Profit: 3.0 -Date: 2024-04-12 01:37:30 +Date: 2024-04-12 11:12:40 Transaction ID: 1 Item Name: testItem Quantity: 1 diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 314380560f..a0bf8b9ef3 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -30,7 +30,7 @@ public int getSellQuantity() { @Override public void execute() { int index = -1; - Item toSell = Itemlist.getItems().get(0); + Item toSell = null; for (Item item : Itemlist.getItems()) { if (item.getItemName().toLowerCase().equals(itemName.toLowerCase())) { index = Itemlist.getItems().indexOf(item); diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index d4e690c2b3..0763b66a91 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -3,10 +3,6 @@ StockMaster v2.0 ---------------- Data is being extracted from: ./StockMasterData.txt Welcome to StockMaster, where you can master the knowledge on your Stock! -Out-of-stock Items: -No items out of stock -Low-on-stock Items: -No items low on stock Enter Command: ---------------- Inventory is being saved to :./StockMasterData.txt From 07216af0a230af66463cf0c791b660f309f7a2dd Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 12:01:38 +0800 Subject: [PATCH 284/421] Revert runtest.sh changes --- text-ui-test/runtest.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text-ui-test/runtest.sh b/text-ui-test/runtest.sh index d9584f6981..1dcbd12021 100755 --- a/text-ui-test/runtest.sh +++ b/text-ui-test/runtest.sh @@ -11,7 +11,7 @@ cd text-ui-test java -jar $(find ../build/libs/ -mindepth 1 -print -quit) < input.txt > ACTUAL.TXT cp EXPECTED.TXT EXPECTED-UNIX.TXT -#dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT +dos2unix EXPECTED-UNIX.TXT ACTUAL.TXT diff EXPECTED-UNIX.TXT ACTUAL.TXT if [ $? -eq 0 ] then @@ -20,4 +20,4 @@ then else echo "Test failed!" exit 1 -fi \ No newline at end of file +fi From 8093c630363efe01ded0b33a40d4849807f97e25 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 17:19:49 +0800 Subject: [PATCH 285/421] Add logger --- .gitignore | 4 +++ src/main/java/parser/Parser.java | 19 ++++++++++++ src/main/java/seedu/duke/StockMaster.java | 36 +++++++++++++++++++++-- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/.gitignore b/.gitignore index 9b2fa6ec4b..307938f9b5 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,10 @@ #Compiled class files *.class +#Logger files +logs +*.log + #Generated storage text files PromotionStorage.txt StockMasterData.txt diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 9bb8e5f05f..1e5b04e1ed 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -27,10 +27,15 @@ import promotion.Promotionlist; +import java.io.IOException; +import java.util.logging.FileHandler; +import java.util.logging.Level; +import java.util.logging.Logger; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Parser { + private static final Logger logger = Logger.getLogger(Parser.class.getName()); public static final Pattern HELP_COMMAND_FORMAT = Pattern.compile("help(?: c/(?[^/]+))?"); @@ -85,6 +90,7 @@ public Command parseInput(String userInput){ if (!matcher.matches()) { System.out.println(Messages.INVALID_COMMAND); System.out.println(Messages.HELP); + logger.log(Level.FINE, "Invalid command received"); return new IncorrectCommand(); } String commandWord = matcher.group("commandWord").toUpperCase(); @@ -101,12 +107,14 @@ public Command parseInput(String userInput){ try { return prepareHelp(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case LIST_ITEMS: try { return prepareItemList(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case LIST_PROMOTIONS: @@ -115,60 +123,70 @@ public Command parseInput(String userInput){ try { return prepareTransactionList(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case DEL_PROMO: try { return prepareDeletePromo(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case ADD: try { return prepareAdd(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case DEL: try { return prepareDelete(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case EDIT: try { return prepareEdit(userInput); } catch (CommandFormatException | EditException e) { + logger.log(Level.WARNING, "Invalid input detected.", e); break; } case FIND: try { return prepareFind(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case SELL: try { return prepareSell(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case PROMOTION: try { return preparePromotion(userInput); } catch (CommandFormatException | InvalidDateException e) { + logger.log(Level.WARNING, "Invalid input detected.", e); break; } case MARK: try { return prepareMark(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case UNMARK: try { return prepareUnmark(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } case TOTAL_PROFIT: @@ -181,6 +199,7 @@ public Command parseInput(String userInput){ try { return prepareLowStock(userInput); } catch (CommandFormatException e) { + logger.log(Level.WARNING, "Invalid input detected."); break; } default: diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index a1cec1bc40..45221f0788 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -13,7 +13,15 @@ import itemlist.Itemlist; +import java.io.File; import java.io.IOException; +import java.util.logging.Logger; +import java.util.logging.Level; +import java.util.logging.LogManager; +import java.util.logging.ConsoleHandler; +import java.util.logging.FileHandler; +import java.util.logging.SimpleFormatter; + public class StockMaster { private static final String STORAGE_FILE = "./StockMasterData.txt"; @@ -21,7 +29,7 @@ public class StockMaster { private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); - private Itemlist itemlist = new Itemlist(); + private static final Logger logger = Logger.getLogger(StockMaster.class.getName()) ; @@ -34,6 +42,8 @@ public static void main(String[] args) throws IOException, CommandFormatExceptio } public void run() throws IOException, CommandFormatException, InvalidDateException, EmptyListException { + initLogger(); + logger.finest("Run begin"); ui.showWelcomeMessage("StockMaster v2.0", STORAGE_FILE); Storage.updateFile("", true); Storage.readFromFile(STORAGE_FILE); @@ -49,10 +59,32 @@ private void normalOperation() throws IOException, CommandFormatException, InvalidDateException, EmptyListException { String userInput; do { - userInput = ui.getUserInput(); + userInput = TextUi.getUserInput(); + logger.info("Input received: " + userInput); Command command = parser.parseInput(userInput); command.execute(); } while (!ExitCommand.getIsExit()); } + private static void initLogger() throws IOException { + LogManager.getLogManager().reset(); //clears out any default settings + ConsoleHandler ch = new ConsoleHandler(); //to print errors to console + logger.addHandler(ch); + logger.setLevel(Level.ALL); //to allow all logs to be logged + ch.setLevel(Level.SEVERE); //only print severe logs to console + try { + File dir = new File("logs"); + if (!dir.exists()) { + dir.mkdir(); + } + FileHandler fh = new FileHandler("logs/StockMasterLogs.log"); + fh.setFormatter(new SimpleFormatter()); + fh.setLevel(Level.FINER); //log finer and above logs + logger.addHandler(fh); + } catch (IOException e) { + logger.log(Level.SEVERE, "Unable to create FileHandler", e); + } + + } + } From 9518a4b23b2baae244ea0f0bdd9c163289302c2c Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 17:20:21 +0800 Subject: [PATCH 286/421] Remove unused imports --- src/main/java/parser/Parser.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 1e5b04e1ed..fa9214cc31 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -27,8 +27,6 @@ import promotion.Promotionlist; -import java.io.IOException; -import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; import java.util.regex.Matcher; From d08e86dd7936baa5f8a7000a5c442effaa439528 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 17:23:59 +0800 Subject: [PATCH 287/421] Change declaration order --- src/main/java/parser/Parser.java | 2 +- src/main/java/seedu/duke/StockMaster.java | 24 +++++++++++------------ 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index fa9214cc31..710fe21045 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -33,7 +33,6 @@ import java.util.regex.Pattern; public class Parser { - private static final Logger logger = Logger.getLogger(Parser.class.getName()); public static final Pattern HELP_COMMAND_FORMAT = Pattern.compile("help(?: c/(?[^/]+))?"); @@ -82,6 +81,7 @@ public class Parser { public static final Pattern LOW_STOCK_COMMAND_FORMAT = Pattern.compile("low_stock /(?[^/]+)"); + private static final Logger logger = Logger.getLogger(Parser.class.getName()); public Command parseInput(String userInput){ final CommandType userCommand; final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index 45221f0788..dd2c482761 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -11,8 +11,6 @@ import storage.TransactionLogs; import ui.TextUi; -import itemlist.Itemlist; - import java.io.File; import java.io.IOException; import java.util.logging.Logger; @@ -55,17 +53,6 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } - private void normalOperation() throws IOException, CommandFormatException, - InvalidDateException, EmptyListException { - String userInput; - do { - userInput = TextUi.getUserInput(); - logger.info("Input received: " + userInput); - Command command = parser.parseInput(userInput); - command.execute(); - } while (!ExitCommand.getIsExit()); - } - private static void initLogger() throws IOException { LogManager.getLogManager().reset(); //clears out any default settings ConsoleHandler ch = new ConsoleHandler(); //to print errors to console @@ -87,4 +74,15 @@ private static void initLogger() throws IOException { } + private void normalOperation() throws IOException, CommandFormatException, + InvalidDateException, EmptyListException { + String userInput; + do { + userInput = TextUi.getUserInput(); + logger.info("Input received: " + userInput); + Command command = parser.parseInput(userInput); + command.execute(); + } while (!ExitCommand.getIsExit()); + } + } From 5416497d31c5dedad2b424bd53e8134c9da56c47 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 17:26:17 +0800 Subject: [PATCH 288/421] Change declaration order --- src/main/java/seedu/duke/StockMaster.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index dd2c482761..5922d2a94b 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -25,9 +25,9 @@ public class StockMaster { private static final String STORAGE_FILE = "./StockMasterData.txt"; private static final String TRANSACTION_FILE = "./TransactionLogs.txt"; private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; + private static final Logger logger = Logger.getLogger(StockMaster.class.getName()) ; private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); - private static final Logger logger = Logger.getLogger(StockMaster.class.getName()) ; From 20cc9fabe7b5f12e8f847c71bde94c709907cd56 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 17:44:10 +0800 Subject: [PATCH 289/421] Add logget to AddCommand --- src/main/java/command/AddCommand.java | 1 + src/main/java/command/Command.java | 4 ++++ src/main/java/seedu/duke/StockMaster.java | 9 ++++++--- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index fdc15357b6..9c4902f87a 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -24,6 +24,7 @@ public AddCommand(String itemName, int quantity, String unitOfMeasurement, Strin this.buyPrice = buyPrice; this.sellPrice = sellPrice; this.toAdd = new Item(itemName, quantity, unitOfMeasurement, category, buyPrice, sellPrice); + LOGGER.info("AddCommand successfully created."); } public String getItemName() { diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 4eb4820c85..6e231edb52 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -4,7 +4,11 @@ import exceptions.EmptyListException; import exceptions.InvalidDateException; +import java.util.logging.Logger; + public abstract class Command { public abstract void execute() throws CommandFormatException, InvalidDateException, EmptyListException; + + protected static final Logger LOGGER = Logger.getLogger(Command.class.getName()); } diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index 5922d2a94b..aafa6123f6 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -53,7 +53,9 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } - private static void initLogger() throws IOException { + private static void initLogger() { + Logger parserLogger = Logger.getLogger(Parser.class.getName()); + Logger commandLogger = Logger.getLogger(Command.class.getName()); LogManager.getLogManager().reset(); //clears out any default settings ConsoleHandler ch = new ConsoleHandler(); //to print errors to console logger.addHandler(ch); @@ -66,12 +68,13 @@ private static void initLogger() throws IOException { } FileHandler fh = new FileHandler("logs/StockMasterLogs.log"); fh.setFormatter(new SimpleFormatter()); - fh.setLevel(Level.FINER); //log finer and above logs + fh.setLevel(Level.INFO); //log info and above logs logger.addHandler(fh); + parserLogger.addHandler(fh); + commandLogger.addHandler(fh); } catch (IOException e) { logger.log(Level.SEVERE, "Unable to create FileHandler", e); } - } private void normalOperation() throws IOException, CommandFormatException, From d3039157330f703581f864d870fa04c74e0ec967 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 12 Apr 2024 17:51:05 +0800 Subject: [PATCH 290/421] Update Storage_sequenceDiagram --- .../PUML files/Storage_sequenceDiagram.puml | 36 ++++++++++++++++++ docs/Diagrams/Storage.png | Bin 16796 -> 0 bytes docs/Diagrams/Storage_class_diagram.png | Bin 86195 -> 0 bytes docs/Diagrams/Storage_sequenceDiagram.png | Bin 0 -> 23852 bytes 4 files changed, 36 insertions(+) create mode 100644 docs/Diagrams/PUML files/Storage_sequenceDiagram.puml delete mode 100644 docs/Diagrams/Storage.png delete mode 100644 docs/Diagrams/Storage_class_diagram.png create mode 100644 docs/Diagrams/Storage_sequenceDiagram.png diff --git a/docs/Diagrams/PUML files/Storage_sequenceDiagram.puml b/docs/Diagrams/PUML files/Storage_sequenceDiagram.puml new file mode 100644 index 0000000000..3b5d87875d --- /dev/null +++ b/docs/Diagrams/PUML files/Storage_sequenceDiagram.puml @@ -0,0 +1,36 @@ +@startuml +participant Client +participant Storage +participant Itemlist +participant Item +participant Scanner +participant File + +Client -> Storage: readFromFile(fileName) +activate Storage +Storage -> File: new File(fileName) +activate File +Storage -> Scanner: new Scanner(File) +activate Scanner +Scanner --> File: interpretLines(scanner) +File --> Storage: Close Scanner +deactivate Scanner +deactivate File +deactivate Storage + +Client -> Storage: addToFile(items) +activate Storage +Storage -> Itemlist: addItem(toAdd) +activate Itemlist +Itemlist --> Storage +deactivate Itemlist +Storage -> Storage: updateFile(descriptionAdded, true) +deactivate Storage + +Client -> Storage: overwriteFile(items) +activate Storage +loop for each item in items + Storage -> Storage: updateFile(descriptionAdded, ifAppend) +end +deactivate Storage +@enduml \ No newline at end of file diff --git a/docs/Diagrams/Storage.png b/docs/Diagrams/Storage.png deleted file mode 100644 index a633a2adfdcedf5fefc1a1bbbbbcb7d355048bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16796 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 diff --git a/docs/Diagrams/Storage_class_diagram.png b/docs/Diagrams/Storage_class_diagram.png deleted file mode 100644 index 23ab02f3db116a1098faa5aafc9d8a7732eaa430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86195 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 diff --git a/docs/Diagrams/Storage_sequenceDiagram.png b/docs/Diagrams/Storage_sequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..412a668eddca1f93bc348371058df3e4e6e186bd GIT binary patch literal 23852 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 literal 0 HcmV?d00001 From bf960ce2b315f2b10b6d4b5cfe9805c697ba8a42 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 18:03:30 +0800 Subject: [PATCH 291/421] Add loggers --- src/main/java/command/AddCommand.java | 2 ++ src/main/java/command/AddPromotionCommand.java | 6 +++++- src/main/java/command/BestsellerCommand.java | 2 +- src/main/java/command/DeleteCommand.java | 7 ++++--- src/main/java/command/HelpCommand.java | 9 +++++++-- src/main/java/common/HelpMessages.java | 14 +++++++------- src/main/java/item/Item.java | 3 +++ 7 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 9c4902f87a..0350537a5d 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -50,8 +50,10 @@ public float getSellPrice() { public void execute() { if (Itemlist.itemIsExist(itemName)) { updateQuantity(itemName); + LOGGER.info("Edited item instead."); } else { Itemlist.addItem(toAdd); + LOGGER.info("Item added successfully."); System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); Storage.addToFile(Itemlist.getItems()); diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index ae7935eca6..23a229f7f2 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -7,6 +7,8 @@ import promotion.Promotionlist; import ui.TextUi; +import java.util.logging.Level; + public class AddPromotionCommand extends Command { protected Promotion promotion; @@ -23,6 +25,7 @@ public AddPromotionCommand( startDate, startMonth, startYear, endDate, endMonth, endYear, startTime, endTime); + LOGGER.info("AddPromotion successfully created."); } @Override @@ -38,8 +41,9 @@ public void execute() throws InvalidDateException, CommandFormatException { "Time: " + String.format("%04d", promotion.getStartTime()) + " to " + String.format("%04d", promotion.getEndTime()) ); + LOGGER.info("Promotion successfully created."); } catch (InvalidDateException | CommandFormatException e){ - System.out.println(""); + LOGGER.log(Level.WARNING, "Unable to create promotion", e); } } } diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index a3468b4af0..2100e85269 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -17,7 +17,7 @@ public void execute() { throw new EmptyListException("Transaction"); } } catch (EmptyListException e) { - return; + LOGGER.warning("No transaction found."); } TextUi.replyToUser("The current best-selling item is " + bs.getItemName()); diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 4156ac26a3..7232383dce 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.EmptyListException; import item.Item; import itemlist.Itemlist; import storage.Storage; @@ -12,7 +13,7 @@ public DeleteCommand(String itemName) { this.itemName = itemName.toLowerCase(); //for checking later } - public void execute() { + public void execute() throws EmptyListException { int index = -1; try { for (Item item : Itemlist.getItems()) { @@ -23,7 +24,7 @@ public void execute() { } if (index == -1) { //throw exception; - System.out.println("Item does not exist."); + throw new EmptyListException("Item"); } else { Itemlist.deleteItem(index); System.out.println(itemName + " has been successfully deleted."); @@ -34,7 +35,7 @@ public void execute() { assert (!Itemlist.getItem(index).getItemName().equals(itemName)); } } - } catch (IndexOutOfBoundsException e) { + } catch (IndexOutOfBoundsException | EmptyListException e) { System.out.println("Itemlist is empty."); } } diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 120e64aa92..2fb291022b 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -1,5 +1,6 @@ package command; +import common.HelpMessages; import common.Messages; public class HelpCommand extends Command{ @@ -8,6 +9,7 @@ public class HelpCommand extends Command{ public HelpCommand(String command){ this.command = command; + LOGGER.info("Command successfully created"); } @Override public void execute() { @@ -39,10 +41,10 @@ public void execute() { case "bestseller": System.out.println(Messages.HELP_BESTSELLER); break; - case "total profit": + case "total_profit": System.out.println(Messages.HELP_TOTAL_PROFIT); break; - case "total revenue": + case "total_revenue": System.out.println(Messages.HELP_TOTAL_REVENUE); break; case "promotion": @@ -60,8 +62,11 @@ public void execute() { case "exit": System.out.println(Messages.HELP_EXIT); break; + case "list_transactions": + System.out.println(HelpMessages.HELP_LIST_TRANSACTIONS); default: System.out.println(Messages.INVALID_HELP_COMMAND); + LOGGER.warning("Invalid help command received."); break; } diff --git a/src/main/java/common/HelpMessages.java b/src/main/java/common/HelpMessages.java index cb9340adf0..4a136a33d0 100644 --- a/src/main/java/common/HelpMessages.java +++ b/src/main/java/common/HelpMessages.java @@ -1,14 +1,14 @@ package common; public class HelpMessages { - public static final String HELP_LIST_PROMO = + public static final String HELP_LIST_TRANSACTIONS = " ___________________________________________________________________________________________\n" + "| STOCKMASTER |\n" + "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|----------------|--------------------------------------------------------------------------|\n" + - "| list_promotion | list_transaction item/[ITEM_NAME] |\n" + - "|----------------|--------------------------------------------------------------------------|\n" + - "| example: | list_transaction item/apple |\n" + - "|________________|__________________________________________________________________________|\n"; + "| Commands | Format |\n" + + "|-------------------|-----------------------------------------------------------------------|\n" + + "| list_transactions | list_transaction item/[ITEM_NAME] |\n" + + "|-------------------|-----------------------------------------------------------------------|\n" + + "| example: | list_transaction item/apple |\n" + + "|___________________|_______________________________________________________________________|\n"; } diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 542222cb4a..25b4eb3baf 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -3,6 +3,8 @@ import itemlist.Itemlist; +import java.util.logging.Logger; + public class Item { public boolean isMark; private String itemName; @@ -27,6 +29,7 @@ public Item(String name, int quantity, String unitOfMeasurement, String category this.sellPrice = sellPrice; this.isOOS = quantity == 0; Itemlist.noOfItems++; + } public String getCategory() { From 5d000ada04a365befa5a60ca846b7aabdfc5c6ba Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 18:08:51 +0800 Subject: [PATCH 292/421] Fix styling --- src/main/java/command/Command.java | 2 +- src/main/java/command/HelpCommand.java | 1 + src/main/java/item/Item.java | 2 -- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/command/Command.java b/src/main/java/command/Command.java index 6e231edb52..3bee49edac 100644 --- a/src/main/java/command/Command.java +++ b/src/main/java/command/Command.java @@ -8,7 +8,7 @@ public abstract class Command { + protected static final Logger LOGGER = Logger.getLogger(Command.class.getName()); public abstract void execute() throws CommandFormatException, InvalidDateException, EmptyListException; - protected static final Logger LOGGER = Logger.getLogger(Command.class.getName()); } diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 2fb291022b..c2a44f2c11 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -64,6 +64,7 @@ public void execute() { break; case "list_transactions": System.out.println(HelpMessages.HELP_LIST_TRANSACTIONS); + break; default: System.out.println(Messages.INVALID_HELP_COMMAND); LOGGER.warning("Invalid help command received."); diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 25b4eb3baf..f9a8d05136 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -3,8 +3,6 @@ import itemlist.Itemlist; -import java.util.logging.Logger; - public class Item { public boolean isMark; private String itemName; From b3a4a6a0bc3800d76fe17b6e36b4f4732f009988 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 18:10:06 +0800 Subject: [PATCH 293/421] Rename PPP --- docs/team/{LowTL.md => lowtl.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/team/{LowTL.md => lowtl.md} (100%) diff --git a/docs/team/LowTL.md b/docs/team/lowtl.md similarity index 100% rename from docs/team/LowTL.md rename to docs/team/lowtl.md From 313478c811a635246d91ef9a44f9955ab28c6935 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 12 Apr 2024 18:32:25 +0800 Subject: [PATCH 294/421] Update Storage_ClassDiagram --- .../PUML files/Storage_ClassDiagram.puml | 57 ++++++++++++++++++ docs/Diagrams/Storage_ClassDiagram.png | Bin 0 -> 38033 bytes 2 files changed, 57 insertions(+) create mode 100644 docs/Diagrams/PUML files/Storage_ClassDiagram.puml create mode 100644 docs/Diagrams/Storage_ClassDiagram.png diff --git a/docs/Diagrams/PUML files/Storage_ClassDiagram.puml b/docs/Diagrams/PUML files/Storage_ClassDiagram.puml new file mode 100644 index 0000000000..b1893b274e --- /dev/null +++ b/docs/Diagrams/PUML files/Storage_ClassDiagram.puml @@ -0,0 +1,57 @@ +@startuml + +class Storage { + +readFromFile(fileName: String) + +addToFile(items: ArrayList) + +overwriteFile(items: ArrayList) +} + +class TransactionLogs { + +readFromFile(fileName: String) + +addToLog(transactions: ArrayList) +} + +class PromotionStorage { + +readFromFile(fileName: String) + +overwritePromotionFile(promotions: ArrayList) +} + +class Itemlist { + +addItem(item: Item) +} + +class Promotionlist { + +addPromotion(promotion: Promotion) +} + +class AddCommand { + +execute() +} + +class EditCommand { + +execute() +} + +class SellCommand { + +execute() +} + +class AddPromotionCommand { + +execute() +} + +class DeletePromotionCommand { + +execute() +} + +Storage <|-- TransactionLogs +Storage <|-- PromotionStorage + +Storage --> Itemlist: uses +PromotionStorage --> Promotionlist: uses +AddCommand --> Storage: uses +EditCommand --> Storage: uses +SellCommand --> TransactionLogs: uses +DeletePromotionCommand --> PromotionStorage: uses +AddPromotionCommand --> PromotionStorage: uses +@enduml \ No newline at end of file diff --git a/docs/Diagrams/Storage_ClassDiagram.png b/docs/Diagrams/Storage_ClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..c28e94b15618a4d26b3c4cf5e7432a8ed9018e30 GIT binary patch literal 38033 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%0D$`an7Y6`WDn_APmn96voTRp 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 NPO6;9k} Date: Fri, 12 Apr 2024 19:56:30 +0800 Subject: [PATCH 295/421] Update DG --- docs/DeveloperGuide.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b28d0d189a..51f3b793c9 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -34,6 +34,12 @@ It contains command formats that must be adhered to for the methods to be called * `overwriteFile()` write data of items to the default file directory, overwriting previous contents in the file. * Method `readFromFile()` retrieve information from the file when program restarts. Information is used to create new `Item` object, which is added to the Itemlist by `addItem()` method. + +### Class diagram +![Storage_ClassDiagram](./Diagrams/Storage_ClassDiagram.png) +### Sequence diagram +![Storage_sequenceDiagram](./Diagrams/Storage_sequenceDiagram.png) + ### UI ### Cashier From 49f6f99ccabcbf004ee69fc50aec9a04525d62a0 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Fri, 12 Apr 2024 21:26:49 +0800 Subject: [PATCH 296/421] update md --- docs/team/HengShuHong.md | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md index e69de29bb2..0b7683b9d6 100644 --- a/docs/team/HengShuHong.md +++ b/docs/team/HengShuHong.md @@ -0,0 +1,47 @@ +# Heng Shu Hong's Project Portfolio Page + + +## Project: StockMaster + +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. + + +### Code Contribution + +- **New Feature:** Added the capability to add/delete/list promotions + - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, + `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell + feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will + be shown. + - Justification: This feature improves the application as the user now have the option to create a discount campaign + and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. + - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, + one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. + + +- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. + - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` + For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` + - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly + retrieve the data that is being searched for by narrow the scope of the search. + - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this + enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original + feature, but yet still able to provide more than 1 filter to narrow the scope. + +- **New Feature:** Enhanced the add command to prevent duplicate entries + - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a + duplicated item, the item information will be updated based on the latest input and the quantity will be increased. + - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the + overflowing of the inventory list with duplicated item. + +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) + +- **Documentation** + - User Guide: + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Added the Quick Start + - Update the Command Summary + - Developer Guide: + - Added implementation details of the `promotion` feature. + - \ No newline at end of file From f8901d737de54a1664e45d656d4f12e0fc2d1215 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 21:52:37 +0800 Subject: [PATCH 297/421] Organise diagrams --- .../{ => Images}/AddCommand_SequenceDiagram.png | Bin .../{ => Images/Storage}/Storage_ClassDiagram.png | Bin .../Storage}/Storage_sequenceDiagram.png | Bin .../{ => Storage}/Storage_ClassDiagram.puml | 0 .../{ => Storage}/Storage_sequenceDiagram.puml | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename docs/Diagrams/{ => Images}/AddCommand_SequenceDiagram.png (100%) rename docs/Diagrams/{ => Images/Storage}/Storage_ClassDiagram.png (100%) rename docs/Diagrams/{ => Images/Storage}/Storage_sequenceDiagram.png (100%) rename docs/Diagrams/PUML files/{ => Storage}/Storage_ClassDiagram.puml (100%) rename docs/Diagrams/PUML files/{ => Storage}/Storage_sequenceDiagram.puml (100%) diff --git a/docs/Diagrams/AddCommand_SequenceDiagram.png b/docs/Diagrams/Images/AddCommand_SequenceDiagram.png similarity index 100% rename from docs/Diagrams/AddCommand_SequenceDiagram.png rename to docs/Diagrams/Images/AddCommand_SequenceDiagram.png diff --git a/docs/Diagrams/Storage_ClassDiagram.png b/docs/Diagrams/Images/Storage/Storage_ClassDiagram.png similarity index 100% rename from docs/Diagrams/Storage_ClassDiagram.png rename to docs/Diagrams/Images/Storage/Storage_ClassDiagram.png diff --git a/docs/Diagrams/Storage_sequenceDiagram.png b/docs/Diagrams/Images/Storage/Storage_sequenceDiagram.png similarity index 100% rename from docs/Diagrams/Storage_sequenceDiagram.png rename to docs/Diagrams/Images/Storage/Storage_sequenceDiagram.png diff --git a/docs/Diagrams/PUML files/Storage_ClassDiagram.puml b/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/Storage_ClassDiagram.puml rename to docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml diff --git a/docs/Diagrams/PUML files/Storage_sequenceDiagram.puml b/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/Storage_sequenceDiagram.puml rename to docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml From 4ba467550bae2d833424d2288d13c440f1f1d715 Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 21:52:49 +0800 Subject: [PATCH 298/421] Add loggers --- docs/DeveloperGuide.md | 4 +- src/main/java/command/BestsellerCommand.java | 2 +- src/main/java/command/DeleteCommand.java | 4 ++ src/main/java/command/EditCommand.java | 3 ++ src/main/java/command/FindCommand.java | 2 + src/main/java/command/IncorrectCommand.java | 4 ++ src/main/java/command/ListCommand.java | 5 ++ src/main/java/command/SellCommand.java | 7 +++ src/main/java/itemlist/Cashier.java | 48 ++++++++++++++------ src/main/java/itemlist/Itemlist.java | 7 +++ src/main/java/seedu/duke/StockMaster.java | 3 ++ 11 files changed, 73 insertions(+), 16 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e1e32996e1..80236694cd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -38,9 +38,9 @@ It contains command formats that must be adhered to for the methods to be called the Itemlist by `addItem()` method. ### Class diagram -![Storage_ClassDiagram](./Diagrams/Storage_ClassDiagram.png) +![Storage_ClassDiagram](Diagrams/Images/Storage/Storage_ClassDiagram.png) ### Sequence diagram -![Storage_sequenceDiagram](./Diagrams/Storage_sequenceDiagram.png) +![Storage_sequenceDiagram](Diagrams/Images/Storage/Storage_sequenceDiagram.png) ### UI diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index 2100e85269..ec7299c6e0 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -10,7 +10,7 @@ public class BestsellerCommand extends Command { //@author LowTL @Override - public void execute() { + public void execute() throws EmptyListException { Item bs = Cashier.getBestseller(); try { if (bs == null) { diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 7232383dce..f850695949 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -5,6 +5,8 @@ import itemlist.Itemlist; import storage.Storage; +import java.util.logging.Level; + public class DeleteCommand extends Command { protected String itemName; @@ -34,8 +36,10 @@ public void execute() throws EmptyListException { } else { assert (!Itemlist.getItem(index).getItemName().equals(itemName)); } + LOGGER.info("Item successfully deleted."); } } catch (IndexOutOfBoundsException | EmptyListException e) { + LOGGER.warning("Item not deleted."); System.out.println("Itemlist is empty."); } } diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index bca282cde2..587d1d010e 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -66,9 +66,11 @@ public void execute() { } if (index == -1) { // if item is not found //throw exception; + LOGGER.warning("Item not found."); ui.TextUi.replyToUser("item not found!"); } else { Item item = Itemlist.getItem(index); + assert item != null; String itemName = item.getItemName(); ui.TextUi.replyToUser("\n" + "Edited: "); if (!newItemName.equals("NA")) { // check if itemName was edited @@ -102,6 +104,7 @@ public void execute() { } } ui.TextUi.replyToUser("End of Edits"); + LOGGER.info("Edit run successfully."); ui.TextUi.replyToUser(""); Storage.overwriteFile(Itemlist.getItems()); } diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index b4d0de3e0f..6d671a0350 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -33,6 +33,7 @@ public void execute() throws EmptyListException { } ArrayList searchList = filterList(); TextUi.showList(searchList); + LOGGER.info("Itemlist successfully filtered."); } public ArrayList filterList() throws EmptyListException { @@ -60,6 +61,7 @@ public ArrayList filterList() throws EmptyListException { } } if (searchList.isEmpty()) { + LOGGER.warning("Item not found."); throw new EmptyListException("No items found!"); } return searchList; diff --git a/src/main/java/command/IncorrectCommand.java b/src/main/java/command/IncorrectCommand.java index d142382994..b08e1f6083 100644 --- a/src/main/java/command/IncorrectCommand.java +++ b/src/main/java/command/IncorrectCommand.java @@ -3,6 +3,10 @@ public class IncorrectCommand extends Command { + public IncorrectCommand() { + LOGGER.warning("Incorrect Command received."); + } + @Override public void execute() { } diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index e9af15bdf5..e12a6f5d8f 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -67,14 +67,19 @@ public void execute() throws EmptyListException { if (containsTransactions(transactionList)) { showTransactionList(); + LOGGER.info("Transactions listed."); } else if (containsPromotions(promotionList)) { showPromotionList(); + LOGGER.info("Promotions listed."); } else if (category.equals("NA") && !isListMarked) { TextUi.showList(itemList); + LOGGER.info("All items listed."); } else if (containsItems(itemList)) { showCustomizedItemList(); + LOGGER.info("Items listed."); } else { TextUi.replyToUser(Messages.EMPTY_LIST); + LOGGER.warning("No items found."); } } diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 13a60cc411..597bc905f1 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -8,6 +8,8 @@ import storage.Storage; import storage.TransactionLogs; +import java.util.Objects; + public class SellCommand extends Command { protected String itemName; @@ -41,24 +43,29 @@ public void execute() throws CommandFormatException { } if (index == -1) { //throw exception; + LOGGER.warning("Item not found."); System.out.println("Item not found!"); return; } + assert (Objects.nonNull(Itemlist.getItem(index))); int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; float getSellPrice = Itemlist.getItem(index).getSellPrice(); float sellPrice = (this.discount >= 0) ? this.discount * getSellPrice : getSellPrice; if (toSell.getIsOOS() || remainingQuantity < 0) { + LOGGER.warning("Item has insufficient quantity."); System.out.println("There is insufficient stock!"); return; } else { ui.TextUi.showSellMessage(itemName, sellQuantity, remainingQuantity, sellPrice); Itemlist.editQuantity(index, remainingQuantity); + LOGGER.info("Item successfully sold."); } Storage.overwriteFile(Itemlist.getItems()); Transaction newTransaction = new Transaction(Itemlist.getItem(index).getItemName(), sellQuantity, toSell.getBuyPrice(), sellPrice); Cashier.addItem(newTransaction); TransactionLogs.addToLog(Cashier.getTransactions()); + LOGGER.info("Transaction successfully recorded."); } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index ad5c402c76..600e4e618c 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -5,9 +5,11 @@ import item.Transaction; import java.util.ArrayList; +import java.util.logging.Logger; public class Cashier extends Itemlist { + protected static final Logger logger = Logger.getLogger(Cashier.class.getName()); private static final ArrayList transactions = new ArrayList<>(); public static void addItem(Transaction transaction) { @@ -26,19 +28,27 @@ public static ArrayList getTransactions(String itemName) { results.add(t); } } + logger.info("Transactions filtered."); return results; } else { + logger.warning("No transactions found."); return null; } } public static float getTotalRevenue() { float totalRevenue = 0; - ArrayList allTransactions = getTransactions(); - if (!allTransactions.isEmpty()) { + try { + ArrayList allTransactions = getTransactions(); + if (allTransactions.isEmpty()) { + throw new EmptyListException("Transaction"); + } for (Transaction t : allTransactions) { totalRevenue += t.getTotalPrice(); } + } catch (EmptyListException e) { + logger.warning("No transactions found."); + return 0; } return totalRevenue; } @@ -49,12 +59,13 @@ public static float getTotalProfit() { if (transactions.isEmpty()) { throw new EmptyListException("Transaction"); } + for (Transaction t : transactions) { + totalProfit += t.getProfit(); + } } catch (EmptyListException e) { + logger.warning("No transactions found."); return 0; } - for (Transaction t : transactions) { - totalProfit += t.getProfit(); - } return totalProfit; } @@ -63,24 +74,35 @@ public static Transaction getTransaction(int index) { return transactions.get(index); } catch (IndexOutOfBoundsException e) { if (index == 0) { + logger.warning("No transactions found."); System.out.println("No transactions found."); } else { + logger.warning("Index out of bounds."); System.out.println("Index " + index + " entered is out of bound."); } return null; } } - public static Item getBestseller() { - Item bestSeller = Itemlist.getItem(0); + public static Item getBestseller() throws EmptyListException { + Item bestSeller = null; float[] profits = new float[Itemlist.items.size()]; - for (Transaction t: transactions) { - profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); - } - for (int i = 1; i < Itemlist.items.size(); i++) { - if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { - bestSeller = Itemlist.getItem(i); + try { + if (transactions.isEmpty()) { + throw new EmptyListException("Transaction"); + } + assert(Itemlist.noOfItems > 0); + bestSeller = Itemlist.getItem(0); + for (Transaction t: transactions) { + profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); + } + for (int i = 1; i < Itemlist.items.size(); i++) { + if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { + bestSeller = Itemlist.getItem(i); + } } + } catch (EmptyListException e) { + logger.warning("No transactions found."); } return bestSeller; } diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index dbf407626b..78655fc687 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -3,9 +3,12 @@ import item.Item; import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; public class Itemlist { public static int noOfItems; + protected static final Logger logger = Logger.getLogger(Itemlist.class.getName()); protected static ArrayList items = new ArrayList<>(); public Itemlist() { @@ -44,8 +47,10 @@ public static Item getItem(int index) { return items.get(index); } catch (IndexOutOfBoundsException e) { if (index != 0) { + logger.log(Level.WARNING, "Index out of bound", e); System.out.println("Index " + index + " entered is out of bound."); } else { + logger.warning("There are no items."); System.out.println("There are no items added yet!"); } return null; @@ -55,9 +60,11 @@ public static Item getItem(int index) { public static Item getItem(String name) { for (Item i: items) { if (i.getItemName().equals(name)) { + logger.info("Item found."); return i; } } + logger.warning("Item not found."); return null; } public static int getIndex(Item item) { diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index aafa6123f6..662067c640 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -5,6 +5,7 @@ import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; +import itemlist.Cashier; import parser.Parser; import storage.PromotionStorage; import storage.Storage; @@ -56,6 +57,7 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti private static void initLogger() { Logger parserLogger = Logger.getLogger(Parser.class.getName()); Logger commandLogger = Logger.getLogger(Command.class.getName()); + Logger cashierLogger = Logger.getLogger(Cashier.class.getName()); LogManager.getLogManager().reset(); //clears out any default settings ConsoleHandler ch = new ConsoleHandler(); //to print errors to console logger.addHandler(ch); @@ -72,6 +74,7 @@ private static void initLogger() { logger.addHandler(fh); parserLogger.addHandler(fh); commandLogger.addHandler(fh); + cashierLogger.addHandler(fh); } catch (IOException e) { logger.log(Level.SEVERE, "Unable to create FileHandler", e); } From 0fd810eed2867d6831dafd24545a3dacf3753f7a Mon Sep 17 00:00:00 2001 From: LowTL Date: Fri, 12 Apr 2024 21:55:08 +0800 Subject: [PATCH 299/421] Update DeleteCommand logging --- src/main/java/command/DeleteCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index f850695949..aa1e11c519 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -39,7 +39,7 @@ public void execute() throws EmptyListException { LOGGER.info("Item successfully deleted."); } } catch (IndexOutOfBoundsException | EmptyListException e) { - LOGGER.warning("Item not deleted."); + LOGGER.log(Level.WARNING, "Item not deleted.", e); System.out.println("Itemlist is empty."); } } From 192bf2ec461b85b22cdaf2d9e42102a588c1d2b4 Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 01:38:18 +0800 Subject: [PATCH 300/421] Add Junit Test for Promotion class --- PromotionStorage.txt | 12 + StockMasterData.txt | 10 +- TransactionLogs.txt | 112 +++++++++ docs/team/hengshuhong.md | 2 +- src/main/java/command/AddCommand.java | 2 +- .../java/command/AddPromotionCommand.java | 2 +- src/main/java/common/Messages.java | 3 +- .../java/exceptions/InvalidDateException.java | 3 + src/main/java/promotion/Promotion.java | 8 +- src/main/java/promotion/Promotionlist.java | 18 +- .../java/command/AddPromotionCommandTest.java | 233 ++++++++++++++++++ .../java/command/DeletePromotionTest.java | 47 ++++ src/test/java/command/SellCommandTest.java | 1 + src/test/java/parser/ParserTest.java | 36 ++- 14 files changed, 469 insertions(+), 20 deletions(-) create mode 100644 src/test/java/command/AddPromotionCommandTest.java create mode 100644 src/test/java/command/DeletePromotionTest.java diff --git a/PromotionStorage.txt b/PromotionStorage.txt index e69de29bb2..82d5376463 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -0,0 +1,12 @@ +apple have a 30.00% discount +Period: 29 FEB 2024 to 4 APR 2024 +Time: 0 to 1100 +durian have a 30.00% discount +Period: 2 APR 2024 to 4 APR 2024 +Time: 0 to 1100 +mango have a 30.00% discount +Period: 29 FEB 2024 to 4 APR 2026 +Time: 0 to 1100 +lemon have a 30.00% discount +Period: 2 FEB 2024 to 4 APR 2025 +Time: 0 to 2359 diff --git a/StockMasterData.txt b/StockMasterData.txt index 4dc4f77cb1..c4e4adc655 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,9 @@ -1. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | [ ] | lemon | Qty: 6 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +2. | [ ] | banana | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +3. | [ ] | apple | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +4. | [ ] | durian | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +5. | [ ] | mango | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +6. | [ ] | cherry | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +7. | [ ] | orange | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 +8. | [ ] | apple iphone | Qty: 100000 pieces | Cat: electronics | BuyPrice: $100.5 | SellPrice: $400.1 +9. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index 22cc8bba26..5384a1b08f 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -14,3 +14,115 @@ Unit Price: 30.0 Total Price: 30.0 Profit: 29.0 +Date: 2024-04-12 11:40:13 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 11:48:23 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 17:59:00 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 18:16:45 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 18:44:44 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 18:45:34 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 18:47:58 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 18:49:32 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 19:07:49 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-13 01:10:22 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-13 01:17:13 +Transaction ID: 13 +Item Name: lemon +Quantity: 1 +Unit Price: 1.0 +Total Price: 1.0 +Profit: 0.0 + +Date: 2024-04-13 01:21:38 +Transaction ID: 14 +Item Name: lemon +Quantity: 1 +Unit Price: 0.5 +Total Price: 0.5 +Profit: -0.5 + +Date: 2024-04-13 01:23:34 +Transaction ID: 15 +Item Name: lemon +Quantity: 1 +Unit Price: 0.5 +Total Price: 0.5 +Profit: -0.5 + +Date: 2024-04-13 01:36:57 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 0b7683b9d6..86ab948da6 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -8,7 +8,7 @@ manage and operate their business. ### Code Contribution - + - **New Feature:** Added the capability to add/delete/list promotions - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index fdc15357b6..80b5d899f1 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -57,7 +57,7 @@ public void execute() { if (!category.equals("NA")) { System.out.println(" to " + getCategory()); } else { - System.out.println(); + System.out.println(""); assert category.equals("NA"); } } diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index ae7935eca6..f0a8953611 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -39,7 +39,7 @@ public void execute() throws InvalidDateException, CommandFormatException { String.format("%04d", promotion.getEndTime()) ); } catch (InvalidDateException | CommandFormatException e){ - System.out.println(""); + System.out.print(""); } } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index ded07d5354..55a81299e8 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -239,7 +239,7 @@ public class Messages { "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'"; public static final String ITEM_NOT_FOUND = "Item is not available"; - public static final String ITEM_NOT_ON_PROMO = "Promotion does not exits for this item and hence cannot be deleted"; + public static final String ITEM_NOT_ON_PROMO = "Promotion does not exists for this item and hence cannot be deleted"; public static final String INVALID_FIND_FORMAT = "Invalid command format. Please use format: " + "\n" + "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + "2. 'find /filter1/filter2 [KEYWORD]' to search under the filters"; @@ -255,6 +255,7 @@ public class Messages { public static final String INVALID_TIME = "Invalid Time Format. Please ensure that the time is in 24 hours " + "format and have a valid range:" + "\n" + "e.g. time /from 0000 /to 2359"; + public static final String INVALID_DATE = "Invalid Date has been entered. Please ensure that the date exists."; public static final String INVALID_MONTH = "Invalid Month has been entered. Please use format: MMM (e.g. JAN, DEC)"; public static final String INVALID_DISCOUNT = "Invalid Discount has been entered. " + diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java index 6f801f7a3c..cc1dda09a4 100644 --- a/src/main/java/exceptions/InvalidDateException.java +++ b/src/main/java/exceptions/InvalidDateException.java @@ -8,6 +8,9 @@ public InvalidDateException(String error) { case "INVALID_PERIOD": System.out.println(Messages.INVALID_PERIOD); break; + case "INVALID_DATE": + System.out.println(Messages.INVALID_DATE); + break; case "INVALID_TIME": System.out.println(Messages.INVALID_TIME); break; diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index f65615952c..7864ae328f 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -87,14 +87,10 @@ public String getItemName() { @Override public String toString() { - return getItemName() + " have a " + String.format("%.2f", (getDiscount()*100)) + + return getItemName() + " have a " + String.format("%.2f", (getDiscount() * 100)) + "% discount" + "\n" + "Period: " + getStartDate() + " " + getStartMonth() + " " - + getStartYear() + " to " + getEndDate()+ " " + getEndMonth() + " " + + + getStartYear() + " to " + getEndDate() + " " + getEndMonth() + " " + getEndYear() + "\n" + "Time: " + String.format("%04d", getStartTime()) + " to " + String.format("%04d", getEndTime()); } - - public void print(String args) { - TextUi.replyToUser(args); - } } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index be405c740b..65bc8be6c4 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -11,9 +11,6 @@ public class Promotionlist { private static final ArrayList promotions = new ArrayList<>(); - public Promotionlist() { - } - public static int getIndex(Promotion promotion) { return promotions.indexOf(promotion); } @@ -57,7 +54,7 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException throw new CommandFormatException("INVALID_DISCOUNT"); } if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { - throw new InvalidDateException("INVALID_PERIOD"); + throw new InvalidDateException("INVALID_DATE"); } if (!isValidTime(startTime, endTime)) { throw new InvalidDateException("INVALID_TIME"); @@ -87,16 +84,22 @@ public static boolean isPromoExistNow(String itemName) { int minute = currentDateTime.getMinute(); String formattedTime = String.valueOf(hour) + String.valueOf(minute); int time = Integer.parseInt(formattedTime); + if (time < promotion.getStartTime() || time > promotion.getEndTime()) { + return false; + } if (year < promotion.getStartYear() || year > promotion.getEndYear()) { return false; } + if (year > promotion.getStartYear() && year < promotion.getEndYear()) { + return true; + } if (month < promotion.getStartMonth().getValue() || month > promotion.getEndMonth().getValue()) { return false; } - if (day < promotion.getStartDate() || day > promotion.getEndDate()) { - return false; + if (month > promotion.getStartMonth().getValue() && month < promotion.getEndMonth().getValue()) { + return true; } - if (time < promotion.getStartTime() || time > promotion.getEndTime()) { + if (day < promotion.getStartDate() || day > promotion.getEndDate()) { return false; } return true; @@ -172,7 +175,6 @@ public static boolean isValidMonth(int date, Month month, int year) throws Inval case JUN: return date <= 30 && date >= 1; default: - System.out.println("Date does not exist."); throw new InvalidDateException("INVALID_PERIOD"); } } diff --git a/src/test/java/command/AddPromotionCommandTest.java b/src/test/java/command/AddPromotionCommandTest.java new file mode 100644 index 0000000000..13a90e31be --- /dev/null +++ b/src/test/java/command/AddPromotionCommandTest.java @@ -0,0 +1,233 @@ +package command; + +import common.Messages; +import exceptions.CommandFormatException; +import exceptions.EmptyListException; +import exceptions.InvalidDateException; +import org.junit.jupiter.api.Test; +import promotion.Month; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class AddPromotionCommandTest { + + @Test + public void addPromotionCommandTest1() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("apple", 1, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("apple", 0.30F, 29, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + addCommandTest1.execute(); + promotionTest1.execute(); + String expectedOutput1 = "added: apple (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + "The following promotion has been added" + System.lineSeparator() + + "apple have a 30.00% discount" + System.lineSeparator() + + "Period: 29 FEB 2024 to 4 APR 2024" + System.lineSeparator() + + "Time: 0000 to 1100" + System.lineSeparator(); + assertEquals(expectedOutput1, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e){ + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void addPromotionCommandTest2() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest2 = new AddCommand("durian", 1, "fruits", + "NA", 1, 1); + Command promotionTest2 = new AddPromotionCommand("durian", 0.30F, 2, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + addCommandTest2.execute(); + promotionTest2.execute(); + String expectedOutput2 = "added: durian (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + "The following promotion has been added" + System.lineSeparator() + + "durian have a 30.00% discount" + System.lineSeparator() + + "Period: 2 APR 2024 to 4 APR 2024" + System.lineSeparator() + + "Time: 0000 to 1100" + System.lineSeparator(); + assertEquals(expectedOutput2, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e){ + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void addPromotionCommandTest3() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest3 = new AddCommand("mango", 1, "fruits", + "NA", 1, 1); + Command promotionTest3 = new AddPromotionCommand("mango", 0.30F, 29, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2026, 0000, 1100); + addCommandTest3.execute(); + promotionTest3.execute(); + String expectedOutput3 = "added: mango (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + "The following promotion has been added" + System.lineSeparator() + + "mango have a 30.00% discount" + System.lineSeparator() + + "Period: 29 FEB 2024 to 4 APR 2026" + System.lineSeparator() + + "Time: 0000 to 1100" + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e){ + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void itemUnavailablePromotionCommandTest() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command promotionTest1 = new AddPromotionCommand("random", 0.30F, 2, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + promotionTest1.execute(); + String expectedOutput3 = + Messages.ITEM_NOT_FOUND + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e){ + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void invalidDiscountPromotionCommandTest() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("banana", 1, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("banana", 100F, 2, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + Command promotionTest2 = new AddPromotionCommand("banana", -1F, 2, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + addCommandTest1.execute(); + promotionTest1.execute(); + promotionTest2.execute(); + String expectedOutput3 = "added: banana (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + Messages.INVALID_DISCOUNT + System.lineSeparator() + + Messages.INVALID_DISCOUNT + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e){ + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void invalidTimePromotionCommandTest() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("lemon", 1, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("lemon", 0.3F, 29, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2024, -1000, 1100); + Command promotionTest2 = new AddPromotionCommand("lemon", 0.3F, 1, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 1200, 1100); + addCommandTest1.execute(); + promotionTest1.execute(); + promotionTest2.execute(); + String expectedOutput3 = "added: lemon (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + Messages.INVALID_TIME + System.lineSeparator() + + Messages.INVALID_TIME + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e) { + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void invalidDatePromotionCommandTest() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("cherry", 1, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("cherry", 0.3F, 30, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + Command promotionTest2 = new AddPromotionCommand("cherry", 0.3F, -1, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + addCommandTest1.execute(); + promotionTest1.execute(); + promotionTest2.execute(); + String expectedOutput3 = "added: cherry (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + Messages.INVALID_DATE + System.lineSeparator() + + Messages.INVALID_DATE + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e) { + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void invalidDurationPromotionCommandTest() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("orange", 1, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("orange", 0.3F, 4, Month.valueOf("APR"), + 2024, 2, Month.valueOf("APR"), 2024, 0000, 1100); + Command promotionTest2 = new AddPromotionCommand("orange", 0.3F, 4, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 2300); + Command promotionTest3 = new AddPromotionCommand("orange", 0.3F, 4, Month.valueOf("DEC"), + 2024, 5, Month.valueOf("APR"), 2024, 0000, 2300); + Command promotionTest4 = new AddPromotionCommand("orange", 0.3F, 4, Month.valueOf("APR"), + 2025, 5, Month.valueOf("APR"), 2024, 0000, 2300); + addCommandTest1.execute(); + promotionTest1.execute(); + promotionTest2.execute(); + promotionTest3.execute(); + promotionTest4.execute(); + String expectedOutput3 = "added: orange (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + Messages.INVALID_PERIOD + System.lineSeparator() + + Messages.INVALID_PERIOD + System.lineSeparator() + + Messages.INVALID_PERIOD + System.lineSeparator() + + Messages.INVALID_PERIOD + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e) { + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void itemIsOnPromoPromotionCommandTest() { + try { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command promotionTest1 = new AddPromotionCommand("apple", 0.3F, 5, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + promotionTest1.execute(); + String expectedOutput3 = + Messages.ITEM_IS_PROMO + System.lineSeparator(); + assertEquals(expectedOutput3, outputStreamCaptor.toString()); + } catch (InvalidDateException | CommandFormatException e) { + System.out.print(""); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/command/DeletePromotionTest.java b/src/test/java/command/DeletePromotionTest.java new file mode 100644 index 0000000000..1980e75c5a --- /dev/null +++ b/src/test/java/command/DeletePromotionTest.java @@ -0,0 +1,47 @@ +package command; + +import common.Messages; +import exceptions.CommandFormatException; +import exceptions.EmptyListException; +import exceptions.InvalidDateException; +import org.junit.jupiter.api.Test; +import promotion.Month; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class DeletePromotionTest { + + @Test + public void deletePromotionTest() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("apple iphone", 100000, "pieces", + "electronics", 100.5F, 400.1F); + Command promotionTest1 = new AddPromotionCommand("apple iphone", 0.30F, 1, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("DEC"), 2024, 0000, 2359); + Command deleteFail = new DeletePromotionCommand("test"); + Command deleteSuccess = new DeletePromotionCommand("apple iphone"); + try { + addCommandTest1.execute(); + promotionTest1.execute(); + deleteFail.execute(); + deleteSuccess.execute(); + String expectedOutput1 = "added: apple iphone (Qty: 100000 pieces, Buy: $100.5, Sell: $400.1) to electronics" + + System.lineSeparator() + + "The following promotion has been added" + System.lineSeparator() + + "apple iphone have a 30.00% discount" + System.lineSeparator() + + "Period: 1 FEB 2024 to 4 DEC 2024" + System.lineSeparator() + + "Time: 0000 to 2359" + System.lineSeparator() + + Messages.ITEM_NOT_ON_PROMO + System.lineSeparator() + + "Promotion for apple iphone has been removed" + System.lineSeparator(); + assertEquals(expectedOutput1, outputStreamCaptor.toString()); + } catch (CommandFormatException | InvalidDateException | EmptyListException e) { + throw new RuntimeException(e); + } + + } + +} diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index a71e8bc090..87d556d093 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -4,6 +4,7 @@ import exceptions.EmptyListException; import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; +import promotion.Month; import static org.junit.jupiter.api.Assertions.fail; diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index b974b7a513..88e7f3950e 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -1,5 +1,6 @@ package parser; +import command.AddPromotionCommand; import command.Command; import command.AddCommand; import command.EditCommand; @@ -9,8 +10,12 @@ import command.MarkCommand; import command.SellCommand; import command.UnmarkCommand; +import exceptions.CommandFormatException; +import exceptions.EmptyListException; +import exceptions.InvalidDateException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import promotion.Month; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -54,7 +59,7 @@ public void testParseEditCommand() { } @Test - public void testParseSellCommand() { + public void testParseSellCommand1() { String userInput = "sell ItemName qty/5"; Command command = parser.parseInput(userInput); assertInstanceOf(SellCommand.class, command); @@ -63,6 +68,26 @@ public void testParseSellCommand() { assertEquals(5, sellCommand.getSellQuantity()); } + @Test + public void testParseSellCommand2() { + Command addCommandTest1 = new AddCommand("lemon", 5, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("lemon", 0.3F, 2, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2025, 0000, 2359); + try { + promotionTest1.execute(); + addCommandTest1.execute(); + } catch (CommandFormatException | InvalidDateException | EmptyListException e) { + throw new RuntimeException(e); + } + String userInput1 = "sell lemon qty/1"; + Command command1 = parser.parseInput(userInput1); + assertInstanceOf(SellCommand.class, command1); + SellCommand sellCommand = (SellCommand) command1; + assertEquals("lemon", sellCommand.getItemName()); + assertEquals(1, sellCommand.getSellQuantity()); + } + @Test public void testParseFindCommand() { String userInput = "find /info Keyword"; @@ -106,4 +131,13 @@ public void testParseHelpCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(HelpCommand.class, command); } + + @Test + public void testParsePromotionCommand() { + String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to 3 Apr 2024 time /from 0000 /to 2359"; + Command command = parser.parseInput(userInput); + assertInstanceOf(AddPromotionCommand.class, command); + } } + + From 12580e366e916b7557b2bf8b1eed67bf647c4ae6 Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 02:24:04 +0800 Subject: [PATCH 301/421] Edit Add Command --- PromotionStorage.txt | 12 -- StockMasterData.txt | 10 +- TransactionLogs.txt | 128 ------------------ src/main/java/command/AddCommand.java | 13 +- src/main/java/command/FindCommand.java | 2 +- src/main/java/command/ListCommand.java | 2 +- src/main/java/common/Messages.java | 4 +- .../java/exceptions/EmptyListException.java | 8 +- src/main/java/item/Item.java | 2 +- .../java/command/AddPromotionCommandTest.java | 1 + src/test/java/command/FindCommandTest.java | 15 ++ src/test/java/promotion/PromotionTest.java | 20 +++ 12 files changed, 59 insertions(+), 158 deletions(-) create mode 100644 src/test/java/promotion/PromotionTest.java diff --git a/PromotionStorage.txt b/PromotionStorage.txt index 82d5376463..e69de29bb2 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,12 +0,0 @@ -apple have a 30.00% discount -Period: 29 FEB 2024 to 4 APR 2024 -Time: 0 to 1100 -durian have a 30.00% discount -Period: 2 APR 2024 to 4 APR 2024 -Time: 0 to 1100 -mango have a 30.00% discount -Period: 29 FEB 2024 to 4 APR 2026 -Time: 0 to 1100 -lemon have a 30.00% discount -Period: 2 FEB 2024 to 4 APR 2025 -Time: 0 to 2359 diff --git a/StockMasterData.txt b/StockMasterData.txt index c4e4adc655..8ef5894379 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,9 +1 @@ -1. | [ ] | lemon | Qty: 6 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -2. | [ ] | banana | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -3. | [ ] | apple | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -4. | [ ] | durian | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -5. | [ ] | mango | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -6. | [ ] | cherry | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -7. | [ ] | orange | Qty: 1 fruits | Cat: null | BuyPrice: $1.0 | SellPrice: $1.0 -8. | [ ] | apple iphone | Qty: 100000 pieces | Cat: electronics | BuyPrice: $100.5 | SellPrice: $400.1 -9. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 +1. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index 5384a1b08f..e69de29bb2 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -1,128 +0,0 @@ -Date: 2024-04-12 11:10:19 -Transaction ID: 1 -Item Name: apple -Quantity: 3 -Unit Price: 5.0 -Total Price: 15.0 -Profit: 3.0 - -Date: 2024-04-12 11:12:40 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 11:40:13 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 11:48:23 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 17:59:00 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 18:16:45 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 18:44:44 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 18:45:34 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 18:47:58 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 18:49:32 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-12 19:07:49 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-13 01:10:22 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - -Date: 2024-04-13 01:17:13 -Transaction ID: 13 -Item Name: lemon -Quantity: 1 -Unit Price: 1.0 -Total Price: 1.0 -Profit: 0.0 - -Date: 2024-04-13 01:21:38 -Transaction ID: 14 -Item Name: lemon -Quantity: 1 -Unit Price: 0.5 -Total Price: 0.5 -Profit: -0.5 - -Date: 2024-04-13 01:23:34 -Transaction ID: 15 -Item Name: lemon -Quantity: 1 -Unit Price: 0.5 -Total Price: 0.5 -Profit: -0.5 - -Date: 2024-04-13 01:36:57 -Transaction ID: 1 -Item Name: testItem -Quantity: 1 -Unit Price: 30.0 -Total Price: 30.0 -Profit: 29.0 - diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 80b5d899f1..a31ce4458d 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -69,12 +69,19 @@ public void updateQuantity(String itemName) { for (Item item : Itemlist.getItems()) { if (item.getItemName().toLowerCase().equals(itemName.toLowerCase())) { indexOfItem = Itemlist.getIndex(item); + break; } } assert indexOfItem != -1; - int currentQty = Itemlist.getItem(indexOfItem).getQuantity(); + Item item = Itemlist.getItem(indexOfItem); + assert item != null; + int currentQty = item.getQuantity(); int newQty = getQuantity() + currentQty; - new EditCommand(getItemName(), "NA", newQty, getUnitOfMeasurement(), getCategory(), getBuyPrice(), - getSellPrice()).execute(); + String newUOM = (getUnitOfMeasurement().equals(item.getUnitOfMeasurement())) ? "NA" : getUnitOfMeasurement(); + String newCat = (getCategory().equals(item.getCategory())) ? "NA" : getCategory(); + float newBuyPrice = (getBuyPrice() == (item.getBuyPrice())) ? -1 : getBuyPrice(); + float newSellPrice = (getSellPrice() == (item.getSellPrice())) ? -1 : getSellPrice(); + new EditCommand(getItemName(), "NA", newQty, newUOM, newCat, newBuyPrice, + newSellPrice).execute(); } } diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index b4d0de3e0f..bba67a864e 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -60,7 +60,7 @@ public ArrayList filterList() throws EmptyListException { } } if (searchList.isEmpty()) { - throw new EmptyListException("No items found!"); + throw new EmptyListException("Item"); } return searchList; } diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index d608f4cb13..94f773f517 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -66,7 +66,7 @@ public void execute() throws EmptyListException { } else if (containsItems(itemList)) { showCustomizedItemList(); } else { - TextUi.replyToUser(Messages.EMPTY_LIST); + throw new EmptyListException("Empty List"); } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 55a81299e8..5e7bc89785 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -237,13 +237,15 @@ public class Messages { "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'"; public static final String INVALID_SELL_FORMAT = "Invalid command format. Please use format: " + "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'"; - public static final String ITEM_NOT_FOUND = "Item is not available"; + public static final String ITEM_NOT_FOUND = "Item cannot be found/unavailable"; public static final String ITEM_NOT_ON_PROMO = "Promotion does not exists for this item and hence cannot be deleted"; public static final String INVALID_FIND_FORMAT = "Invalid command format. Please use format: " + "\n" + "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + "2. 'find /filter1/filter2 [KEYWORD]' to search under the filters"; + public static final String EMPTY_ITEM_LIST = "There are no items with your search query."; + public static final String EMPTY_TRANSACTION_LIST = "There are no transactions with your search query."; public static final String EMPTY_LIST = "There is nothing here! Time to spend some money and stock em up!"; public static final String WELCOME_MESSAGE = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index 3501081d38..40b4746734 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -1,15 +1,19 @@ package exceptions; +import common.Messages; + public class EmptyListException extends Exception { public EmptyListException(String error) { switch (error) { case "Item": - System.out.println("There are no items with your search query."); + System.out.println(Messages.EMPTY_ITEM_LIST); break; case "Transaction": - System.out.println("There are no transactions with your search query."); + System.out.println(Messages.EMPTY_TRANSACTION_LIST); break; + case "Empty List": + System.out.println(Messages.EMPTY_LIST); default: System.out.println(error); } diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index d2806287d0..bd532515fa 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -107,7 +107,7 @@ public boolean getMarkStatus() { public String toString() { String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; String markString = (this.isMark) ? "[X] " : "[ ] "; - return (markString + getItemName() + " (Qty: " + getQuantity() + getUnitOfMeasurement() + + return (markString + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); } } diff --git a/src/test/java/command/AddPromotionCommandTest.java b/src/test/java/command/AddPromotionCommandTest.java index 13a90e31be..510572b57d 100644 --- a/src/test/java/command/AddPromotionCommandTest.java +++ b/src/test/java/command/AddPromotionCommandTest.java @@ -6,6 +6,7 @@ import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; import promotion.Month; +import promotion.Promotion; import java.io.ByteArrayOutputStream; import java.io.PrintStream; diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 9b89595100..90ebc68fc7 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -1,25 +1,40 @@ package command; +import common.Messages; import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; import itemlist.Itemlist; import org.junit.jupiter.api.Test; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; public class FindCommandTest { @Test public void findCommandTest() throws CommandFormatException, InvalidDateException { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); Command addCommandTest1 = new AddCommand("testItem", 1, "EA", "NA", 1, 10); Command findCommand = new FindCommand("item","testItem"); Command findCommand2 = new FindCommand("NA","failFindCommand"); + Command findCommand3 = new FindCommand("qtybuysell","1"); try { addCommandTest1.execute(); findCommand.execute(); findCommand2.execute(); + findCommand3.execute(); + String expectedOutput1 = "added: testItem (Qty: 1 EA, Buy: $1, Sell: $1)" + + System.lineSeparator() + + "testItem (Qty: 1 EA, Buy: $1, Sell: $1)" + System.lineSeparator() + + Messages.EMPTY_ITEM_LIST + System.lineSeparator() + + "testItem (Qty: 1 EA, Buy: $1, Sell: $1)" + System.lineSeparator(); + assertEquals(expectedOutput1, outputStreamCaptor.toString()); } catch (EmptyListException e) { return; } diff --git a/src/test/java/promotion/PromotionTest.java b/src/test/java/promotion/PromotionTest.java new file mode 100644 index 0000000000..aa8b315c31 --- /dev/null +++ b/src/test/java/promotion/PromotionTest.java @@ -0,0 +1,20 @@ +package promotion; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class PromotionTest { + + @Test + public void testToString() { + Promotion promotion = new Promotion("Item", 0.1f, 1, Month.JAN, + 2022, 10, Month.FEB, 2023, 800, 1600); + + String expected = "Item have a 10.00% discount\n" + + "Period: 1 JAN 2022 to 10 FEB 2023\n" + + "Time: 0800 to 1600"; + assertEquals(expected, promotion.toString()); + } + } + From f6a53fccf98e738327d9266947b9baa3546164ce Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 02:25:29 +0800 Subject: [PATCH 302/421] Fix bug in Intellij for PPP --- docs/team/HengShuHong.md | 0 docs/team/hengshuhong.md | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 docs/team/HengShuHong.md diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 86ab948da6..0b7683b9d6 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -8,7 +8,7 @@ manage and operate their business. ### Code Contribution - + - **New Feature:** Added the capability to add/delete/list promotions - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell From dae6d6cbfd4d36e4e1f99f602b11928eccfeb7db Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 02:37:56 +0800 Subject: [PATCH 303/421] Fix checkstyle --- src/main/java/command/ListCommand.java | 2 -- src/main/java/common/Messages.java | 3 ++- .../java/exceptions/EmptyListException.java | 1 + src/main/java/itemlist/Cashier.java | 16 ++++++++-------- src/main/java/itemlist/Itemlist.java | 10 +++++----- src/main/java/promotion/Promotion.java | 2 -- .../java/command/AddPromotionCommandTest.java | 4 ---- src/test/java/command/DeletePromotionTest.java | 4 ++-- src/test/java/command/SellCommandTest.java | 1 - src/test/java/parser/ParserTest.java | 3 ++- src/test/java/promotion/PromotionTest.java | 18 +++++++++--------- 11 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index f96b55c5ad..f2442435e7 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -1,7 +1,6 @@ package command; import exceptions.EmptyListException; -import common.Messages; import item.Item; import item.Transaction; import itemlist.Cashier; @@ -80,7 +79,6 @@ public void execute() throws EmptyListException { } else { LOGGER.warning("No items found."); throw new EmptyListException("Empty List"); - } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index c9262ae671..56b2f7f863 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -239,7 +239,8 @@ public class Messages { "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'"; public static final String ITEM_NOT_FOUND = "Item cannot be found/unavailable"; - public static final String ITEM_NOT_ON_PROMO = "Promotion does not exists for this item and hence cannot be deleted"; + public static final String ITEM_NOT_ON_PROMO = "Promotion does not exists for this item and hence " + + "cannot be deleted"; public static final String INVALID_FIND_FORMAT = "Invalid command format. Please use format: " + "\n" + "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + "2. 'find /filter1/filter2 [KEYWORD]' to search under the filters"; diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index 40b4746734..ba92bae009 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -14,6 +14,7 @@ public EmptyListException(String error) { break; case "Empty List": System.out.println(Messages.EMPTY_LIST); + break; default: System.out.println(error); } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 600e4e618c..5d551ed3b5 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -9,7 +9,7 @@ public class Cashier extends Itemlist { - protected static final Logger logger = Logger.getLogger(Cashier.class.getName()); + protected static final Logger LOGGER = Logger.getLogger(Cashier.class.getName()); private static final ArrayList transactions = new ArrayList<>(); public static void addItem(Transaction transaction) { @@ -28,10 +28,10 @@ public static ArrayList getTransactions(String itemName) { results.add(t); } } - logger.info("Transactions filtered."); + LOGGER.info("Transactions filtered."); return results; } else { - logger.warning("No transactions found."); + LOGGER.warning("No transactions found."); return null; } } @@ -47,7 +47,7 @@ public static float getTotalRevenue() { totalRevenue += t.getTotalPrice(); } } catch (EmptyListException e) { - logger.warning("No transactions found."); + LOGGER.warning("No transactions found."); return 0; } return totalRevenue; @@ -63,7 +63,7 @@ public static float getTotalProfit() { totalProfit += t.getProfit(); } } catch (EmptyListException e) { - logger.warning("No transactions found."); + LOGGER.warning("No transactions found."); return 0; } return totalProfit; @@ -74,10 +74,10 @@ public static Transaction getTransaction(int index) { return transactions.get(index); } catch (IndexOutOfBoundsException e) { if (index == 0) { - logger.warning("No transactions found."); + LOGGER.warning("No transactions found."); System.out.println("No transactions found."); } else { - logger.warning("Index out of bounds."); + LOGGER.warning("Index out of bounds."); System.out.println("Index " + index + " entered is out of bound."); } return null; @@ -102,7 +102,7 @@ public static Item getBestseller() throws EmptyListException { } } } catch (EmptyListException e) { - logger.warning("No transactions found."); + LOGGER.warning("No transactions found."); } return bestSeller; } diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index 78655fc687..dd8d1242af 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -8,7 +8,7 @@ public class Itemlist { public static int noOfItems; - protected static final Logger logger = Logger.getLogger(Itemlist.class.getName()); + protected static final Logger LOGGER = Logger.getLogger(Itemlist.class.getName()); protected static ArrayList items = new ArrayList<>(); public Itemlist() { @@ -47,10 +47,10 @@ public static Item getItem(int index) { return items.get(index); } catch (IndexOutOfBoundsException e) { if (index != 0) { - logger.log(Level.WARNING, "Index out of bound", e); + LOGGER.log(Level.WARNING, "Index out of bound", e); System.out.println("Index " + index + " entered is out of bound."); } else { - logger.warning("There are no items."); + LOGGER.warning("There are no items."); System.out.println("There are no items added yet!"); } return null; @@ -60,11 +60,11 @@ public static Item getItem(int index) { public static Item getItem(String name) { for (Item i: items) { if (i.getItemName().equals(name)) { - logger.info("Item found."); + LOGGER.info("Item found."); return i; } } - logger.warning("Item not found."); + LOGGER.warning("Item not found."); return null; } public static int getIndex(Item item) { diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index 7864ae328f..f300aaa236 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -1,7 +1,5 @@ package promotion; -import ui.TextUi; - public class Promotion { protected String itemName; diff --git a/src/test/java/command/AddPromotionCommandTest.java b/src/test/java/command/AddPromotionCommandTest.java index 510572b57d..0b44894903 100644 --- a/src/test/java/command/AddPromotionCommandTest.java +++ b/src/test/java/command/AddPromotionCommandTest.java @@ -6,13 +6,9 @@ import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; import promotion.Month; -import promotion.Promotion; - import java.io.ByteArrayOutputStream; import java.io.PrintStream; - import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; public class AddPromotionCommandTest { diff --git a/src/test/java/command/DeletePromotionTest.java b/src/test/java/command/DeletePromotionTest.java index 1980e75c5a..69677b730a 100644 --- a/src/test/java/command/DeletePromotionTest.java +++ b/src/test/java/command/DeletePromotionTest.java @@ -29,8 +29,8 @@ public void deletePromotionTest() { promotionTest1.execute(); deleteFail.execute(); deleteSuccess.execute(); - String expectedOutput1 = "added: apple iphone (Qty: 100000 pieces, Buy: $100.5, Sell: $400.1) to electronics" - + System.lineSeparator() + + String expectedOutput1 = "added: apple iphone (Qty: 100000 pieces, Buy: $100.5, Sell: $400.1) " + + "to electronics" + System.lineSeparator() + "The following promotion has been added" + System.lineSeparator() + "apple iphone have a 30.00% discount" + System.lineSeparator() + "Period: 1 FEB 2024 to 4 DEC 2024" + System.lineSeparator() + diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index 87d556d093..a71e8bc090 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -4,7 +4,6 @@ import exceptions.EmptyListException; import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; -import promotion.Month; import static org.junit.jupiter.api.Assertions.fail; diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 88e7f3950e..8ef0219a7b 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -134,7 +134,8 @@ public void testParseHelpCommand() { @Test public void testParsePromotionCommand() { - String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to 3 Apr 2024 time /from 0000 /to 2359"; + String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to " + + "3 Apr 2024 time /from 0000 /to 2359"; Command command = parser.parseInput(userInput); assertInstanceOf(AddPromotionCommand.class, command); } diff --git a/src/test/java/promotion/PromotionTest.java b/src/test/java/promotion/PromotionTest.java index aa8b315c31..6f15664271 100644 --- a/src/test/java/promotion/PromotionTest.java +++ b/src/test/java/promotion/PromotionTest.java @@ -6,15 +6,15 @@ public class PromotionTest { - @Test - public void testToString() { - Promotion promotion = new Promotion("Item", 0.1f, 1, Month.JAN, - 2022, 10, Month.FEB, 2023, 800, 1600); + @Test + public void testToString() { + Promotion promotion = new Promotion("Item", 0.1f, 1, Month.JAN, + 2022, 10, Month.FEB, 2023, 800, 1600); - String expected = "Item have a 10.00% discount\n" + - "Period: 1 JAN 2022 to 10 FEB 2023\n" + - "Time: 0800 to 1600"; - assertEquals(expected, promotion.toString()); - } + String expected = "Item have a 10.00% discount\n" + + "Period: 1 JAN 2022 to 10 FEB 2023\n" + + "Time: 0800 to 1600"; + assertEquals(expected, promotion.toString()); } +} From fa4f274161a25444907b5431c5e41c96dc89cd2d Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 03:19:34 +0800 Subject: [PATCH 304/421] Add JavaDocs --- src/main/java/command/AddCommand.java | 17 +++- .../java/command/AddPromotionCommand.java | 11 ++- .../java/command/DeletePromotionCommand.java | 7 ++ src/main/java/command/FindCommand.java | 12 +++ .../java/exceptions/InvalidDateException.java | 1 + src/main/java/promotion/Promotion.java | 25 ++--- src/main/java/promotion/Promotionlist.java | 99 ++++++++++++++++--- src/main/java/storage/PromotionStorage.java | 28 +++--- src/main/java/storage/Storage.java | 4 +- 9 files changed, 160 insertions(+), 44 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 61aada1fa0..c6ddb64a4f 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package command; import item.Item; @@ -46,10 +47,15 @@ public float getSellPrice() { return sellPrice; } + + /** + * Adds item to the item list + * Category is an optional parameter and will be set to "NA" if left empty + */ @Override public void execute() { if (Itemlist.itemIsExist(itemName)) { - updateQuantity(itemName); + updateItemInfo(itemName); LOGGER.info("Edited item instead."); } else { Itemlist.addItem(toAdd); @@ -66,7 +72,14 @@ public void execute() { } } - public void updateQuantity(String itemName) { + /** + * Performs an edit on the item if the item already exists in the item list + * Only the item information that are different will be edited + * + * @param itemName + */ + + public void updateItemInfo(String itemName) { System.out.println("Item already exists and item information has been updated"); int indexOfItem = -1; for (Item item : Itemlist.getItems()) { diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index 49435d7675..a81e54723a 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package command; import exceptions.CommandFormatException; @@ -28,6 +29,12 @@ public AddPromotionCommand( LOGGER.info("AddPromotion successfully created."); } + /** + * Adds a new promotion for an item that is in the item list + * + * @throws InvalidDateException if there is an invalid date for promotion + * @throws CommandFormatException if item is not found in the list or there is an invalid discount + */ @Override public void execute() throws InvalidDateException, CommandFormatException { try { @@ -35,8 +42,8 @@ public void execute() throws InvalidDateException, CommandFormatException { TextUi.replyToUser( "The following promotion has been added", promotion.getItemName() + " have a " + String.format("%.2f", promotion.getDiscount() * 100) + - "% discount", "Period: " + promotion.getStartDate() + " " + promotion.getStartMonth() + - " " + promotion.getStartYear() + " to " + promotion.getEndDate() + " " + + "% discount", "Period: " + promotion.getStartDay() + " " + promotion.getStartMonth() + + " " + promotion.getStartYear() + " to " + promotion.getEndDay() + " " + promotion.getEndMonth() + " " + promotion.getEndYear(), "Time: " + String.format("%04d", promotion.getStartTime()) + " to " + String.format("%04d", promotion.getEndTime()) diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java index 1d55aed7d3..eb18cad9af 100644 --- a/src/main/java/command/DeletePromotionCommand.java +++ b/src/main/java/command/DeletePromotionCommand.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package command; import common.Messages; @@ -14,6 +15,12 @@ public class DeletePromotionCommand extends Command { public DeletePromotionCommand(String itemName) { this.itemName = itemName; } + + /** + * Deletes a promotion from the promotion list + * + * @throws CommandFormatException is thrown when the promotion for the item does not exists + */ @Override public void execute() throws CommandFormatException { if (Promotionlist.itemIsOnPromo(itemName)) { diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 914e2c72bb..faab55a4dd 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package command; import exceptions.EmptyListException; @@ -26,6 +27,11 @@ public String getKeyword() { return keyword; } + /** + * Searches for item(s) given a specified keyword + * + * @throws EmptyListException when the filtered list is empty (nothing found) + */ @Override public void execute() throws EmptyListException { if (itemInfo.equals("NA")) { @@ -36,6 +42,12 @@ public void execute() throws EmptyListException { LOGGER.info("Itemlist successfully filtered."); } + /** + * Enhances the find feature by searching through a filtered list, e.g. search for "fruits" in /item /uom + * + * @return a list of items that matches the filter and the keyword + * @throws EmptyListException when the filtered list is empty (nothing found) + */ public ArrayList filterList() throws EmptyListException { ArrayList searchList = new ArrayList<>(); for (Item item : Itemlist.getItems()) { diff --git a/src/main/java/exceptions/InvalidDateException.java b/src/main/java/exceptions/InvalidDateException.java index cc1dda09a4..2a6bef3c12 100644 --- a/src/main/java/exceptions/InvalidDateException.java +++ b/src/main/java/exceptions/InvalidDateException.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package exceptions; import common.Messages; diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index f300aaa236..853ed27435 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package promotion; public class Promotion { @@ -6,13 +7,13 @@ public class Promotion { protected Float discount; - protected int startDate; + protected int startDay; protected Month startMonth; protected int startYear; - protected int endDate; + protected int endDay; protected Month endMonth; @@ -25,16 +26,16 @@ public class Promotion { public Promotion( String itemName, Float discount, - int startDate, Month startMonth, int startYear, - int endDate, Month endMonth, int endYear, + int startDay, Month startMonth, int startYear, + int endDay, Month endMonth, int endYear, int startTime, int endTime) { this.itemName = itemName; this.discount = discount; - this.startDate = startDate; + this.startDay = startDay; this.startMonth = startMonth; this.startYear = startYear; - this.endDate = endDate; + this.endDay = endDay; this.endMonth = endMonth; this.endYear = endYear; this.startTime = startTime; @@ -47,8 +48,8 @@ public float getDiscount() { return discount; } - public int getStartDate() { - return startDate; + public int getStartDay() { + return startDay; } public Month getStartMonth() { @@ -59,8 +60,8 @@ public int getStartYear() { return startYear; } - public int getEndDate() { - return endDate; + public int getEndDay() { + return endDay; } public Month getEndMonth() { @@ -86,8 +87,8 @@ public String getItemName() { @Override public String toString() { return getItemName() + " have a " + String.format("%.2f", (getDiscount() * 100)) + - "% discount" + "\n" + "Period: " + getStartDate() + " " + getStartMonth() + " " - + getStartYear() + " to " + getEndDate() + " " + getEndMonth() + " " + + "% discount" + "\n" + "Period: " + getStartDay() + " " + getStartMonth() + " " + + getStartYear() + " to " + getEndDay() + " " + getEndMonth() + " " + getEndYear() + "\n" + "Time: " + String.format("%04d", getStartTime()) + " to " + String.format("%04d", getEndTime()); } diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 65bc8be6c4..d1e4a0ee8f 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package promotion; import exceptions.CommandFormatException; @@ -19,6 +20,12 @@ public static void deletePromotion(int index) { promotions.remove(index); } + /** + * Boolean to determine if the item has an existing promotion + * + * @param itemName name of item + * @return true if item is on promotion, false if item is not on promotion + */ public static boolean itemIsOnPromo(String itemName) { for (Promotion promotion : promotions) { if (promotion.getItemName().toLowerCase().equals(itemName)) { @@ -28,13 +35,27 @@ public static boolean itemIsOnPromo(String itemName) { return false; } + /** + * Checks if the year is a leap year + * + * @param year + * @return true if it is leap year, false if it is not + */ public static boolean isLeapYear(int year) { return year % 4 == 0; } + /** + * Adds a promotion to promotionlist. + * Multiple checks are done to ensure that the promotion entered is valid. + * + * @param promotion + * @throws InvalidDateException is thrown when the date or time is invalid + * @throws CommandFormatException is thrown when discount is invalid or item is not found + */ public static void addPromotion(Promotion promotion) throws InvalidDateException, CommandFormatException { - int startDate = promotion.getStartDate(); - int endDate = promotion.getEndDate(); + int startDay = promotion.getStartDay(); + int endDate = promotion.getEndDay(); Month startMonth = promotion.getStartMonth(); Month endMonth = promotion.getEndMonth(); int startYear = promotion.getStartYear(); @@ -53,19 +74,25 @@ public static void addPromotion(Promotion promotion) throws InvalidDateException if (!isValidDiscount(discount)) { throw new CommandFormatException("INVALID_DISCOUNT"); } - if (!isValidMonth(startDate, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { + if (!isValidMonth(startDay, startMonth, startYear) || !isValidMonth(endDate, endMonth, endYear)) { throw new InvalidDateException("INVALID_DATE"); } if (!isValidTime(startTime, endTime)) { throw new InvalidDateException("INVALID_TIME"); } - if (!isValidDuration(startDate, startMonth, startYear, endDate, endMonth, endYear)) { + if (!isValidDuration(startDay, startMonth, startYear, endDate, endMonth, endYear)) { throw new InvalidDateException("INVALID_PERIOD"); } promotions.add(promotion); PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); } + /** + * Checks if the input discount is valid + * + * @param discount + * @return true if the discount ranges from 0 to 1, returns false otherwise + */ public static boolean isValidDiscount (float discount) { return !(discount < 0) && !(discount > 1); } @@ -99,12 +126,20 @@ public static boolean isPromoExistNow(String itemName) { if (month > promotion.getStartMonth().getValue() && month < promotion.getEndMonth().getValue()) { return true; } - if (day < promotion.getStartDate() || day > promotion.getEndDate()) { + if (day < promotion.getStartDay() || day > promotion.getEndDay()) { return false; } return true; } + + /** + * Checks if the time of promotion is valid + * + * @param startTime starting time of the promotion + * @param endTime ending time of the promotion + * @return true if time ranges from 0000 and 2359, and ending time is later than starting time + */ public static boolean isValidTime(int startTime, int endTime) { String startTimeStr = String.format("%04d", startTime); String endTimeStr = String.format("%04d", endTime); @@ -119,6 +154,12 @@ public static boolean isValidTime(int startTime, int endTime) { return true; } + /** + * Checks if time ranges from 0000 and 2359 + * + * @param timeStr time with String datatype + * @return true if hour ranges from 0 to 23, minutes ranges from 0 to 59 + */ public static boolean isVerifiedTime(String timeStr) { String[] splitTime = timeStr.split("(?<=.)"); if (splitTime.length != 4) { @@ -133,7 +174,20 @@ public static boolean isVerifiedTime(String timeStr) { return min <= 59 && min >= 0; } - public static boolean isValidDuration (int startDate, Month startMonth, int startYear, int endDate, Month endMonth, + + /** + * Checks if the duration of the promotion period is valid + * + * @param startDay + * @param startMonth + * @param startYear + * @param endDay + * @param endMonth + * @param endYear + * @return true if promotion period is valid + * @return false if end of promotion is earlier than the start of promotion + */ + public static boolean isValidDuration (int startDay, Month startMonth, int startYear, int endDay, Month endMonth, int endYear) { int startMonthInt = startMonth.getValue(); int endMonthInt = endMonth.getValue(); @@ -147,19 +201,28 @@ public static boolean isValidDuration (int startDate, Month startMonth, int star } else if (endMonthInt < startMonthInt) { return false; } - if (endDate > startDate) { + if (endDay > startDay) { return true; } return false; } - public static boolean isValidMonth(int date, Month month, int year) throws InvalidDateException { + /** + * Checks if the day exists in the month specified + * + * @param day + * @param month + * @param year + * @return + * @throws InvalidDateException + */ + public static boolean isValidMonth(int day, Month month, int year) throws InvalidDateException { switch (month) { case FEB: - if (isLeapYear(year) && (date < 30 && date > 0)) { + if (isLeapYear(year) && (day < 30 && day > 0)) { return true; } else { - return date <= 28 && date >= 1; + return day <= 28 && day >= 1; } case JAN: //fall through case MAR: //fall through @@ -168,17 +231,24 @@ public static boolean isValidMonth(int date, Month month, int year) throws Inval case DEC: //fall through case OCT: //fall through case AUG: - return date <= 31 && date >= 1; + return day <= 31 && day >= 1; case APR: //fall through case SEP: //fall through case NOV: //fall through case JUN: - return date <= 30 && date >= 1; + return day <= 30 && day >= 1; default: throw new InvalidDateException("INVALID_PERIOD"); } } + /** + * Gets the promotion for the item + * + * @param itemName + * @return promotion of the item + * @return null if there is no promotion + */ public static Promotion getPromotion(String itemName) { for (Promotion promotion: promotions) { if (promotion.getItemName().toLowerCase().equals(itemName.toLowerCase())) { @@ -188,6 +258,11 @@ public static Promotion getPromotion(String itemName) { return null; } + /** + * Gets all promotion in the promotion lists + * + * @return all promotions + */ public static ArrayList getAllPromotion() { return promotions; } diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java index 99ade26a5d..0905f812c2 100644 --- a/src/main/java/storage/PromotionStorage.java +++ b/src/main/java/storage/PromotionStorage.java @@ -1,3 +1,4 @@ +//@@author HengShuHong package storage; import exceptions.CommandFormatException; @@ -28,6 +29,12 @@ public static void updateFile(String inputText, boolean ifAppend) { } } + /** + * Read lines from the file and identify promotions written inside. + * Add the identified promotions into a list of existing promotions. + * + * @param fileName Name of the file to read from. + */ public static void readFromFile(String fileName) { int count = 0; String itemName = ""; @@ -88,26 +95,19 @@ public static void readFromFile(String fileName) { } } - public static void addToPromotionFile(ArrayList promotions) { - assert promotions != null : "Promotions cannot be null."; - Promotion lastPromotion = promotions.get(promotions.size() - 1); - String descriptionAdded = (lastPromotion.getItemName() + " have a " + - String.format("%.2f", (lastPromotion.getDiscount()*100)) + "% discount" + "\n" + - "Period: " + lastPromotion.getStartDate() + " " + lastPromotion.getStartMonth() + - " " + lastPromotion.getStartYear() + " to " + lastPromotion.getEndDate()+ " " + - lastPromotion.getEndMonth() + " " + lastPromotion.getEndYear() + "\n" + "Time: " + - lastPromotion.getStartTime() + " to " + lastPromotion.getEndTime() + "\n"); - updateFile(descriptionAdded, true); - } - + /** + * Writes to the indicated file and overwrite previous data + * + * @param promotions List of promotions with relevant details to write + */ public static void overwritePromotionFile(ArrayList promotions) { assert promotions != null : "Promotions cannot be null."; int length = promotions.size(); for (Promotion promotion: promotions) { String descriptionAdded = (promotion.getItemName() + " have a " + String.format("%.2f", (promotion.getDiscount()*100)) + "% discount" + "\n" + "Period: " + - promotion.getStartDate() + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + - " to " + promotion.getEndDate()+ " " + promotion.getEndMonth() + " " + promotion.getEndYear() + + promotion.getStartDay() + " " + promotion.getStartMonth() + " " + promotion.getStartYear() + + " to " + promotion.getEndDay()+ " " + promotion.getEndMonth() + " " + promotion.getEndYear() + "\n" + "Time: " + promotion.getStartTime() + " to " + promotion.getEndTime() + "\n"); if (promotions.indexOf(promotion) == 0) { updateFile(descriptionAdded, false); diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 65f78581aa..69942652d7 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -103,8 +103,8 @@ public static void interpretLines(Scanner scanner) throws NumberFormatException{ } /** - * Read lines from the file and identify tasks written inside. - * Add the identified tasks into a list of existing tasks. + * Read lines from the file and identify items written inside. + * Add the identified items into a list of existing item lists. * * @param fileName Name of the file to read from. */ From 5b93e2565a96aa4462a2c8744ae6a1ba233f9784 Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 03:25:23 +0800 Subject: [PATCH 305/421] Fix Checkstyle --- src/main/java/promotion/Promotionlist.java | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index d1e4a0ee8f..99875b87f8 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -184,8 +184,7 @@ public static boolean isVerifiedTime(String timeStr) { * @param endDay * @param endMonth * @param endYear - * @return true if promotion period is valid - * @return false if end of promotion is earlier than the start of promotion + * @return true if promotion period is valid, return false if end is earlier than the start of promotion */ public static boolean isValidDuration (int startDay, Month startMonth, int startYear, int endDay, Month endMonth, int endYear) { @@ -213,8 +212,8 @@ public static boolean isValidDuration (int startDay, Month startMonth, int start * @param day * @param month * @param year - * @return - * @throws InvalidDateException + * @return true if day exists, false if does not exists + * @throws InvalidDateException is thrown when the day does not exists in the month */ public static boolean isValidMonth(int day, Month month, int year) throws InvalidDateException { switch (month) { @@ -246,8 +245,7 @@ public static boolean isValidMonth(int day, Month month, int year) throws Invali * Gets the promotion for the item * * @param itemName - * @return promotion of the item - * @return null if there is no promotion + * @return promotion of the item, return null if there is no promotion */ public static Promotion getPromotion(String itemName) { for (Promotion promotion: promotions) { From 240f826d8df6970b07a3061323c5d96252e3ec5e Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sat, 13 Apr 2024 11:05:43 +0800 Subject: [PATCH 306/421] Update md --- docs/DeveloperGuide.md | 1 + docs/team/fxe025.md | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e1e32996e1..7b2d7f484b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -43,6 +43,7 @@ the Itemlist by `addItem()` method. ![Storage_sequenceDiagram](./Diagrams/Storage_sequenceDiagram.png) ### UI +UI prints command output, and useful messages to the user. ### Cashier Cashier class extends Itemlist class, and stores `Transactions` instead of `Items`. diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md index b517e54183..799b29a3c0 100644 --- a/docs/team/fxe025.md +++ b/docs/team/fxe025.md @@ -16,3 +16,11 @@ StockMaster is a platform aimed at helping SMEs track and organise their invento * Write information from a transactionlist to file * Read information from the file when program starts +#### Contributions to the UG +- Update feature guide for edit command feature +- Add edit command to command summary + +#### Contributions to the DG +- Storage feature + - Class diagram + - Sequence diagram From 3054dce5a4f8f7ba6ea25252e48833798bbe374d Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 13 Apr 2024 11:35:24 +0800 Subject: [PATCH 307/421] Update PPP --- docs/team/lowtl.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/team/lowtl.md b/docs/team/lowtl.md index 9e7ec75700..c643302e38 100644 --- a/docs/team/lowtl.md +++ b/docs/team/lowtl.md @@ -5,6 +5,15 @@ StockMaster is a desktop inventory and management that provides the user with a manage and operate their business. ### Summary of Contribution +* Overall organisation of project +* **New Feature:** `Cashier` class. + * Allows users to create and store `Transactions`, in an extension of the `Item` class. + * Contains the `getTotalProfit`, `getTotalRevenue`, and `getBestseller` methods, for basic business analysis. + +* Logger + + + **Code Contributed:** [Reposense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=LowTL&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=LowTL&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=functional-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) \ No newline at end of file From 4eae7205a20996426738b0f565e6d2f27aca3887 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sat, 13 Apr 2024 15:11:32 +0800 Subject: [PATCH 308/421] Fix issue 125 --- src/main/java/command/AddCommand.java | 3 ++- src/main/java/command/EditCommand.java | 4 ++-- src/main/java/itemlist/Cashier.java | 14 ++++++++++++-- src/main/java/promotion/Promotionlist.java | 5 +---- src/main/java/storage/Storage.java | 9 +++++---- 5 files changed, 22 insertions(+), 13 deletions(-) diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index fdc15357b6..6dca25056f 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -52,7 +52,8 @@ public void execute() { } else { Itemlist.addItem(toAdd); System.out.print(MESSAGE_SUCCESS + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() - + ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + ")"); + + ", Buy: $" + String.format("%.2f", getBuyPrice()) + ", Sell: $" + + String.format("%.2f", getSellPrice()) + ")"); Storage.addToFile(Itemlist.getItems()); if (!category.equals("NA")) { System.out.println(" to " + getCategory()); diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index bca282cde2..51cb795f34 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -92,12 +92,12 @@ public void execute() { } if (newBuyPrice != -1) { // check if buyPrice was edited ui.TextUi.showEditMessage(itemName, "newBuyPrice", String.valueOf(item.getBuyPrice()), - String.valueOf(newBuyPrice)); + String.format("%.2f", newBuyPrice)); item.setBuyPrice(newBuyPrice); } if (newSellPrice != -1) { // check if sellPrice was edited ui.TextUi.showEditMessage(itemName, "newSellPrice", String.valueOf(item.getSellPrice()), - String.valueOf(newSellPrice)); + String.format("%.2f", newSellPrice)); item.setSellPrice(newSellPrice); } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index ad5c402c76..af88b9013f 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -6,6 +6,8 @@ import java.util.ArrayList; +import static ui.TextUi.replyToUser; + public class Cashier extends Itemlist { private static final ArrayList transactions = new ArrayList<>(); @@ -74,8 +76,16 @@ public static Transaction getTransaction(int index) { public static Item getBestseller() { Item bestSeller = Itemlist.getItem(0); float[] profits = new float[Itemlist.items.size()]; - for (Transaction t: transactions) { - profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); + int transaction_index = 0; + try { + for (Transaction t : transactions) { + transaction_index = transactions.indexOf(t); + profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); + } + } catch (ArrayIndexOutOfBoundsException e) { + replyToUser("Item at Transaction ID " + (transaction_index + 1) + + " no longer found in the item list."); + return null; } for (int i = 1; i < Itemlist.items.size(); i++) { if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index be405c740b..c142a79ee8 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -11,9 +11,6 @@ public class Promotionlist { private static final ArrayList promotions = new ArrayList<>(); - public Promotionlist() { - } - public static int getIndex(Promotion promotion) { return promotions.indexOf(promotion); } @@ -24,7 +21,7 @@ public static void deletePromotion(int index) { public static boolean itemIsOnPromo(String itemName) { for (Promotion promotion : promotions) { - if (promotion.getItemName().toLowerCase().equals(itemName)) { + if (promotion.getItemName().toLowerCase().equals(itemName.toLowerCase())) { return true; } } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 65f78581aa..9097f8bdeb 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -132,8 +132,8 @@ public static void addToFile(ArrayList items) { String descriptionAdded = (items.size()) + "." + " | " + markString + " | " + lastItem.getItemName() + " | " + "Qty: " + lastItem.getQuantity() + " " + lastItem.getUnitOfMeasurement() + " | " + "Cat: " + lastItem.getCategory() + - " | " + "BuyPrice: $" + lastItem.getBuyPrice() + " | " + "SellPrice: $" + - lastItem.getSellPrice() + "\n"; + " | " + "BuyPrice: $" + String.format("%.2f", lastItem.getBuyPrice()) + " | " + + "SellPrice: $" + String.format("%.2f", lastItem.getSellPrice()) + "\n"; updateFile(descriptionAdded, true); } @@ -150,8 +150,9 @@ public static void overwriteFile(ArrayList items) { String descriptionAdded = (index + 1) + "." + " | " + markString + " | " + items.get(index).getItemName() + " | " + "Qty: " + items.get(index).getQuantity() + " " + items.get(index).getUnitOfMeasurement() + " | " + "Cat: " + - items.get(index).getCategory() + " | " + "BuyPrice: $" + items.get(index).getBuyPrice() + - " | " + "SellPrice: $" + items.get(index).getSellPrice() + "\n"; + items.get(index).getCategory() + " | " + "BuyPrice: $" + + String.format("%.2f", items.get(index).getBuyPrice()) + " | " + "SellPrice: $" + + String.format("%.2f", items.get(index).getSellPrice()) + "\n"; if (index == 0) { updateFile(descriptionAdded, false); } else { From 1cadb5dea6cb6c8c81dcd50a0a83bad2b7cb429e Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 13 Apr 2024 15:14:34 +0800 Subject: [PATCH 309/421] remove HengShuHeng.md due to comitting errors --- docs/team/HengShuHong.md | 0 docs/team/hengshuhong.md | 47 ---------------------------------------- 2 files changed, 47 deletions(-) delete mode 100644 docs/team/HengShuHong.md delete mode 100644 docs/team/hengshuhong.md diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md deleted file mode 100644 index 0b7683b9d6..0000000000 --- a/docs/team/hengshuhong.md +++ /dev/null @@ -1,47 +0,0 @@ -# Heng Shu Hong's Project Portfolio Page - - -## Project: StockMaster - -StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them -manage and operate their business. - - -### Code Contribution - -- **New Feature:** Added the capability to add/delete/list promotions - - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, - `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell - feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will - be shown. - - Justification: This feature improves the application as the user now have the option to create a discount campaign - and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. - - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, - one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. - - -- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. - - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` - For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` - - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly - retrieve the data that is being searched for by narrow the scope of the search. - - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this - enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original - feature, but yet still able to provide more than 1 filter to narrow the scope. - -- **New Feature:** Enhanced the add command to prevent duplicate entries - - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a - duplicated item, the item information will be updated based on the latest input and the quantity will be increased. - - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the - overflowing of the inventory list with duplicated item. - -- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) - -- **Documentation** - - User Guide: - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` - - Added the Quick Start - - Update the Command Summary - - Developer Guide: - - Added implementation details of the `promotion` feature. - - \ No newline at end of file From a50ef355b5d78485acff66ed701e2e945b62e272 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sat, 13 Apr 2024 15:53:04 +0800 Subject: [PATCH 310/421] Fix naming convention --- src/main/java/itemlist/Cashier.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index be3e144d70..bcf6956099 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -89,7 +89,7 @@ public static Transaction getTransaction(int index) { public static Item getBestseller() { Item bestSeller = null; float[] profits = new float[Itemlist.items.size()]; - int transaction_index = 0; + int transactionIndex = 0; try { if (transactions.isEmpty()) { throw new EmptyListException("Transaction"); @@ -97,7 +97,7 @@ public static Item getBestseller() { assert(Itemlist.noOfItems > 0); bestSeller = Itemlist.getItem(0); for (Transaction t: transactions) { - transaction_index = transactions.indexOf(t); + transactionIndex = transactions.indexOf(t); profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); } for (int i = 1; i < Itemlist.items.size(); i++) { @@ -109,7 +109,7 @@ public static Item getBestseller() { LOGGER.warning("No transactions found."); return null; } catch (ArrayIndexOutOfBoundsException e) { - replyToUser("Item at Transaction ID " + (transaction_index + 1) + + replyToUser("Item at Transaction ID " + (transactionIndex + 1) + " no longer found in the item list."); return null; } From fcb74d196396374a43365ca7504841b7e8872880 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sat, 13 Apr 2024 16:03:27 +0800 Subject: [PATCH 311/421] Modify expected output --- src/test/java/command/AddPromotionCommandTest.java | 14 +++++++------- src/test/java/command/DeletePromotionTest.java | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/test/java/command/AddPromotionCommandTest.java b/src/test/java/command/AddPromotionCommandTest.java index 0b44894903..143d33eab0 100644 --- a/src/test/java/command/AddPromotionCommandTest.java +++ b/src/test/java/command/AddPromotionCommandTest.java @@ -23,7 +23,7 @@ public void addPromotionCommandTest1() { 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); addCommandTest1.execute(); promotionTest1.execute(); - String expectedOutput1 = "added: apple (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput1 = "added: apple (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + "The following promotion has been added" + System.lineSeparator() + "apple have a 30.00% discount" + System.lineSeparator() + "Period: 29 FEB 2024 to 4 APR 2024" + System.lineSeparator() + @@ -47,7 +47,7 @@ public void addPromotionCommandTest2() { 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); addCommandTest2.execute(); promotionTest2.execute(); - String expectedOutput2 = "added: durian (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput2 = "added: durian (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + "The following promotion has been added" + System.lineSeparator() + "durian have a 30.00% discount" + System.lineSeparator() + "Period: 2 APR 2024 to 4 APR 2024" + System.lineSeparator() + @@ -71,7 +71,7 @@ public void addPromotionCommandTest3() { 2024, 4, Month.valueOf("APR"), 2026, 0000, 1100); addCommandTest3.execute(); promotionTest3.execute(); - String expectedOutput3 = "added: mango (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput3 = "added: mango (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + "The following promotion has been added" + System.lineSeparator() + "mango have a 30.00% discount" + System.lineSeparator() + "Period: 29 FEB 2024 to 4 APR 2026" + System.lineSeparator() + @@ -116,7 +116,7 @@ public void invalidDiscountPromotionCommandTest() { addCommandTest1.execute(); promotionTest1.execute(); promotionTest2.execute(); - String expectedOutput3 = "added: banana (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput3 = "added: banana (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + Messages.INVALID_DISCOUNT + System.lineSeparator() + Messages.INVALID_DISCOUNT + System.lineSeparator(); assertEquals(expectedOutput3, outputStreamCaptor.toString()); @@ -141,7 +141,7 @@ public void invalidTimePromotionCommandTest() { addCommandTest1.execute(); promotionTest1.execute(); promotionTest2.execute(); - String expectedOutput3 = "added: lemon (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput3 = "added: lemon (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + Messages.INVALID_TIME + System.lineSeparator() + Messages.INVALID_TIME + System.lineSeparator(); assertEquals(expectedOutput3, outputStreamCaptor.toString()); @@ -166,7 +166,7 @@ public void invalidDatePromotionCommandTest() { addCommandTest1.execute(); promotionTest1.execute(); promotionTest2.execute(); - String expectedOutput3 = "added: cherry (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput3 = "added: cherry (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + Messages.INVALID_DATE + System.lineSeparator() + Messages.INVALID_DATE + System.lineSeparator(); assertEquals(expectedOutput3, outputStreamCaptor.toString()); @@ -197,7 +197,7 @@ public void invalidDurationPromotionCommandTest() { promotionTest2.execute(); promotionTest3.execute(); promotionTest4.execute(); - String expectedOutput3 = "added: orange (Qty: 1 fruits, Buy: $1.0, Sell: $1.0)" + System.lineSeparator() + + String expectedOutput3 = "added: orange (Qty: 1 fruits, Buy: $1.00, Sell: $1.00)" + System.lineSeparator() + Messages.INVALID_PERIOD + System.lineSeparator() + Messages.INVALID_PERIOD + System.lineSeparator() + Messages.INVALID_PERIOD + System.lineSeparator() + diff --git a/src/test/java/command/DeletePromotionTest.java b/src/test/java/command/DeletePromotionTest.java index 69677b730a..ce02961d4f 100644 --- a/src/test/java/command/DeletePromotionTest.java +++ b/src/test/java/command/DeletePromotionTest.java @@ -29,7 +29,7 @@ public void deletePromotionTest() { promotionTest1.execute(); deleteFail.execute(); deleteSuccess.execute(); - String expectedOutput1 = "added: apple iphone (Qty: 100000 pieces, Buy: $100.5, Sell: $400.1) " + + String expectedOutput1 = "added: apple iphone (Qty: 100000 pieces, Buy: $100.50, Sell: $400.10) " + "to electronics" + System.lineSeparator() + "The following promotion has been added" + System.lineSeparator() + "apple iphone have a 30.00% discount" + System.lineSeparator() + From 6dd7581f23f380e5cd2a79087e4724c7f0154d17 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 13 Apr 2024 18:15:16 +0800 Subject: [PATCH 312/421] Add BestsellerCommandTest --- PromotionStorage.txt | 0 StockMasterData.txt | 1 - TransactionLogs.txt | 0 src/main/java/command/BestsellerCommand.java | 1 + src/main/java/itemlist/Cashier.java | 30 ++++---- src/main/java/itemlist/Itemlist.java | 1 + .../java/command/BestsellerCommandTest.java | 69 +++++++++++++++++++ src/test/java/command/SellCommandTest.java | 1 + 8 files changed, 85 insertions(+), 18 deletions(-) delete mode 100644 PromotionStorage.txt delete mode 100644 StockMasterData.txt delete mode 100644 TransactionLogs.txt create mode 100644 src/test/java/command/BestsellerCommandTest.java diff --git a/PromotionStorage.txt b/PromotionStorage.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/StockMasterData.txt b/StockMasterData.txt deleted file mode 100644 index 8ef5894379..0000000000 --- a/StockMasterData.txt +++ /dev/null @@ -1 +0,0 @@ -1. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index ec7299c6e0..cb9eda02a8 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -18,6 +18,7 @@ public void execute() throws EmptyListException { } } catch (EmptyListException e) { LOGGER.warning("No transaction found."); + return; } TextUi.replyToUser("The current best-selling item is " + bs.getItemName()); diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 5d551ed3b5..f2b7013414 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -10,7 +10,7 @@ public class Cashier extends Itemlist { protected static final Logger LOGGER = Logger.getLogger(Cashier.class.getName()); - private static final ArrayList transactions = new ArrayList<>(); + protected static ArrayList transactions = new ArrayList<>(); public static void addItem(Transaction transaction) { transactions.add(transaction); @@ -84,25 +84,21 @@ public static Transaction getTransaction(int index) { } } - public static Item getBestseller() throws EmptyListException { + public static Item getBestseller() { Item bestSeller = null; float[] profits = new float[Itemlist.items.size()]; - try { - if (transactions.isEmpty()) { - throw new EmptyListException("Transaction"); - } - assert(Itemlist.noOfItems > 0); - bestSeller = Itemlist.getItem(0); - for (Transaction t: transactions) { - profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); - } - for (int i = 1; i < Itemlist.items.size(); i++) { - if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { - bestSeller = Itemlist.getItem(i); - } + if (transactions.isEmpty()) { + return null; + } + assert(Itemlist.noOfItems > 0); + bestSeller = Itemlist.getItem(0); + for (Transaction t: transactions) { + profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); + } + for (int i = 1; i < Itemlist.items.size(); i++) { + if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { + bestSeller = Itemlist.getItem(i); } - } catch (EmptyListException e) { - LOGGER.warning("No transactions found."); } return bestSeller; } diff --git a/src/main/java/itemlist/Itemlist.java b/src/main/java/itemlist/Itemlist.java index dd8d1242af..99d3ad407b 100644 --- a/src/main/java/itemlist/Itemlist.java +++ b/src/main/java/itemlist/Itemlist.java @@ -19,6 +19,7 @@ public static void addItem(Item item) { public static void deleteItem(int index) { items.remove(index); + noOfItems--; } public static void editQuantity(int index, int newQuantity) { diff --git a/src/test/java/command/BestsellerCommandTest.java b/src/test/java/command/BestsellerCommandTest.java new file mode 100644 index 0000000000..c0cfac073c --- /dev/null +++ b/src/test/java/command/BestsellerCommandTest.java @@ -0,0 +1,69 @@ +package command; + +import common.Messages; +import exceptions.CommandFormatException; +import item.Transaction; +import itemlist.Cashier; +import itemlist.Itemlist; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import exceptions.EmptyListException; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class BestsellerCommandTest extends Cashier { + + private final BestsellerCommand bestsellerCommand = new BestsellerCommand(); + + @BeforeEach + public void reset() { + //clears the transactions list + Cashier.transactions = new ArrayList(); + + for (int i = 0; i < Itemlist.noOfItems; i++) { + Itemlist.deleteItem(i); + } + } + + @Test + public void testExecuteWithEmptyBestseller() throws EmptyListException { + + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + bestsellerCommand.execute(); + String expected = Messages.EMPTY_TRANSACTION_LIST + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + + } + + @Test + public void testExecuteWithBestseller() throws EmptyListException, CommandFormatException { + //set up an item to test bestseller + AddCommand testAdd = new AddCommand("testItem", 10, "ea","NA", 10.0F, 10.0F); + testAdd.execute(); + SellCommand testSell = new SellCommand("testItem", 10, 0); + testSell.execute(); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + bestsellerCommand.execute(); + String expectedOutput = "The current best-selling item is testItem" + System.lineSeparator(); + assertEquals(expectedOutput, outputStream.toString()); + } catch (EmptyListException e) { + // It's not supposed to throw EmptyListException in this case + fail("Unexpected EmptyListException thrown"); + } + + } + +} diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index a71e8bc090..7ec06d54e7 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -12,6 +12,7 @@ public class SellCommandTest { @Test public void sellItemTest() { try { + Command sellCommandTest1 = new SellCommand("testItem", 1, 3); Command sellCommandTest2 = new SellCommand("testItem", 7, 14); sellCommandTest1.execute(); From d482ce3ddba82620c0dbbc14f57e00a1ff6af380 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 13 Apr 2024 18:17:15 +0800 Subject: [PATCH 313/421] Fix BestsellerCommandTest bug --- src/test/java/command/BestsellerCommandTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/command/BestsellerCommandTest.java b/src/test/java/command/BestsellerCommandTest.java index c0cfac073c..52443ccbf7 100644 --- a/src/test/java/command/BestsellerCommandTest.java +++ b/src/test/java/command/BestsellerCommandTest.java @@ -26,8 +26,8 @@ public void reset() { //clears the transactions list Cashier.transactions = new ArrayList(); - for (int i = 0; i < Itemlist.noOfItems; i++) { - Itemlist.deleteItem(i); + while (Itemlist.getItem(0) != null) { + Itemlist.deleteItem(0); } } From ef479dea436a78b31af1638e2ef3f6dbea8f99b6 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 13 Apr 2024 20:49:08 +0800 Subject: [PATCH 314/421] add UML diagram for listcommand for list_items --- .../PUML files/Itemlist/EditCommand.puml | 11 +++ .../Itemlist/ListItems_SequenceDiagram.puml | 41 +++++++++++ docs/team/Fureimi.md | 6 ++ src/main/java/item/Item.java | 2 +- src/test/java/itemlist/ItemlistTest.java | 72 +++++++++++++++++++ 5 files changed, 131 insertions(+), 1 deletion(-) create mode 100644 docs/Diagrams/PUML files/Itemlist/EditCommand.puml create mode 100644 docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml diff --git a/docs/Diagrams/PUML files/Itemlist/EditCommand.puml b/docs/Diagrams/PUML files/Itemlist/EditCommand.puml new file mode 100644 index 0000000000..ac2c2d3913 --- /dev/null +++ b/docs/Diagrams/PUML files/Itemlist/EditCommand.puml @@ -0,0 +1,11 @@ +@startuml +'https://plantuml.com/sequence-diagram + +autonumber + +Alice -> Bob: Authentication Request +Bob --> Alice: Authentication Response + +Alice -> Bob: Another authentication Request +Alice <-- Bob: another authentication Response +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml new file mode 100644 index 0000000000..c3873a5f0f --- /dev/null +++ b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml @@ -0,0 +1,41 @@ +@startuml +participant "ui : TextUi" as UI +participant "listCommand : ListCommand" as ListCommand +participant "itemList : Itemlist" as Itemlist +participant "item : Item" as Item + +activate ListCommand + +ListCommand -> Itemlist : getItems() +activate Itemlist +Itemlist --> ListCommand : return items +deactivate Itemlist + +ListCommand -> ListCommand : containsItems(items) +activate ListCommand +ListCommand --> ListCommand : return result +deactivate ListCommand + +alt category equals "NA" and not isListMarked + ListCommand -> UI : showList(items) + activate UI + UI --> ListCommand : display items + deactivate UI +else contains Items + ListCommand -> ListCommand : showCustomizedItemList() + activate ListCommand + ListCommand -> Item : getCategory() + activate Item + Item --> ListCommand : return category + deactivate Item + ListCommand -> Item : getMarkStatus() + Item --> ListCommand : return isMark + ListCommand -> UI : replyToUser(item details) + deactivate ListCommand + activate UI + UI --> ListCommand : display marked items + deactivate UI +end +hide footbox +deactivate ListCommand +@enduml diff --git a/docs/team/Fureimi.md b/docs/team/Fureimi.md index e69de29bb2..e52e869e60 100644 --- a/docs/team/Fureimi.md +++ b/docs/team/Fureimi.md @@ -0,0 +1,6 @@ +# Min Guanlin - Project Portfolio Page + +## Project: StockMaster + +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. \ No newline at end of file diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 5cf51f38c9..8bdcdd8224 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -11,7 +11,7 @@ public class Item { private String category; private float buyPrice; private float sellPrice; - private boolean isOOS; + public boolean isOOS; public Item(String name, int quantity, String unitOfMeasurement, String category, float buyPrice, float sellPrice) { this.itemName = name; diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index bca85bff37..5fe4c6ae16 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -1,4 +1,76 @@ package itemlist; +import item.Item; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + public class ItemlistTest { + + private Item testItem; + + @BeforeEach + void setUp() { + // This will be run before each test, setting up test conditions + float buyPrice = 0.5F; + float sellPrice = 1.2F; + testItem = new Item("TestItem", 10, "test UOM", "test Cat", buyPrice, + sellPrice); + Itemlist.addItem(testItem); + } + + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + } + + @Test + void addItem_shouldIncreaseListSize() { + assertEquals(1, Itemlist.getItems().size()); + } + + @Test + void deleteItem_shouldDecreaseListSize() { + Itemlist.deleteItem(0); + assertEquals(0, Itemlist.getItems().size()); + } + + @Test + void editQuantity_shouldUpdateQuantity() { + Itemlist.editQuantity(0, 5); + assertEquals(5, testItem.getQuantity()); + assertFalse(testItem.getIsOOS()); + } + + @Test + void editQuantity_shouldMarkOutOfStock() { + Itemlist.editQuantity(0, 0); + assertTrue(testItem.getIsOOS()); + } + + @Test + void itemIsExist_shouldReturnTrueForExistingItem() { + assertTrue(Itemlist.itemIsExist("TestItem")); + } + + @Test + void itemIsExist_shouldReturnFalseForNonExistingItem() { + assertFalse(Itemlist.itemIsExist("NonExistingItem")); + } + + @Test + void getItem_shouldReturnCorrectItem() { + Item item = Itemlist.getItem(0); + assertEquals("TestItem", item.getItemName()); + assertEquals(10, item.getQuantity()); + } + + @Test + void getIndex_shouldReturnCorrectIndex() { + int index = Itemlist.getIndex(testItem); + assertEquals(0, index); + } } From e6a99b4474b0d5e88009a427c6e51d0c8f0c0958 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 13 Apr 2024 21:39:29 +0800 Subject: [PATCH 315/421] Remove unnecessary import --- src/main/java/itemlist/Cashier.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index a0aeff2f04..f2b7013414 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -7,8 +7,6 @@ import java.util.ArrayList; import java.util.logging.Logger; -import static ui.TextUi.replyToUser; - public class Cashier extends Itemlist { protected static final Logger LOGGER = Logger.getLogger(Cashier.class.getName()); From 17f4dcf69252b1e6a1f95522efc97a092cd60e83 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 13 Apr 2024 22:22:36 +0800 Subject: [PATCH 316/421] add to DG and upload UML diagrams --- docs/DeveloperGuide.md | 45 +++++++ .../Itemlist/AddCommand_SequenceDiagram.png | Bin 0 -> 29614 bytes .../Itemlist/EditCommand_ClassDiagram.png | Bin 0 -> 97004 bytes .../Itemlist/EditCommand_SequenceDiagram.png | Bin 0 -> 81944 bytes .../Itemlist/ListItems_SequenceDiagram.png | Bin 0 -> 29158 bytes .../PUML files/Itemlist/EditCommand.puml | 11 -- .../Itemlist/EditCommand_ClassDiagram.puml | 68 +++++++++++ .../Itemlist/EditCommand_SequenceDiagram.puml | 112 ++++++++++++++++++ .../Itemlist/ListItems_SequenceDiagram.puml | 2 +- src/main/java/command/EditCommand.java | 2 +- 10 files changed, 227 insertions(+), 13 deletions(-) create mode 100644 docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png create mode 100644 docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png create mode 100644 docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png create mode 100644 docs/Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png delete mode 100644 docs/Diagrams/PUML files/Itemlist/EditCommand.puml create mode 100644 docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml create mode 100644 docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e2eddc907e..193adec793 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -23,10 +23,55 @@ price, quantity of item, and others. Itemlist class is an object which contains items to be added to the stock inventory list. Able to add items, remove functions, edit items inside the list. +To list items in the `Itemlist` to the user, the `ListCommand` class is used. + +#### Sequence Diagram of `ListCommand` when used to list items. + +![ListItems_SequenceDiagram](Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png) +1. An instance of `ListCommand` is created with parameters specifying what category to list, or whether to only +list marked items, as well as an `Itemlist` class. +2. The `execute()` method is then called, which first checks which type of list is passed. In this case, it wil be the +list of items. Afterwards, it checks for modifiers such as category or isListMarked. +3. Depending on the modifiers, different things will happen. + - If there are no modifiers, `ListCommand` will display all items in the list by calling `TextUi.ShowList()`. +4. If there are modifiers present, `ShowCustomizedItemList()` will be called. + - If there is a category present, `ListCommand` will get the category of every item in the `Itemlist` with + `Item.getCategory()`. + - If isListMarked is true, `ListCommand` will get the mark status of evey item in the `Itemlist` with + `Item.getMarkStatus()`. + - Afterwards, `TextUi.replyToUser()` will be called, displaying the relevant items. + + The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` ![AddCommand_SequenceDiagram](Diagrams/Images/AddCommand_Sequence_Diagram.png) +The `EditCommand` class extends the `command` class. +The `EditCommand` is responsible for editing attributes of an item in the `Itemlist`. This includes changing the +item's name, quantity, unit of measurement, category, buy price, and sell price. +The command modifies the relevant item if it exists and updates the system accordingly. + +#### Class Diagram of `EditCommand` and with partial Class Diagrams of `Item` and `Itemlist` + +![EditCommand_ClassDiagram](Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png) + +#### Sequence Diagram of `EditCommand` +![EditCommand_SequenceDiagram](Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png) + +1. When an instance of `EditCommand` is created, the parameters indicating the item to be edited and the new values for +these parameters are also specified. +2. - Afterwards, the `execute()` method will be called, which first interacts with `Itemlist` class by calling +`Itemlist.getItems()` to retrieve the list of all items. + - If the item is found, it retreives the index of the item. If not, a messasge indicating that item is not found + will be displayed using `TextUi.replyToUser()`. +3. If an item is found, the `Itemlist.getItem(index)` method is used to retrieve the item object. For each +attribute that needs modification, the corresponding setter method on the `Item` objet is called, such as +`setItemName()`, `setQuantity()`, etc. +4. Once all changes have been made, `TextUi.replyToUser()` is called to display to the user that the editing +process had concluded. +5. Finally, `Storage.overwriteFile(Itemlist.getItems())` is called to write changes to the local save file. + + ### Parser Parser class processes user inputs and sieves out relevant details before calling the relevant methods. It contains command formats that must be adhered to for the methods to be called. diff --git a/docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f0efd61166f98e03d48f1637f0e81a075ccac4ff GIT binary patch literal 29614 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®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 literal 0 HcmV?d00001 diff --git a/docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png b/docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..192e698ed9035f93176bf0adef12b451d3c88fa9 GIT binary patch literal 97004 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%0DA}kU+e2}W8d|(G(kz50cW*)CCh5b@85!}g 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 literal 0 HcmV?d00001 diff --git a/docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..20781d3e2a95b6f00a1f5671b55dc603b680035e GIT binary patch literal 81944 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%0A9-Qb z^3Y;Ke8sHo?ou6EOSR8TA{8hq%5UyNc-FM#18%b}{dql9gtDbqCQmO=fBtg%cOH3P zXTFBJN^w(XR_dcpYS{e{Hw@qRR01$jg<{rCBUdC#`Mn6ArTOXWS1U`)ww9LfvnhOH zLw`)g%W4=-S)f|R6HaecCQ!^59@u*-iu&!TINSVHI$yqitwAaR{7r@YW8&hLvM_GV zsMBg%GWsjkkoUoHgu+u};2PYiP~5@i`Si(;;;A=Y1ht_UN;^NRh1Y>qL(^_zd}3lE zgbpvG__j_uJP&{@zU~&Q!vlB7Pl%T~$MKMtzPkU-!y3Ra{B43A%kJEFZC!ojU{zU} zaqvFpzML*+zIyg>&eKxE_ca=|#v{nbQ&Us*g>D}$jEPHa1$Nft8TNvDcW9^zd1OxJ z@$Jt61t0_PlKs2`78VQHQ@ut(ouon&kYcl_VLypMp{cC+SY(p#TR2M}|D5i$ldX7C z++Io`VA7x>GK41&VVt(N1OLQMQ_7V{3p5Nc13#-Wk0hvU#u6;&QAO>dqd}jL?NB03 zUQ2NorLJXy+ETWP486r4|2OjUHsBojxMUQ#n-^>*!O2|RE3l43n2LDO5$3O=zO-k1 zxQfOHD*gfLUfS?-F?odkdOy~7@6czbPyKKR@OCR*mZfeJdC$PL7uwLKr+2Qc5pVf@ z1Wr^IZ^d&nS5v=gC7)GFQF!xe+z}@4=>qbr58ZXM^bm0o!!|)?_EY42cn+rbrE9Xk zdSHFwxCsp&Fkf3T=eRNFjMr4emcQ586>|_rvLMqZWCR0Q0Zp!ZP8_}4dFyU`@`T2B zM^FK8D_@Juk(88N&hL#-L}(rW-I!%16iaOYdu;`{RrNm7YkeKn^zi9KmFewP55H zaT&3FFA5`gs!)W$OzR5QM(~$^R@wQGtJ$Te7YZuqvoq6(91vDJm0~q>uQFDg!#-?` zz0=;_-f_+6$uBpr8WfuM34HaBhG&AQzdja;TYO%;PEF4p^(!ewu;ab8#*ZsX4e=Hx zvp&C1x@XgIImF?(=ppcq5BB-a1;pkIYh{8BYVF>ASC|=X0lMGTe37Dc&mQM&u>11p zHB3l!s+-`ZVHFMFjpyn5=IdxAOe)zm9!lbhe<#?SpswGUFZ|9+-Jt&1*wA&PCdH}0 zg3H>iTpS2Z@jKy+=P@=`zrUh=0JpS zV?t|8N-!Q+-1`8r<(+{xk>NE+#;Gv(Le>H*3EI~ug@KCarB`bny^&@Yr;QozA4qAL z;mAW>)t|Yo^<$!Y$=P zk=s!2<5=Wf7S91`F8`QtG>M{aJ##|zHL6* zL&q#dCdK12OY^BmPnqBgSvA%TvIh^|?c1fR`$?G6vz7|uF;dC|>t#!%8*fBIn?cHC zctScndR%{DL!?S@!A#lA6&-gPLK*cP@3}Zqzoru6?RZE!>W4GDA#3(}7I~mSG?mSa z$-DheU1O1T?bd1Z_1=FvMJDRIifksElx`X}_{O5P{q*=9&@Ti9p z!QAl0ybyq9ISR6SHS&MEb@V!8aBpd8>Er}amg|E&%rJv+{yW#hHXBYhn;_G{6Ap!F z)DWDO(rNIk3kNXmJgv1Ymi*aZn}Y1uD(B9Zpzs|ycz--rK7WJq6UO}PE-NeECU3xhSCV0I<42+aD z)O+_7uqh>PIcO~u_nRotzNWR$Sm$z#=f>9lsKprBj-2W?ecwla1ip3)Q;34VKhn#| zl$CbJTrx*rD$f0|X@9*H+(G|%D?FRXPRKlu5E4qA0PRxHu}~-%Yz5d-J9AX)x;{9Z zT-bi|G9Wlw@le9L(MN5utHxzupQwlCPa-e>zL31nI?un~r_arG|D~l#?*p{(GK!*{ L%9glIMjrnkr<^rB literal 0 HcmV?d00001 diff --git a/docs/Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..1659782d88e055eb4071b79547b67c84bece92dd GIT binary patch literal 29158 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 Bob: Authentication Request -Bob --> Alice: Authentication Response - -Alice -> Bob: Another authentication Request -Alice <-- Bob: another authentication Response -@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml b/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml new file mode 100644 index 0000000000..845de2748d --- /dev/null +++ b/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml @@ -0,0 +1,68 @@ +@startuml +class EditCommand { + - itemName : String + - newItemName : String + - newQuantity : int + - newUnitOfMeasurement : String + - newCategory : String + - newBuyPrice : float + - newSellPrice : float + + + EditCommand(itemName: String, newItemName: String, newQuantity: int, newUnitOfMeasurement: String, newCategory: String, newBuyPrice: float, newSellPrice: float) + + getItemName() : String + + getNewItemName() : String + + getNewQuantity() : int + + getNewUnitOfMeasurement() : String + + getNewCategory() : String + + getNewBuyPrice() : float + + getNewSellPrice() : float + + execute() : void +} + +class Item { + - itemName : String + - quantity : int + - unitOfMeasurement : String + - category : String + - buyPrice : float + - sellPrice : float + - isOOS : boolean + + + setItemName(newName: String) + + setQuantity(newQuantity: int) + + setUnitOfMeasurement(newUnit: String) + + setCategory(newCategory: String) + + setBuyPrice(newPrice: float) + + setSellPrice(newPrice: float) + + getItemName() : String + + getQuantity() : int + + getUnitOfMeasurement() : String + + getCategory() : String + + getBuyPrice() : float + + getSellPrice() : float + + markOOS() + + unmarkOOS() +} + +class Itemlist { + - items : ArrayList + + + getItems() : ArrayList + + getItem(index: int) : Item + + overwriteFile(items : ArrayList) +} + +class TextUi { + + replyToUser(message: String) + + showEditMessage(oldValue: String, attribute: String, newValue: String) +} + +class Storage { + + overwriteFile(items : ArrayList) +} + +EditCommand -- "0..*" Item +EditCommand -- "1" Itemlist +EditCommand -- "1" TextUi +EditCommand -- "1" Storage +@enduml diff --git a/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml new file mode 100644 index 0000000000..e8f4bac3f6 --- /dev/null +++ b/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml @@ -0,0 +1,112 @@ +@startuml +participant "ui : TextUi" as UI +participant "editCommand : EditCommand" as EditCommand +participant "itemList : Itemlist" as Itemlist +participant "item : Item" as Item +participant "storage : Storage" as Storage + +activate EditCommand + +EditCommand -> Itemlist : getItems() +activate Itemlist +Itemlist --> EditCommand : return items +deactivate Itemlist + +EditCommand -> EditCommand : find item index +activate EditCommand +EditCommand --> EditCommand : index found / -1 if not found +deactivate EditCommand + +alt item not found + EditCommand -> UI : replyToUser("item not found!") + activate UI + UI --> EditCommand + deactivate UI +else item found + EditCommand -> Itemlist : getItem(index) + activate Itemlist + Itemlist --> EditCommand : return item + deactivate Itemlist + + loop For each editable attribute + alt newItemName exists + EditCommand -> UI : showEditMessage(newItemName) + activate UI + UI --> EditCommand + deactivate UI + EditCommand -> Item : setItemName(newItemName) + activate Item + Item --> EditCommand + deactivate Item + end + alt newQuantity exists + EditCommand -> UI : showEditMessage(newQuantity) + activate UI + UI --> EditCommand + deactivate UI + EditCommand -> Item : setQuantity(newQuantity) + activate Item + Item --> EditCommand + deactivate Item + end + alt newUnitOfMeasurement exists + EditCommand -> UI : showEditMessage(newUnitOfMeasurement) + activate UI + UI --> EditCommand + deactivate UI + EditCommand -> Item : setUnitOfMeasurement(newUnitOfMeasurement) + activate Item + Item --> EditCommand + deactivate Item + end + alt newCategory exists + EditCommand -> UI : showEditMessage(newCategory) + activate UI + UI --> EditCommand + deactivate UI + EditCommand -> Item : setCategory(newCategory) + activate Item + Item --> EditCommand + deactivate Item + end + alt newBuyPrice exists + EditCommand -> UI : showEditMessage(newBuyPrice) + activate UI + UI --> EditCommand + deactivate UI + EditCommand -> Item : setBuyPrice(newBuyPrice) + activate Item + Item --> EditCommand + deactivate Item + end + alt newSellPrice exists + EditCommand -> UI : showEditMessage(newSellPrice) + activate UI + UI --> EditCommand + deactivate UI + EditCommand -> Item : setSellPrice(newSellPrice) + activate Item + Item --> EditCommand + deactivate Item + end + + end loop + + EditCommand -> UI : replyToUser("End of Edits") + activate UI + UI --> EditCommand + deactivate UI + + EditCommand -> Storage : overwriteFile(Itemlist.getItems()) + activate Storage + Storage --> EditCommand + deactivate Storage +end + +EditCommand -> UI : replyToUser("") +activate UI +UI --> EditCommand +deactivate UI +hide footbox +deactivate EditCommand +@enduml diff --git a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml index c3873a5f0f..acfa613ff3 100644 --- a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml @@ -33,7 +33,7 @@ else contains Items ListCommand -> UI : replyToUser(item details) deactivate ListCommand activate UI - UI --> ListCommand : display marked items + UI --> ListCommand : display relevant items deactivate UI end hide footbox diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 587d1d010e..ef21da0f4a 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -15,7 +15,7 @@ public class EditCommand extends Command{ protected float newBuyPrice; protected float newSellPrice; - public EditCommand(String itemName, String newItemName, int newQuantity, String newUnitOfMeasurement, + public EditCommand(String itemName, String newItemName, int newQuantity, String newUnitOfMeasurement, String newCategory, float newBuyPrice, float newSellPrice) { this.itemName = itemName; From 81731e649a37c0db71f952c65b857316f3d07a53 Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 23:02:24 +0800 Subject: [PATCH 317/421] Update PPP --- docs/DeveloperGuide.md | 3 --- docs/team/hengshuhong.md | 18 +++++++++++++----- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 80236694cd..b78521df5b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -6,13 +6,10 @@ ## Design -{Describe the design and implementation of the product. Use UML diagrams and short code snippets where applicable.} - ### Command The Command class is an abstract class which is extended to execute the various commands used in the product. It contains the abstract method `execute`, which is overridden by all other Command child classes. -{Describe the design of the product. Use UML diagrams and short code snippets where applicable.} ### Exception ### Item diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 0b7683b9d6..b42c31b658 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -37,11 +37,19 @@ manage and operate their business. - **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) +- **Enhancements to existing features:** + - **Documentation** - User Guide: - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` - - Added the Quick Start - - Update the Command Summary + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions`. [#86](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/86) + - Added the Quick Start. + - Update the Command Summary. - Developer Guide: - - Added implementation details of the `promotion` feature. - - \ No newline at end of file + - Added implementation details of the `promotion` feature. [#176](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/176) + - Update Product Scope [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) + - Added non-functional requirements. [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) + + +- **Review Contributions** + - Fixed bug for team members that caused the application to crash. [#184](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/184) + - Fixed test case that failed [#187](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/187) \ No newline at end of file From a88dc1971bb8af744d6ee84ed554c2efcfc7c5e6 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sat, 13 Apr 2024 23:02:45 +0800 Subject: [PATCH 318/421] Documentation --- PromotionStorage.txt | 3 - StockMasterData.txt | 1 - TransactionLogs.txt | 24 +++ src/main/java/command/AddCommand.java | 10 + src/main/java/command/DeleteCommand.java | 4 + .../java/command/DeletePromotionCommand.java | 6 + src/main/java/command/EditCommand.java | 4 + src/main/java/command/HelpCommand.java | 5 + src/main/java/command/LowStockCommand.java | 2 +- src/main/java/command/SellCommand.java | 3 + src/main/java/common/Messages.java | 2 + .../exceptions/CommandFormatException.java | 3 + src/main/java/parser/Parser.java | 181 ++++++++++++------ src/main/java/parser/ParserFormat.java | 54 ++++++ src/main/java/seedu/duke/StockMaster.java | 2 + 15 files changed, 238 insertions(+), 66 deletions(-) create mode 100644 src/main/java/parser/ParserFormat.java diff --git a/PromotionStorage.txt b/PromotionStorage.txt index e21c82d075..e69de29bb2 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -1,3 +0,0 @@ -apple have a 50.00% discount -Period: 10 APR 2024 to 14 APR 2024 -Time: 1200 to 2300 diff --git a/StockMasterData.txt b/StockMasterData.txt index 4dc4f77cb1..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +0,0 @@ -1. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.0 | SellPrice: $10.0 diff --git a/TransactionLogs.txt b/TransactionLogs.txt index d71613a93a..de48b7761f 100644 --- a/TransactionLogs.txt +++ b/TransactionLogs.txt @@ -38,3 +38,27 @@ Unit Price: 30.0 Total Price: 30.0 Profit: 29.0 +Date: 2024-04-12 14:08:33 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-12 14:09:02 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + +Date: 2024-04-13 22:43:04 +Transaction ID: 1 +Item Name: testItem +Quantity: 1 +Unit Price: 30.0 +Total Price: 30.0 +Profit: 29.0 + diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index fdc15357b6..02cad26081 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.CommandFormatException; import item.Item; import itemlist.Itemlist; import storage.Storage; @@ -45,6 +46,9 @@ public float getSellPrice() { return sellPrice; } + /** + * Adds an item to the itemlist with the item name, quantity, units of measurement, category, buy and sell price + */ @Override public void execute() { if (Itemlist.itemIsExist(itemName)) { @@ -63,6 +67,12 @@ public void execute() { } } + /** + * Checks if the item about to be added already exists in the item list. If so, it will update the quantity of the + * item by adding the new amount to the existing amount. Other variables like buy and sell price will not be changed + * + * @param itemName The name of the item to be added + */ public void updateQuantity(String itemName) { System.out.println("Item already exists and item information has been updated"); int indexOfItem = -1; diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 4156ac26a3..b0d4f7d9db 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -1,5 +1,6 @@ package command; +import exceptions.CommandFormatException; import item.Item; import itemlist.Itemlist; import storage.Storage; @@ -12,6 +13,9 @@ public DeleteCommand(String itemName) { this.itemName = itemName.toLowerCase(); //for checking later } + /** + * Searches of the item in the item list with the same name and deletes it + */ public void execute() { int index = -1; try { diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java index 1d55aed7d3..0698111d38 100644 --- a/src/main/java/command/DeletePromotionCommand.java +++ b/src/main/java/command/DeletePromotionCommand.java @@ -14,6 +14,12 @@ public class DeletePromotionCommand extends Command { public DeletePromotionCommand(String itemName) { this.itemName = itemName; } + + /** + * Deletes an existing promotion for an item + * + * @throws CommandFormatException Command does not follow the required format. + */ @Override public void execute() throws CommandFormatException { if (Promotionlist.itemIsOnPromo(itemName)) { diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index bca282cde2..d06854a758 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -1,6 +1,7 @@ //@@author Fureimi package command; +import exceptions.CommandFormatException; import item.Item; import itemlist.Itemlist; import storage.Storage; @@ -55,6 +56,9 @@ public float getNewSellPrice() { return newSellPrice; } + /** + * Edits the relevant params of the item in the item list + */ @Override public void execute() { int index = -1; // flag to check if item exists in Itemlist diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 120e64aa92..94487db782 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -1,6 +1,7 @@ package command; import common.Messages; +import exceptions.CommandFormatException; public class HelpCommand extends Command{ @@ -9,6 +10,10 @@ public class HelpCommand extends Command{ public HelpCommand(String command){ this.command = command; } + + /** + * Prints the help message for the relevant command + */ @Override public void execute() { switch (command) { diff --git a/src/main/java/command/LowStockCommand.java b/src/main/java/command/LowStockCommand.java index 1f1cf6b864..bad4bafb13 100644 --- a/src/main/java/command/LowStockCommand.java +++ b/src/main/java/command/LowStockCommand.java @@ -5,7 +5,7 @@ public class LowStockCommand extends Command{ - protected static final int DEFAULT_LOW_STOCK_THRESHOLD = 5; + protected static final int DEFAULT_LOW_STOCK_THRESHOLD = 10; protected int lowStockAmount; public LowStockCommand(){ diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 314380560f..f89aa645d1 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -27,6 +27,9 @@ public int getSellQuantity() { return sellQuantity; } + /** + * Checks that the item is in the list, then edits the quantity, reducing it by the amount sold + */ @Override public void execute() { int index = -1; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index ded07d5354..e8a40ebd2b 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -291,6 +291,8 @@ public class Messages { public static final String INVALID_CATEGORY = "Blank category detected. Please input a category."; + public static final String INVALID_UNITS = "Invalid units of measurement."; + public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; public static final String QTY_TOO_LARGE = "Quantity is too large. Please input a smaller quantity."; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index b9c1b57830..7402ba6729 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -68,6 +68,9 @@ public CommandFormatException(String error) { case "INVALID_CATEGORY": System.out.println(Messages.INVALID_CATEGORY); break; + case "INVALID_UNITS": + System.out.println(Messages.INVALID_UNITS); + break; case "INVALID_COMMAND": System.out.println(Messages.INVALID_HELP_COMMAND); break; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 1b190dc49c..482e805931 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -27,61 +27,22 @@ import promotion.Promotionlist; +import java.io.IOException; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Parser { - public static final Pattern HELP_COMMAND_FORMAT = - Pattern.compile("help(?: c/(?[^/]+))?"); - public static final Pattern ADD_COMMAND_FORMAT = - Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + - "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); - - - public static final Pattern DELETE_COMMAND_FORMAT = - Pattern.compile("del (?[^/]+)"); - - public static final Pattern EDIT_COMMAND_FORMAT = - Pattern.compile("edit (?[^/]+)" + - "(?:\\s+(name/(?[^/]+)|qty/(?\\d+)|uom/(?[^/]+)|" + - "cat/(?[^/]+)|buy/(?\\d*\\.?\\d+)|sell/(?\\d*\\.?\\d+)))+"); - - public static final Pattern SELL_COMMAND_FORMAT = - Pattern.compile("sell (?[^/]+) qty/(?\\d+)"); - - public static final Pattern FIND_COMMAND_FORMAT = - Pattern.compile("find(?: /(?[^/]+))* (?[^/]+)"); - - public static final Pattern BASIC_COMMAND_FORMAT = - Pattern.compile("(?\\S+)(?.*)"); - - public static final Pattern LIST_ITEM_COMMAND_FORMAT = - Pattern.compile("list_items(?:\\s+(?marked))?(?:\\s+cat/(?[^/]+))?"); - - public static final Pattern MARK_COMMAND_FORMAT = - Pattern.compile("mark (?[^/]+)"); - public static final Pattern UNMARK_COMMAND_FORMAT = - Pattern.compile("unmark (?[^/]+)"); - - public static final Pattern PROMOTION_COMMAND_FORMAT = - Pattern.compile("promotion (?[^/]+) discount/(?\\d+(\\.\\d{1,2})?) " + - "period /from (?\\d+) (?\\w+) (?\\d+) " + - "/to (?\\d+) (?\\w+) (?\\d+) " + - "time /from (?\\d{4}) /to (?\\d{4})"); - public static final Pattern DELETE_PROMO_COMMAND_FORMAT = - Pattern.compile("del_promo (?[^/]+)"); - - public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = - Pattern.compile("^list_transactions(?:\\s+item/(?\\w+))?$"); - - - public static final Pattern LOW_STOCK_COMMAND_FORMAT = - Pattern.compile("low_stock /(?[^/]+)"); + /** + * Takes in the user's input and calls the relevant command + * + * @param userInput The user's input command + * @throws CommandFormatException Command does not follow the required format. + */ public Command parseInput(String userInput){ final CommandType userCommand; - final Matcher matcher = BASIC_COMMAND_FORMAT.matcher(userInput.trim()); + final Matcher matcher = ParserFormat.BASIC_COMMAND_FORMAT.matcher(userInput.trim()); if (!matcher.matches()) { System.out.println(Messages.INVALID_COMMAND); System.out.println(Messages.HELP); @@ -190,8 +151,15 @@ public Command parseInput(String userInput){ return new IncorrectCommand(); } + /** + * Formats the user's input to call HelpCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareHelp(String args) throws CommandFormatException{ - final Matcher matcher = HELP_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.HELP_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.HELP); @@ -206,8 +174,15 @@ private Command prepareHelp(String args) throws CommandFormatException{ return new HelpCommand(command); } + /** + * Formats the user's input to call AddCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareAdd(String args) throws CommandFormatException{ - final Matcher matcher = ADD_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.ADD_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.ADD); @@ -230,6 +205,11 @@ private Command prepareAdd(String args) throws CommandFormatException{ throw new CommandFormatException("QTY_TOO_LARGE"); } + String unitOfMeasurement = matcher.group("unitOfMeasurement").trim(); + if (unitOfMeasurement.isEmpty()) { + throw new CommandFormatException("INVALID_UNITS"); + } + float buyPrice; try { buyPrice = Float.parseFloat(matcher.group("buyPrice")); @@ -248,15 +228,22 @@ private Command prepareAdd(String args) throws CommandFormatException{ return new AddCommand( itemName, quantity, - matcher.group("unitOfMeasurement"), + unitOfMeasurement, category, buyPrice, sellPrice ); } + /** + * Formats the user's input to call DeleteCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareDelete(String args) throws CommandFormatException{ - final Matcher matcher = DELETE_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.DELETE_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.DEL); @@ -268,9 +255,15 @@ private Command prepareDelete(String args) throws CommandFormatException{ return new DeleteCommand(itemName); } + /** + * Formats the user's input to call SellCommand with the appropriate params + * + * @param args The user's parsed input command + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareSell(String args) throws CommandFormatException{ - final Matcher matcher = SELL_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.SELL_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.SELL); @@ -304,8 +297,15 @@ private Command prepareSell(String args) throws CommandFormatException{ } } + /** + * Formats the user's input to call FindCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareFind(String args) throws CommandFormatException{ - final Matcher matcher = FIND_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.FIND_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.FIND); @@ -317,8 +317,16 @@ private Command prepareFind(String args) throws CommandFormatException{ } //@@author Fureimi + /** + * Formats the user's input to call EditCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + * @throws EditException Command does not follow the required format for the edit command. + */ private Command prepareEdit(String args) throws CommandFormatException, EditException { - final Matcher matcher = EDIT_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.EDIT_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(CommandType.EDIT); } @@ -392,8 +400,16 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce ); } + /** + * Formats the user's input to call AddPromotionCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + * @throws InvalidDateException Date/time input is not valid. + */ private Command preparePromotion(String args) throws CommandFormatException, InvalidDateException { - final Matcher matcher = PROMOTION_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.PROMOTION_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(CommandType.PROMOTION); @@ -431,16 +447,31 @@ private Command preparePromotion(String args) throws CommandFormatException, Inv } } + /** + * Formats the user's input to call DeletePromotionCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareDeletePromo(String args) throws CommandFormatException{ - final Matcher matcher = DELETE_PROMO_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.DELETE_PROMO_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.DEL_PROMO); } return new DeletePromotionCommand(matcher.group("itemName").toLowerCase()); } + + /** + * Formats the user's input to list all items or list them by category + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareItemList(String args) throws CommandFormatException { - final Matcher matcher = LIST_ITEM_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.LIST_ITEM_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.LIST_ITEMS); @@ -457,8 +488,15 @@ private Command preparePromotionList() { return new ListCommand<>(Promotionlist.getAllPromotion()); } + /** + * Formats the user's input to call MarkCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareMark(String args) throws CommandFormatException { - final Matcher matcher = MARK_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.MARK_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(CommandType.MARK); } @@ -469,8 +507,15 @@ private Command prepareMark(String args) throws CommandFormatException { return new MarkCommand(itemName); } + /** + * Formats the user's input to call UnmarkCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareUnmark(String args) throws CommandFormatException { - final Matcher matcher = UNMARK_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.UNMARK_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(CommandType.UNMARK); } @@ -481,8 +526,15 @@ private Command prepareUnmark(String args) throws CommandFormatException { return new UnmarkCommand(itemName); } + /** + * Formats the user's input to list all transactions or list all transactions of a certain item + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareTransactionList(String args) throws CommandFormatException { - final Matcher matcher = LIST_TRANSACTION_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.LIST_TRANSACTION_COMMAND_FORMAT.matcher(args.trim()); if (!matcher.matches()) { throw new CommandFormatException(Messages.INVALID_COMMAND); } @@ -494,8 +546,15 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio return new ListCommand<>(Cashier.getTransactions(), itemName); } + /** + * Formats the user's input to call LowStockCommand with the appropriate params + * + * @param args The user's parsed input command + + * @throws CommandFormatException Command does not follow the required format. + */ private Command prepareLowStock(String args) throws CommandFormatException{ - final Matcher matcher = LOW_STOCK_COMMAND_FORMAT.matcher(args.trim()); + final Matcher matcher = ParserFormat.LOW_STOCK_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format if (!matcher.matches()) { throw new CommandFormatException(CommandType.LOW_STOCK); diff --git a/src/main/java/parser/ParserFormat.java b/src/main/java/parser/ParserFormat.java new file mode 100644 index 0000000000..b142291ef4 --- /dev/null +++ b/src/main/java/parser/ParserFormat.java @@ -0,0 +1,54 @@ +package parser; + +import java.util.regex.Pattern; + +public class ParserFormat { + + public static final Pattern HELP_COMMAND_FORMAT = + Pattern.compile("help(?: c/(?[^/]+))?"); + public static final Pattern ADD_COMMAND_FORMAT = + Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + + "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); + + + public static final Pattern DELETE_COMMAND_FORMAT = + Pattern.compile("del (?[^/]+)"); + + public static final Pattern EDIT_COMMAND_FORMAT = + Pattern.compile("edit (?[^/]+)" + + "(?:\\s+(name/(?[^/]+)|qty/(?\\d+)|uom/(?[^/]+)|" + + "cat/(?[^/]+)|buy/(?\\d*\\.?\\d+)|sell/(?\\d*\\.?\\d+)))+"); + + public static final Pattern SELL_COMMAND_FORMAT = + Pattern.compile("sell (?[^/]+) qty/(?\\d+)"); + + public static final Pattern FIND_COMMAND_FORMAT = + Pattern.compile("find(?: /(?[^/]+))* (?[^/]+)"); + + public static final Pattern BASIC_COMMAND_FORMAT = + Pattern.compile("(?\\S+)(?.*)"); + + public static final Pattern LIST_ITEM_COMMAND_FORMAT = + Pattern.compile("list_items(?:\\s+(?marked))?(?:\\s+cat/(?[^/]+))?"); + + public static final Pattern MARK_COMMAND_FORMAT = + Pattern.compile("mark (?[^/]+)"); + public static final Pattern UNMARK_COMMAND_FORMAT = + Pattern.compile("unmark (?[^/]+)"); + + public static final Pattern PROMOTION_COMMAND_FORMAT = + Pattern.compile("promotion (?[^/]+) discount/(?\\d+(\\.\\d{1,2})?) " + + "period /from (?\\d+) (?\\w+) (?\\d+) " + + "/to (?\\d+) (?\\w+) (?\\d+) " + + "time /from (?\\d{4}) /to (?\\d{4})"); + public static final Pattern DELETE_PROMO_COMMAND_FORMAT = + Pattern.compile("del_promo (?[^/]+)"); + + public static final Pattern LIST_TRANSACTION_COMMAND_FORMAT = + Pattern.compile("^list_transactions(?:\\s+item/(?\\w+))?$"); + + + public static final Pattern LOW_STOCK_COMMAND_FORMAT = + Pattern.compile("low_stock /(?[^/]+)"); + +} diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index a1cec1bc40..b76c098e10 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -2,6 +2,7 @@ import command.Command; import command.ExitCommand; +import command.LowStockCommand; import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; @@ -41,6 +42,7 @@ public void run() throws IOException, CommandFormatException, InvalidDateExcepti TransactionLogs.readFromFile(TRANSACTION_FILE); PromotionStorage.updateFile("", true); PromotionStorage.readFromFile(PROMOTION_STORAGE_FILE); + new LowStockCommand().execute(); this.normalOperation(); ui.showGoodByeMessage(STORAGE_FILE, TRANSACTION_FILE, PROMOTION_STORAGE_FILE); } From 57028b61a11efd99fa7415e03856fe8da0cb12e8 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 13 Apr 2024 23:18:36 +0800 Subject: [PATCH 319/421] Add ListCommaandTest --- src/main/java/command/AddCommand.java | 4 +- src/main/java/command/ListCommand.java | 40 ++-- src/main/java/parser/Parser.java | 8 +- .../java/command/IncorrectCommandTest.java | 13 ++ src/test/java/command/ListCommandTest.java | 172 ++++++++++++++++++ 5 files changed, 219 insertions(+), 18 deletions(-) create mode 100644 src/test/java/command/IncorrectCommandTest.java create mode 100644 src/test/java/command/ListCommandTest.java diff --git a/src/main/java/command/AddCommand.java b/src/main/java/command/AddCommand.java index 9c9c8a6355..0a5251bc16 100644 --- a/src/main/java/command/AddCommand.java +++ b/src/main/java/command/AddCommand.java @@ -67,7 +67,7 @@ public void execute() { if (!category.equals("NA")) { System.out.println(" to " + getCategory()); } else { - System.out.println(""); + System.out.println(); assert category.equals("NA"); } } @@ -77,7 +77,7 @@ public void execute() { * Performs an edit on the item if the item already exists in the item list * Only the item information that are different will be edited * - * @param itemName + * @param itemName The name of the Item to be edited. */ public void updateItemInfo(String itemName) { diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index f2442435e7..affab4ce2b 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -8,13 +8,14 @@ import ui.TextUi; import java.util.ArrayList; +import java.util.logging.Level; /** * Prints out the various ArrayLists, full or partial, based on modifiers. - * @param is the Type of ArrayList ie Item, - * Transaction or Promotion + * It prints differently based on the Type of ArrayList used. + * ie Item, Transaction or Promotion */ -public class ListCommand extends Command{ +public class ListCommand extends Command{ protected ArrayList itemList = new ArrayList<>(); protected ArrayList transactionList = new ArrayList<>(); @@ -96,28 +97,43 @@ private void showPromotionList() { } private static boolean containsItems(ArrayList arrayList) { - for (Object obj : arrayList) { - if (obj instanceof Item) { - return true; + try { + for (Object obj : arrayList) { + if (obj instanceof Item) { + return true; + } } + } catch (NullPointerException e) { + LOGGER.log(Level.WARNING, "NullPointerException occurred.", e); + return false; } return false; } private static boolean containsTransactions(ArrayList arrayList) { - for (Object obj : arrayList) { - if (obj instanceof Transaction) { - return true; + try { + for (Object obj : arrayList) { + if (obj instanceof Transaction) { + return true; + } } + } catch (NullPointerException e) { + LOGGER.log(Level.WARNING, "NullPointerException occurred.", e); + return false; } return false; } private static boolean containsPromotions(ArrayList arrayList) { - for (Object obj : arrayList) { - if (obj instanceof Promotion) { - return true; + try { + for (Object obj : arrayList) { + if (obj instanceof Promotion) { + return true; + } } + } catch (NullPointerException e) { + LOGGER.log(Level.WARNING, "NullPointerException occurred.", e); + return false; } return false; } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 710fe21045..fef075da39 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -467,11 +467,11 @@ private Command prepareItemList(String args) throws CommandFormatException { throw new CommandFormatException("INVALID_CATEGORY"); } boolean listMarked = matcher.group("isMark") != null; - return new ListCommand<>(Itemlist.getItems(), category, listMarked); + return new ListCommand(Itemlist.getItems(), category, listMarked); } private Command preparePromotionList() { - return new ListCommand<>(Promotionlist.getAllPromotion()); + return new ListCommand(Promotionlist.getAllPromotion()); } private Command prepareMark(String args) throws CommandFormatException { @@ -504,11 +504,11 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio throw new CommandFormatException(CommandType.LIST_TRANSACTIONS); } if (matcher.group("itemName") == null) { - return new ListCommand<>(Cashier.getTransactions(), "NA"); + return new ListCommand(Cashier.getTransactions(), "NA"); } String itemName = matcher.group(1).trim(); - return new ListCommand<>(Cashier.getTransactions(), itemName); + return new ListCommand(Cashier.getTransactions(), itemName); } private Command prepareLowStock(String args) throws CommandFormatException{ diff --git a/src/test/java/command/IncorrectCommandTest.java b/src/test/java/command/IncorrectCommandTest.java new file mode 100644 index 0000000000..48e4a7a274 --- /dev/null +++ b/src/test/java/command/IncorrectCommandTest.java @@ -0,0 +1,13 @@ +package command; + +import org.junit.jupiter.api.Test; + +public class IncorrectCommandTest { + + private static final IncorrectCommand incorrectCommand = new IncorrectCommand(); + + @Test + public void incorrectCommandTest() { + incorrectCommand.execute(); + } +} diff --git a/src/test/java/command/ListCommandTest.java b/src/test/java/command/ListCommandTest.java new file mode 100644 index 0000000000..beb93052b2 --- /dev/null +++ b/src/test/java/command/ListCommandTest.java @@ -0,0 +1,172 @@ +package command; + +import common.Messages; +import exceptions.CommandFormatException; +import exceptions.EmptyListException; +import item.Item; +import item.Transaction; +import itemlist.Cashier; +import itemlist.Itemlist; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import promotion.Promotion; +import promotion.Promotionlist; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class ListCommandTest extends Cashier { + + //clears all the lists + @BeforeEach + public void reset() { + while (!Promotionlist.getAllPromotion().isEmpty()) { + Promotionlist.deletePromotion(0); + } + while (Itemlist.getItem(0) != null) { + Itemlist.deleteItem(0); + } + while (Cashier.getTransaction(0) != null) { + transactions = new ArrayList<>(); + } + } + + //happy case: has item + @Test + public void listCommandTest_itemList_correct() { + Item test = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); + Itemlist.addItem(test); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", false); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "List: " + System.lineSeparator() + "1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + + //Happy case: has 1 transaction + @Test + public void listCommandTest_transactionList_correct() { + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + addCommand.execute(); + SellCommand sellCommand = new SellCommand("testItem", 1, 0); + ListCommand listCommand1 = new ListCommand(transactions, "NA"); + try { + sellCommand.execute(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. " + transactions.get(0) + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } catch (CommandFormatException e) { + Assertions.fail("Unexpected CommandFormatException thrown"); + throw new RuntimeException(e); + } + + } + + //happy case: filtered item successfully + @Test + public void listCommandTest_transactionList_correct2() { + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + addCommand.execute(); + SellCommand sellCommand = new SellCommand("testItem", 1, 0); + try { + sellCommand.execute(); + ListCommand listCommand1 = new ListCommand(transactions, "testItem"); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. " + transactions.get(0) + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } catch (CommandFormatException e) { + Assertions.fail("Unexpected CommandFormatException thrown"); + throw new RuntimeException(e); + } + + } + + @Test + public void listCommandTest_transactionList_correct3() { + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + addCommand.execute(); + SellCommand sellCommand = new SellCommand("testItem", 1, 0); + ListCommand listCommand1 = new ListCommand(transactions, "failTest"); + try { + sellCommand.execute(); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = Messages.EMPTY_LIST + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } catch (CommandFormatException e) { + Assertions.fail("Unexpected CommandFormatException thrown"); + throw new RuntimeException(e); + } + + } + + @Test + public void listCommandTest_itemList_empty() { + ListCommand listCommand1 = new ListCommand(new ArrayList(), "NA", false); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = Messages.EMPTY_LIST + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + + } + + @Test + public void listCommandTest_transactionList_empty() { + ListCommand listCommand1 = new ListCommand(new ArrayList(), "NA"); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = Messages.EMPTY_LIST + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + + } + + @Test + public void listCommandTest_promotionList_empty() { + ListCommand listCommand1 = new ListCommand(new ArrayList()); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = Messages.EMPTY_LIST + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + throw new RuntimeException(e); + } + + } +} From 128bfb4451f45c81ff5c502e6de5e4b7e4c2cb64 Mon Sep 17 00:00:00 2001 From: Shu Date: Sat, 13 Apr 2024 23:36:14 +0800 Subject: [PATCH 320/421] Edit Delete Command --- StockMasterData.txt | 1 - docs/team/hengshuhong.md | 18 ++++-------- src/main/java/command/DeleteCommand.java | 28 +++++++++++-------- src/main/java/common/Messages.java | 2 ++ .../exceptions/CommandFormatException.java | 3 ++ 5 files changed, 27 insertions(+), 25 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8ef5894379..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +0,0 @@ -1. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index b42c31b658..0b7683b9d6 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -37,19 +37,11 @@ manage and operate their business. - **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) -- **Enhancements to existing features:** - - **Documentation** - User Guide: - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions`. [#86](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/86) - - Added the Quick Start. - - Update the Command Summary. + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Added the Quick Start + - Update the Command Summary - Developer Guide: - - Added implementation details of the `promotion` feature. [#176](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/176) - - Update Product Scope [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) - - Added non-functional requirements. [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) - - -- **Review Contributions** - - Fixed bug for team members that caused the application to crash. [#184](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/184) - - Fixed test case that failed [#187](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/187) \ No newline at end of file + - Added implementation details of the `promotion` feature. + - \ No newline at end of file diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index aa1e11c519..ae85bd6832 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -1,8 +1,10 @@ package command; +import exceptions.CommandFormatException; import exceptions.EmptyListException; import item.Item; import itemlist.Itemlist; +import promotion.Promotionlist; import storage.Storage; import java.util.logging.Level; @@ -26,21 +28,25 @@ public void execute() throws EmptyListException { } if (index == -1) { //throw exception; - throw new EmptyListException("Item"); + throw new CommandFormatException("ITEM_NOT_FOUND"); + } + if (Promotionlist.itemIsOnPromo(itemName)) { + throw new CommandFormatException("UNABLE_TO_DELETE"); + } + Itemlist.deleteItem(index); + System.out.println(itemName + " has been successfully deleted."); + Storage.overwriteFile(Itemlist.getItems()); + if (index == Itemlist.getItems().size()) { + assert (Itemlist.getItem(index) == null); } else { - Itemlist.deleteItem(index); - System.out.println(itemName + " has been successfully deleted."); - Storage.overwriteFile(Itemlist.getItems()); - if (index == Itemlist.getItems().size()) { - assert (Itemlist.getItem(index) == null); - } else { - assert (!Itemlist.getItem(index).getItemName().equals(itemName)); - } - LOGGER.info("Item successfully deleted."); + assert (!Itemlist.getItem(index).getItemName().equals(itemName)); } - } catch (IndexOutOfBoundsException | EmptyListException e) { + LOGGER.info("Item successfully deleted."); + } catch (IndexOutOfBoundsException e) { LOGGER.log(Level.WARNING, "Item not deleted.", e); System.out.println("Itemlist is empty."); + } catch (CommandFormatException e) { + LOGGER.info("Promotion exists for item and thus cannot be deleted."); } } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 56b2f7f863..774166299d 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -245,6 +245,8 @@ public class Messages { "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + "2. 'find /filter1/filter2 [KEYWORD]' to search under the filters"; + public static final String UNABLE_TO_DELETE = "There is a promotion that exists for this item. Please remove the " + + "promotion before deleting the item."; public static final String EMPTY_ITEM_LIST = "There are no items with your search query."; public static final String EMPTY_TRANSACTION_LIST = "There are no transactions with your search query."; public static final String EMPTY_LIST = "There is nothing here! Time to spend some money and stock em up!"; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 5ffd9b3c1c..778a4e1575 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -74,6 +74,9 @@ public CommandFormatException(String error) { case "INVALID_COMMAND": System.out.println(Messages.INVALID_HELP_COMMAND); break; + case "UNABLE_TO_DELETE": + System.out.println(Messages.UNABLE_TO_DELETE); + break; case "QTY_TOO_LARGE": System.out.println(Messages.QTY_TOO_LARGE); break; From 440965a67aa020df64b87429abe547c1b914a4ef Mon Sep 17 00:00:00 2001 From: LowTL Date: Sat, 13 Apr 2024 23:37:01 +0800 Subject: [PATCH 321/421] Add storage loggers --- src/main/java/seedu/duke/StockMaster.java | 4 +++- src/main/java/storage/PromotionStorage.java | 8 ++++++++ src/main/java/storage/Storage.java | 14 ++++++++++++++ src/main/java/storage/TransactionLogs.java | 2 ++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index 662067c640..e988e6ed75 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -26,7 +26,7 @@ public class StockMaster { private static final String STORAGE_FILE = "./StockMasterData.txt"; private static final String TRANSACTION_FILE = "./TransactionLogs.txt"; private static final String PROMOTION_STORAGE_FILE = "./PromotionStorage.txt"; - private static final Logger logger = Logger.getLogger(StockMaster.class.getName()) ; + private static final Logger logger = Logger.getLogger(StockMaster.class.getName()); private final TextUi ui = new TextUi(); private final Parser parser = new Parser(); @@ -58,6 +58,7 @@ private static void initLogger() { Logger parserLogger = Logger.getLogger(Parser.class.getName()); Logger commandLogger = Logger.getLogger(Command.class.getName()); Logger cashierLogger = Logger.getLogger(Cashier.class.getName()); + Logger storageLogger = Logger.getLogger(Storage.class.getName()); LogManager.getLogManager().reset(); //clears out any default settings ConsoleHandler ch = new ConsoleHandler(); //to print errors to console logger.addHandler(ch); @@ -75,6 +76,7 @@ private static void initLogger() { parserLogger.addHandler(fh); commandLogger.addHandler(fh); cashierLogger.addHandler(fh); + storageLogger.addHandler(fh); } catch (IOException e) { logger.log(Level.SEVERE, "Unable to create FileHandler", e); } diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java index 0905f812c2..95776379d0 100644 --- a/src/main/java/storage/PromotionStorage.java +++ b/src/main/java/storage/PromotionStorage.java @@ -12,6 +12,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Scanner; +import java.util.logging.Level; public class PromotionStorage extends Storage{ @@ -24,8 +25,10 @@ public static String getFileDirectory() { public static void updateFile(String inputText, boolean ifAppend) { try { writeToFile(getFileDirectory(), inputText, ifAppend); + LOGGER.info("Stored promotion."); } catch (IOException e) { System.out.println("IOExceptions occurred"); + LOGGER.warning(e.toString()); } } @@ -83,14 +86,19 @@ public static void readFromFile(String fileName) { break; default: System.out.println("Read Promotion File Error"); + LOGGER.warning("Promotions not read from file."); } } scanner.close(); + LOGGER.info("Promotions successfully read from file."); } catch (FileNotFoundException e) { System.out.println("File does not exist."); + LOGGER.warning("File not found."); } catch (NumberFormatException e) { System.out.println("Invalid numbers found."); + LOGGER.warning("Invalid numbers found."); } catch (InvalidDateException | CommandFormatException e) { + LOGGER.log(Level.WARNING, "Other exception occurred.", e); System.out.println(e);; } } diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index 2af1500724..d5f2a24c38 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -9,14 +9,18 @@ import java.util.Scanner; import java.io.FileWriter; import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; /** * Represents a class that stores and writes information of a list of items to a file. * String FILENAME represents the designated relative file path for the file. */ public class Storage { + protected static final Logger LOGGER = Logger.getLogger(Storage.class.getName()); private static final String FILENAME = "./StockMasterData.txt"; + /** * Write contents to the file. * @@ -30,13 +34,16 @@ public static void writeToFile(String filePath, String textToAdd, boolean ifAppe FileWriter writer = new FileWriter(filePath, ifAppend); writer.write(textToAdd); writer.close(); + LOGGER.info("Line written successfully."); } public static void updateFile(String inputText, boolean ifAppend) { try { writeToFile(getFileDirectory(), inputText, ifAppend); + LOGGER.info("Line written successfully."); } catch (IOException e) { System.out.println("IOExceptions occurred"); + LOGGER.warning("IOException occurred."); } } @@ -99,6 +106,7 @@ public static void interpretLines(Scanner scanner) throws NumberFormatException{ toAdd.unmark(); } Itemlist.addItem(toAdd); + LOGGER.info("Item successfully restored."); } } @@ -113,10 +121,13 @@ public static void readFromFile(String fileName) { Scanner scanner = new Scanner(new File(fileName)); interpretLines(scanner); scanner.close(); + LOGGER.info("Storage done reading."); } catch(FileNotFoundException e) { System.out.println("File does not exist. Creating a new Text File"); + LOGGER.warning("File does not exist."); } catch(NumberFormatException e) { System.out.println("Invalid numbers found."); + LOGGER.log(Level.WARNING, "Invalid numbers found.", e); } } @@ -135,6 +146,7 @@ public static void addToFile(ArrayList items) { " | " + "BuyPrice: $" + String.format("%.2f", lastItem.getBuyPrice()) + " | " + "SellPrice: $" + String.format("%.2f", lastItem.getSellPrice()) + "\n"; updateFile(descriptionAdded, true); + LOGGER.info("Added line to file."); } /** @@ -155,8 +167,10 @@ public static void overwriteFile(ArrayList items) { String.format("%.2f", items.get(index).getSellPrice()) + "\n"; if (index == 0) { updateFile(descriptionAdded, false); + LOGGER.info("File overwritten."); } else { updateFile(descriptionAdded, true); + LOGGER.info("File not overwritten."); } } } diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index 7d8f2ece23..c4f05214a7 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -61,6 +61,7 @@ public static void interpretLines(Scanner scanner) throws NumberFormatException{ Transaction toAdd = new Transaction(commandName, quantityAsInt, buyAsFloat, Float.parseFloat(commandSell), commandDate); Cashier.addItem(toAdd); + LOGGER.info("Transaction added successfully."); } } } @@ -90,5 +91,6 @@ public static void addToLog(ArrayList transactions) { descriptionAdded += "Profit: " + lastTransaction.getProfit() + "\n"; descriptionAdded += "\n"; updateFile(descriptionAdded, true); + LOGGER.info("Stored transaction."); } } From eec36ca292ceb18bfb20f366d294c71d893ccd3d Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 13 Apr 2024 23:46:31 +0800 Subject: [PATCH 322/421] change UG and PPP --- docs/UserGuide.md | 22 +++++++++------ docs/team/Fureimi.md | 36 +++++++++++++++++++++++- src/main/java/item/Item.java | 2 +- src/test/java/itemlist/ItemlistTest.java | 5 +++- 4 files changed, 54 insertions(+), 11 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index ffae728696..3bad8361b8 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -30,13 +30,14 @@ add apple qty/50 /pieces cat/fruits buy/4 sell/5 add phone qty/5 /pieces cat/Electronics buy/100 sell/500 ``` -### Listing all items: `list_items` -Lists all stored items. +### Listing items: `list_items` +Lists stored items according to what user requests. Format: `list_items [marked] [cat/CATEGORY]` +* By default, `list_items` on its own will list all stored items. * `marked` is an optional field. If used, it will only list marked items. -* `CATEGORY` is an optional field. By default, it will list all the stored items. +* `CATEGORY` is an optional field. If used, it will only list items of that category. Example of usage: ``` @@ -44,8 +45,13 @@ list_items list_items cat/Electronics list_items marked cat/fruits ``` +Example output: +``` +1. [ ] apple (Qty: 50 pieces, Buy: $4.0, Sell: $5.0, Category: fruits) +``` _**Note**_
-_marked **MUST** be before cat/[CATEGORY]_ +- _marked **MUST** be before cat/[CATEGORY]_ +- The `[ ]` before each item represents if an item is marked or not. More info on mark feature can be found below. ### Deleting an item: `del` Deletes the item from the list of items. @@ -107,7 +113,7 @@ edit apple qty/45 buy/3.50 sell/5.50 edit fish name/Salmon qty/1 cat/fish ``` -Expected Output: +Example Output: ``` Edited: Quantity of apple from 50 to 45 @@ -248,11 +254,11 @@ the application. |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | | Delete Item | `del ITEM_NAME`
`e.g. del Apple` | -| Edit Item | `edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | +| Edit Item | `edit [ITEM_NAME] [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | | Find Item | `find KEYWORD`
`e.g. find University` | | Sell Item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | -| Mark Item | `mark [ITEM_NAME]` | -| Unmark Item | `unmark [ITEM_NAME]` | +| Mark Item | `mark ITEM_NAME` | +| Unmark Item | `unmark ITEM_NAME` | | List Inventory | `list_items [marked] [cat/CATEGORY]` | | Get Best Seller | `bestseller` | | Get Profit | `total_profit` | diff --git a/docs/team/Fureimi.md b/docs/team/Fureimi.md index e52e869e60..5db86ffff4 100644 --- a/docs/team/Fureimi.md +++ b/docs/team/Fureimi.md @@ -3,4 +3,38 @@ ## Project: StockMaster StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them -manage and operate their business. \ No newline at end of file +manage and operate their business. + +### Code Contribution +- **New Feature**: Added the ability to: + - List all items, + - List all items of a certain category, + - List all marked items, + - List all marked items of a certain category. + - **What it does**: Allows user to list items in the item list according to the user needs. + - **Justification**: This feature is crucial for StockMaster, as the main purpose of our application is for store owners +to keep track of their inventory. It also provides a convenient way for users to check a item of a certain category as +they may have many items in the whole item list, making it hard to search for specific items. In addition, users might +only want to see their marked items. The mark feature is explained below. +- **New Feature**: Added the ability to mark and unmark specific items in the item list. + - **What it does**: Allows users to mark specific item in the item list. The user can also unmark a marked item. + - **Justification**: Users might want to mark items for many reasons, such as to keep track of their sales as they + may be a high in demand item. These items might also be from different categories, so user cannot list them by + category. This feature hence provides a convenient way for users to access items they want to keep an eye on. +- **New Feature**: Added the ability to edit current item parameters. + - **What it does**: Allows users to edit specific parameters of existing items, such as quantity, category, name, etc. + - **Justification**: This feature is crucial to our application as it allows users to rectify user errors when + adding items to the item list. In addition, it allows the user to change the items to reflect accurately the status + of each item. For example, the user may want to change the selling price of specific items due to a anticipation of a + surge in demand. + - **Highlights**: The implementation was challenging as it required integration with `Itemlist` as well as `Item` to + ensure that the parameters are edited accurately. In addition, this enhancement allows users to edit multiple + parameters at once, which increases convenience for the user. +- **Code Contributed** : [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Fureimi&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +- **Documentation**: + - User Guide: + - Added documentation for the features `list_items`, `mark`, `unmark` and `edit` + - Update the command summary + - Developer Guide: + - Added class diagram of the `EditCommand` class. + - Added implementation details and sequence diagram of both the `list_items` and `edit` features. \ No newline at end of file diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 8bdcdd8224..8def0b3fd6 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -5,13 +5,13 @@ public class Item { public boolean isMark; + public boolean isOOS; private String itemName; private int quantity; private String unitOfMeasurement; private String category; private float buyPrice; private float sellPrice; - public boolean isOOS; public Item(String name, int quantity, String unitOfMeasurement, String category, float buyPrice, float sellPrice) { this.itemName = name; diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index 5fe4c6ae16..b8654fc8d9 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -5,7 +5,10 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + public class ItemlistTest { From 422efa0a4c430b10c2235e6631f4c09776c06ad6 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sat, 13 Apr 2024 23:56:34 +0800 Subject: [PATCH 323/421] change junit test --- src/test/java/itemlist/ItemlistTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index b8654fc8d9..197f1eb59f 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -32,7 +32,7 @@ void tearDown() { @Test void addItem_shouldIncreaseListSize() { - assertEquals(1, Itemlist.getItems().size()); + assertEquals(10, Itemlist.getItems().size()); } @Test From f80ad98000534d3bc099f6e01407914bfafb9aa9 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 00:06:27 +0800 Subject: [PATCH 324/421] Revert PPP file --- docs/team/hengshuhong.md | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 docs/team/hengshuhong.md diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md new file mode 100644 index 0000000000..0b7683b9d6 --- /dev/null +++ b/docs/team/hengshuhong.md @@ -0,0 +1,47 @@ +# Heng Shu Hong's Project Portfolio Page + + +## Project: StockMaster + +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. + + +### Code Contribution + +- **New Feature:** Added the capability to add/delete/list promotions + - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, + `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell + feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will + be shown. + - Justification: This feature improves the application as the user now have the option to create a discount campaign + and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. + - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, + one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. + + +- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. + - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` + For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` + - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly + retrieve the data that is being searched for by narrow the scope of the search. + - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this + enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original + feature, but yet still able to provide more than 1 filter to narrow the scope. + +- **New Feature:** Enhanced the add command to prevent duplicate entries + - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a + duplicated item, the item information will be updated based on the latest input and the quantity will be increased. + - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the + overflowing of the inventory list with duplicated item. + +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) + +- **Documentation** + - User Guide: + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Added the Quick Start + - Update the Command Summary + - Developer Guide: + - Added implementation details of the `promotion` feature. + - \ No newline at end of file From 357a176b2d6fa8864094ca856342cfec10ebef62 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 00:46:52 +0800 Subject: [PATCH 325/421] Add promotionList test --- src/test/java/command/ListCommandTest.java | 26 ++++++++++++++++++++++ src/test/java/itemlist/ItemlistTest.java | 4 ++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/src/test/java/command/ListCommandTest.java b/src/test/java/command/ListCommandTest.java index beb93052b2..22b3b2bd6b 100644 --- a/src/test/java/command/ListCommandTest.java +++ b/src/test/java/command/ListCommandTest.java @@ -3,6 +3,7 @@ import common.Messages; import exceptions.CommandFormatException; import exceptions.EmptyListException; +import exceptions.InvalidDateException; import item.Item; import item.Transaction; import itemlist.Cashier; @@ -10,6 +11,7 @@ import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import promotion.Month; import promotion.Promotion; import promotion.Promotionlist; @@ -125,6 +127,30 @@ public void listCommandTest_transactionList_correct3() { } + @Test + public void listCommandTest_promotionList_correct() throws InvalidDateException, CommandFormatException { + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + addCommand.execute(); + Command testPromo = new AddPromotionCommand("testItem", 0.30F, 2, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + testPromo.execute(); + String expected = "The following promotion has been added" + System.lineSeparator() + + "testItem have a 30.00% discount" + System.lineSeparator() + + "Period: 2 APR 2024 to 4 APR 2024" + System.lineSeparator() + + "Time: 0000 to 1100" + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } catch (CommandFormatException | InvalidDateException e) { + Assertions.fail("Unexpected exception thrown"); + throw new RuntimeException(e); + } + + } @Test public void listCommandTest_itemList_empty() { ListCommand listCommand1 = new ListCommand(new ArrayList(), "NA", false); diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index 197f1eb59f..39a0eac429 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -31,8 +31,8 @@ void tearDown() { } @Test - void addItem_shouldIncreaseListSize() { - assertEquals(10, Itemlist.getItems().size()); + void getSizeTest() { + assertEquals(1, Itemlist.getItems().size()); } @Test From c7c7d12c86186b191850691f2def382e4d0a3923 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 00:55:13 +0800 Subject: [PATCH 326/421] Add testing txt --- StockMasterData.txt | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 8ef5894379..3301c9bc71 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1 +1,9 @@ -1. | [ ] | apple | Qty: 50 pieces | Cat: fruits | BuyPrice: $4.0 | SellPrice: $5.0 +1. | [ ] | lemon | Qty: 6 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +2. | [ ] | banana | Qty: 1 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +3. | [ ] | apple | Qty: 1 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +4. | [ ] | durian | Qty: 1 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +5. | [ ] | mango | Qty: 1 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +6. | [ ] | cherry | Qty: 1 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +7. | [ ] | orange | Qty: 1 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 +8. | [ ] | apple iphone | Qty: 100000 pieces | Cat: electronics | BuyPrice: $100.50 | SellPrice: $400.10 +9. | [ ] | testItem | Qty: 0 EA | Cat: null | BuyPrice: $1.00 | SellPrice: $10.00 From 7002ddfbf9311c32ac6abb7b09ce3f586907d578 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 01:19:01 +0800 Subject: [PATCH 327/421] Update md --- docs/team/fxe025.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md index 799b29a3c0..7b419724cf 100644 --- a/docs/team/fxe025.md +++ b/docs/team/fxe025.md @@ -1,21 +1,26 @@ # Fu Xueer - Project Portfolio Page -## Overview -StockMaster is a platform aimed at helping SMEs track and organise their inventory. -### Summary of Contributions -#### Enhancements implemented +## Project: StockMaster +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. + + +### Code Contribution + - **New Feature:** Add Storage feature - * Write information from an itemlist to file - * Read information from the file when program starts + - What it does: Write information from an itemlist to file + - Read information from the file when program starts - **New Feature:** Add Transaction feature - * Store selling price, cost, quantity and profit made of a type of item that's already sold. + - What it does: Store selling price, cost, quantity and profit made of a type of item that's already sold. - **New Feature:** Add Cashier feature * A list to store past transactions - **New Feature:** Add TransactionLogs feature * Write information from a transactionlist to file * Read information from the file when program starts +**Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=fxe025&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=isaaceng7&tabRepo=AY2324S2-CS2113-T15-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + #### Contributions to the UG - Update feature guide for edit command feature - Add edit command to command summary From 6fd86edd25adff3d7d1e19f268f68bdbdaca284d Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 02:53:00 +0800 Subject: [PATCH 328/421] Documentation --- src/main/java/parser/Parser.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 482e805931..a40a8c338b 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -27,9 +27,7 @@ import promotion.Promotionlist; -import java.io.IOException; import java.util.regex.Matcher; -import java.util.regex.Pattern; public class Parser { From b9d0400f94ad1cd1d2b8d7714b2a2281cc24b94c Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 03:01:57 +0800 Subject: [PATCH 329/421] Documentation --- docs/team/HengShuHong.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/team/HengShuHong.md diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md deleted file mode 100644 index e69de29bb2..0000000000 From a3b2d3a1f5bec3c8d7ae74918aa9c9e476293e13 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 03:17:54 +0800 Subject: [PATCH 330/421] checkstyle edit --- src/main/java/command/EditCommand.java | 1 - src/main/java/command/HelpCommand.java | 1 - src/main/java/parser/Parser.java | 28 +++++++++++++------------- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index bfa27575da..66cd26c4ab 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -1,7 +1,6 @@ //@@author Fureimi package command; -import exceptions.CommandFormatException; import item.Item; import itemlist.Itemlist; import storage.Storage; diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index fa83bdcf60..ab27f0c9ec 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -2,7 +2,6 @@ import common.HelpMessages; import common.Messages; -import exceptions.CommandFormatException; public class HelpCommand extends Command{ diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 6489c1f599..9c1e762655 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -37,7 +37,7 @@ public class Parser { * Takes in the user's input and calls the relevant command * * @param userInput The user's input command - + * * @throws CommandFormatException Command does not follow the required format. */ @@ -171,7 +171,7 @@ public Command parseInput(String userInput){ * Formats the user's input to call HelpCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareHelp(String args) throws CommandFormatException{ @@ -194,7 +194,7 @@ private Command prepareHelp(String args) throws CommandFormatException{ * Formats the user's input to call AddCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareAdd(String args) throws CommandFormatException{ @@ -255,7 +255,7 @@ private Command prepareAdd(String args) throws CommandFormatException{ * Formats the user's input to call DeleteCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareDelete(String args) throws CommandFormatException{ @@ -275,7 +275,7 @@ private Command prepareDelete(String args) throws CommandFormatException{ * Formats the user's input to call SellCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareSell(String args) throws CommandFormatException{ @@ -317,7 +317,7 @@ private Command prepareSell(String args) throws CommandFormatException{ * Formats the user's input to call FindCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareFind(String args) throws CommandFormatException{ @@ -337,7 +337,7 @@ private Command prepareFind(String args) throws CommandFormatException{ * Formats the user's input to call EditCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. * @throws EditException Command does not follow the required format for the edit command. */ @@ -420,7 +420,7 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce * Formats the user's input to call AddPromotionCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. * @throws InvalidDateException Date/time input is not valid. */ @@ -467,7 +467,7 @@ private Command preparePromotion(String args) throws CommandFormatException, Inv * Formats the user's input to call DeletePromotionCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareDeletePromo(String args) throws CommandFormatException{ @@ -483,7 +483,7 @@ private Command prepareDeletePromo(String args) throws CommandFormatException{ * Formats the user's input to list all items or list them by category * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareItemList(String args) throws CommandFormatException { @@ -508,7 +508,7 @@ private Command preparePromotionList() { * Formats the user's input to call MarkCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareMark(String args) throws CommandFormatException { @@ -527,7 +527,7 @@ private Command prepareMark(String args) throws CommandFormatException { * Formats the user's input to call UnmarkCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareUnmark(String args) throws CommandFormatException { @@ -546,7 +546,7 @@ private Command prepareUnmark(String args) throws CommandFormatException { * Formats the user's input to list all transactions or list all transactions of a certain item * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareTransactionList(String args) throws CommandFormatException { @@ -566,7 +566,7 @@ private Command prepareTransactionList(String args) throws CommandFormatExceptio * Formats the user's input to call LowStockCommand with the appropriate params * * @param args The user's parsed input command - + * * @throws CommandFormatException Command does not follow the required format. */ private Command prepareLowStock(String args) throws CommandFormatException{ From 8a21b1ec4f39c60e6c0056a773e43e2a7459bad0 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 13:11:48 +0800 Subject: [PATCH 331/421] Add ListCommandTests --- src/test/java/command/ListCommandTest.java | 151 ++++++++++++++++++++- 1 file changed, 144 insertions(+), 7 deletions(-) diff --git a/src/test/java/command/ListCommandTest.java b/src/test/java/command/ListCommandTest.java index 22b3b2bd6b..1ec09381ac 100644 --- a/src/test/java/command/ListCommandTest.java +++ b/src/test/java/command/ListCommandTest.java @@ -14,10 +14,14 @@ import promotion.Month; import promotion.Promotion; import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.util.ArrayList; +import java.util.Objects; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -35,12 +39,16 @@ public void reset() { while (Cashier.getTransaction(0) != null) { transactions = new ArrayList<>(); } + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); } //happy case: has item @Test public void listCommandTest_itemList_correct() { - Item test = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "NA", + 1.00F, 2.00F); Itemlist.addItem(test); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", false); try { @@ -56,10 +64,135 @@ public void listCommandTest_itemList_correct() { } + + //happy case: has item, filtered corrrectly + @Test + public void listCommandTest_itemList_correct2() { + Item test = new Item("testItem", 1, "ea", "test", + 1.00F, 2.00F); + Itemlist.addItem(test); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", false); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. Item Index: 1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + + //happy case: has item, filtered wrongly + @Test + public void listCommandTest_itemList_correct3() { + Item test = new Item("testItem", 1, "ea", "noCat", + 1.00F, 2.00F); + Itemlist.addItem(test); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", false); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "No items were found within the category test." + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + + //happy case: has item, search for marked and is marked + @Test + public void listCommandTest_itemList_correct4() { + Item test = new Item("testItem", 1, "ea", "NA", + 1.00F, 2.00F); + Itemlist.addItem(test); + Objects.requireNonNull(Itemlist.getItem(0)).mark(); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", true); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. Item Index: 1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + + //Error: Filter for marked, but no items are marked + @Test + public void listCommandTest_itemList_correct5() { + Item test = new Item("testItem", 1, "ea", "NA", + 1.00F, 2.00F); + Itemlist.addItem(test); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", true); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "There are no marked items in your inventory list!" + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + + //Error: Filter for marked + cat, have result + @Test + public void listCommandTest_itemList_correct6() { + Item test = new Item("testItem", 1, "ea", "test", + 1.00F, 2.00F); + Itemlist.addItem(test); + Objects.requireNonNull(Itemlist.getItem(0)).mark(); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", true); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. Item Index: 1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + + //Error: Filter for marked + cat, have no result + @Test + public void listCommandTest_itemList_correct7() { + Item test = new Item("testItem", 1, "ea", "test", + 1.00F, 2.00F); + Itemlist.addItem(test); + ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", true); + try { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "There are no marked items of category '" + "test"+ + "' in your inventory list!" + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + } catch (EmptyListException e) { + Assertions.fail("Unexpected EmptyListException thrown."); + throw new RuntimeException(e); + } + + } + //Happy case: has 1 transaction @Test public void listCommandTest_transactionList_correct() { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", + "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); ListCommand listCommand1 = new ListCommand(transactions, "NA"); @@ -83,7 +216,8 @@ public void listCommandTest_transactionList_correct() { //happy case: filtered item successfully @Test public void listCommandTest_transactionList_correct2() { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", + "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); try { @@ -106,7 +240,8 @@ public void listCommandTest_transactionList_correct2() { @Test public void listCommandTest_transactionList_correct3() { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", + "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); ListCommand listCommand1 = new ListCommand(transactions, "failTest"); @@ -129,10 +264,12 @@ public void listCommandTest_transactionList_correct3() { @Test public void listCommandTest_promotionList_correct() throws InvalidDateException, CommandFormatException { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", + "NA", 1.00F, 2.00F); addCommand.execute(); - Command testPromo = new AddPromotionCommand("testItem", 0.30F, 2, Month.valueOf("APR"), - 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + Command testPromo = new AddPromotionCommand("testItem", 0.30F, 2, + Month.valueOf("APR"), 2024, 4, Month.valueOf("APR"), + 2024, 0000, 1100); try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); From acd9322c474d645c89ad78a0f94e6efd4ccf1f3f Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 13:26:38 +0800 Subject: [PATCH 332/421] Add TotalProfitCommandTest --- src/main/java/command/SellCommand.java | 2 +- .../java/command/TotalProfitCommandTest.java | 83 +++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/test/java/command/TotalProfitCommandTest.java diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index 597bc905f1..cf8e19014e 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -50,7 +50,7 @@ public void execute() throws CommandFormatException { assert (Objects.nonNull(Itemlist.getItem(index))); int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; float getSellPrice = Itemlist.getItem(index).getSellPrice(); - float sellPrice = (this.discount >= 0) ? this.discount * getSellPrice : getSellPrice; + float sellPrice = (this.discount > 0) ? this.discount * getSellPrice : getSellPrice; if (toSell.getIsOOS() || remainingQuantity < 0) { LOGGER.warning("Item has insufficient quantity."); System.out.println("There is insufficient stock!"); diff --git a/src/test/java/command/TotalProfitCommandTest.java b/src/test/java/command/TotalProfitCommandTest.java new file mode 100644 index 0000000000..27133f74f9 --- /dev/null +++ b/src/test/java/command/TotalProfitCommandTest.java @@ -0,0 +1,83 @@ +package command; + +import exceptions.CommandFormatException; +import itemlist.Cashier; +import itemlist.Itemlist; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import parser.CommandType; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class TotalProfitCommandTest extends Cashier { + + @BeforeEach + public void reset() { + //clears the transactions list + Cashier.transactions = new ArrayList<>(); + + while (Itemlist.getItem(0) != null) { + Itemlist.deleteItem(0); + } + } + + @Test + public void testProfitWithNoItems() { + TotalProfitCommand totalProfitCommand = new TotalProfitCommand(CommandType.TOTAL_PROFIT); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + totalProfitCommand.execute(); + String expected = "There are no transactions with your search query." + System.lineSeparator() + + "You have earned 0.0 in profits so far." + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + + } + + @Test + public void testProfitWithItems() throws CommandFormatException { + //set up an item to test bestseller + AddCommand testAdd = new AddCommand("testItem", 10, "ea","NA", 10.0F, 20.0F); + testAdd.execute(); + SellCommand testSell = new SellCommand("testItem", 10, 0); + testSell.execute(); + TotalProfitCommand totalProfitCommand = new TotalProfitCommand(CommandType.TOTAL_PROFIT); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + totalProfitCommand.execute(); + String expected = "You have earned 100.0 in profits so far." + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + + } + + @Test + public void testRevenueWithNoItems() { + TotalProfitCommand totalProfitCommand = new TotalProfitCommand(CommandType.TOTAL_REVENUE); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + totalProfitCommand.execute(); + String expected = "There are no transactions with your search query." + System.lineSeparator() + + "You have earned 0.0 in revenue so far." + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + + } + + @Test + public void testRevenueWithItems() throws CommandFormatException { + //set up an item to test bestseller + AddCommand testAdd = new AddCommand("testItem", 10, "ea","NA", 10.0F, 20.0F); + testAdd.execute(); + SellCommand testSell = new SellCommand("testItem", 10, 0); + testSell.execute(); + TotalProfitCommand totalProfitCommand = new TotalProfitCommand(CommandType.TOTAL_REVENUE); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + totalProfitCommand.execute(); + String expected = "You have earned 200.0 in revenue so far." + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); + + } +} From 4a7e06178447fe53ff645130c15a4cc199da24c3 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 13:55:17 +0800 Subject: [PATCH 333/421] Make Cashier.transactions public --- src/main/java/itemlist/Cashier.java | 2 +- src/test/java/command/BestsellerCommandTest.java | 2 +- src/test/java/command/TotalProfitCommandTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index f2b7013414..1c305ddaef 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -9,8 +9,8 @@ public class Cashier extends Itemlist { + public static ArrayList transactions = new ArrayList<>(); protected static final Logger LOGGER = Logger.getLogger(Cashier.class.getName()); - protected static ArrayList transactions = new ArrayList<>(); public static void addItem(Transaction transaction) { transactions.add(transaction); diff --git a/src/test/java/command/BestsellerCommandTest.java b/src/test/java/command/BestsellerCommandTest.java index 52443ccbf7..f2312be837 100644 --- a/src/test/java/command/BestsellerCommandTest.java +++ b/src/test/java/command/BestsellerCommandTest.java @@ -17,7 +17,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; -public class BestsellerCommandTest extends Cashier { +public class BestsellerCommandTest { private final BestsellerCommand bestsellerCommand = new BestsellerCommand(); diff --git a/src/test/java/command/TotalProfitCommandTest.java b/src/test/java/command/TotalProfitCommandTest.java index 27133f74f9..e2edaa33e9 100644 --- a/src/test/java/command/TotalProfitCommandTest.java +++ b/src/test/java/command/TotalProfitCommandTest.java @@ -13,7 +13,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -public class TotalProfitCommandTest extends Cashier { +public class TotalProfitCommandTest { @BeforeEach public void reset() { From 2fe01862383e64203d7f7eda74b5bb83d2e11d69 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 13:59:20 +0800 Subject: [PATCH 334/421] Change reset for tests --- src/test/java/command/BestsellerCommandTest.java | 2 +- src/test/java/command/TotalProfitCommandTest.java | 2 +- src/test/java/itemlist/ItemlistTest.java | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/test/java/command/BestsellerCommandTest.java b/src/test/java/command/BestsellerCommandTest.java index f2312be837..8de2641721 100644 --- a/src/test/java/command/BestsellerCommandTest.java +++ b/src/test/java/command/BestsellerCommandTest.java @@ -24,7 +24,7 @@ public class BestsellerCommandTest { @BeforeEach public void reset() { //clears the transactions list - Cashier.transactions = new ArrayList(); + Cashier.transactions.clear(); while (Itemlist.getItem(0) != null) { Itemlist.deleteItem(0); diff --git a/src/test/java/command/TotalProfitCommandTest.java b/src/test/java/command/TotalProfitCommandTest.java index e2edaa33e9..d14741cc47 100644 --- a/src/test/java/command/TotalProfitCommandTest.java +++ b/src/test/java/command/TotalProfitCommandTest.java @@ -18,7 +18,7 @@ public class TotalProfitCommandTest { @BeforeEach public void reset() { //clears the transactions list - Cashier.transactions = new ArrayList<>(); + Cashier.transactions.clear(); while (Itemlist.getItem(0) != null) { Itemlist.deleteItem(0); diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index 39a0eac429..eb3d496174 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -67,6 +67,7 @@ void itemIsExist_shouldReturnFalseForNonExistingItem() { @Test void getItem_shouldReturnCorrectItem() { Item item = Itemlist.getItem(0); + assert item != null; assertEquals("TestItem", item.getItemName()); assertEquals(10, item.getQuantity()); } From a1789ae38856f2f3d201cb93f655f72b822088d6 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 14:01:21 +0800 Subject: [PATCH 335/421] Change shouldReturnCorrectIndex --- src/test/java/itemlist/ItemlistTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index eb3d496174..dfb66ad5c9 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -75,6 +75,6 @@ void getItem_shouldReturnCorrectItem() { @Test void getIndex_shouldReturnCorrectIndex() { int index = Itemlist.getIndex(testItem); - assertEquals(0, index); + assertEquals(1, index); } } From a8ce1142e417b050b7d948226443cfe7a1487854 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 14:03:07 +0800 Subject: [PATCH 336/421] Remove unused imports --- src/test/java/command/BestsellerCommandTest.java | 2 -- src/test/java/command/TotalProfitCommandTest.java | 1 - 2 files changed, 3 deletions(-) diff --git a/src/test/java/command/BestsellerCommandTest.java b/src/test/java/command/BestsellerCommandTest.java index 8de2641721..c69b6fa2e1 100644 --- a/src/test/java/command/BestsellerCommandTest.java +++ b/src/test/java/command/BestsellerCommandTest.java @@ -2,7 +2,6 @@ import common.Messages; import exceptions.CommandFormatException; -import item.Transaction; import itemlist.Cashier; import itemlist.Itemlist; import org.junit.jupiter.api.BeforeEach; @@ -12,7 +11,6 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; diff --git a/src/test/java/command/TotalProfitCommandTest.java b/src/test/java/command/TotalProfitCommandTest.java index d14741cc47..04585cbacf 100644 --- a/src/test/java/command/TotalProfitCommandTest.java +++ b/src/test/java/command/TotalProfitCommandTest.java @@ -9,7 +9,6 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.assertEquals; From aab03a254726148910183326ea377b284380b8a0 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 14:41:15 +0800 Subject: [PATCH 337/421] Update expected test text --- text-ui-test/EXPECTED.TXT | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/text-ui-test/EXPECTED.TXT b/text-ui-test/EXPECTED.TXT index 0763b66a91..d9cb163dd4 100644 --- a/text-ui-test/EXPECTED.TXT +++ b/text-ui-test/EXPECTED.TXT @@ -3,6 +3,10 @@ StockMaster v2.0 ---------------- Data is being extracted from: ./StockMasterData.txt Welcome to StockMaster, where you can master the knowledge on your Stock! +Out-of-stock Items: +No items out of stock +Low-on-stock Items: (less than 10) +No items low on stock Enter Command: ---------------- Inventory is being saved to :./StockMasterData.txt From 1c67281324172b78a019800397b836d125459413 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 15:04:17 +0800 Subject: [PATCH 338/421] Update StorageTest --- src/test/java/storage/StorageTest.java | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index a85b30ca88..8d4fbf92c7 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,6 +1,9 @@ package storage; import exceptions.InvalidDateException; +import item.Item; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.io.File; @@ -50,20 +53,24 @@ public void writeToFile_aLine_writeSuccessful() { } @Test - public void readFromFile_successful() { + public void interpretLinesTest() { String directory = "./testFile3.txt"; File testFile = new File(directory); - String aLine = "A line"; + String aLine = "1. | [ ] | testItem | Qty: 1 unit | Cat: interpretLines | BuyPrice: $1.00 | SellPrice: $1.00"; try { Storage.writeToFile(directory, aLine, true); Scanner scanner = new Scanner(testFile); - String lineSkipped = scanner.nextLine(); + interpretLines(scanner); scanner.close(); - testFile.delete(); - assertEquals(aLine, lineSkipped); } catch (IOException e) { fail("File not found"); + } catch (NumberFormatException e) { + fail("Incorrect number format"); } + assert testFile.delete(); + Item itemAdded = Itemlist.getItem(Itemlist.getItems().size() - 1); + Itemlist.deleteItem(Itemlist.getIndex(Itemlist.getItem("testItem"))); + assertEquals("testItem", itemAdded.getItemName()); } @Test From cd6da3d24dfd1c6c4b147285fbec641bdff35c03 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 15:27:17 +0800 Subject: [PATCH 339/421] Update ItemlistTest, remove unused import --- src/main/java/itemlist/Cashier.java | 4 ++++ src/test/java/itemlist/ItemlistTest.java | 2 +- src/test/java/storage/StorageTest.java | 2 -- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 1c305ddaef..da7b97768d 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -16,6 +16,10 @@ public static void addItem(Transaction transaction) { transactions.add(transaction); } + public static void deleteItem(int index) { + transactions.remove(index); + } + public static ArrayList getTransactions() { return transactions; } diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index dfb66ad5c9..9cb022712b 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -75,6 +75,6 @@ void getItem_shouldReturnCorrectItem() { @Test void getIndex_shouldReturnCorrectIndex() { int index = Itemlist.getIndex(testItem); - assertEquals(1, index); + assertEquals(1, index + 1); } } diff --git a/src/test/java/storage/StorageTest.java b/src/test/java/storage/StorageTest.java index 8d4fbf92c7..912d94ba84 100644 --- a/src/test/java/storage/StorageTest.java +++ b/src/test/java/storage/StorageTest.java @@ -1,9 +1,7 @@ package storage; -import exceptions.InvalidDateException; import item.Item; import itemlist.Itemlist; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import java.io.File; From dee8d14273bd4dab6a45f0588cf64d82ef91c70c Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 15:29:38 +0800 Subject: [PATCH 340/421] Update ItemlistTest --- src/test/java/itemlist/ItemlistTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index 9cb022712b..dfb66ad5c9 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -75,6 +75,6 @@ void getItem_shouldReturnCorrectItem() { @Test void getIndex_shouldReturnCorrectIndex() { int index = Itemlist.getIndex(testItem); - assertEquals(1, index + 1); + assertEquals(1, index); } } From 992e7cea34656a95025c9d8e7c5827aa4c23565e Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 14 Apr 2024 16:37:16 +0800 Subject: [PATCH 341/421] Update PPP --- PromotionStorage.txt | 3 + StockMasterData.txt | 4 ++ docs/team/HengShuHong.md | 40 +++++++---- src/main/java/promotion/Promotionlist.java | 27 +++++-- .../java/command/AddPromotionCommandTest.java | 71 ++++++++++++++++++- .../java/command/DeletePromotionTest.java | 10 +++ src/test/java/command/FindCommandTest.java | 9 +++ src/test/java/promotion/PromotionTest.java | 9 +++ 8 files changed, 151 insertions(+), 22 deletions(-) diff --git a/PromotionStorage.txt b/PromotionStorage.txt index e69de29bb2..9c2077e1f1 100644 --- a/PromotionStorage.txt +++ b/PromotionStorage.txt @@ -0,0 +1,3 @@ +apple iphone have a 30.00% discount +Period: 1 FEB 2024 to 4 DEC 2024 +Time: 0 to 2359 diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..3ebaef70d4 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1,4 @@ +1. | [ ] | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.00 | SellPrice: $10.00 +1. | [ ] | apple iphone | Qty: 100000 pieces | Cat: electronics | BuyPrice: $100.50 | SellPrice: $400.10 +1. | [ ] | testItem | Qty: 1 EA | Cat: null | BuyPrice: $1.00 | SellPrice: $10.00 +1. | [ ] | lemon | Qty: 5 fruits | Cat: null | BuyPrice: $1.00 | SellPrice: $1.00 diff --git a/docs/team/HengShuHong.md b/docs/team/HengShuHong.md index 0b7683b9d6..1d06a55cfc 100644 --- a/docs/team/HengShuHong.md +++ b/docs/team/HengShuHong.md @@ -9,39 +9,49 @@ manage and operate their business. ### Code Contribution -- **New Feature:** Added the capability to add/delete/list promotions - - What it does: allows the user to add a `Promotion` for a certain `ITEM` by entering the `discount`, `startDate`, - `endDate`, `startTime` and `endTime`. When a `Promotion` is added for an `ITEM`, when the store owner uses the sell - feature in the application, the discount will be immediately applied to the `sell` price and the discounted price will +- New Feature: Added the capability to add/delete/list promotions + - What it does: allows the user to add a Promotion for a certain ITEM by entering the discount, startDate, + endDate, startTime and endTime. When a Promotion is added for an ITEM, when the store owner uses the sell + feature in the application, the discount will be immediately applied to the sell price and the discounted price will be shown. - Justification: This feature improves the application as the user now have the option to create a discount campaign - and make adjustments to the `sell` price automatically rather than having to manually use the `edit` feature. - - Highlights: This enhancement was challenging as it involved the integration with the `sell` command. In particular, - one difficulty was to ensure that the original price of the `ITEM` would not be changed even during a promotion period. + and make adjustments to the sell price automatically rather than having to manually use the edit feature. + - Highlights: This enhancement was challenging as it involved the integration with the sell command. In particular, + one difficulty was to ensure that the original price of the ITEM would not be changed even during a promotion period. -- **New Feature:** Enhanced the find command to allow the user to search based on the specified item information. - - What it does: allows the user to look through a filtered list to find the `ITEM` information based on the `KEYWORD` - For instance, the user can find all `ITEMS` that has a `buy` price or `sell` price of $`1` +- New Feature: Enhanced the find command to allow the user to search based on the specified item information. + - What it does: allows the user to look through a filtered list to find the ITEM information based on the KEYWORD + For instance, the user can find all ITEMS that has a buy price or sell price of $`1` - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly retrieve the data that is being searched for by narrow the scope of the search. - Highlights: The difficulty in this enhancement was the approach to implement this improvement. This is because this - enhancement is an extension of the previous `find` command, meaning that it must still be able to retain its original + enhancement is an extension of the previous find command, meaning that it must still be able to retain its original feature, but yet still able to provide more than 1 filter to narrow the scope. -- **New Feature:** Enhanced the add command to prevent duplicate entries +- New Feature: Enhanced the add command to prevent duplicate entries - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a duplicated item, the item information will be updated based on the latest input and the quantity will be increased. - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the overflowing of the inventory list with duplicated item. -- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) +- Code Contributed: [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) - **Documentation** - User Guide: - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` - Added the Quick Start - Update the Command Summary + - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions`. [#86](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/86) + - Added the Quick Start. + - Update the Command Summary. - Developer Guide: - - Added implementation details of the `promotion` feature. - - \ No newline at end of file + - Added implementation details of the `promotion` feature. [#176](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/176) + - Update Product Scope [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) + - Added non-functional requirements. [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) + + +- **Review Contributions** + - Fixed bug for team members that caused the application to crash. [#184](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/184) + - Fixed test case that failed [#187](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/187) + No newline at end of file \ No newline at end of file diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index e8ebd72c9b..677e360f1f 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -1,6 +1,7 @@ //@@author HengShuHong package promotion; +import command.Command; import exceptions.CommandFormatException; import exceptions.InvalidDateException; import itemlist.Itemlist; @@ -8,10 +9,14 @@ import java.time.LocalDateTime; import java.util.ArrayList; +import java.util.logging.Level; +import java.util.logging.Logger; public class Promotionlist { private static final ArrayList promotions = new ArrayList<>(); + protected static final Logger LOGGER = Logger.getLogger(Promotionlist.class.getName()); + public static int getIndex(Promotion promotion) { return promotions.indexOf(promotion); } @@ -120,15 +125,25 @@ public static boolean isPromoExistNow(String itemName) { if (year > promotion.getStartYear() && year < promotion.getEndYear()) { return true; } - if (month < promotion.getStartMonth().getValue() || month > promotion.getEndMonth().getValue()) { - return false; - } - if (month > promotion.getStartMonth().getValue() && month < promotion.getEndMonth().getValue()) { + if (year == promotion.getStartYear()) { + if (month < promotion.getStartMonth().getValue()) { + return false; + } + if (day < promotion.getStartDay()) { + return false; + } return true; } - if (day < promotion.getStartDay() || day > promotion.getEndDay()) { - return false; + if (year == promotion.getEndYear()) { + if (month > promotion.getEndMonth().getValue()) { + return false; + } + if (day > promotion.getEndDay()) { + return false; + } + return true; } + LOGGER.log(Level.WARNING, "Unable to create promotion"); return true; } diff --git a/src/test/java/command/AddPromotionCommandTest.java b/src/test/java/command/AddPromotionCommandTest.java index 143d33eab0..5a01323df9 100644 --- a/src/test/java/command/AddPromotionCommandTest.java +++ b/src/test/java/command/AddPromotionCommandTest.java @@ -4,14 +4,38 @@ import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import promotion.Month; +import promotion.Promotion; +import promotion.Promotionlist; import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.time.LocalDateTime; + import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; +import static promotion.Promotionlist.isPromoExistNow; + +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; + public class AddPromotionCommandTest { + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } + @Test public void addPromotionCommandTest1() { try { @@ -215,11 +239,22 @@ public void itemIsOnPromoPromotionCommandTest() { try { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); + Command addCommandTest1 = new AddCommand("apple", 1, "pieces", + "fruits", 1, 1); Command promotionTest1 = new AddPromotionCommand("apple", 0.3F, 5, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2024, 1100, 1100); + Command promotionTest2 = new AddPromotionCommand("apple", 0.3F, 5, Month.valueOf("FEB"), 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); + addCommandTest1.execute(); promotionTest1.execute(); + promotionTest2.execute(); String expectedOutput3 = - Messages.ITEM_IS_PROMO + System.lineSeparator(); + "added: apple (Qty: 1 pieces, Buy: $1.00, Sell: $1.00) to fruits" + System.lineSeparator() + + "The following promotion has been added" + System.lineSeparator() + + "apple have a 30.00% discount" + System.lineSeparator() + + "Period: 5 FEB 2024 to 4 APR 2024" + System.lineSeparator() + + "Time: 1100 to 1100" + System.lineSeparator() + + Messages.ITEM_IS_PROMO + System.lineSeparator(); assertEquals(expectedOutput3, outputStreamCaptor.toString()); } catch (InvalidDateException | CommandFormatException e) { System.out.print(""); @@ -227,4 +262,38 @@ public void itemIsOnPromoPromotionCommandTest() { throw new RuntimeException(e); } } + + + @Test + void testIsPromoExistNow() { + Command addCommandTest1 = new AddCommand("apple", 1, "pieces", + "fruits", 1, 1); + Command promotionTest1 = new AddPromotionCommand("apple", 0.3F, 5, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2030, 0000, 2359); + Command addCommandTest2 = new AddCommand("banana", 1, "pieces", + "fruits", 1, 1); + Command promotionTest2 = new AddPromotionCommand("banana", 0.3F, 5, Month.valueOf("FEB"), + 2022, 4, Month.valueOf("APR"), 2023, 0000, 2359); + Command addCommandTest3 = new AddCommand("lemon", 1, "pieces", + "fruits", 1, 1); + Command promotionTest3 = new AddPromotionCommand("lemon", 0.3F, 5, Month.valueOf("FEB"), + 2022, 29, Month.valueOf("DEC"), 2024, 0000, 2359); + try { + addCommandTest1.execute(); + addCommandTest2.execute(); + addCommandTest3.execute(); + promotionTest1.execute(); + promotionTest2.execute(); + promotionTest3.execute(); + } catch (CommandFormatException | EmptyListException | InvalidDateException e) { + throw new RuntimeException(e); + } + // Test the method + assertTrue(isPromoExistNow("apple")); + assertTrue(isPromoExistNow("lemon")); + assertFalse(isPromoExistNow("banana")); // Assuming banana is not on promo + } + + + } diff --git a/src/test/java/command/DeletePromotionTest.java b/src/test/java/command/DeletePromotionTest.java index ce02961d4f..192c458c66 100644 --- a/src/test/java/command/DeletePromotionTest.java +++ b/src/test/java/command/DeletePromotionTest.java @@ -4,8 +4,12 @@ import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; +import item.Transaction; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import promotion.Month; +import promotion.Promotionlist; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -41,7 +45,13 @@ public void deletePromotionTest() { } catch (CommandFormatException | InvalidDateException | EmptyListException e) { throw new RuntimeException(e); } + } + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); } } diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 90ebc68fc7..c92809cd6c 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -5,7 +5,9 @@ import exceptions.EmptyListException; import exceptions.InvalidDateException; import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import promotion.Promotionlist; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -40,4 +42,11 @@ public void findCommandTest() throws CommandFormatException, InvalidDateExceptio } assertFalse(Itemlist.itemIsExist("failFindCommand")); } + + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + } } diff --git a/src/test/java/promotion/PromotionTest.java b/src/test/java/promotion/PromotionTest.java index 6f15664271..b73664f576 100644 --- a/src/test/java/promotion/PromotionTest.java +++ b/src/test/java/promotion/PromotionTest.java @@ -1,5 +1,7 @@ package promotion; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -16,5 +18,12 @@ public void testToString() { "Time: 0800 to 1600"; assertEquals(expected, promotion.toString()); } + + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + } } From 1f5b88331544adf52889535605a85480a986d604 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 14 Apr 2024 16:46:15 +0800 Subject: [PATCH 342/421] Fix Checkstyle --- src/main/java/promotion/Promotionlist.java | 3 +-- src/test/java/command/AddPromotionCommandTest.java | 2 -- src/test/java/command/DeletePromotionTest.java | 7 ++++++- src/test/java/command/FindCommandTest.java | 6 ++++++ src/test/java/itemlist/ItemlistTest.java | 2 +- src/test/java/promotion/PromotionTest.java | 6 ++++++ 6 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 677e360f1f..4ce4544500 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -1,7 +1,6 @@ //@@author HengShuHong package promotion; -import command.Command; import exceptions.CommandFormatException; import exceptions.InvalidDateException; import itemlist.Itemlist; @@ -13,9 +12,9 @@ import java.util.logging.Logger; public class Promotionlist { - private static final ArrayList promotions = new ArrayList<>(); protected static final Logger LOGGER = Logger.getLogger(Promotionlist.class.getName()); + private static final ArrayList promotions = new ArrayList<>(); public static int getIndex(Promotion promotion) { return promotions.indexOf(promotion); diff --git a/src/test/java/command/AddPromotionCommandTest.java b/src/test/java/command/AddPromotionCommandTest.java index 5a01323df9..214cd94746 100644 --- a/src/test/java/command/AddPromotionCommandTest.java +++ b/src/test/java/command/AddPromotionCommandTest.java @@ -8,11 +8,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import promotion.Month; -import promotion.Promotion; import promotion.Promotionlist; import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.time.LocalDateTime; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; diff --git a/src/test/java/command/DeletePromotionTest.java b/src/test/java/command/DeletePromotionTest.java index 192c458c66..a2b3b6939e 100644 --- a/src/test/java/command/DeletePromotionTest.java +++ b/src/test/java/command/DeletePromotionTest.java @@ -4,12 +4,14 @@ import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; -import item.Transaction; import itemlist.Itemlist; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import promotion.Month; import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -52,6 +54,9 @@ void tearDown() { // This will be run after each test, cleaning up Itemlist.getItems().clear(); // clear the list for next test Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); } } diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index c92809cd6c..b7922cb21e 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -8,6 +8,9 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -48,5 +51,8 @@ void tearDown() { // This will be run after each test, cleaning up Itemlist.getItems().clear(); // clear the list for next test Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); } } diff --git a/src/test/java/itemlist/ItemlistTest.java b/src/test/java/itemlist/ItemlistTest.java index dfb66ad5c9..eb3d496174 100644 --- a/src/test/java/itemlist/ItemlistTest.java +++ b/src/test/java/itemlist/ItemlistTest.java @@ -75,6 +75,6 @@ void getItem_shouldReturnCorrectItem() { @Test void getIndex_shouldReturnCorrectIndex() { int index = Itemlist.getIndex(testItem); - assertEquals(1, index); + assertEquals(0, index); } } diff --git a/src/test/java/promotion/PromotionTest.java b/src/test/java/promotion/PromotionTest.java index b73664f576..64e9e9a3bf 100644 --- a/src/test/java/promotion/PromotionTest.java +++ b/src/test/java/promotion/PromotionTest.java @@ -3,6 +3,9 @@ import itemlist.Itemlist; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -24,6 +27,9 @@ void tearDown() { // This will be run after each test, cleaning up Itemlist.getItems().clear(); // clear the list for next test Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); } } From 71195f9e94805c900c0b58cb9d6412cecbc3553f Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 14 Apr 2024 16:51:55 +0800 Subject: [PATCH 343/421] Add teardown to tests --- src/test/java/command/AddCommandTest.java | 16 ++++++++++++++++ src/test/java/command/SellCommandTest.java | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index b9599854e3..5f5d4749c5 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -3,7 +3,13 @@ import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import static org.junit.jupiter.api.Assertions.fail; @@ -25,4 +31,14 @@ public void addItemTest() { } } + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } + } diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index 7ec06d54e7..0b5491c980 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -3,7 +3,13 @@ import exceptions.CommandFormatException; import exceptions.EmptyListException; import exceptions.InvalidDateException; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import static org.junit.jupiter.api.Assertions.fail; @@ -24,4 +30,14 @@ public void sellItemTest() { } } + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } + } From 09dcebd5ba5d9a7cd4a3a3c7a782607665375a50 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 14 Apr 2024 16:57:26 +0800 Subject: [PATCH 344/421] Fix junit tests --- src/test/java/command/DeleteCommandTest.java | 14 ++++++++++++++ src/test/java/itemlist/CashierTest.java | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/src/test/java/command/DeleteCommandTest.java b/src/test/java/command/DeleteCommandTest.java index f1c5636f96..19c193d1fe 100644 --- a/src/test/java/command/DeleteCommandTest.java +++ b/src/test/java/command/DeleteCommandTest.java @@ -4,7 +4,12 @@ import exceptions.EmptyListException; import exceptions.InvalidDateException; import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.fail; @@ -26,6 +31,15 @@ public void delCommandTest_success() { } catch (InvalidDateException | EmptyListException e) { throw new RuntimeException(e); } + } + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); } } diff --git a/src/test/java/itemlist/CashierTest.java b/src/test/java/itemlist/CashierTest.java index e0b8f6299c..74d37efb21 100644 --- a/src/test/java/itemlist/CashierTest.java +++ b/src/test/java/itemlist/CashierTest.java @@ -2,7 +2,12 @@ import item.Item; import item.Transaction; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; public class CashierTest { @@ -14,4 +19,14 @@ public void addTransactionTest() { assert(Cashier.getTransactions().contains(testTransaction)); Cashier.deleteItem(Cashier.getTransactions().size() - 1); } + + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } } From 3d94eb55e0fa3deb1e0c143957678e7e6ead5e3f Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 18:19:21 +0800 Subject: [PATCH 345/421] parsertest --- src/main/java/command/DeleteCommand.java | 6 + .../java/command/DeletePromotionCommand.java | 4 + src/main/java/command/HelpCommand.java | 3 + src/main/java/command/LowStockCommand.java | 6 + src/main/java/common/Messages.java | 2 + .../exceptions/CommandFormatException.java | 3 + src/main/java/parser/Parser.java | 18 +- src/test/java/parser/ParserTest.java | 393 ++++++++++++++---- 8 files changed, 346 insertions(+), 89 deletions(-) diff --git a/src/main/java/command/DeleteCommand.java b/src/main/java/command/DeleteCommand.java index 8634b6fdab..d56226d41c 100644 --- a/src/main/java/command/DeleteCommand.java +++ b/src/main/java/command/DeleteCommand.java @@ -17,6 +17,11 @@ public DeleteCommand(String itemName) { this.itemName = itemName.toLowerCase(); //for checking later } + + public String getItemName() { + return itemName; + } + /** * Searches of the item in the item list with the same name and deletes it */ @@ -52,4 +57,5 @@ public void execute() throws EmptyListException { LOGGER.info("Promotion exists for item and thus cannot be deleted."); } } + } diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java index ee3efd846f..db636f8302 100644 --- a/src/main/java/command/DeletePromotionCommand.java +++ b/src/main/java/command/DeletePromotionCommand.java @@ -11,6 +11,9 @@ public class DeletePromotionCommand extends Command { protected String itemName; + public String getItemName() { + return itemName; + } public DeletePromotionCommand(String itemName) { this.itemName = itemName; } @@ -32,4 +35,5 @@ public void execute() throws CommandFormatException { System.out.println(Messages.ITEM_NOT_ON_PROMO); } } + } diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index ab27f0c9ec..0c71424043 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -33,6 +33,9 @@ public void execute() { case "edit": System.out.println(Messages.HELP_EDIT); break; + case "find": + System.out.println(Messages.HELP_FIND); + break; case "mark": System.out.println(Messages.HELP_MARK); break; diff --git a/src/main/java/command/LowStockCommand.java b/src/main/java/command/LowStockCommand.java index bad4bafb13..cea4ad7c5a 100644 --- a/src/main/java/command/LowStockCommand.java +++ b/src/main/java/command/LowStockCommand.java @@ -15,6 +15,11 @@ public LowStockCommand(int lowStockAmount){ this.lowStockAmount = lowStockAmount; } + + public int getAmount() { + return lowStockAmount; + } + private static void outOfStockItemsReminder(){ int count = 0; System.out.println("Out-of-stock Items:"); @@ -47,4 +52,5 @@ public void execute() { outOfStockItemsReminder(); lowOnStockItemsReminder(lowStockAmount); } + } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3fde0d29b5..981774d1a2 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -311,5 +311,7 @@ public class Messages { "list_transactions item/[ITEM_NAME]"; public static final String INVALID_LOW_STOCK_AMOUNT = "Please input a valid amount."; + public static final String INVALID_VALUE = "Please input a valid amount."; + } diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 4e018b265f..233b802661 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -92,6 +92,9 @@ public CommandFormatException(String error) { case "INVALID_LOW_STOCK_AMOUNT": System.out.println(Messages.INVALID_LOW_STOCK_AMOUNT); break; + case "INVALID_VALUE": + System.out.println(Messages.INVALID_VALUE); + break; default: System.out.println(error); } diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index d6a055e609..27c5a1a492 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -48,7 +48,7 @@ public Command parseInput(String userInput){ if (!matcher.matches()) { System.out.println(Messages.INVALID_COMMAND); System.out.println(Messages.HELP); - logger.log(Level.FINE, "Invalid command received"); + logger.log(Level.FINE, "Invalid command received."); return new IncorrectCommand(); } String commandWord = matcher.group("commandWord").toUpperCase(); @@ -230,6 +230,10 @@ private Command prepareAdd(String args) throws CommandFormatException{ try { buyPrice = Float.parseFloat(matcher.group("buyPrice")); } catch (NumberFormatException e) { + throw new CommandFormatException("INVALID_VALUE"); + } + // Check if the parsed quantity is larger than Integer.MAX_VALUE + if (buyPrice > Integer.MAX_VALUE) { throw new CommandFormatException("BUY_TOO_LARGE"); } @@ -237,6 +241,10 @@ private Command prepareAdd(String args) throws CommandFormatException{ try { sellPrice = Float.parseFloat(matcher.group("sellPrice")); } catch (NumberFormatException e) { + throw new CommandFormatException("INVALID_VALUE"); + } + // Check if the parsed quantity is larger than Integer.MAX_VALUE + if (sellPrice > Integer.MAX_VALUE) { throw new CommandFormatException("SELL_TOO_LARGE"); } @@ -264,7 +272,7 @@ private Command prepareDelete(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.DEL); } - String itemName = matcher.group("itemName").trim(); + String itemName = matcher.group("itemName").toLowerCase().trim(); if (itemName.isEmpty()) { throw new CommandFormatException("INVALID_ITEM_NAME"); } @@ -476,7 +484,11 @@ private Command prepareDeletePromo(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.DEL_PROMO); } - return new DeletePromotionCommand(matcher.group("itemName").toLowerCase()); + String itemName = matcher.group("itemName").toLowerCase().trim(); + if (itemName.isEmpty()) { + throw new CommandFormatException("INVALID_ITEM_NAME"); + } + return new DeletePromotionCommand(itemName); } /** diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 8ef0219a7b..091870d5bd 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -1,24 +1,34 @@ package parser; +import command.AddCommand; import command.AddPromotionCommand; +import command.BestsellerCommand; import command.Command; -import command.AddCommand; +import command.DeleteCommand; +import command.DeletePromotionCommand; import command.EditCommand; +import command.ExitCommand; import command.FindCommand; import command.HelpCommand; +import command.IncorrectCommand; import command.ListCommand; +import command.LowStockCommand; import command.MarkCommand; import command.SellCommand; +import command.TotalProfitCommand; import command.UnmarkCommand; import exceptions.CommandFormatException; +import exceptions.EditException; import exceptions.EmptyListException; import exceptions.InvalidDateException; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import promotion.Month; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import static org.junit.jupiter.api.Assertions.*; public class ParserTest { @@ -30,115 +40,326 @@ public void setUp() { } @Test - public void testParseAddCommand() { - String userInput = "add ItemName qty/10 /unitOfMeasurement cat/Category buy/10.5 sell/15.0"; - Command command = parser.parseInput(userInput); - assertInstanceOf(AddCommand.class, command); - AddCommand addCommand = (AddCommand) command; - assertEquals("itemname", addCommand.getItemName()); - assertEquals(10, addCommand.getQuantity()); - assertEquals("unitOfMeasurement", addCommand.getUnitOfMeasurement()); - assertEquals("Category", addCommand.getCategory()); - assertEquals(10.5f, addCommand.getBuyPrice(), 0.01); - assertEquals(15.0f, addCommand.getSellPrice(), 0.01); + public void testParseAddCommandWithBlankText() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseEditCommand() { - String userInput = "edit ItemName name/NewName qty/20 uom/NewUOM cat/NewCategory buy/15.0 sell/20.0"; - Command command = parser.parseInput(userInput); - assertInstanceOf(EditCommand.class, command); - EditCommand editCommand = (EditCommand) command; - assertEquals("itemname", editCommand.getItemName()); - assertEquals("newname", editCommand.getNewItemName()); - assertEquals(20, editCommand.getNewQuantity()); - assertEquals("NewUOM", editCommand.getNewUnitOfMeasurement()); - assertEquals("NewCategory", editCommand.getNewCategory()); - assertEquals(15.0f, editCommand.getNewBuyPrice(), 0.01); - assertEquals(20.0f, editCommand.getNewSellPrice(), 0.01); + public void testParseAddCommandWithBlankItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add "; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseSellCommand1() { - String userInput = "sell ItemName qty/5"; - Command command = parser.parseInput(userInput); - assertInstanceOf(SellCommand.class, command); - SellCommand sellCommand = (SellCommand) command; - assertEquals("itemname", sellCommand.getItemName()); - assertEquals(5, sellCommand.getSellQuantity()); + public void testParseAddCommandWithInvalidQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/a /pc cat/test buy/1 sell/2"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseSellCommand2() { - Command addCommandTest1 = new AddCommand("lemon", 5, "fruits", - "NA", 1, 1); - Command promotionTest1 = new AddPromotionCommand("lemon", 0.3F, 2, Month.valueOf("FEB"), - 2024, 4, Month.valueOf("APR"), 2025, 0000, 2359); - try { - promotionTest1.execute(); - addCommandTest1.execute(); - } catch (CommandFormatException | InvalidDateException | EmptyListException e) { - throw new RuntimeException(e); - } - String userInput1 = "sell lemon qty/1"; - Command command1 = parser.parseInput(userInput1); - assertInstanceOf(SellCommand.class, command1); - SellCommand sellCommand = (SellCommand) command1; - assertEquals("lemon", sellCommand.getItemName()); - assertEquals(1, sellCommand.getSellQuantity()); + public void testParseAddCommandWithLargeQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/9999999999999999999 /pc cat/test buy/1 sell/2"; + parser.parseInput(userInput); + String expectedMessage = "Quantity is too large. Please input a smaller quantity." + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseFindCommand() { - String userInput = "find /info Keyword"; - Command command = parser.parseInput(userInput); - assertInstanceOf(FindCommand.class, command); - FindCommand findCommand = (FindCommand) command; - assertEquals("info", findCommand.getItemInfo()); - assertEquals("keyword", findCommand.getKeyword()); + public void testParseAddCommandWithBlankCategory() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/1 /pc cat/ buy/1 sell/2"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseListCommand() { - String userInput = "list_items cat/Category"; - Command command = parser.parseInput(userInput); - assertInstanceOf(ListCommand.class, command); - ListCommand listCommand = (ListCommand) command; - assertEquals("category", listCommand.getCategory()); + public void testParseAddCommandWithLargeBuy() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/1 /pc cat/test buy/9999999999999999999999999999999999999999999 sell/2"; + parser.parseInput(userInput); + String expectedMessage = "Buy price is too large. Please input a smaller buy price." + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseMarkCommand() { - String userInput = "mark ItemName"; - Command command = parser.parseInput(userInput); - assertInstanceOf(MarkCommand.class, command); - MarkCommand markCommand = (MarkCommand) command; - assertEquals("itemname", markCommand.getItemName()); + public void testParseAddCommandWithLargeSell() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/9999999999999999999999999999999999999999"; + parser.parseInput(userInput); + String expectedMessage = "Sell price is too large. Please input a smaller sell price." + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseUnmarkCommand() { - String userInput = "unmark ItemName"; - Command command = parser.parseInput(userInput); - assertInstanceOf(UnmarkCommand.class, command); - UnmarkCommand unmarkCommand = (UnmarkCommand) command; - assertEquals("itemname", unmarkCommand.getItemName()); + public void testParseDeleteCommandWithBlankItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "del "; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: 'del [ITEM_NAME]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test - public void testParseHelpCommand() { - String userInput = "help"; - Command command = parser.parseInput(userInput); - assertInstanceOf(HelpCommand.class, command); + public void testParseEditCommandWithBlankItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit "; + parser.parseInput(userInput); + String expectedMessage = "Invalid edit command format. Please use format: " + + "'edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] " + + "buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'\n" + "You can edit at least 1 parameter up to all available" + + " parameters. For example, if you only wish to update buy and sell price, you can input:\n" + + "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); } - @Test - public void testParsePromotionCommand() { - String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to " + - "3 Apr 2024 time /from 0000 /to 2359"; - Command command = parser.parseInput(userInput); - assertInstanceOf(AddPromotionCommand.class, command); - } +// @Test +// public void testParseAddCommand() { +// String userInput = "add ItemName qty/10 /unitOfMeasurement cat/Category buy/10.5 sell/15.0"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(AddCommand.class, command); +// AddCommand addCommand = (AddCommand) command; +// assertEquals("itemname", addCommand.getItemName()); +// assertEquals(10, addCommand.getQuantity()); +// assertEquals("unitOfMeasurement", addCommand.getUnitOfMeasurement()); +// assertEquals("Category", addCommand.getCategory()); +// assertEquals(10.5f, addCommand.getBuyPrice(), 0.01); +// assertEquals(15.0f, addCommand.getSellPrice(), 0.01); +// } +// +// @Test +// public void testParseEditCommand() { +// String userInput = "edit ItemName name/NewName qty/20 uom/NewUOM cat/NewCategory buy/15.0 sell/20.0"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(EditCommand.class, command); +// EditCommand editCommand = (EditCommand) command; +// assertEquals("itemname", editCommand.getItemName()); +// assertEquals("newname", editCommand.getNewItemName()); +// assertEquals(20, editCommand.getNewQuantity()); +// assertEquals("NewUOM", editCommand.getNewUnitOfMeasurement()); +// assertEquals("NewCategory", editCommand.getNewCategory()); +// assertEquals(15.0f, editCommand.getNewBuyPrice(), 0.01); +// assertEquals(20.0f, editCommand.getNewSellPrice(), 0.01); +// } +// +// @Test +// public void testParseSellCommand1() { +// String userInput = "sell ItemName qty/5"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(SellCommand.class, command); +// SellCommand sellCommand = (SellCommand) command; +// assertEquals("itemname", sellCommand.getItemName()); +// assertEquals(5, sellCommand.getSellQuantity()); +// } +// +// @Test +// public void testParseSellCommand2() { +// Command addCommandTest1 = new AddCommand("lemon", 5, "fruits", +// "NA", 1, 1); +// Command promotionTest1 = new AddPromotionCommand("lemon", 0.3F, 2, Month.valueOf("FEB"), +// 2024, 4, Month.valueOf("APR"), 2025, 0000, 2359); +// try { +// promotionTest1.execute(); +// addCommandTest1.execute(); +// } catch (CommandFormatException | InvalidDateException | EmptyListException e) { +// throw new RuntimeException(e); +// } +// String userInput1 = "sell lemon qty/1"; +// Command command1 = parser.parseInput(userInput1); +// assertInstanceOf(SellCommand.class, command1); +// SellCommand sellCommand = (SellCommand) command1; +// assertEquals("lemon", sellCommand.getItemName()); +// assertEquals(1, sellCommand.getSellQuantity()); +// } +// +// @Test +// public void testParseFindCommand() { +// String userInput = "find /info Keyword"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(FindCommand.class, command); +// FindCommand findCommand = (FindCommand) command; +// assertEquals("info", findCommand.getItemInfo()); +// assertEquals("keyword", findCommand.getKeyword()); +// } +// +// @Test +// public void testPrepareFindCommand() { +// // Test valid find command +// String userInput = "find /itemInfo Keyword"; +// Command command = parser.parseInput(userInput); +// assertTrue(command instanceof FindCommand); +// FindCommand findCommand = (FindCommand) command; +// assertEquals("iteminfo", findCommand.getItemInfo()); +// assertEquals("keyword", findCommand.getKeyword()); +// +// // Test find command without specifying item info +// userInput = "find Keyword"; +// command = parser.parseInput(userInput); +// assertTrue(command instanceof FindCommand); +// findCommand = (FindCommand) command; +// assertEquals("NA", findCommand.getItemInfo()); +// assertEquals("keyword", findCommand.getKeyword()); +// } +// +// @Test +// public void testParseListCommand() { +// String userInput = "list_items cat/Category"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(ListCommand.class, command); +// ListCommand listCommand = (ListCommand) command; +// assertEquals("category", listCommand.getCategory()); +// } +// +// @Test +// public void testParseMarkCommand() { +// String userInput = "mark ItemName"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(MarkCommand.class, command); +// MarkCommand markCommand = (MarkCommand) command; +// assertEquals("itemname", markCommand.getItemName()); +// } +// +// @Test +// public void testParseUnmarkCommand() { +// String userInput = "unmark ItemName"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(UnmarkCommand.class, command); +// UnmarkCommand unmarkCommand = (UnmarkCommand) command; +// assertEquals("itemname", unmarkCommand.getItemName()); +// } +// +// @Test +// public void testParseHelpCommand() { +// String userInput = "help"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(HelpCommand.class, command); +// } +// +// @Test +// public void testParsePromotionCommand() { +// String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to " + +// "3 Apr 2024 time /from 0000 /to 2359"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(AddPromotionCommand.class, command); +// } +// +// +// @Test +// public void testPrepareDeleteCommand() { +// Command addCommand = new AddCommand("lemon", 5, "fruits", +// "NA", 1, 1); +// Command DelCommand1 = new DeleteCommand("lemon"); +// Command DelCommand2 = new DeleteCommand(" "); +// try { +// addCommand.execute(); +// DelCommand1.execute(); +// DelCommand2.execute(); +// } catch (CommandFormatException | InvalidDateException | EmptyListException e) { +// throw new RuntimeException(e); +// } +// } +// +// @Test +// public void testLowStockCommand() { +// // Test valid low stock command +// String userInput1 = "low_stock /10"; +// Command command1 = parser.parseInput(userInput1); +// assertTrue(command1 instanceof LowStockCommand); +// LowStockCommand lowStockCommand1 = (LowStockCommand) command1; +// assertEquals(10, lowStockCommand1.getAmount()); +// } +// +// @Test +// public void testParseExitCommand() { +// String userInput = "exit"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(ExitCommand.class, command); +// } +// +// @Test +// public void testParseIncorrectCommand() { +// String userInput = "incorrect"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(IncorrectCommand.class, command); +// } +// +// @Test +// public void testParseTotalProfitCommand() { +// String userInput = "total_profit"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(TotalProfitCommand.class, command); +// } +// +// @Test +// public void testParseBestsellerCommand() { +// String userInput = "bestseller"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(BestsellerCommand.class, command); +// } +// +// @Test +// public void testParseDeletePromotionCommand() { +// String userInput = "del_promo ItemName"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(DeletePromotionCommand.class, command); +// } +// +// @Test +// public void testPrepareAddWithInvalidFormat() { +// ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); +// System.setOut(new PrintStream(outputStreamCaptor)); +// String userInput = "add itemName"; +// parser.parseInput(userInput); +// String expectedMessage = "Invalid command format. Please use format: " + "\n" + +// "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + +// "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); +// assertEquals(expectedMessage, outputStreamCaptor.toString()); +// } +// +// @Test +// public void testParseUnrecognizedCommand() { +// String userInput = "unknown command"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(IncorrectCommand.class, command); +// } +// +// @Test +// public void testPrepareDeletePromo() { +// String userInput = "del_promo ItemName"; +// Command command = parser.parseInput(userInput); +// assertInstanceOf(DeletePromotionCommand.class, command); +// DeletePromotionCommand deletePromotionCommand = (DeletePromotionCommand) command; +// assertEquals("itemname", deletePromotionCommand.getItemName()); +// } + } From daa55531386bd0938047606176bb7596b76d15e9 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 19:42:53 +0800 Subject: [PATCH 346/421] Update md --- docs/team/fxe025.md | 33 +++++++++++++++++++-------------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md index 7b419724cf..c9e40ba017 100644 --- a/docs/team/fxe025.md +++ b/docs/team/fxe025.md @@ -9,23 +9,28 @@ manage and operate their business. ### Code Contribution - **New Feature:** Add Storage feature - - What it does: Write information from an itemlist to file - - Read information from the file when program starts + - What it does: Write information from an itemlist to file. Read information from the file when program starts + - Justification: This feature is important in saving stock information and any update to stock, during the execution of +StockMaster. When the user restarts the program, information from previous runs can be automatically retrieved. User can also +use the text file created by this feature for reference. - **New Feature:** Add Transaction feature - - What it does: Store selling price, cost, quantity and profit made of a type of item that's already sold. + - What it does: Store date and time, selling price, cost, quantity and profit made of a type of item that's already sold + - Justification: Transactions contain additional information of items in stock when they are being sold, and those are not necessary +to be stored in itemlist. The transaction feature is useful in saving these information. - **New Feature:** Add Cashier feature - * A list to store past transactions + - What it does: A list to store past transactions + - Justification: This is a necessary feature to store and edit transactions list by user command - **New Feature:** Add TransactionLogs feature - * Write information from a transactionlist to file - * Read information from the file when program starts + - What it does: Write information from a transactionlist to file. Read information from the file when program starts + - Justification: Transactions are stored in different format than stock, and they contain additional information like profit and date. + Storing transactions in another file helps the user to obtain required information more easily. **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=fxe025&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=isaaceng7&tabRepo=AY2324S2-CS2113-T15-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) -#### Contributions to the UG -- Update feature guide for edit command feature -- Add edit command to command summary - -#### Contributions to the DG -- Storage feature - - Class diagram - - Sequence diagram +- **Documentation** + - User Guide: + - Update feature guide for edit command feature + - Developer Guide: + - Add Storage feature + - Class diagram + - Sequence diagram From 877bf0e8177c301596520ea9413ae303ecc60614 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 20:15:11 +0800 Subject: [PATCH 347/421] Add JavaDoc --- src/main/java/storage/PromotionStorage.java | 4 ++ src/main/java/storage/Storage.java | 6 +++ src/main/java/storage/TransactionLogs.java | 5 +++ src/main/java/ui/TextUi.java | 48 +++++++++++++++++++++ 4 files changed, 63 insertions(+) diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java index 95776379d0..5bbc3b001a 100644 --- a/src/main/java/storage/PromotionStorage.java +++ b/src/main/java/storage/PromotionStorage.java @@ -14,6 +14,10 @@ import java.util.Scanner; import java.util.logging.Level; +/** + * Represents a class that stores and writes information of a list of promotions existed to a file. + * String PROMOTIONSTORAGE represents the designated relative file path for the file. + */ public class PromotionStorage extends Storage{ private static final String PRMOTIONSTORAGE = "./PromotionStorage.txt"; diff --git a/src/main/java/storage/Storage.java b/src/main/java/storage/Storage.java index d5f2a24c38..717f651115 100644 --- a/src/main/java/storage/Storage.java +++ b/src/main/java/storage/Storage.java @@ -37,6 +37,12 @@ public static void writeToFile(String filePath, String textToAdd, boolean ifAppe LOGGER.info("Line written successfully."); } + /** + * Update information in file. + * @param inputText The line of text to write to the file. + * @param ifAppend Indicate if append the text at the end of the file (true) + * or overwrite the file (false). + */ public static void updateFile(String inputText, boolean ifAppend) { try { writeToFile(getFileDirectory(), inputText, ifAppend); diff --git a/src/main/java/storage/TransactionLogs.java b/src/main/java/storage/TransactionLogs.java index c4f05214a7..c2e56f1c6b 100644 --- a/src/main/java/storage/TransactionLogs.java +++ b/src/main/java/storage/TransactionLogs.java @@ -78,6 +78,11 @@ public static void readFromFile(String fileName) { } } + /** + * Writes to the indicated file without overwriting the previous information. + * + * @param transactions List of transactions to write to the file. + */ public static void addToLog(ArrayList transactions) { assert transactions != null : "Transactions cannot be null."; Transaction lastTransaction = transactions.get(transactions.size() - 1); diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index 1c2ec32192..f67a00a9fc 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -8,16 +8,27 @@ import item.Transaction; import promotion.Promotion; +/** + * Represents a class that displays messages and command output to the user. + * String DIVIDER A string to separate current message from the previous ones. + * Scanner in A scanner to retrieve user's text inputs. + */ public class TextUi { public static final String DIVIDER = "----------------"; private final Scanner in; + /** + * Constructor for TextUi. + */ public TextUi() { this.in = new Scanner(System.in); } + /** + * Retrieve user's input as a string. + */ public static String getUserInput() { System.out.println("Enter Command:"); Scanner in = new Scanner(System.in); @@ -28,6 +39,11 @@ public static String getUserInput() { return userInput; } + /** + * Determines if user's input is empty and should be ignored. + * + * @param userInput User's input. + */ public static boolean shouldIgnore(String userInput) { return userInput.trim().isEmpty(); } @@ -42,6 +58,13 @@ public void showWelcomeMessage(String version, String storageFilePath) { ); } + /** + * Displays goodbye message to the user when exit the program. + * + * @param storageFilePath Directory of storage file. + * @param transactionLogPath Directory of transaction log file. + * @param promotionStoragePath Directory of promotion storage file. + */ public void showGoodByeMessage(String storageFilePath, String transactionLogPath, String promotionStoragePath) { replyToUser( DIVIDER, @@ -55,12 +78,22 @@ public void showGoodByeMessage(String storageFilePath, String transactionLogPath ); } + /** + * Displays message to the user. + * + * @param message Message to show to the user. + */ public static void replyToUser(String... message) { for (String m : message) { System.out.println(m); } } + /** + * Display the arraylist to the user. + * + * @param arrayList The arraylist to show to the user. + */ public static void showList(ArrayList arrayList) { if (arrayList.isEmpty()) { replyToUser(Messages.EMPTY_LIST); @@ -78,6 +111,14 @@ public static void showList(ArrayList arrayList) { } } + /** + * Displays message to the user when an item is sold. + * + * @param item The item sold. + * @param sellQuantity Quantity of the item sold. + * @param remainingQuantity Quantity remained for the item sold. + * @param sellPrice The selling price of the item sold. + */ public static void showSellMessage(String item, int sellQuantity, int remainingQuantity, float sellPrice) { float totalValue = sellQuantity * sellPrice; replyToUser("Quantity of " + item + " sold: " + sellQuantity + ", for: $" + sellPrice + "\n" + @@ -87,6 +128,13 @@ public static void showSellMessage(String item, int sellQuantity, int remainingQ } //@@author Fureimi + /** + * Displays a list that contains items of a certain category. + * + * @param arrayList The arraylist to show to the user. + * @param category The category to be listed to the user. + * @param isListMarked Whether the items listed are marked items. + */ public static void showCustomizedList(ArrayList arrayList, String category, boolean isListMarked) { if (arrayList.isEmpty()) { replyToUser(Messages.EMPTY_LIST); From 42e2882355f7bcf632585ccae199fcf06a8548cf Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sun, 14 Apr 2024 21:03:59 +0800 Subject: [PATCH 348/421] make change to DG --- docs/DeveloperGuide.md | 3 +- .../Itemlist/EditCommand_SequenceDiagram.png | Bin 81944 -> 86734 bytes .../Itemlist/ListItems_SequenceDiagram.png | Bin 29158 -> 33705 bytes .../Itemlist/EditCommand_SequenceDiagram.puml | 12 ++-- .../Itemlist/ListItems_SequenceDiagram.puml | 56 +++++++++--------- src/main/java/command/ListCommand.java | 1 - 6 files changed, 35 insertions(+), 37 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 80e9bc3fff..07db3c0da1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -27,8 +27,7 @@ To list items in the `Itemlist` to the user, the `ListCommand` class is used. ![ListItems_SequenceDiagram](Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png) 1. An instance of `ListCommand` is created with parameters specifying what category to list, or whether to only list marked items, as well as an `Itemlist` class. -2. The `execute()` method is then called, which first checks which type of list is passed. In this case, it wil be the -list of items. Afterwards, it checks for modifiers such as category or isListMarked. +2. The `execute()` method is then called, checking for modifiers such as category or isListMarked. 3. Depending on the modifiers, different things will happen. - If there are no modifiers, `ListCommand` will display all items in the list by calling `TextUi.ShowList()`. 4. If there are modifiers present, `ShowCustomizedItemList()` will be called. diff --git a/docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png index 20781d3e2a95b6f00a1f5671b55dc603b680035e..4e45af6b2aaf572971ce5d76a728376d090bf87a 100644 GIT binary patch literal 86734 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
1WCJ0Lkdvr2tUM#{YKUNI2br=}$pH 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%0A9-Qb z^3Y;Ke8sHo?ou6EOSR8TA{8hq%5UyNc-FM#18%b}{dql9gtDbqCQmO=fBtg%cOH3P zXTFBJN^w(XR_dcpYS{e{Hw@qRR01$jg<{rCBUdC#`Mn6ArTOXWS1U`)ww9LfvnhOH zLw`)g%W4=-S)f|R6HaecCQ!^59@u*-iu&!TINSVHI$yqitwAaR{7r@YW8&hLvM_GV zsMBg%GWsjkkoUoHgu+u};2PYiP~5@i`Si(;;;A=Y1ht_UN;^NRh1Y>qL(^_zd}3lE zgbpvG__j_uJP&{@zU~&Q!vlB7Pl%T~$MKMtzPkU-!y3Ra{B43A%kJEFZC!ojU{zU} zaqvFpzML*+zIyg>&eKxE_ca=|#v{nbQ&Us*g>D}$jEPHa1$Nft8TNvDcW9^zd1OxJ z@$Jt61t0_PlKs2`78VQHQ@ut(ouon&kYcl_VLypMp{cC+SY(p#TR2M}|D5i$ldX7C z++Io`VA7x>GK41&VVt(N1OLQMQ_7V{3p5Nc13#-Wk0hvU#u6;&QAO>dqd}jL?NB03 zUQ2NorLJXy+ETWP486r4|2OjUHsBojxMUQ#n-^>*!O2|RE3l43n2LDO5$3O=zO-k1 zxQfOHD*gfLUfS?-F?odkdOy~7@6czbPyKKR@OCR*mZfeJdC$PL7uwLKr+2Qc5pVf@ z1Wr^IZ^d&nS5v=gC7)GFQF!xe+z}@4=>qbr58ZXM^bm0o!!|)?_EY42cn+rbrE9Xk zdSHFwxCsp&Fkf3T=eRNFjMr4emcQ586>|_rvLMqZWCR0Q0Zp!ZP8_}4dFyU`@`T2B zM^FK8D_@Juk(88N&hL#-L}(rW-I!%16iaOYdu;`{RrNm7YkeKn^zi9KmFewP55H zaT&3FFA5`gs!)W$OzR5QM(~$^R@wQGtJ$Te7YZuqvoq6(91vDJm0~q>uQFDg!#-?` zz0=;_-f_+6$uBpr8WfuM34HaBhG&AQzdja;TYO%;PEF4p^(!ewu;ab8#*ZsX4e=Hx zvp&C1x@XgIImF?(=ppcq5BB-a1;pkIYh{8BYVF>ASC|=X0lMGTe37Dc&mQM&u>11p zHB3l!s+-`ZVHFMFjpyn5=IdxAOe)zm9!lbhe<#?SpswGUFZ|9+-Jt&1*wA&PCdH}0 zg3H>iTpS2Z@jKy+=P@=`zrUh=0JpS zV?t|8N-!Q+-1`8r<(+{xk>NE+#;Gv(Le>H*3EI~ug@KCarB`bny^&@Yr;QozA4qAL z;mAW>)t|Yo^<$!Y$=P zk=s!2<5=Wf7S91`F8`QtG>M{aJ##|zHL6* zL&q#dCdK12OY^BmPnqBgSvA%TvIh^|?c1fR`$?G6vz7|uF;dC|>t#!%8*fBIn?cHC zctScndR%{DL!?S@!A#lA6&-gPLK*cP@3}Zqzoru6?RZE!>W4GDA#3(}7I~mSG?mSa z$-DheU1O1T?bd1Z_1=FvMJDRIifksElx`X}_{O5P{q*=9&@Ti9p z!QAl0ybyq9ISR6SHS&MEb@V!8aBpd8>Er}amg|E&%rJv+{yW#hHXBYhn;_G{6Ap!F z)DWDO(rNIk3kNXmJgv1Ymi*aZn}Y1uD(B9Zpzs|ycz--rK7WJq6UO}PE-NeECU3xhSCV0I<42+aD z)O+_7uqh>PIcO~u_nRotzNWR$Sm$z#=f>9lsKprBj-2W?ecwla1ip3)Q;34VKhn#| zl$CbJTrx*rD$f0|X@9*H+(G|%D?FRXPRKlu5E4qA0PRxHu}~-%Yz5d-J9AX)x;{9Z zT-bi|G9Wlw@le9L(MN5utHxzupQwlCPa-e>zL31nI?un~r_arG|D~l#?*p{(GK!*{ L%9glIMjrnkr<^rB diff --git a/docs/Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/ListItems_SequenceDiagram.png index 1659782d88e055eb4071b79547b67c84bece92dd..221f1272378b35b4e07a672f6af16f7da8941743 100644 GIT binary patch literal 33705 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 EditCommand : execute() activate EditCommand EditCommand -> Itemlist : getItems() diff --git a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml index acfa613ff3..6462af2dce 100644 --- a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml @@ -1,41 +1,39 @@ @startuml -participant "ui : TextUi" as UI -participant "listCommand : ListCommand" as ListCommand -participant "itemList : Itemlist" as Itemlist -participant "item : Item" as Item +actor User +participant "ListCommand :ListCommand" as LC +participant "UI :TextUi" as UI +participant "ItemList :Itemlist" as IL -activate ListCommand +User -> LC : execute() +activate LC -ListCommand -> Itemlist : getItems() -activate Itemlist -Itemlist --> ListCommand : return items -deactivate Itemlist - -ListCommand -> ListCommand : containsItems(items) -activate ListCommand -ListCommand --> ListCommand : return result -deactivate ListCommand +LC -> IL : isEmpty() +activate IL +IL --> LC : false +deactivate IL alt category equals "NA" and not isListMarked - ListCommand -> UI : showList(items) + LC -> UI : showList(itemList) + activate UI + UI --> LC + deactivate UI +else category not equals "NA" and not isListMarked + LC -> UI : showCustomizedList(itemList, category, false) activate UI - UI --> ListCommand : display items + UI --> LC deactivate UI -else contains Items - ListCommand -> ListCommand : showCustomizedItemList() - activate ListCommand - ListCommand -> Item : getCategory() - activate Item - Item --> ListCommand : return category - deactivate Item - ListCommand -> Item : getMarkStatus() - Item --> ListCommand : return isMark - ListCommand -> UI : replyToUser(item details) - deactivate ListCommand +else category equals "NA" and isListMarked + LC -> UI : showCustomizedList(itemList, "NA", true) activate UI - UI --> ListCommand : display relevant items + UI --> LC deactivate UI +else + LC -> UI : showCustomizedList(itemList, category, true) + activate UI + UI --> LC + deactivate UI + deactivate LC end + hide footbox -deactivate ListCommand @enduml diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index f2442435e7..d32e54f089 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -82,7 +82,6 @@ public void execute() throws EmptyListException { } } - private void showTransactionList() { TextUi.showTransactionList(transactionList); } From 0ecfa0b6ab55dde907bc38b0ddc37736a122486a Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 21:13:12 +0800 Subject: [PATCH 349/421] parsertest update --- src/main/java/parser/Parser.java | 2 +- src/test/java/parser/ParserTest.java | 618 +++++++++++++++++---------- 2 files changed, 399 insertions(+), 221 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 27c5a1a492..7a10037202 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -389,8 +389,8 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce if (newCategory.isBlank() || newCategory.isEmpty()) { throw new EditException("CATEGORY"); } - // check if BuyPrice was edited. If no, newBuyPrice will be -1 + // check if BuyPrice was edited. If no, newBuyPrice will be -1 float newBuyPrice; try { newBuyPrice = matcher.group("newBuyPrice") != null ? diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 091870d5bd..2edbdefa4c 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -39,6 +39,65 @@ public void setUp() { parser = new Parser(); } + @Test + public void testParseCommandWithBlankText() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = " "; + parser.parseInput(userInput); + String expectedMessage = + "Invalid command detected. Type 'help' for list of valid commands" + System.lineSeparator() + + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list items | list_items |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| edit | edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + + "| | cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] SELL/[NEW_SELL_PRICE] |\n" + + "| | (use AT LEAST 1 of: name/ qty/, uom/, cat/, buy/, sell/) |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| mark | mark ITEM_NAME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| unmark | unmark ITEM_NAME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del ITEM_NAME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| find | 1. find KEYWORD - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| bestseller | bestseller |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_profit |\n" + + "| profit | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_revenue |\n" + + "| revenue | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del_promo ITEM_NAME |\n" + + "| promotion | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list | list_promotions |\n" + + "| promotions | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| low stock | low_stock /AMOUNT |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| exit | exit |\n" + + "|____________|______________________________________________________________________________|\n" + + "* type help c/COMMAND for more detailed explanations\n" + + " (use the command names on the left column)" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } @Test public void testParseAddCommandWithBlankText() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -51,6 +110,16 @@ public void testParseAddCommandWithBlankText() { assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseAddCommandWithValidItem() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/2"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseAddCommandWithBlankItemName() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -101,22 +170,77 @@ public void testParseAddCommandWithBlankCategory() { public void testParseAddCommandWithLargeBuy() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); - String userInput = "add itemname qty/1 /pc cat/test buy/9999999999999999999999999999999999999999999 sell/2"; + String userInput = "add itemname qty/1 /pc cat/test buy/999999999999999999999999999 sell/2"; parser.parseInput(userInput); String expectedMessage = "Buy price is too large. Please input a smaller buy price." + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseAddCommandWithNegativeBuy() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/1 /pc cat/test buy/-1 sell/2"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseAddCommandWithLargeSell() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); - String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/9999999999999999999999999999999999999999"; + String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/99999999999999999999999999"; parser.parseInput(userInput); String expectedMessage = "Sell price is too large. Please input a smaller sell price." + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseAddCommandWithNegativeSell() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/-2"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseHelpCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "help"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseHelpCommandWithBlankCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "help c/ "; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: 'help' or " + + "'help c/[COMMAND]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseHelpCommandWithInvalidCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "help c/invalid "; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseDeleteCommandWithBlankItemName() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -127,6 +251,37 @@ public void testParseDeleteCommandWithBlankItemName() { assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseDeleteCommandWithItemThatDoesNotExist() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "del non existent item"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseSellCommandWithBlankItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "sell "; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + + "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseSellCommandWithItemThatDoesNotExist() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "sell non existent item qty/1"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseEditCommandWithBlankItemName() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); @@ -141,224 +296,247 @@ public void testParseEditCommandWithBlankItemName() { assertEquals(expectedMessage, outputStreamCaptor.toString()); } -// @Test -// public void testParseAddCommand() { -// String userInput = "add ItemName qty/10 /unitOfMeasurement cat/Category buy/10.5 sell/15.0"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(AddCommand.class, command); -// AddCommand addCommand = (AddCommand) command; -// assertEquals("itemname", addCommand.getItemName()); -// assertEquals(10, addCommand.getQuantity()); -// assertEquals("unitOfMeasurement", addCommand.getUnitOfMeasurement()); -// assertEquals("Category", addCommand.getCategory()); -// assertEquals(10.5f, addCommand.getBuyPrice(), 0.01); -// assertEquals(15.0f, addCommand.getSellPrice(), 0.01); -// } -// -// @Test -// public void testParseEditCommand() { -// String userInput = "edit ItemName name/NewName qty/20 uom/NewUOM cat/NewCategory buy/15.0 sell/20.0"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(EditCommand.class, command); -// EditCommand editCommand = (EditCommand) command; -// assertEquals("itemname", editCommand.getItemName()); -// assertEquals("newname", editCommand.getNewItemName()); -// assertEquals(20, editCommand.getNewQuantity()); -// assertEquals("NewUOM", editCommand.getNewUnitOfMeasurement()); -// assertEquals("NewCategory", editCommand.getNewCategory()); -// assertEquals(15.0f, editCommand.getNewBuyPrice(), 0.01); -// assertEquals(20.0f, editCommand.getNewSellPrice(), 0.01); -// } -// -// @Test -// public void testParseSellCommand1() { -// String userInput = "sell ItemName qty/5"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(SellCommand.class, command); -// SellCommand sellCommand = (SellCommand) command; -// assertEquals("itemname", sellCommand.getItemName()); -// assertEquals(5, sellCommand.getSellQuantity()); -// } -// -// @Test -// public void testParseSellCommand2() { -// Command addCommandTest1 = new AddCommand("lemon", 5, "fruits", -// "NA", 1, 1); -// Command promotionTest1 = new AddPromotionCommand("lemon", 0.3F, 2, Month.valueOf("FEB"), -// 2024, 4, Month.valueOf("APR"), 2025, 0000, 2359); -// try { -// promotionTest1.execute(); -// addCommandTest1.execute(); -// } catch (CommandFormatException | InvalidDateException | EmptyListException e) { -// throw new RuntimeException(e); -// } -// String userInput1 = "sell lemon qty/1"; -// Command command1 = parser.parseInput(userInput1); -// assertInstanceOf(SellCommand.class, command1); -// SellCommand sellCommand = (SellCommand) command1; -// assertEquals("lemon", sellCommand.getItemName()); -// assertEquals(1, sellCommand.getSellQuantity()); -// } -// -// @Test -// public void testParseFindCommand() { -// String userInput = "find /info Keyword"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(FindCommand.class, command); -// FindCommand findCommand = (FindCommand) command; -// assertEquals("info", findCommand.getItemInfo()); -// assertEquals("keyword", findCommand.getKeyword()); -// } -// -// @Test -// public void testPrepareFindCommand() { -// // Test valid find command -// String userInput = "find /itemInfo Keyword"; -// Command command = parser.parseInput(userInput); -// assertTrue(command instanceof FindCommand); -// FindCommand findCommand = (FindCommand) command; -// assertEquals("iteminfo", findCommand.getItemInfo()); -// assertEquals("keyword", findCommand.getKeyword()); -// -// // Test find command without specifying item info -// userInput = "find Keyword"; -// command = parser.parseInput(userInput); -// assertTrue(command instanceof FindCommand); -// findCommand = (FindCommand) command; -// assertEquals("NA", findCommand.getItemInfo()); -// assertEquals("keyword", findCommand.getKeyword()); -// } -// -// @Test -// public void testParseListCommand() { -// String userInput = "list_items cat/Category"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(ListCommand.class, command); -// ListCommand listCommand = (ListCommand) command; -// assertEquals("category", listCommand.getCategory()); -// } -// -// @Test -// public void testParseMarkCommand() { -// String userInput = "mark ItemName"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(MarkCommand.class, command); -// MarkCommand markCommand = (MarkCommand) command; -// assertEquals("itemname", markCommand.getItemName()); -// } -// -// @Test -// public void testParseUnmarkCommand() { -// String userInput = "unmark ItemName"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(UnmarkCommand.class, command); -// UnmarkCommand unmarkCommand = (UnmarkCommand) command; -// assertEquals("itemname", unmarkCommand.getItemName()); -// } -// -// @Test -// public void testParseHelpCommand() { -// String userInput = "help"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(HelpCommand.class, command); -// } -// -// @Test -// public void testParsePromotionCommand() { -// String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to " + -// "3 Apr 2024 time /from 0000 /to 2359"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(AddPromotionCommand.class, command); -// } -// -// -// @Test -// public void testPrepareDeleteCommand() { -// Command addCommand = new AddCommand("lemon", 5, "fruits", -// "NA", 1, 1); -// Command DelCommand1 = new DeleteCommand("lemon"); -// Command DelCommand2 = new DeleteCommand(" "); -// try { -// addCommand.execute(); -// DelCommand1.execute(); -// DelCommand2.execute(); -// } catch (CommandFormatException | InvalidDateException | EmptyListException e) { -// throw new RuntimeException(e); -// } -// } -// -// @Test -// public void testLowStockCommand() { -// // Test valid low stock command -// String userInput1 = "low_stock /10"; -// Command command1 = parser.parseInput(userInput1); -// assertTrue(command1 instanceof LowStockCommand); -// LowStockCommand lowStockCommand1 = (LowStockCommand) command1; -// assertEquals(10, lowStockCommand1.getAmount()); -// } -// -// @Test -// public void testParseExitCommand() { -// String userInput = "exit"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(ExitCommand.class, command); -// } -// -// @Test -// public void testParseIncorrectCommand() { -// String userInput = "incorrect"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(IncorrectCommand.class, command); -// } -// -// @Test -// public void testParseTotalProfitCommand() { -// String userInput = "total_profit"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(TotalProfitCommand.class, command); -// } -// -// @Test -// public void testParseBestsellerCommand() { -// String userInput = "bestseller"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(BestsellerCommand.class, command); -// } -// -// @Test -// public void testParseDeletePromotionCommand() { -// String userInput = "del_promo ItemName"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(DeletePromotionCommand.class, command); -// } -// -// @Test -// public void testPrepareAddWithInvalidFormat() { -// ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); -// System.setOut(new PrintStream(outputStreamCaptor)); -// String userInput = "add itemName"; -// parser.parseInput(userInput); -// String expectedMessage = "Invalid command format. Please use format: " + "\n" + -// "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + -// "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); -// assertEquals(expectedMessage, outputStreamCaptor.toString()); -// } -// -// @Test -// public void testParseUnrecognizedCommand() { -// String userInput = "unknown command"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(IncorrectCommand.class, command); -// } -// -// @Test -// public void testPrepareDeletePromo() { -// String userInput = "del_promo ItemName"; -// Command command = parser.parseInput(userInput); -// assertInstanceOf(DeletePromotionCommand.class, command); -// DeletePromotionCommand deletePromotionCommand = (DeletePromotionCommand) command; -// assertEquals("itemname", deletePromotionCommand.getItemName()); -// } + @Test + public void testParseLowStockCommandWithBlankAmount() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "low_stock /"; + parser.parseInput(userInput); + String expectedMessage = "Invalid Command Format. Please use format: low_stock /AMOUNT" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseLowStockCommandWithLargeAmount() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "low_stock /99999999999999999999"; + parser.parseInput(userInput); + String expectedMessage = "Please input a valid amount." + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseLowStockCommandWithNegativeAmount() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "low_stock /-1"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseAddCommand() { + String userInput = "add ItemName qty/10 /unitOfMeasurement cat/Category buy/10.5 sell/15.0"; + Command command = parser.parseInput(userInput); + assertInstanceOf(AddCommand.class, command); + AddCommand addCommand = (AddCommand) command; + assertEquals("itemname", addCommand.getItemName()); + assertEquals(10, addCommand.getQuantity()); + assertEquals("unitOfMeasurement", addCommand.getUnitOfMeasurement()); + assertEquals("Category", addCommand.getCategory()); + assertEquals(10.5f, addCommand.getBuyPrice(), 0.01); + assertEquals(15.0f, addCommand.getSellPrice(), 0.01); + } + + @Test + public void testParseEditCommand() { + String userInput = "edit ItemName name/NewName qty/20 uom/NewUOM cat/NewCategory buy/15.0 sell/20.0"; + Command command = parser.parseInput(userInput); + assertInstanceOf(EditCommand.class, command); + EditCommand editCommand = (EditCommand) command; + assertEquals("itemname", editCommand.getItemName()); + assertEquals("newname", editCommand.getNewItemName()); + assertEquals(20, editCommand.getNewQuantity()); + assertEquals("NewUOM", editCommand.getNewUnitOfMeasurement()); + assertEquals("NewCategory", editCommand.getNewCategory()); + assertEquals(15.0f, editCommand.getNewBuyPrice(), 0.01); + assertEquals(20.0f, editCommand.getNewSellPrice(), 0.01); + } + + @Test + public void testParseSellCommand1() { + String userInput = "sell ItemName qty/5"; + Command command = parser.parseInput(userInput); + assertInstanceOf(SellCommand.class, command); + SellCommand sellCommand = (SellCommand) command; + assertEquals("itemname", sellCommand.getItemName()); + assertEquals(5, sellCommand.getSellQuantity()); + } + + @Test + public void testParseSellCommand2() { + Command addCommandTest1 = new AddCommand("lemon", 5, "fruits", + "NA", 1, 1); + Command promotionTest1 = new AddPromotionCommand("lemon", 0.3F, 2, Month.valueOf("FEB"), + 2024, 4, Month.valueOf("APR"), 2025, 0000, 2359); + try { + promotionTest1.execute(); + addCommandTest1.execute(); + } catch (CommandFormatException | InvalidDateException | EmptyListException e) { + throw new RuntimeException(e); + } + String userInput1 = "sell lemon qty/1"; + Command command1 = parser.parseInput(userInput1); + assertInstanceOf(SellCommand.class, command1); + SellCommand sellCommand = (SellCommand) command1; + assertEquals("lemon", sellCommand.getItemName()); + assertEquals(1, sellCommand.getSellQuantity()); + } + + @Test + public void testParseFindCommand() { + String userInput = "find /info Keyword"; + Command command = parser.parseInput(userInput); + assertInstanceOf(FindCommand.class, command); + FindCommand findCommand = (FindCommand) command; + assertEquals("info", findCommand.getItemInfo()); + assertEquals("keyword", findCommand.getKeyword()); + } + + @Test + public void testPrepareFindCommand() { + // Test valid find command + String userInput = "find /itemInfo Keyword"; + Command command = parser.parseInput(userInput); + assertTrue(command instanceof FindCommand); + FindCommand findCommand = (FindCommand) command; + assertEquals("iteminfo", findCommand.getItemInfo()); + assertEquals("keyword", findCommand.getKeyword()); + + // Test find command without specifying item info + userInput = "find Keyword"; + command = parser.parseInput(userInput); + assertTrue(command instanceof FindCommand); + findCommand = (FindCommand) command; + assertEquals("NA", findCommand.getItemInfo()); + assertEquals("keyword", findCommand.getKeyword()); + } + + @Test + public void testParseListCommand() { + String userInput = "list_items cat/Category"; + Command command = parser.parseInput(userInput); + assertInstanceOf(ListCommand.class, command); + ListCommand listCommand = (ListCommand) command; + assertEquals("category", listCommand.getCategory()); + } + + @Test + public void testParseMarkCommand() { + String userInput = "mark ItemName"; + Command command = parser.parseInput(userInput); + assertInstanceOf(MarkCommand.class, command); + MarkCommand markCommand = (MarkCommand) command; + assertEquals("itemname", markCommand.getItemName()); + } + + @Test + public void testParseUnmarkCommand() { + String userInput = "unmark ItemName"; + Command command = parser.parseInput(userInput); + assertInstanceOf(UnmarkCommand.class, command); + UnmarkCommand unmarkCommand = (UnmarkCommand) command; + assertEquals("itemname", unmarkCommand.getItemName()); + } + + @Test + public void testParsePromotionCommand() { + String userInput = "promotion apple discount/10 period /from 2 Apr 2024 /to " + + "3 Apr 2024 time /from 0000 /to 2359"; + Command command = parser.parseInput(userInput); + assertInstanceOf(AddPromotionCommand.class, command); + } + + + @Test + public void testPrepareDeleteCommand() { + Command addCommand = new AddCommand("lemon", 5, "fruits", + "NA", 1, 1); + Command DelCommand1 = new DeleteCommand("lemon"); + Command DelCommand2 = new DeleteCommand(" "); + try { + addCommand.execute(); + DelCommand1.execute(); + DelCommand2.execute(); + } catch (CommandFormatException | InvalidDateException | EmptyListException e) { + throw new RuntimeException(e); + } + } + + @Test + public void testLowStockCommand() { + // Test valid low stock command + String userInput1 = "low_stock /10"; + Command command1 = parser.parseInput(userInput1); + assertTrue(command1 instanceof LowStockCommand); + LowStockCommand lowStockCommand1 = (LowStockCommand) command1; + assertEquals(10, lowStockCommand1.getAmount()); + } + + @Test + public void testParseExitCommand() { + String userInput = "exit"; + Command command = parser.parseInput(userInput); + assertInstanceOf(ExitCommand.class, command); + } + + @Test + public void testParseIncorrectCommand() { + String userInput = "incorrect"; + Command command = parser.parseInput(userInput); + assertInstanceOf(IncorrectCommand.class, command); + } + + @Test + public void testParseTotalProfitCommand() { + String userInput = "total_profit"; + Command command = parser.parseInput(userInput); + assertInstanceOf(TotalProfitCommand.class, command); + } + + @Test + public void testParseBestsellerCommand() { + String userInput = "bestseller"; + Command command = parser.parseInput(userInput); + assertInstanceOf(BestsellerCommand.class, command); + } + + @Test + public void testParseDeletePromotionCommand() { + String userInput = "del_promo ItemName"; + Command command = parser.parseInput(userInput); + assertInstanceOf(DeletePromotionCommand.class, command); + } + + @Test + public void testPrepareAddWithInvalidFormat() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemName"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseUnrecognizedCommand() { + String userInput = "unknown command"; + Command command = parser.parseInput(userInput); + assertInstanceOf(IncorrectCommand.class, command); + } + + @Test + public void testPrepareDeletePromo() { + String userInput = "del_promo ItemName"; + Command command = parser.parseInput(userInput); + assertInstanceOf(DeletePromotionCommand.class, command); + DeletePromotionCommand deletePromotionCommand = (DeletePromotionCommand) command; + assertEquals("itemname", deletePromotionCommand.getItemName()); + } } From a373a25b35b3c1e18bd7ecb021f7110bd0e55a49 Mon Sep 17 00:00:00 2001 From: LowTL Date: Sun, 14 Apr 2024 21:14:09 +0800 Subject: [PATCH 350/421] Update DG --- docs/DeveloperGuide.md | 68 +++++++++++++++--- docs/Diagrams/Images/ArchitectureDiagram.png | Bin 0 -> 37401 bytes .../Images/Cashier/CashierSequenceDiagram.png | Bin 0 -> 28959 bytes .../TotalProfitCommand_SequenceDiagram.png | Bin 14105 -> 23735 bytes .../Cashier/TransactionClassDiagram.png | Bin 0 -> 20370 bytes .../PUML files/ArchitectureDiagram.puml | 40 +++++++++++ .../Cashier/CashierClassDiagram.puml | 18 ++--- .../Cashier/CashierSequenceDiagram.puml | 49 +++++++++++++ .../TotalProfitCommand_SequenceDiagram.puml | 22 ++++-- .../Cashier/TransactionClassDiagram.puml | 8 +++ docs/team/lowtl.md | 5 +- src/test/java/command/ListCommandTest.java | 14 ++-- 12 files changed, 193 insertions(+), 31 deletions(-) create mode 100644 docs/Diagrams/Images/ArchitectureDiagram.png create mode 100644 docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png create mode 100644 docs/Diagrams/Images/Cashier/TransactionClassDiagram.png create mode 100644 docs/Diagrams/PUML files/ArchitectureDiagram.puml create mode 100644 docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml create mode 100644 docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 80e9bc3fff..1b09e0aa41 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,17 +1,57 @@ # Developer Guide +## Table of contents + +* [Acknowledgements](#acknowledgements) +* [Design](#design) + * [Architecture Diagram](#architecture-diagram) + * [Command](#command) + * [Item](#item) + * [Itemlist](#itemlist) + * [Sequence Diagram](#sequence-diagram-of-listcommand-when-used-to-list-items) + * [Parser](#parser) + * [Class Diagram] + * [Storage](#storage) + * [Class Diagram](#storage-class-diagram) + * [Sequence Diagram](#storage-sequence-diagram) + * [UI](#ui) + * [Cashier](#cashier) + * [Class Diagram](#cashier-class-diagram) + * [Sequence Diagrams](#cashier-sequence-diagrams) +* [Product Scope](#product-scope) +* [User Stories](#user-stories) +* [Non-Functional Requirements](#non-functional-requirements) +* [Glossary](#glossary) +* [Instructions for manual testing](#instructions-for-manual-testing) + ## Acknowledgements -{list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +**DG Adapted from** + +* [Addressbook-Level3](https://github.com/se-edu/addressbook-level3) ## Design +### Architecture Diagram +![ArchitectureDiagram](Diagrams/Images/ArchitectureDiagram.png) + +The **Architecture Diagram** above explains the high-level design of the program. + +#### Main components of the architecture +`Main` is the `StockMaster` class, and controls the operation and closing of the app. + +The program consists of several components: +* `TextUi` handles interaction with the User +* `Parser` converts the user input into `Command` +* `Command` executes the commands given by the user +* `Itemlist`, `Cashier` and `PromotionList` are ArrayLists of type `Item`, `Transaction` and `Promotion` +respectively. +* `Storage` reads from and writes to the hard disk. + ### Command The Command class is an abstract class which is extended to execute the various commands used in the product. It contains the abstract method `execute`, which is overridden by all other Command child classes. -### Exception - ### Item Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, quantity of item, and others. @@ -79,9 +119,11 @@ It contains command formats that must be adhered to for the methods to be called * Method `readFromFile()` retrieve information from the file when program restarts. Information is used to create new `Item` object, which is added to the Itemlist by `addItem()` method. -### Class diagram +### Storage Class diagram ![Storage_ClassDiagram](Diagrams/Images/Storage/Storage_ClassDiagram.png) -### Sequence diagram + +### Storage Sequence diagram + ![Storage_sequenceDiagram](Diagrams/Images/Storage/Storage_sequenceDiagram.png) ### UI @@ -89,14 +131,24 @@ UI prints command output, and useful messages to the user. ### Cashier Cashier class extends Itemlist class, and stores `Transactions` instead of `Items`. +It has 4 main functions: `addItem`, `getTransactions`, `getBestseller` and `getTotalProfit`. +The main function of this class is to track transactions, as well as provide some basic +business analytics to the app. -#### Class Diagram +It mainly uses 4 `Command` subclasses, namely the `AddCommand`, `ListCommand`, `BestsellerCommand` and +`TotalProfitCommand`. Each `Command` subclass executes their respective function, and print the result through +`TextUi`. + +### Cashier Class Diagram ![CashierClassDiagram](Diagrams/Images/Cashier/CashierClassDiagram.png) -#### Sequence Diagrams +### Cashier Sequence Diagrams +![CashierSeqDiagram](Diagrams/Images/Cashier/CashierSequenceDiagram.png) + +BestsellerCommand: `getBestseller` ref from the overall sequence diagram above: ![BestsellerCommand](Diagrams/Images/Cashier/BestsellerCommand_SequenceDiagram.png) -The `BestsellerCommand` calls the `getBestseller()` command from the Cashier +TotalProfitCommand: `getTotalProfit` and `getTotalRevenue` refs from the overall sequence diagram: ![TotalProfitCommand](Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png) ## Implementation diff --git a/docs/Diagrams/Images/ArchitectureDiagram.png b/docs/Diagrams/Images/ArchitectureDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..1e7579f60acf057db88ffaf92fbd4d7ff37ba863 GIT binary patch literal 37401 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 literal 0 HcmV?d00001 diff --git a/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png b/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..552f65ab1971b292593190fcd697ee3fba1a3fd2 GIT binary patch literal 28959 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 literal 0 HcmV?d00001 diff --git a/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png index 0acd680b2f5a14d730b4fecee53402a0029daf2d..c3981ad17c7eb67d536814b57773bf58a710102c 100644 GIT binary patch literal 23735 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 Cbc$mD diff --git a/docs/Diagrams/Images/Cashier/TransactionClassDiagram.png b/docs/Diagrams/Images/Cashier/TransactionClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..fd930bafd0db89ff5209dbd8e0b3678f6fad5cdd GIT binary patch literal 20370 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 B9_#=B literal 0 HcmV?d00001 diff --git a/docs/Diagrams/PUML files/ArchitectureDiagram.puml b/docs/Diagrams/PUML files/ArchitectureDiagram.puml new file mode 100644 index 0000000000..3fe41960d8 --- /dev/null +++ b/docs/Diagrams/PUML files/ArchitectureDiagram.puml @@ -0,0 +1,40 @@ +@startuml + +package "StockMaster" { +Class TextUi #Blue +Class Parser #DarkMagenta +Class Main #LightSkyBlue +Class Storage #Green +Class Command #Grey +Class Cashier #Orange +Class PromotionList +Class Itemlist #LightGreen +} + +Class User #IndianRed +file "Storage" as File #DarkOliveGreen { +} +file "TransactionLogs" as File2 #DarkOliveGreen { +} +file "PromotionStorage"" as File3 #DarkOliveGreen { +} + +User -d-> TextUi +TextUi --> Parser +TextUi <--> Main +TextUi <--> Storage +Main --> Storage +Main -l-> Parser +Main --> Command +Parser --> Command +Command --> Cashier +Command --> Itemlist +Command --> PromotionList +Itemlist <--> PromotionList +Itemlist <--> Cashier + +Storage <-d-> File +Storage <-r-> File2 +Storage <-d-> File3 + +@endumlenduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml index 61a44a2d66..23524d34a8 100644 --- a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml @@ -5,27 +5,29 @@ class Cashier { + addItem(transaction: Transaction): void + getTransactions(): ArrayList + getTransactions(item: Item): ArrayList + + getTransaction(index: int): Transaction + getTotalRevenue(): float + getTotalProfit(): float - + getTransaction(index: int): Transaction + getBestseller(): Item } class Transaction { - - item: Item + - dateTime: String - totalPrice: float - + getItem(): Item - + getTotalPrice(): float - + getProfit(): float + - profit: float + - item: Item + - quantity: int + - buyPrice: float + - sellPrice: float + + + Transaction(String, int, float, float) + + Transaction(String, int, float, float, String) } class Item { - name: String - price: float - cost: float - + getName(): String - + getPrice(): float - + getCost(): float } Cashier --> Transaction : has 1..* transactions diff --git a/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml new file mode 100644 index 0000000000..dfc779d2ad --- /dev/null +++ b/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml @@ -0,0 +1,49 @@ +@startuml +participant ":Command" as Command +participant ":TextUi" as TextUi +participant ":Cashier" as Cashier + +-> Command: execute() +activate Command +Command -> Cashier: addItem(transaction) +activate Cashier +Cashier -> Cashier: transactions.add(transaction) +return +Command --> TextUi: showSellMessage() +activate TextUi +return +alt if itemName is not given +Command -> Cashier: getAllTransactions() +activate Cashier +return transactions +Command -> TextUi : showTransactionsList(); +activate TextUi +return +else if itemName is given +Command -> Cashier: getTransactions(itemName) +activate Cashier +Cashier -> Cashier: Filter transactions +return transactions +Command -> TextUi: showTransactionsList() +activate TextUi +return +end + +Command -> Cashier: getTransaction(index) +activate Cashier +Cashier -> Cashier: transactions.get(index) +return transaction +Command -> TextUi: showTransactionsList() +activate TextUi +return + +alt Revenue + ref over Command, Cashier: getTotalRevenue +else Profit + ref over Command, Cashier: getTotalProfit +end + +ref over Command, Cashier: getBestseller + +return +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml index 8b080cd4a1..1a49a3b3c5 100644 --- a/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml @@ -3,11 +3,21 @@ participant TotalProfitCommand participant Cashier participant TextUi -TotalProfitCommand -> Cashier: getTotalProfit() / getTotalRevenue() -activate Cashier -Cashier -> Cashier: Calculate total profit / total revenue -Cashier --> TotalProfitCommand: totalProfit / totalRevenue -deactivate Cashier -TotalProfitCommand -> TextUi: replyToUser("You have earned {totalProfit} in {profits/revenue} so far.") +alt getTotalRevenue() + TotalProfitCommand -> Cashier: getTotalRevenue() + activate Cashier + Cashier -> Cashier: Calculate total revenue + Cashier --> TotalProfitCommand: totalRevenue + deactivate Cashier + TotalProfitCommand -> TextUi: replyToUser("You have earned {totalRevenue} in revenue so far.") +else getTotalProfit() + TotalProfitCommand -> Cashier: getTotalProfit() + activate Cashier + Cashier -> Cashier: Calculate total profit + Cashier --> TotalProfitCommand: totalProfit + deactivate Cashier + TotalProfitCommand -> TextUi: replyToUser("You have earned {totalProfit} in profits so far.") +end + @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml new file mode 100644 index 0000000000..e866dd497e --- /dev/null +++ b/docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml @@ -0,0 +1,8 @@ +@startuml + +class Item { + +} + +Transaction "1"*-- Item +@enduml \ No newline at end of file diff --git a/docs/team/lowtl.md b/docs/team/lowtl.md index c643302e38..d35c11e341 100644 --- a/docs/team/lowtl.md +++ b/docs/team/lowtl.md @@ -1,16 +1,17 @@ # Low Tjun Lym - Project Portfolio Page -## Overview +## Project: Stockmaster StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them manage and operate their business. ### Summary of Contribution * Overall organisation of project * **New Feature:** `Cashier` class. +* Logging & some testing +* * Allows users to create and store `Transactions`, in an extension of the `Item` class. * Contains the `getTotalProfit`, `getTotalRevenue`, and `getBestseller` methods, for basic business analysis. -* Logger diff --git a/src/test/java/command/ListCommandTest.java b/src/test/java/command/ListCommandTest.java index 1ec09381ac..ec00d753f8 100644 --- a/src/test/java/command/ListCommandTest.java +++ b/src/test/java/command/ListCommandTest.java @@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -public class ListCommandTest extends Cashier { +public class ListCommandTest { //clears all the lists @BeforeEach @@ -37,7 +37,7 @@ public void reset() { Itemlist.deleteItem(0); } while (Cashier.getTransaction(0) != null) { - transactions = new ArrayList<>(); + Cashier.transactions = new ArrayList<>(); } Storage.updateFile("", false); PromotionStorage.updateFile("", false); @@ -195,13 +195,13 @@ public void listCommandTest_transactionList_correct() { "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); - ListCommand listCommand1 = new ListCommand(transactions, "NA"); + ListCommand listCommand1 = new ListCommand(Cashier.transactions, "NA"); try { sellCommand.execute(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); listCommand1.execute(); - String expected = "1. " + transactions.get(0) + System.lineSeparator(); + String expected = "1. " + Cashier.transactions.get(0) + System.lineSeparator(); assertEquals(expected, outputStream.toString()); } catch (EmptyListException e) { Assertions.fail("Unexpected EmptyListException thrown."); @@ -222,11 +222,11 @@ public void listCommandTest_transactionList_correct2() { SellCommand sellCommand = new SellCommand("testItem", 1, 0); try { sellCommand.execute(); - ListCommand listCommand1 = new ListCommand(transactions, "testItem"); + ListCommand listCommand1 = new ListCommand(Cashier.transactions, "testItem"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); listCommand1.execute(); - String expected = "1. " + transactions.get(0) + System.lineSeparator(); + String expected = "1. " + Cashier.transactions.get(0) + System.lineSeparator(); assertEquals(expected, outputStream.toString()); } catch (EmptyListException e) { Assertions.fail("Unexpected EmptyListException thrown."); @@ -244,7 +244,7 @@ public void listCommandTest_transactionList_correct3() { "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); - ListCommand listCommand1 = new ListCommand(transactions, "failTest"); + ListCommand listCommand1 = new ListCommand(Cashier.transactions, "failTest"); try { sellCommand.execute(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); From ec68de6c26a304e70975416d0844f623045718dc Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sun, 14 Apr 2024 22:09:54 +0800 Subject: [PATCH 351/421] fix some bug, list_item 2dp for sell and buy price --- StockMasterData.txt | 2 + docs/DeveloperGuide.md | 16 ++-- .../Itemlist/EditCommand_ClassDiagram.puml | 2 + docs/UserGuide.md | 14 ++-- docs/team/Fureimi.md | 2 +- docs/team/lowtl.md | 2 +- src/main/java/common/Messages.java | 12 +-- src/main/java/item/Item.java | 6 +- src/test/java/item/ItemTest.java | 84 +++++++++++++++++++ src/test/java/promotion/PromotionTest.java | 2 +- 10 files changed, 117 insertions(+), 25 deletions(-) create mode 100644 src/test/java/item/ItemTest.java diff --git a/StockMasterData.txt b/StockMasterData.txt index e69de29bb2..0b8ea9f22e 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -0,0 +1,2 @@ +1. | [ ] | testing item 11 | Qty: 2347634 t | Cat: t | BuyPrice: $12.00 | SellPrice: $23.00 +2. | [ ] | testingitem2 | Qty: 321 t | Cat: t | BuyPrice: $123.00 | SellPrice: $321.00 diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 07db3c0da1..fd537c15fb 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -12,8 +12,8 @@ used in the product. It contains the abstract method `execute`, which is overrid ### Exception -### Item -Item class is an object which represents an item in the stock inventory list. Stores data about the item such as item +### item +item class is an object which represents an item in the stock inventory list. Stores data about the item such as item price, quantity of item, and others. ### Itemlist @@ -32,9 +32,9 @@ list marked items, as well as an `Itemlist` class. - If there are no modifiers, `ListCommand` will display all items in the list by calling `TextUi.ShowList()`. 4. If there are modifiers present, `ShowCustomizedItemList()` will be called. - If there is a category present, `ListCommand` will get the category of every item in the `Itemlist` with - `Item.getCategory()`. + `item.getCategory()`. - If isListMarked is true, `ListCommand` will get the mark status of evey item in the `Itemlist` with - `Item.getMarkStatus()`. + `item.getMarkStatus()`. - Afterwards, `TextUi.replyToUser()` will be called, displaying the relevant items. @@ -47,7 +47,7 @@ The `EditCommand` is responsible for editing attributes of an item in the `Iteml item's name, quantity, unit of measurement, category, buy price, and sell price. The command modifies the relevant item if it exists and updates the system accordingly. -#### Class Diagram of `EditCommand` and with partial Class Diagrams of `Item` and `Itemlist` +#### Class Diagram of `EditCommand` and with partial Class Diagrams of `item` and `Itemlist` ![EditCommand_ClassDiagram](Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png) @@ -61,7 +61,7 @@ these parameters are also specified. - If the item is found, it retreives the index of the item. If not, a messasge indicating that item is not found will be displayed using `TextUi.replyToUser()`. 3. If an item is found, the `Itemlist.getItem(index)` method is used to retrieve the item object. For each -attribute that needs modification, the corresponding setter method on the `Item` objet is called, such as +attribute that needs modification, the corresponding setter method on the `item` objet is called, such as `setItemName()`, `setQuantity()`, etc. 4. Once all changes have been made, `TextUi.replyToUser()` is called to display to the user that the editing process had concluded. @@ -75,7 +75,7 @@ It contains command formats that must be adhered to for the methods to be called ### Storage * Storage class contains method `addToFile()` to write data of items to the default file directory, `./StockMasterData.txt`. * `overwriteFile()` write data of items to the default file directory, overwriting previous contents in the file. -* Method `readFromFile()` retrieve information from the file when program restarts. Information is used to create new `Item` object, which is added to +* Method `readFromFile()` retrieve information from the file when program restarts. Information is used to create new `item` object, which is added to the Itemlist by `addItem()` method. ### Class diagram @@ -258,7 +258,7 @@ it also allows users to see which item has generated the most profit in the busi ## Glossary * *CLI* - Command Line Interface, where the user types commands rather than clicking options. -* *Item* - Item to be sold at the shop, with key information such as quantity, buying/selling price, description etc. +* *item* - item to be sold at the shop, with key information such as quantity, buying/selling price, description etc. ## Instructions for manual testing diff --git a/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml b/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml index 845de2748d..6d4376108f 100644 --- a/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml @@ -65,4 +65,6 @@ EditCommand -- "0..*" Item EditCommand -- "1" Itemlist EditCommand -- "1" TextUi EditCommand -- "1" Storage +hide circle +skinparam classAttributeIconSize 0 @enduml diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3bad8361b8..66ebb9729e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -252,13 +252,13 @@ the application. | Action | Format, Examples | |------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Add Item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | -| Delete Item | `del ITEM_NAME`
`e.g. del Apple` | -| Edit Item | `edit [ITEM_NAME] [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | -| Find Item | `find KEYWORD`
`e.g. find University` | -| Sell Item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | -| Mark Item | `mark ITEM_NAME` | -| Unmark Item | `unmark ITEM_NAME` | +| Add item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | +| Delete item | `del ITEM_NAME`
`e.g. del Apple` | +| Edit item | `edit [ITEM_NAME] [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | +| Find item | `find KEYWORD`
`e.g. find University` | +| Sell item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | +| Mark item | `mark ITEM_NAME` | +| Unmark item | `unmark ITEM_NAME` | | List Inventory | `list_items [marked] [cat/CATEGORY]` | | Get Best Seller | `bestseller` | | Get Profit | `total_profit` | diff --git a/docs/team/Fureimi.md b/docs/team/Fureimi.md index 5db86ffff4..e7c21e9d4a 100644 --- a/docs/team/Fureimi.md +++ b/docs/team/Fureimi.md @@ -27,7 +27,7 @@ only want to see their marked items. The mark feature is explained below. adding items to the item list. In addition, it allows the user to change the items to reflect accurately the status of each item. For example, the user may want to change the selling price of specific items due to a anticipation of a surge in demand. - - **Highlights**: The implementation was challenging as it required integration with `Itemlist` as well as `Item` to + - **Highlights**: The implementation was challenging as it required integration with `Itemlist` as well as `item` to ensure that the parameters are edited accurately. In addition, this enhancement allows users to edit multiple parameters at once, which increases convenience for the user. - **Code Contributed** : [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Fureimi&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) diff --git a/docs/team/lowtl.md b/docs/team/lowtl.md index c643302e38..381932555d 100644 --- a/docs/team/lowtl.md +++ b/docs/team/lowtl.md @@ -7,7 +7,7 @@ manage and operate their business. ### Summary of Contribution * Overall organisation of project * **New Feature:** `Cashier` class. - * Allows users to create and store `Transactions`, in an extension of the `Item` class. + * Allows users to create and store `Transactions`, in an extension of the `item` class. * Contains the `getTotalProfit`, `getTotalRevenue`, and `getBestseller` methods, for basic business analysis. * Logger diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3fde0d29b5..7beea4981d 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -8,15 +8,15 @@ public class Messages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| list items | list_items |\n" + + "| list items | list_items [marked] [cat/CATEGORY] |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| edit | edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + - "| | cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] SELL/[NEW_SELL_PRICE] |\n" + + "| edit | edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] |\n" + + "| | [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [SELL/NEW_SELL_PRICE] |\n" + "| | (use AT LEAST 1 of: name/ qty/, uom/, cat/, buy/, sell/) |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| mark | mark ITEM_NAME |\n" + @@ -154,7 +154,7 @@ public class Messages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| list items | list_items |\n" + + "| list items | list_items [marked] [cat/CATEGORY] |\n" + "|____________|______________________________________________________________________________|\n"; public static final String HELP_MARK = @@ -189,8 +189,8 @@ public class Messages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| edit | edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + - "| | cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] SELL/[NEW_SELL_PRICE] |\n" + + "| edit | edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] |\n" + + "| | [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [SELL/NEW_SELL_PRICE] |\n" + "| |------------------------------------------------------------------------------|\n" + "| example: | edit apple qty/15 /pcs cat/fruit buy/2.50 sell/3.50 |\n" + "| | edit plastic bag qty/150 |\n" + diff --git a/src/main/java/item/Item.java b/src/main/java/item/Item.java index 8def0b3fd6..3e5bb9e18b 100644 --- a/src/main/java/item/Item.java +++ b/src/main/java/item/Item.java @@ -63,6 +63,9 @@ public int getQuantity() { public void setQuantity(int newQuantity) { this.quantity = newQuantity; + if (newQuantity == 0) { + this.isOOS = true; + } } public float getBuyPrice() { @@ -110,6 +113,7 @@ public String toString() { String categoryString = (getCategory() != null) ? ", Category: " + getCategory() : ""; String markString = (this.isMark) ? "[X] " : "[ ] "; return (markString + getItemName() + " (Qty: " + getQuantity() + " " + getUnitOfMeasurement() + - ", Buy: $" + getBuyPrice() + ", Sell: $" + getSellPrice() + categoryString + ")"); + ", Buy: $" + String.format("%.2f", getBuyPrice()) + ", Sell: $" + String.format("%.2f", getSellPrice()) + + categoryString + ")"); } } diff --git a/src/test/java/item/ItemTest.java b/src/test/java/item/ItemTest.java new file mode 100644 index 0000000000..bd718cae5d --- /dev/null +++ b/src/test/java/item/ItemTest.java @@ -0,0 +1,84 @@ +package item; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +public class ItemTest { + + private Item item; + + @BeforeEach + void setUp() { + // Initialize Item object before each test + item = new Item("Apple", 10, "Kg", "Fruit", 0.50f, 1.00f); + } + + @Test + void testItemCreation() { + assertNotNull(item, "Item should not be null after creation"); + assertEquals("Apple", item.getItemName(), "Check item name"); + assertEquals(10, item.getQuantity(), "Check quantity"); + assertEquals("Kg", item.getUnitOfMeasurement(), "Check unit of measurement"); + assertEquals("Fruit", item.getCategory(), "Check category"); + assertEquals(0.50f, item.getBuyPrice(), "Check buy price"); + assertEquals(1.00f, item.getSellPrice(), "Check sell price"); + assertFalse(item.getIsOOS(), "Item should not be out of stock"); + } + + @Test + void testSetItemName() { + item.setItemName("Banana"); + assertEquals("Banana", item.getItemName(), "Item name should be updated to Banana"); + } + + @Test + void testSetQuantity() { + item.setQuantity(20); + assertEquals(20, item.getQuantity(), "Quantity should be updated to 20"); + assertFalse(item.getIsOOS(), "Item should not be marked out of stock with quantity 20"); + + // Testing out of stock scenario + item.setQuantity(0); + assertEquals(0, item.getQuantity(), "Quantity should be updated to 0"); + assertTrue(item.getIsOOS(), "Item should be marked out of stock"); + } + + @Test + void testSetUnitOfMeasurement() { + item.setUnitOfMeasurement("Boxes"); + assertEquals("Boxes", item.getUnitOfMeasurement(), "Unit of measurement should be updated to Boxes"); + } + + @Test + void testSetCategory() { + item.setCategory("Snacks"); + assertEquals("Snacks", item.getCategory(), "Category should be updated to Snacks"); + } + + @Test + void testSetBuyPrice() { + item.setBuyPrice(0.75f); + assertEquals(0.75f, item.getBuyPrice(), "Buy price should be updated to 0.75"); + } + + @Test + void testSetSellPrice() { + item.setSellPrice(1.50f); + assertEquals(1.50f, item.getSellPrice(), "Sell price should be updated to 1.50"); + } + + @Test + void testMarkUnmarkItem() { + item.mark(); + assertTrue(item.getMarkStatus(), "Item should be marked"); + + item.unmark(); + assertFalse(item.getMarkStatus(), "Item should be unmarked"); + } +} + diff --git a/src/test/java/promotion/PromotionTest.java b/src/test/java/promotion/PromotionTest.java index 64e9e9a3bf..17e72fb4b9 100644 --- a/src/test/java/promotion/PromotionTest.java +++ b/src/test/java/promotion/PromotionTest.java @@ -13,7 +13,7 @@ public class PromotionTest { @Test public void testToString() { - Promotion promotion = new Promotion("Item", 0.1f, 1, Month.JAN, + Promotion promotion = new Promotion("item", 0.1f, 1, Month.JAN, 2022, 10, Month.FEB, 2023, 800, 1600); String expected = "Item have a 10.00% discount\n" + From 90df63ec7bc6b2b584977e4754de1f4f5fa162f2 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Sun, 14 Apr 2024 22:15:30 +0800 Subject: [PATCH 352/421] change to fix test error --- src/test/java/promotion/PromotionTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/promotion/PromotionTest.java b/src/test/java/promotion/PromotionTest.java index 17e72fb4b9..2c4fdf0caa 100644 --- a/src/test/java/promotion/PromotionTest.java +++ b/src/test/java/promotion/PromotionTest.java @@ -16,7 +16,7 @@ public void testToString() { Promotion promotion = new Promotion("item", 0.1f, 1, Month.JAN, 2022, 10, Month.FEB, 2023, 800, 1600); - String expected = "Item have a 10.00% discount\n" + + String expected = "item have a 10.00% discount\n" + "Period: 1 JAN 2022 to 10 FEB 2023\n" + "Time: 0800 to 1600"; assertEquals(expected, promotion.toString()); From e17ec7188cf226c674aa910a0630e0be2f170e52 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 22:19:31 +0800 Subject: [PATCH 353/421] lowstock bug fix --- docs/DeveloperGuide.md | 2 +- .../Images/AddCommand_Sequence_Diagram.png | Bin 48441 -> 0 bytes src/main/java/common/Messages.java | 2 ++ .../java/exceptions/CommandFormatException.java | 3 +++ src/main/java/parser/Parser.java | 3 +++ 5 files changed, 9 insertions(+), 1 deletion(-) delete mode 100644 docs/Diagrams/Images/AddCommand_Sequence_Diagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 07db3c0da1..6cf8d1232c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -40,7 +40,7 @@ list marked items, as well as an `Itemlist` class. The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` -![AddCommand_SequenceDiagram](Diagrams/Images/AddCommand_Sequence_Diagram.png) +![AddCommand_SequenceDiagram](Diagrams/Images/AddCommand_SequenceDiagram.png) The `EditCommand` class extends the `command` class. The `EditCommand` is responsible for editing attributes of an item in the `Itemlist`. This includes changing the diff --git a/docs/Diagrams/Images/AddCommand_Sequence_Diagram.png b/docs/Diagrams/Images/AddCommand_Sequence_Diagram.png deleted file mode 100644 index 3e840854b500fdf54824bbdcca59ba40f6f95f8a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48441 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 Date: Sun, 14 Apr 2024 22:21:41 +0800 Subject: [PATCH 354/421] Fix bestseller bug --- PromotionStorage.txt | 0 StockMasterData.txt | 0 src/main/java/command/BestsellerCommand.java | 5 ++-- src/main/java/item/Transaction.java | 15 ++++-------- src/main/java/itemlist/Cashier.java | 24 ++++++++++++-------- 5 files changed, 22 insertions(+), 22 deletions(-) delete mode 100644 PromotionStorage.txt delete mode 100644 StockMasterData.txt diff --git a/PromotionStorage.txt b/PromotionStorage.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/StockMasterData.txt b/StockMasterData.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index cb9eda02a8..415db12815 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -1,5 +1,6 @@ package command; +import common.Messages; import exceptions.EmptyListException; import item.Item; import itemlist.Cashier; @@ -11,7 +12,7 @@ public class BestsellerCommand extends Command { //@author LowTL @Override public void execute() throws EmptyListException { - Item bs = Cashier.getBestseller(); + String bs = Cashier.getBestseller(); try { if (bs == null) { throw new EmptyListException("Transaction"); @@ -21,6 +22,6 @@ public void execute() throws EmptyListException { return; } TextUi.replyToUser("The current best-selling item is " + - bs.getItemName()); + bs); } } diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 0876640664..9a3e435217 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -9,14 +9,14 @@ public class Transaction { private String dateTime; private float totalPrice; private float profit; - private Item item; + private String item; private int quantity; private float buyPrice; private float sellPrice; public Transaction(String name, int inputQty, float inputBuy, float inputSell) { setDateTime(); - item = Itemlist.getItem(name); + item = name; quantity = inputQty; buyPrice = inputBuy; sellPrice = inputSell; @@ -26,7 +26,7 @@ public Transaction(String name, int inputQty, float inputBuy, float inputSell) { public Transaction(String name, int inputQty, float inputBuy, float inputSell, String storedTime) { dateTime = storedTime; - item = Itemlist.getItem(name); + item = name; quantity = inputQty; buyPrice = inputBuy; sellPrice = inputSell; @@ -35,13 +35,8 @@ public Transaction(String name, int inputQty, float inputBuy, float inputSell, S } public String getItemName() { - return this.item.getItemName(); - } - - public Item getItem() { return this.item; } - public int getQuantity() { return this.quantity; } @@ -71,7 +66,7 @@ public void setDateTime() { @Override public String toString() { - return (this.quantity + this.item.getUnitOfMeasurement() + " " + this.getItemName() + - " Sell: $" + this.sellPrice + "Date: " + this.getDateTime() ); + return (this.quantity + " " + this.getItemName() + + " Sell: $" + this.sellPrice + " Date: " + this.getDateTime() ); } } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index da7b97768d..21fed1ce66 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,7 +1,7 @@ package itemlist; +import common.Messages; import exceptions.EmptyListException; -import item.Item; import item.Transaction; import java.util.ArrayList; @@ -28,7 +28,7 @@ public static ArrayList getTransactions(String itemName) { ArrayList results = new ArrayList<>(); if (!transactions.isEmpty()) { for (Transaction t : transactions) { - if (t.getItem().getItemName().equals(itemName)) { + if (t.getItemName().equals(itemName)) { results.add(t); } } @@ -88,20 +88,24 @@ public static Transaction getTransaction(int index) { } } - public static Item getBestseller() { - Item bestSeller = null; - float[] profits = new float[Itemlist.items.size()]; + public static String getBestseller() { if (transactions.isEmpty()) { return null; } + String bestSeller = transactions.get(0).getItemName(); + ArrayList tempNames = new ArrayList<>(); + float[] profits = new float[transactions.size()]; assert(Itemlist.noOfItems > 0); - bestSeller = Itemlist.getItem(0); for (Transaction t: transactions) { - profits[Itemlist.getIndex(t.getItem())] += t.getProfit(); + if (!tempNames.contains(t.getItemName())) { + tempNames.add(t.getItemName()); + } + profits[tempNames.indexOf(t.getItemName())] += t.getProfit(); } - for (int i = 1; i < Itemlist.items.size(); i++) { - if (profits[i] > profits[Itemlist.getIndex(bestSeller)]) { - bestSeller = Itemlist.getItem(i); + for (int i = 1; i < tempNames.size(); i++) { + if (profits[i] > profits[tempNames.indexOf(bestSeller)]) { + System.out.println(tempNames.get(i)); + bestSeller = tempNames.get(i); } } return bestSeller; From ce958b2c28c24fe3a6555eb81920a2b235b683b5 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Sun, 14 Apr 2024 22:33:00 +0800 Subject: [PATCH 355/421] Update help messages --- src/main/java/command/HelpCommand.java | 36 +-- src/main/java/common/HelpMessages.java | 225 ++++++++++++++++++ src/main/java/common/Messages.java | 223 ----------------- .../exceptions/CommandFormatException.java | 3 +- src/main/java/parser/Parser.java | 3 +- src/test/java/command/HelpCommandTest.java | 4 +- 6 files changed, 249 insertions(+), 245 deletions(-) diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 0c71424043..9d725633e7 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -19,61 +19,61 @@ public HelpCommand(String command){ public void execute() { switch (command) { case "NA": - System.out.println(Messages.HELP); + System.out.println(HelpMessages.HELP); break; case "list_items": - System.out.println(Messages.HELP_LIST_ITEMS); + System.out.println(HelpMessages.HELP_LIST_ITEMS); break; case "add": - System.out.println(Messages.HELP_ADD); + System.out.println(HelpMessages.HELP_ADD); break; case "sell": - System.out.println(Messages.HELP_SELL); + System.out.println(HelpMessages.HELP_SELL); break; case "edit": - System.out.println(Messages.HELP_EDIT); + System.out.println(HelpMessages.HELP_EDIT); break; case "find": - System.out.println(Messages.HELP_FIND); + System.out.println(HelpMessages.HELP_FIND); break; case "mark": - System.out.println(Messages.HELP_MARK); + System.out.println(HelpMessages.HELP_MARK); break; case "unmark": - System.out.println(Messages.HELP_UNMARK); + System.out.println(HelpMessages.HELP_UNMARK); break; case "delete": - System.out.println(Messages.HELP_DEL); + System.out.println(HelpMessages.HELP_DEL); break; case "bestseller": - System.out.println(Messages.HELP_BESTSELLER); + System.out.println(HelpMessages.HELP_BESTSELLER); break; case "total_profit": - System.out.println(Messages.HELP_TOTAL_PROFIT); + System.out.println(HelpMessages.HELP_TOTAL_PROFIT); break; case "total_revenue": - System.out.println(Messages.HELP_TOTAL_REVENUE); + System.out.println(HelpMessages.HELP_TOTAL_REVENUE); break; case "promotion": - System.out.println(Messages.HELP_PROMOTION); + System.out.println(HelpMessages.HELP_PROMOTION); break; case "delete promotion": - System.out.println(Messages.HELP_DEL_PROMO); + System.out.println(HelpMessages.HELP_DEL_PROMO); break; case "list promotion": - System.out.println(Messages.HELP_LIST_PROMO); + System.out.println(HelpMessages.HELP_LIST_PROMO); break; case "low stock": - System.out.println(Messages.HELP_LOW_STOCK); + System.out.println(HelpMessages.HELP_LOW_STOCK); break; case "exit": - System.out.println(Messages.HELP_EXIT); + System.out.println(HelpMessages.HELP_EXIT); break; case "list_transactions": System.out.println(HelpMessages.HELP_LIST_TRANSACTIONS); break; default: - System.out.println(Messages.INVALID_HELP_COMMAND); + System.out.println(HelpMessages.INVALID_HELP_COMMAND); LOGGER.warning("Invalid help command received."); break; } diff --git a/src/main/java/common/HelpMessages.java b/src/main/java/common/HelpMessages.java index 4a136a33d0..3623d6d0fd 100644 --- a/src/main/java/common/HelpMessages.java +++ b/src/main/java/common/HelpMessages.java @@ -1,6 +1,229 @@ package common; public class HelpMessages { + + public static final String HELP = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list items | list_items [marked] [cat/CATEGORY] |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| edit | edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] |\n" + + "| | [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [SELL/NEW_SELL_PRICE] |\n" + + "| | (use AT LEAST 1 of: name/ qty/, uom/, cat/, buy/, sell/) |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| mark | mark ITEM_NAME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| unmark | unmark ITEM_NAME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del ITEM_NAME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| find | 1. find KEYWORD - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| bestseller | bestseller |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_profit |\n" + + "| profit | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_revenue |\n" + + "| revenue | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del_promo ITEM_NAME |\n" + + "| promotion | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list | list_promotions |\n" + + "| promotions | |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| low stock | low_stock /AMOUNT |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| exit | exit |\n" + + "|____________|______________________________________________________________________________|\n" + + "* type help c/COMMAND for more detailed explanations\n" + + " (use the command names on the left column)"; + + public static final String HELP_EXIT = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| exit | exit |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_LOW_STOCK = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| low stock | low_stock /AMOUNT |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_LIST_PROMO = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list | list_promotions |\n" + + "| promotions | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_DEL_PROMO = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del_promo ITEM_NAME |\n" + + "| promotion | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_PROMOTION = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + + "| | to DD MMM YYYY time /from TIME /to TIME |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | promotion milk discount/5 period /from 03 MAR 2024 to 09 MAR 2024 |\n" + + "| | time /from 0000 /to 2359 |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| remarks: | discount is a percentage discount of the original sell price |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_TOTAL_REVENUE = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_revenue |\n" + + "| revenue | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_TOTAL_PROFIT = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| total | total_profit |\n" + + "| profit | |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_BESTSELLER = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| bestseller | bestseller |\n" + + "|____________|______________________________________________________________________________|\n"; + public static final String HELP_FIND = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| find | 1. find KEYWORD - to search the entire Item List |\n" + + "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | find apple |\n" + + "| | find /cat fruit |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_LIST_ITEMS = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| list items | list_items [marked] [cat/CATEGORY] |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_MARK = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| mark | mark ITEM_NAME |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_UNMARK = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| unmark | unmark ITEM_NAME |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_DEL = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| delete | del ITEM_NAME |\n" + + "|____________|______________________________________________________________________________|\n"; + public static final String HELP_EDIT = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| edit | edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] |\n" + + "| | [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [SELL/NEW_SELL_PRICE] |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | edit apple qty/15 /pcs cat/fruit buy/2.50 sell/3.50 |\n" + + "| | edit plastic bag qty/150 |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| remarks: | use AT LEAST 1 of: qty/, uom/, cat/, buy/, sell/ |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_SELL = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | sell apple qty/5 |\n" + + "|____________|______________________________________________________________________________|\n"; + + public static final String HELP_ADD = + " ___________________________________________________________________________________________\n" + + "| STOCKMASTER |\n" + + "|___________________________________________________________________________________________|\n" + + "| Commands | Format |\n" + + "|------------|------------------------------------------------------------------------------|\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| example: | add apple qty/100 /pcs cat/fruit buy/1.50 sell/2.50 |\n" + + "| | add flour qty/15 /kg buy/5.10 sell/7.45 |\n" + + "| |------------------------------------------------------------------------------|\n" + + "| remarks: | category is optional |\n" + + "|____________|______________________________________________________________________________|\n"; + public static final String HELP_LIST_TRANSACTIONS = " ___________________________________________________________________________________________\n" + "| STOCKMASTER |\n" + @@ -11,4 +234,6 @@ public class HelpMessages { "|-------------------|-----------------------------------------------------------------------|\n" + "| example: | list_transaction item/apple |\n" + "|___________________|_______________________________________________________________________|\n"; + + public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 4cb2d93f5b..1bda776130 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -2,227 +2,6 @@ public class Messages { public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; - public static final String HELP = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| list items | list_items [marked] [cat/CATEGORY] |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + - "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| edit | edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] |\n" + - "| | [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [SELL/NEW_SELL_PRICE] |\n" + - "| | (use AT LEAST 1 of: name/ qty/, uom/, cat/, buy/, sell/) |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| mark | mark ITEM_NAME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| unmark | unmark ITEM_NAME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del ITEM_NAME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| find | 1. find KEYWORD - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + - "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| bestseller | bestseller |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| total | total_profit |\n" + - "| profit | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| total | total_revenue |\n" + - "| revenue | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + - "| | to DD MMM YYYY time /from TIME /to TIME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del_promo ITEM_NAME |\n" + - "| promotion | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| list | list_promotions |\n" + - "| promotions | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| low stock | low_stock /AMOUNT |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| exit | exit |\n" + - "|____________|______________________________________________________________________________|\n" + - "* type help c/COMMAND for more detailed explanations\n" + - " (use the command names on the left column)"; - - public static final String HELP_EXIT = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| exit | exit |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_LOW_STOCK = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| low stock | low_stock /AMOUNT |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_LIST_PROMO = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| list | list_promotions |\n" + - "| promotions | |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_DEL_PROMO = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del_promo ITEM_NAME |\n" + - "| promotion | |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_PROMOTION = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + - "| | to DD MMM YYYY time /from TIME /to TIME |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| example: | promotion milk discount/5 period /from 03 MAR 2024 to 09 MAR 2024 |\n" + - "| | time /from 0000 /to 2359 |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| remarks: | discount is a percentage discount of the original sell price |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_TOTAL_REVENUE = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| total | total_revenue |\n" + - "| revenue | |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_TOTAL_PROFIT = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| total | total_profit |\n" + - "| profit | |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_BESTSELLER = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| bestseller | bestseller |\n" + - "|____________|______________________________________________________________________________|\n"; - public static final String HELP_FIND = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| find | 1. find KEYWORD - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + - "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| example: | find apple |\n" + - "| | find /cat fruit |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_LIST_ITEMS = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| list items | list_items [marked] [cat/CATEGORY] |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_MARK = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| mark | mark ITEM_NAME |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_UNMARK = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| unmark | unmark ITEM_NAME |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_DEL = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del ITEM_NAME |\n" + - "|____________|______________________________________________________________________________|\n"; - public static final String HELP_EDIT = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| edit | edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] |\n" + - "| | [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [SELL/NEW_SELL_PRICE] |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| example: | edit apple qty/15 /pcs cat/fruit buy/2.50 sell/3.50 |\n" + - "| | edit plastic bag qty/150 |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| remarks: | use AT LEAST 1 of: qty/, uom/, cat/, buy/, sell/ |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_SELL = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| example: | sell apple qty/5 |\n" + - "|____________|______________________________________________________________________________|\n"; - - public static final String HELP_ADD = - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + - "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| example: | add apple qty/100 /pcs cat/fruit buy/1.50 sell/2.50 |\n" + - "| | add flour qty/15 /kg buy/5.10 sell/7.45 |\n" + - "| |------------------------------------------------------------------------------|\n" + - "| remarks: | category is optional |\n" + - "|____________|______________________________________________________________________________|\n"; public static final String INVALID_HELP_FORMAT = "Invalid command format. Please use format: 'help' or " + "'help c/[COMMAND]'"; @@ -299,8 +78,6 @@ public class Messages { public static final String INVALID_UNITS = "Invalid units of measurement."; - public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; - public static final String QTY_TOO_LARGE = "Quantity is too large. Please input a smaller quantity."; public static final String BUY_TOO_LARGE = "Buy price is too large. Please input a smaller buy price."; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 9a8f24ad25..3d78d32397 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -1,5 +1,6 @@ package exceptions; +import common.HelpMessages; import parser.CommandType; import common.Messages; @@ -75,7 +76,7 @@ public CommandFormatException(String error) { System.out.println(Messages.INVALID_UNITS); break; case "INVALID_COMMAND": - System.out.println(Messages.INVALID_HELP_COMMAND); + System.out.println(HelpMessages.INVALID_HELP_COMMAND); break; case "UNABLE_TO_DELETE": System.out.println(Messages.UNABLE_TO_DELETE); diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index d32cf78494..21d0d80ff0 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -17,6 +17,7 @@ import command.SellCommand; import command.TotalProfitCommand; import command.UnmarkCommand; +import common.HelpMessages; import common.Messages; import exceptions.CommandFormatException; import exceptions.EditException; @@ -47,7 +48,7 @@ public Command parseInput(String userInput){ final Matcher matcher = ParserFormat.BASIC_COMMAND_FORMAT.matcher(userInput.trim()); if (!matcher.matches()) { System.out.println(Messages.INVALID_COMMAND); - System.out.println(Messages.HELP); + System.out.println(HelpMessages.HELP); logger.log(Level.FINE, "Invalid command received."); return new IncorrectCommand(); } diff --git a/src/test/java/command/HelpCommandTest.java b/src/test/java/command/HelpCommandTest.java index 6f706ac237..fa31c0ccff 100644 --- a/src/test/java/command/HelpCommandTest.java +++ b/src/test/java/command/HelpCommandTest.java @@ -1,6 +1,6 @@ package command; -import common.Messages; +import common.HelpMessages; import org.junit.jupiter.api.Test; import java.io.ByteArrayOutputStream; @@ -15,7 +15,7 @@ public void testExecute() { System.setOut(new PrintStream(outputStreamCaptor)); HelpCommand helpCommand = new HelpCommand("NA"); helpCommand.execute(); - String expectedOutput = Messages.HELP + System.lineSeparator(); + String expectedOutput = HelpMessages.HELP + System.lineSeparator(); assertEquals(expectedOutput, outputStreamCaptor.toString()); } } From bf287a12429beccb5a1c7a99ec5a2a395f008fdd Mon Sep 17 00:00:00 2001 From: fxe025 Date: Sun, 14 Apr 2024 23:20:32 +0800 Subject: [PATCH 356/421] Add TransactionLogsTest --- .../java/storage/TransactionLogsTest.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/test/java/storage/TransactionLogsTest.java diff --git a/src/test/java/storage/TransactionLogsTest.java b/src/test/java/storage/TransactionLogsTest.java new file mode 100644 index 0000000000..87e982b883 --- /dev/null +++ b/src/test/java/storage/TransactionLogsTest.java @@ -0,0 +1,44 @@ +package storage; + +import item.Item; +import item.Transaction; +import itemlist.Cashier; +import itemlist.Itemlist; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Scanner; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static storage.Storage.interpretLines; + +public class TransactionLogsTest { + @Test + public void interpretLinesTest() { + String directory = "./testFile.txt"; + File testFile = new File(directory); + String aTransaction = "Date: 2024-04-14 15:25:47\n" + + "Transaction ID: 1\n" + + "Item Name: testItem\n" + + "Quantity: 10\n" + + "Unit Price: 20.0\n" + + "Total Price: 200.0\n" + + "Profit: 100.0"; + try { + TransactionLogs.writeToFile(directory, aTransaction, true); + Scanner scanner = new Scanner(testFile); + TransactionLogs.interpretLines(scanner); + scanner.close(); + } catch (IOException e) { + fail("File not found"); + } catch (NumberFormatException e) { + fail("Incorrect number format"); + } + assert testFile.delete(); + Transaction transactionAdded = Cashier.getTransaction(Cashier.getTransactions().size() - 1); + Cashier.deleteItem(Cashier.getTransactions().size() - 1); + assertEquals(200.0, transactionAdded.getTotalPrice()); + } +} From 974ac07eb093f326e8ad0c1b182e0a2508918b13 Mon Sep 17 00:00:00 2001 From: Shu Date: Sun, 14 Apr 2024 23:33:19 +0800 Subject: [PATCH 357/421] Fix addPromotion Command --- src/main/java/command/AddPromotionCommand.java | 5 ++++- src/main/java/command/EditCommand.java | 7 +++++++ src/main/java/command/FindCommand.java | 11 +++++++---- src/main/java/common/Messages.java | 2 +- src/main/java/parser/Parser.java | 7 +++++++ src/main/java/promotion/Promotion.java | 4 ++++ src/main/java/promotion/Promotionlist.java | 5 ++--- src/test/java/parser/ParserTest.java | 15 +++++++++++++++ 8 files changed, 47 insertions(+), 9 deletions(-) diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index a81e54723a..bfa6d4cb53 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -3,6 +3,8 @@ import exceptions.CommandFormatException; import exceptions.InvalidDateException; +import item.Item; +import itemlist.Itemlist; import promotion.Month; import promotion.Promotion; import promotion.Promotionlist; @@ -21,8 +23,9 @@ public AddPromotionCommand( int endDate, Month endMonth, int endYear, int startTime, int endTime) { + Item item = Itemlist.getItem(itemName); this.promotion = new Promotion( - itemName, discount, + item.getItemName(), discount, startDate, startMonth, startYear, endDate, endMonth, endYear, startTime, endTime); diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 66cd26c4ab..9621454c8a 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -3,6 +3,8 @@ import item.Item; import itemlist.Itemlist; +import promotion.Promotion; +import promotion.Promotionlist; import storage.Storage; public class EditCommand extends Command{ @@ -79,6 +81,11 @@ public void execute() { if (!newItemName.equals("NA")) { // check if itemName was edited ui.TextUi.showEditMessage(itemName, "newItemName", itemName, newItemName); item.setItemName(newItemName); + if (Promotionlist.itemIsOnPromo(itemName)) { + Promotion promotion = Promotionlist.getPromotion(itemName); + assert promotion != null; + promotion.setItemName(newItemName); + } } if (newQuantity != -1) { // check if quantity was edited ui.TextUi.showEditMessage(itemName, "newQuantity", String.valueOf(item.getQuantity()), diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index faab55a4dd..69924763ca 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -37,9 +37,13 @@ public void execute() throws EmptyListException { if (itemInfo.equals("NA")) { itemInfo = "item + qty + uom + cat + buy + sell"; } - ArrayList searchList = filterList(); - TextUi.showList(searchList); - LOGGER.info("Itemlist successfully filtered."); + try { + ArrayList searchList = filterList(); + TextUi.showList(searchList); + LOGGER.info("Itemlist successfully filtered."); + } catch (EmptyListException e) { + LOGGER.warning("EMPTY LIST"); + } } /** @@ -78,5 +82,4 @@ public ArrayList filterList() throws EmptyListException { } return searchList; } - } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3fde0d29b5..b6666d77fb 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -287,7 +287,7 @@ public class Messages { "add a new one."; public static final String INVALID_PROMOTION_FORMAT = "Invalid Command Format. Please use format:\n" + - "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DAY] /to [END_DAY] time /from [START_TIME]" + + "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DATE] /to [END_DATE] time /from [START_TIME]" + " /to [END_TIME]"; public static final String INVALID_LOW_STOCK_FORMAT = "Invalid Command Format. Please use format: " + diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index d6a055e609..309c1085c2 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -326,6 +326,13 @@ private Command prepareFind(String args) throws CommandFormatException{ if (!matcher.matches()) { throw new CommandFormatException(CommandType.FIND); } + /*StringBuilder filters = new StringBuilder(); + for (int i = 1; i <= matcher.groupCount("itemInfo"); i++) { + String segment = matcher.group("info" + i); + if (segment != null) { + filters.append(segment); + } + }*/ String itemInfo = matcher.group("itemInfo") != null ? matcher.group("itemInfo").toLowerCase() : "NA"; return new FindCommand( itemInfo, diff --git a/src/main/java/promotion/Promotion.java b/src/main/java/promotion/Promotion.java index 853ed27435..1940a3726c 100644 --- a/src/main/java/promotion/Promotion.java +++ b/src/main/java/promotion/Promotion.java @@ -84,6 +84,10 @@ public String getItemName() { return itemName; } + public void setItemName(String itemName) { + this.itemName = itemName; + } + @Override public String toString() { return getItemName() + " have a " + String.format("%.2f", (getDiscount() * 100)) + diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 4ce4544500..26d1a5f959 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -131,7 +131,6 @@ public static boolean isPromoExistNow(String itemName) { if (day < promotion.getStartDay()) { return false; } - return true; } if (year == promotion.getEndYear()) { if (month > promotion.getEndMonth().getValue()) { @@ -142,8 +141,8 @@ public static boolean isPromoExistNow(String itemName) { } return true; } - LOGGER.log(Level.WARNING, "Unable to create promotion"); - return true; + LOGGER.log(Level.SEVERE, "Unable to create promotion"); + return false; } diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 8ef0219a7b..722df69612 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -17,6 +17,9 @@ import org.junit.jupiter.api.Test; import promotion.Month; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertInstanceOf; @@ -139,6 +142,18 @@ public void testParsePromotionCommand() { Command command = parser.parseInput(userInput); assertInstanceOf(AddPromotionCommand.class, command); } + + @Test + public void testPrepareAddWithInvalidFormat() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "add itemName"; + parser.parseInput(userInput); + String expectedMessage = "Invalid command format. Please use format: " + "\n" + + "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + + "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } } From 3218d453444411b35caae299d5df438674b65085 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 15 Apr 2024 00:25:03 +0800 Subject: [PATCH 358/421] Remove unused imports --- src/test/java/storage/PromotionStorageTest.java | 8 ++------ src/test/java/storage/TransactionLogsTest.java | 3 --- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/test/java/storage/PromotionStorageTest.java b/src/test/java/storage/PromotionStorageTest.java index 42bf482474..c113164b26 100644 --- a/src/test/java/storage/PromotionStorageTest.java +++ b/src/test/java/storage/PromotionStorageTest.java @@ -1,18 +1,14 @@ package storage; -import item.Transaction; -import itemlist.Cashier; import org.junit.jupiter.api.Test; -import promotion.Promotion; -import promotion.Promotionlist; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; -import java.util.Scanner; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.fail; +import static org.junit.jupiter.api.Assertions.assertNotEquals; public class PromotionStorageTest { @Test diff --git a/src/test/java/storage/TransactionLogsTest.java b/src/test/java/storage/TransactionLogsTest.java index 87e982b883..2624e88d53 100644 --- a/src/test/java/storage/TransactionLogsTest.java +++ b/src/test/java/storage/TransactionLogsTest.java @@ -1,9 +1,7 @@ package storage; -import item.Item; import item.Transaction; import itemlist.Cashier; -import itemlist.Itemlist; import org.junit.jupiter.api.Test; import java.io.File; @@ -12,7 +10,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; -import static storage.Storage.interpretLines; public class TransactionLogsTest { @Test From b664cab61c695077798f8cfd502a8aec4715d891 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 00:49:51 +0800 Subject: [PATCH 359/421] ParserTest improved --- StockMasterData.txt | 2 - src/main/java/common/Messages.java | 8 +- src/main/java/parser/Parser.java | 6 + src/test/java/parser/ParserTest.java | 445 +++++++++++++++++++++------ 4 files changed, 368 insertions(+), 93 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 0b8ea9f22e..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +0,0 @@ -1. | [ ] | testing item 11 | Qty: 2347634 t | Cat: t | BuyPrice: $12.00 | SellPrice: $23.00 -2. | [ ] | testingitem2 | Qty: 321 t | Cat: t | BuyPrice: $123.00 | SellPrice: $321.00 diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 1bda776130..c81807b5da 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -45,11 +45,11 @@ public class Messages { public static final String INVALID_DISCOUNT = "Invalid Discount has been entered. " + "Please ensure it falls within the " + "range of 0 to 100"; - public static final String INVALID_MARK_FORMAT = "Invalid Command Format. Please use format : " + - "mark [ITEM_NAME]"; + public static final String INVALID_MARK_FORMAT = "Invalid command format. Please use format: " + + "'mark [ITEM_NAME]'"; - public static final String INVALID_UNMARK_FORMAT = "Invalid Command Format. Please use format : " + - "unmark [ITEM_NAME]"; + public static final String INVALID_UNMARK_FORMAT = "Invalid command format. Please use format: " + + "'unmark [ITEM_NAME]'"; public static final String INVALID_LIST_FORMAT = "Invalid Command Format. Please use format:\n" + "1. 'list' to list all items in the inventory, \n" + diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 21d0d80ff0..6ded4e3897 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -399,6 +399,9 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce if (matcher.group("newBuyPrice") != null && newBuyPrice < 0) { throw new EditException("BUY_PRICE"); } + if (newBuyPrice >= Integer.MAX_VALUE){ + throw new CommandFormatException("BUY_TOO_LARGE"); + } } catch (NumberFormatException e) { throw new CommandFormatException("BUY_TOO_LARGE"); } @@ -411,6 +414,9 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce if (matcher.group("newSellPrice") != null && newSellPrice < 0) { throw new EditException("SELL_PRICE"); } + if (newSellPrice >= Integer.MAX_VALUE){ + throw new CommandFormatException("SELL_TOO_LARGE"); + } } catch (NumberFormatException e) { throw new CommandFormatException("SELL_TOO_LARGE"); } diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 2edbdefa4c..17d8172f29 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -17,13 +17,21 @@ import command.SellCommand; import command.TotalProfitCommand; import command.UnmarkCommand; +import common.HelpMessages; +import common.Messages; import exceptions.CommandFormatException; import exceptions.EditException; import exceptions.EmptyListException; import exceptions.InvalidDateException; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import promotion.Month; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; import java.io.ByteArrayOutputStream; import java.io.PrintStream; @@ -39,63 +47,24 @@ public void setUp() { parser = new Parser(); } + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } + @Test public void testParseCommandWithBlankText() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); String userInput = " "; parser.parseInput(userInput); - String expectedMessage = - "Invalid command detected. Type 'help' for list of valid commands" + System.lineSeparator() + - " ___________________________________________________________________________________________\n" + - "| STOCKMASTER |\n" + - "|___________________________________________________________________________________________|\n" + - "| Commands | Format |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| list items | list_items |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + - "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| edit | edit ITEM_NAME name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] |\n" + - "| | cat/[NEW_CATEGORY] buy/[NEW_BUY_PRICE] SELL/[NEW_SELL_PRICE] |\n" + - "| | (use AT LEAST 1 of: name/ qty/, uom/, cat/, buy/, sell/) |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| mark | mark ITEM_NAME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| unmark | unmark ITEM_NAME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del ITEM_NAME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| find | 1. find KEYWORD - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + - "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| bestseller | bestseller |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| total | total_profit |\n" + - "| profit | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| total | total_revenue |\n" + - "| revenue | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| promotion | promotion ITEM_NAME discount/DISCOUNT period /from DD MMM YYYY |\n" + - "| | to DD MMM YYYY time /from TIME /to TIME |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| delete | del_promo ITEM_NAME |\n" + - "| promotion | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| list | list_promotions |\n" + - "| promotions | |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| low stock | low_stock /AMOUNT |\n" + - "|------------|------------------------------------------------------------------------------|\n" + - "| exit | exit |\n" + - "|____________|______________________________________________________________________________|\n" + - "* type help c/COMMAND for more detailed explanations\n" + - " (use the command names on the left column)" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_COMMAND + System.lineSeparator() + + HelpMessages.HELP + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @Test @@ -104,9 +73,7 @@ public void testParseAddCommandWithBlankText() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add"; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_ADD_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -126,9 +93,7 @@ public void testParseAddCommandWithBlankItemName() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add "; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_ADD_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -138,9 +103,7 @@ public void testParseAddCommandWithInvalidQuantity() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/a /pc cat/test buy/1 sell/2"; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_ADD_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -150,7 +113,7 @@ public void testParseAddCommandWithLargeQuantity() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/9999999999999999999 /pc cat/test buy/1 sell/2"; parser.parseInput(userInput); - String expectedMessage = "Quantity is too large. Please input a smaller quantity." + System.lineSeparator(); + String expectedMessage = Messages.QTY_TOO_LARGE + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -160,9 +123,7 @@ public void testParseAddCommandWithBlankCategory() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/1 /pc cat/ buy/1 sell/2"; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_ADD_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -172,7 +133,7 @@ public void testParseAddCommandWithLargeBuy() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/1 /pc cat/test buy/999999999999999999999999999 sell/2"; parser.parseInput(userInput); - String expectedMessage = "Buy price is too large. Please input a smaller buy price." + System.lineSeparator(); + String expectedMessage = Messages.BUY_TOO_LARGE + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -182,9 +143,7 @@ public void testParseAddCommandWithNegativeBuy() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/1 /pc cat/test buy/-1 sell/2"; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_ADD_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -194,7 +153,7 @@ public void testParseAddCommandWithLargeSell() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/99999999999999999999999999"; parser.parseInput(userInput); - String expectedMessage = "Sell price is too large. Please input a smaller sell price." + System.lineSeparator(); + String expectedMessage = Messages.SELL_TOO_LARGE + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -204,9 +163,7 @@ public void testParseAddCommandWithNegativeSell() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "add itemname qty/1 /pc cat/test buy/1 sell/-2"; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_ADD_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -226,8 +183,7 @@ public void testParseHelpCommandWithBlankCommand() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "help c/ "; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: 'help' or " + - "'help c/[COMMAND]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_HELP_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -241,13 +197,23 @@ public void testParseHelpCommandWithInvalidCommand() { assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseHelpCommandWithValidCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "help c/add"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseDeleteCommandWithBlankItemName() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "del "; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: 'del [ITEM_NAME]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_DELETE_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -261,14 +227,23 @@ public void testParseDeleteCommandWithItemThatDoesNotExist() { assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseDeleteCommandWithValidItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "del validItemName"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseSellCommandWithBlankItemName() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "sell "; parser.parseInput(userInput); - String expectedMessage = "Invalid command format. Please use format: " + - "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_SELL_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -282,27 +257,323 @@ public void testParseSellCommandWithItemThatDoesNotExist() { assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseSellCommandWithValidItemNameAndInvalidQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "sell validItemName qty/a"; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_SELL_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseSellCommandWithValidItemNameAndLargeQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "sell validItemName qty/9999999999999999999"; + parser.parseInput(userInput); + String expectedMessage = Messages.QTY_TOO_LARGE + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + @Test public void testParseEditCommandWithBlankItemName() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "edit "; parser.parseInput(userInput); - String expectedMessage = "Invalid edit command format. Please use format: " + - "'edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] " + - "buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'\n" + "You can edit at least 1 parameter up to all available" + - " parameters. For example, if you only wish to update buy and sell price, you can input:\n" + - "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_EDIT_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithValidItemNameAndValidQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName qty/10"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithNegativeQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName qty/-1"; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_EDIT_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithLargeQuantity() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName qty/99999999999999999"; + parser.parseInput(userInput); + String expectedMessage = Messages.QTY_TOO_LARGE + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithValidUOM() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName uom/kg"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithInvalidUOM() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName uom/1"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithBlankCat() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName cat/ "; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_EDIT_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithInvalidCat() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName cat/1"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithNegativeBuy() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName buy/-1"; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_EDIT_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithLargeBuy() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName buy/99999999999999999"; + parser.parseInput(userInput); + String expectedMessage = Messages.BUY_TOO_LARGE + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithNegativeSell() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName sell/-1"; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_EDIT_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseEditCommandWithLargeSell() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "edit validItemName sell/99999999999999999"; + parser.parseInput(userInput); + String expectedMessage = Messages.SELL_TOO_LARGE + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseFindCommandWithBlankInfo() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "find "; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_FIND_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseFindCommandWithBlankKeyword() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "find /info "; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_FIND_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParsePromotionCommandWithInvalidDiscount() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "promotion apple discount/invalid period /from 2 Apr 2024 /to " + + "3 Apr 2024 time /from 0000 /to 2359"; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_PROMOTION_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParsePromotionCommandWithInvalidPeriodFormat() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "promotion apple discount/10 period /invalidformat"; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_PROMOTION_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseMarkCommandWithValidItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "mark validItemName"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseMarkCommandWithBlankItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "mark "; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_MARK_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseMarkCommandWithInvalidItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "mark invalidItemName"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseUnmarkCommandWithValidItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "unmark validItemName"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseUnmarkCommandWithBlankItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "unmark "; + parser.parseInput(userInput); + String expectedMessage = Messages.INVALID_UNMARK_FORMAT + System.lineSeparator(); + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseUnmarkCommandWithInvalidItemName() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "unmark invalidItemName"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseListItemsCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "list_items"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseListPromotionsCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "list_promotions"; + parser.parseInput(userInput); + String expectedMessage = ""; assertEquals(expectedMessage, outputStreamCaptor.toString()); } + @Test + public void testParseListTransactionsCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "list_transactions"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseTotalProfitCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "total_profit"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseTotalRevenueCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "total_revenue"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseBestsellerCommand() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "bestseller"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } + + @Test + public void testParseLowStockCommandWithValidAmount() { + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + String userInput = "low_stock /10"; + parser.parseInput(userInput); + String expectedMessage = ""; + assertEquals(expectedMessage, outputStreamCaptor.toString()); + } @Test public void testParseLowStockCommandWithBlankAmount() { ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "low_stock /"; parser.parseInput(userInput); - String expectedMessage = "Invalid Command Format. Please use format: low_stock /AMOUNT" + System.lineSeparator(); + String expectedMessage = Messages.INVALID_LOW_STOCK_FORMAT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -312,7 +583,7 @@ public void testParseLowStockCommandWithLargeAmount() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "low_stock /99999999999999999999"; parser.parseInput(userInput); - String expectedMessage = "Please input a valid amount." + System.lineSeparator(); + String expectedMessage = Messages.INVALID_LOW_STOCK_AMOUNT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -322,7 +593,7 @@ public void testParseLowStockCommandWithNegativeAmount() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "low_stock /-1"; parser.parseInput(userInput); - String expectedMessage = ""; + String expectedMessage = Messages.NEGATIVE_LOW_STOCK_AMOUNT + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -490,14 +761,14 @@ public void testParseIncorrectCommand() { } @Test - public void testParseTotalProfitCommand() { + public void testParseTotalProfitCommand2() { String userInput = "total_profit"; Command command = parser.parseInput(userInput); assertInstanceOf(TotalProfitCommand.class, command); } @Test - public void testParseBestsellerCommand() { + public void testParseBestsellerCommand2() { String userInput = "bestseller"; Command command = parser.parseInput(userInput); assertInstanceOf(BestsellerCommand.class, command); From 5c4d8e9de94e13d4571348259c4db9a66fef75b5 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 00:54:11 +0800 Subject: [PATCH 360/421] Checkstyle edit --- src/main/java/command/DeletePromotionCommand.java | 6 +++--- src/main/java/command/HelpCommand.java | 1 - src/test/java/parser/ParserTest.java | 14 +++++++------- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/main/java/command/DeletePromotionCommand.java b/src/main/java/command/DeletePromotionCommand.java index db636f8302..c7137da2bb 100644 --- a/src/main/java/command/DeletePromotionCommand.java +++ b/src/main/java/command/DeletePromotionCommand.java @@ -11,12 +11,12 @@ public class DeletePromotionCommand extends Command { protected String itemName; - public String getItemName() { - return itemName; - } public DeletePromotionCommand(String itemName) { this.itemName = itemName; } + public String getItemName() { + return itemName; + } /** * Deletes a promotion from the promotion list diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index 9d725633e7..e70df9e058 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -1,7 +1,6 @@ package command; import common.HelpMessages; -import common.Messages; public class HelpCommand extends Command{ diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index 17d8172f29..25b67d134f 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -9,7 +9,6 @@ import command.EditCommand; import command.ExitCommand; import command.FindCommand; -import command.HelpCommand; import command.IncorrectCommand; import command.ListCommand; import command.LowStockCommand; @@ -20,7 +19,6 @@ import common.HelpMessages; import common.Messages; import exceptions.CommandFormatException; -import exceptions.EditException; import exceptions.EmptyListException; import exceptions.InvalidDateException; import itemlist.Itemlist; @@ -36,7 +34,9 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertInstanceOf; +import static org.junit.jupiter.api.Assertions.assertTrue; public class ParserTest { @@ -725,12 +725,12 @@ public void testParsePromotionCommand() { public void testPrepareDeleteCommand() { Command addCommand = new AddCommand("lemon", 5, "fruits", "NA", 1, 1); - Command DelCommand1 = new DeleteCommand("lemon"); - Command DelCommand2 = new DeleteCommand(" "); + Command delCommand1 = new DeleteCommand("lemon"); + Command delCommand2 = new DeleteCommand(" "); try { addCommand.execute(); - DelCommand1.execute(); - DelCommand2.execute(); + delCommand1.execute(); + delCommand2.execute(); } catch (CommandFormatException | InvalidDateException | EmptyListException e) { throw new RuntimeException(e); } From f89d17034b4a21712e19b7809b14176862d8f6d8 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 15 Apr 2024 01:11:09 +0800 Subject: [PATCH 361/421] Update DG diagram, UG introductions --- .../Images/Storage/Storage_ClassDiagram.png | Bin 38033 -> 32635 bytes .../Storage/Storage_sequenceDiagram.png | Bin 23852 -> 21376 bytes .../Storage/Storage_ClassDiagram.puml | 1 + .../Storage/Storage_sequenceDiagram.puml | 1 + docs/UserGuide.md | 5 +++-- docs/team/fxe025.md | 3 ++- 6 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/Diagrams/Images/Storage/Storage_ClassDiagram.png b/docs/Diagrams/Images/Storage/Storage_ClassDiagram.png index c28e94b15618a4d26b3c4cf5e7432a8ed9018e30..882e1dd604e370bcdc5f938d30a6619d329cc684 100644 GIT binary patch literal 32635 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 bkUNdS9qzIP=cNLCNFyz&a60wWr5pbTt@8Bc literal 38033 zcma&O2UJv9ur-Y12%~_EGJ*s_MLCJ*UpDUAuPm3l$|<@>8^@h=_>DD|n3-OD;BoPxi;IJ^Fc+7D zjj^4JtE~;EiM_2`dov>u(Xnrq8agh2f1l_WypMZ)Ld3Ar#Em}#R&amSlHHO@(|CC9 z(jB(HRMj#c{v7*q+pMXOeV8qI)Cbvci6ldky-_-~72o#Bk430Bm_~at%rs0_enyF| z?00OmO7#}`4RHZsM$(htdB^N@PoGqi$($M^slRD7d-l)MPH~+n+>0FN`VtIGew2LP zq-_n7GG)gmY4~3!Q;#xJdKfvMhFg=2`Kz)_CPQ0A#73z8!w`v|@h#^M>38J{<};M= z0Vk`xj$g@k)fRn55vjzShV9LyqfxA0iZ5|cx!<^ZcScCPx;;R<@f3+F5yI)Go4RwT zlOR7?z_6mxqo*HRY)@iZgmBtQ|&CAoamLvau@8-d6we%=ykFzSK zsfGC-w{4Zijw$XXOVD36Wg{YbL?m}dO2d6P8_zbl^F`h;)1bfTv%c2Vt8AHfKi_-#AneR@_ZHG-Fo-&Pm%>4CWct)i#y6D=3hi7<;umRudN!)A*W%a8E-~ zt_ywN&)K;Zoohtc%6fZ?$}$jc`6BZ1$O*VvxM=c8XYFNHMvj*{Jm%v%<;HfL{)hn2 z%Dof8UcAEN#iU8ykL`Ra7nZq@A>I+V^@Rd)UdPt^+kW z=2z8?$V*gM?_{27DBB^5K6dQWu_QmGF&0?hMg$Qp6EZS7x(=(iBiaAh{>pVUe(EPJ zeyMWvXHE_^2Dx0vVn;4E7nNA`awS5PQM^BbW0|kh(&V#@01fO7EJA1U2y=?H+HC4~ zN}uiyGn$1bIe52tZ@+8VSBQ52b^L#+NG?-p$Fr~%hvUS{;r=z2JylAOiCa__BVZw z=!1LwCd)%*)_cj9K6u(VT2RmI@9zf`_~wjM44sP^IY9(bXDdut5U*FOuf`ZmI!{o< z^UkGMk)?aMVlLz5j`6z*o0yo0AeRjmP?UE+a89@gBCh zrKQ`?dSklH&CM-A*mb_Y03CcmWOFaQVN9>mY3j=hN`B#r7cX9HZEdYf?N(WKv*3bP z8c=iz2?-n=93-ddW8&hfY=;HjR8~ji@Au|tFYpb14Wd5&+i$tKxgT5?rdL*sG&E9u zy|jTKc*Fwa$270p8?MEt%o3R4g%dyc63;sH>wIfoRJIJvvmfv62rKQg zRRn|xt$I|JSQX%LT3$H9rn7wc`vP|wd%Vj{-90zb@53ffSd@8Y={u4njIaqje^OI# zcgb_%wgXK`PH!#^Z_j>z_x0=7^>Tm+E40Q0N1C5aE)zVqor#I_WaI1Ma{Cq|nyAFW zA^E8G&E1U|vqVyAPVdRrvNEsEr_|C5+8HFUgnw;pZ|CITz^#2_oN0>_v}mWtOeiTS zt@rZaO0E0T72cdZdsc0M5QMag%YC6740XIxecvNS(h9K+`MfrH|A~u1kpb({SS zwiNltARa?^&o2adxw|)h!6KZeG~&ACqc}@>t~=jwXY*MWR!m>%%hT_g)0XhvTGYkl zt<>%wY0PZ?Z-6GYQnXpwP~Z&D`PcP2UR@RO?nL1x$5@c zCjCif*k@VvnpLlIA_wLj)pdzgrMtVPT9DHJZlb@fT9>3D1 zgTqecM^*hBz}o0qpW^nFf^AI;{UUWyQL)Xv=!tJ3f;ab44j#yQHZ@?=Y3(hIytHb# zIK_U@?rk<0#@>8WUcUWSI_MNBX$yQcH}fqwS~L^(WWKvx`F7b339H*2diE9*(lXZ< z2fI@FpIsrpFwHsGG=QKo=gOYqB%m*`;wiP6E!;L5xzM)+2?ZN%*>rxY{dY`N`;BYY z?oAkyGB7aA@A6IgWBU{N9~f23M{`1;HLn($d{dYUikoo_@DDs~*GPpfvbJ_`c+XbZ z60txg;f-~X(4LyjR%z6BgT3pe<><847RSdQa5)?7bTGlAOpZD&j#Rw+D+YW@cva`x_n4o;`c>=1o_d zCYN=@3yegjU%@k(#h?WjVcn{(uCDG3^!K@j1+xV8WfKT=WRf#kafXv{%Nep_ zH8Wj-LxLJNcA|Ybtyk6UXpvHnJf=AdnOp;Bx(!`N#{)U(FYuWDp&x&g1TvME&pHDe z;o>o41j9aF(1-S!j6|ew(HE>k)iE!p`Kw>N!p{ zwCy^_u+2#FY;2!UJQ)l5z{5ibH%Ap)Wf~N+Mn{MJ%%@(qlOivhp%m9l#riAjM^r@w z@5Bo^d&}%yS^DnzM18;g_if{42+lOpvA53AMPGqWEiLgn-8O$x*ygi3|J}B#46x+= z-y!gbr&j#7XWP$Nze}XqYXyw*neDvv;d|ai zWS0JZ)+J>WMf{(Yj#E`aE4Z20%`+6~IOPU?I;{}QhDlKP;aU=*;;SO|MwdpbkYm*z zaD2+j%EY|3TpS$Ei+k_n6x4cd&Z;VTmK2SA{rh=hFCkO%rZ|uG0=C16x-#f!b^pV~ z9*syZ|MrWtq*gA}Y>x#=Z46dATTsq$mbq`(+5L)(uOnY~N!pQ*HxBb8kPUb*cqM^& zhE@UNIeH7p<;%#|RYz>(|JUzqG$TaYUd$jL&m8RmgU#~z{_&ZrkGq_QJooS_mydqd zh&a4&0w1|}cokr~1TOqPe}_X?Ln9(7DTznayfsEMN9%Rfz{uafm_tP&wi)_DJt`tX zM_=FQgNvMp$HD$C;A})xRM>xi(NTDOxXhML!ngV$hTEheH9h^`A4`%pA^;=&iOJ_j zDvJ{mMqi#|2O1zRFYhWmnywhvV<})iwm3bV9`BGTUUQI3Ou=AdY`iuZt_<0vs=;%( zIVSKx(1i5eD~eO6?#ao0Pil(d(7$!-RwKgZ*K#KhI`xmSXUJsK_H8fGOpN($OqP;1 zu!#8X?|giGe5$~uh|8!}6t+Aw^C}G<({D69Ffche*|;jp=yPRs+`2#CQh{r0aj?7C zq62t@ez{$O2$J*SMae2ALmUU{&G68WVWpF_-#Enf;P7yG)n@q)qucc|pS{5~%NCTa zqk!PAn0Q#pjvIfG=&1gL=d+R6`gBafMqWQL-NN&|ogMG>Cf50u&!2ArP?_m?{_LWT zwkzEHtehl{Sl9%z0xQBhHP2&m!4dUFUr&#Azd9o|^^Qzf)q%6|*bJk1nYjCB60RmH zidLQd0c~6WR~&qn;jZw`PRL_6N9p;WxK4Ha6}&6CFLtshL!sF>k*%L-FO6vVQyY zFN)7_e|i4Bm4Sv`$q*?;NAUZ>8>J0wY5sdl zWjWqcR_=KE^eHWRsNCKtN!+JBQEWIzy8ySh-7j1NnU{poTg7MpU5Ge#6p7B_>WCM5 zw^f%G?FZRTor>k^)vH26gFj?Q!&#MCkZd*r3g6M=>PRlS1T5{}3+Dc)a$$+r%kx{{ zJz3Ffg2GoedKng2mMZrhQR)oh-UH3e_plX$b|X6ndn;)hVosBHY4B6gM&eroCY6-TrEwl+3f%cEX`S9T2g_{mPAh8XRGL_kl3fqm`#4&GgY^blK$S!+s>_i#Tv9Rllx@_NyBUj%x z6#Dv~#MLYGsS9=mbl~8^kf?p$o0Ih_&7XCO<{{lbHpOc&=2W{j8w7NkGo2|9H zjha?dQ!9G#^=10Vc!UQpc4s0)U0q%1S7m+q!Y8wqsM69|O+!OFanfSj;WA*;e1lYI zIK;371An$%mXN?hMU$JIJ>GcyurA~F%+oDq5fE_m8D8zvx38?IXf$%xiGiZffKUyT zyE{3p&-doU`HV6@COd!Q{?bsXZR&UvClw>3k*;nN_hHH2$?`NX(AoZY83+mhmF|yT zzI+*fxf3KL7G`FurwN5BQHk%lbLZOI+oh$Y|B_a3 zZfaV?V5SV`53f;jZf$Mt=g*%Jx5HmoFsI1BrIrTOqmooo-w}V{lc1!nq9UovhXPpp z@#B6o{0Iu)GG_R?e*Klx!`~t!BbS$#cXxOHI&t_kwwz=Ym6eD}r)O_3j{im|&L5FH z3qr?AN=rXe%3!~KJ@qOP;a(pGfl^XkT@CWd)t4lJ`Z0$JOK0B_y3X(O(~}YP$JMm7 zrWY5zH>MR|!a~7S1yFl&5;xDBIRo`Y#POr6C9I1YHK%-s#}g6}(bmvV`RnkZe&Cg2 zZv6c5$v@)ugx>r6Qr_O8Q=r!X$R2QTadot`SyIAx^uR>>+P=QE(b3d17PKd3D2^R2cH6IA2@KfS*qGRMI@&Sf z{VQ3jrWO{?es>894$*xL9UUDfC!Q%4dreIUHA7H-el1ldO-Q^|@~c;`{#jU}hbJj0 zX0p^V>bkmF-E*f-ow^E|DZESaGj&5uR7}iGzXR`Ix75RV`SN99;aI0kO1bPXZRS$7 zqeoA613e%(ICwq!?Tv&hy%6JsAb_LuQR8*pTY3cz0|N!M6NgXh%5>&dM)zp7NBG+t zCj^;}9exvYN$S@4?^7x{3;hMotY;4|ufjNT_46Hocs4e+Un`$Uq2$qfO+o@aI$HDZ z`e8o#Ke9geYYh)~^buBGPVOWr={tI>i16@Ajsru{g zQviT&-M(!tZYRE}g5r|E&N2xK3d+m396L^IYHE6w3BTLnmv2}z1mWD=JYPAJSmlSW zZTK?H#m>%t^JdJijYK79X9G!Kht1v`fil0qXKxEP!HBmaAJ2%ywsV0M{U6s9KzybXgkWH>)Tq z>FMj!GI_wOjkB<~E&KcTRg^pugq$0`jJU3ie@#xlXl=c~n&iC>;MRN>9wTtG#2#&E z^1xY3RW${+n3R<5Xp1{zoSd9sDad8?baeJ{D}LGm^7rnM6@9Baz!WSlE+&e3UE|u@ zUh$h~AUD|%j2VdU-O(v7)BUw>uQls@(9h2>y?yr%Fd8(BzyAC)IRN$X<452egeMQ( z@66HWGBbVfV4Sx@bOUhhuK4bF5SOVZ>P4HDuI`(6?@SyW3qS1$==^%iHBE^rOs}?) zho`68T$kC$N5?EJEv*J113k*g$w^B~i;Eln#^{&(YJWxoUkOqRD=X_8-`UQTz|$AH zVg_ua@7%c~BcsKLCJs70z(k^d9y@kSS6A284HNV?i`N?aXAux z2m4>X+{p&CApqq2C;tA!(`*G$rUM@7>dIX>I;|9a&q%39Mn{M5@Bcwgt|%}64z5E$ zob*4bsG`Ecy3(~OQAYRS3UKga_2{a{+xz9u_v#*nDq1`=IsV z(W^;vmPS--{*Ipz6da$!*SovBdwYB57`2s@lyr8g2nZhD-9utPRR9sdvU3F{W@c%* zCQ?$z;^+>6moKEzsC4|Cf`UT4gr7Ja?a?>megXLKwf_9KZ$A$XR%T{CCnrC;jJk`< zW|3Ko-c+`hTqx+hs6l2yYL+S`h(Qe)Ths$mB#kIc74tNp!g7+iFmtW6P+WIl2(?NIjz5# z9|6NOGl*q;d?n{{?>aa*XlYT=K}bLziAl)LzQ)B>0MANQLj_DmTwJ_}(?;d+0{4T9 zii%*T^f#~VV6oGalkeFM@BGml*wpMqeK?N#Dt2Ul{Bd98=+eb3kZqz5VtRTsiV=D^ zk+0>!3s;UFHtxsF4082{6lN+{x46|!wLeck<210@n2onbuie)+G)#<+j&`z!xFaCO~JcriYxoe0Xjtq+jMoAZw(hrtYtW_(hDEB?{&=HaF7>*u?nz*RvN?pQWM6`tlWk zxk=A~-Q#HO(u3)Ry2|a*!0jl`-}v#2+VH%n`|64xevdWL{T5z;ZkmaWZ7wS#aUNY) zS5t$VZj1XCe1ZLpDiyFA33K(MRoNh5jxP=?_lQQoW&q?3FU&l1J%F}(MJ6Q8qNhdf z0s;bO&rB7-olLbv4?aK23?q;O)E_7SRrWma%hAf?sh@&)J%HM$_ZdBp>0Mo2nm9Nz z1SUZSsn(?7)h+;3!JXJj=b6}_w}?qdL~h<}92Z;rLizad<7tm>>BFZYdIuYS#ZE{_ zNbddG#s+UaGhl19S#fD8;)4s@Ftk+&@2J7e%?;>$LD(gehBNL;zPJz8X7od3+wX+) zAQ_GYm8ieKsE!I{(eR1}bY1g``)5B)wDm0?oUay@l_-}}@{U>pQ!smy7I z!$HlVFWT8Vg?c)*S0`#PQ3ve^Z&%FQW5-FZT)Cq1fKXHe6KF)Zk|I8-vxX$j#`$u# z=*+6&mq7gNXAI!d{qWR@32JvhKmtit$L&r@gq)Xvpqvx3) zy5em6r&jKm`4+BVzD!Xeu4kjo>!oMZ7TTsV6yvDq>G!`<8%0D$`an7Y6`WDn_APmn96voTRp zQZ6kmiMY;R@e{NiN|h+AE-5Uu?9WfAu6AF0ASwAMGE%eLZgd}qgGANChF_1a1A$(9 zx)TENf{5F!Y*lM(tCT;n>+;B8d%NA&m*=LYrZfoQd>96pkK}9TV_mKeUR1=)Vq(Ic zg`H-#M&DQdtKGpJ0HYE7v%eTM% z6Tc+w?PK}a3;e=j(2_*ZBrSb!M}!Sl%LexxynOYF3@A!+ax!M2e`b0b0H|MQd3|*? z^aaKwCL<$5cnS`=RXjdVzx+xHTYY^XMMrb98aiws-S=5YNC!ag+geQ>o!K8hBu~IW zf&k^{g1*DV_;}yDtS=1>_qf7e$}VS@!#!&$tEbQ8UtmQeU0w4q`gS7~h0wf&ZE5-f zWj?ENVlFq*b!7|}$mpwL)cpRHYR3LtMp92X@L<>pug%$%>lVN*dW2?;y01E`)ZHpF z3N$LUN7sVZk4?I@(2n3!csSQ)r>WTsHR@yzn;%~RzjYr-i~%ENR7wfLkzrxC1k+yl z?EDM_lzWSPT{WMfj273O+3w#HuICtJ1Agv`m6;QR+U?_)5g^i<6A@!$V?k6L*REf` z4wV)=yE>Y`5dlJo8E8yEB8$Eb>n*=Ez9nz(1_U&kLq94mPQK~gpj;f?g$oF%otCY9 zp}Oj6G)RfN33zM;l07q0*R9lhX-TlFV<~@4e0|;iQ&IH0 zckfE;9sqNLRAJ=1n?|3@1y=+O!lZ$0ibF)C3c_%t3aRYzCNXiW3TcnYKhKlvXGD(k zn0NUwFfj0sRBz;??Rg9K5+ENc#C2`BPiO|(n3+Y!$9qpSpjPVezR)jWvfeYJ)%#TV zEZ`)EPk-|1`h9kZ%An~y+ZQ1r8N^{#^OvlZ`!d&Rdyhxrb3f`O#a+h-e4uE9-rvDX zN>(L>SiUC6$6Z}TMs>bH)Lc>3sl*&FWFUj6bgSOF^`xf82UaQvEoPpyg z<~Zni%+*2bd>}(P38F#h=1rTiYTa~Ibl7!P-5lV_p!PEITlK(U%!GXMu{91c#1mSj zk~FP|wP4rIBa8oQ_UGKst%$hoyDOn=m!Lu_z*Od3M1I#2y9m8dN7qAP-ZNdV=qE<1 z-UZ<|Tv{w`A&bC2N4_Ov(Wzwf9I0@eu66_F1QnW%nG-cRrJmz*m@u?VF7UB6)-Rx4 z-JfnhZ@LtoReup#Iy&My{^caPu+~5DgIM{_GyW{=a?^~|cz3QjmG$|hLau5aWT;&y zU`mDe8_;!ixAzrPVqI-S{GF>(pH9#vEq^Jf`=j)D(cD@lNbJC7$L^v75h;o>2ezEB4 zFzX!(AKrER(D5)SO+H#Jr3o>a&!VNKw%$6xozkJqKb6}Ld5!q#@9ptI>TV7%gGZ$6 ze~%qyv1>^^t?cL4FhC@sKEE0qzCy80Q)oJOR)D4vktd3*`K$K6!VjJ90;A?uv|uyx zFFf~c5YzePH)Hv|`c@^#3f9UE@imV7!I;~lf%gO>I$?EF$h(t_4xGhkS%ezYXzsIA zvU?lvRLJ@9)tp|zdatZXyc&3Kd|aP=GG8mMs%Xn%E@0NwzMwlqW(;o{9TX)0&LB8< zY`pb{(!)IePxlDIJ?a5;f9#YiQ3iTPUG@|$7 z>FMdAHZb(TXb$S$Y?B6H?4qWl8-@&`7b1{8$%%PP&QlKwxn^s~dY+Oxw$Rbiy)N9m z{LC;yE`wrsr^d;7c1%(Rzn&gsHw(~%va+)3_SfZ2%+7W%P+*cqo?!*; zy-qJc~T%Z8o^qRKU@Gfap}OPhl9iPAig^`&e2Uw$!<|E6u< zs+DgbYixNgg-=AtGt=jZ0KQn~y|o?FuwqH4?>G`Ox`_ugOo)?1z`S9Hjn5bsK~8m8}eItuDs zLviu_HS`d{#UioTn6twZm8`nFA{0$OUla1(KXn{*Gy1OMb+_K?^R9k@A>ACNr!t^y_=3SF=rHNy&6{iZkZfR_MUsiVd)G0j>oqK+Or7YWi_ozRF z70LGZ_b(hFu#gEqHGrX+YGh3<-J1(=;C=1P0pZ^`2W3^z7v5jkn|3MfcGqyEvc9}&Bzplp#!WW$HG%!HRjK}VpdlST ztU^*4*8TvFG6ARvMvj%$1cv2QdRiXw;ded{?@A<0&Ch2WsUERJtrv4VW5Ajxo5Gvj zn@leF_JXCrZE2{f)vUs|G6ys~><~0xt(y_3;Tv+SmQ7)JaZ0u;S4@F@l`<6akEs>d zc>;HUVu6}NFLg{?Qs&yRfK}nBZ5czVF9AE|6I-AqA>SyJBtwCBtw{3r;c7 zqNv;KCd$lij|2*&o-U9>(Ea&Wa)O)b!X6eYBP$y>*3uQzkSzR$M{vGwx8KhxdXV2f z#W|frx2|_N0Njm3T3JVK?wg6LH2E~O< zNqXoB9 zYU(Z^dNP9`XYEcOc`f;vcmoSk8i&Q+s0u&0M3_6VyU79m6#giWSZj_fvu=H zTzf#d7Oit=ZE{|oE&L=KEj#>$D{aun!FCW<)`wM8eMMN*Ju~jpaf+TCQx50@IW&YY za#>rgj!f!#>C$$e*I=cbk--UW{5movxvggJS#Cz3*B7kwJ+|&7$=ZbvHbAl71 zkx=XTwB`Hiy8(szq)eV~bitR&c$e2C$+-TfR0%2EtKHZaqcU6Ct&(qv@{F{LyYd3n z;tyl;7woIt%4Qcc7Z}%+dhj2Ndn&J&XN>Uq2K;dZ>p+Rg!7JlDqf{W_-uvz}1+D0F z0x`{LLtJ*pPBwKYem{uJIFJwuRyeZB^jQA=!pG+2p88vhxo<9YJnPFkEioZ6jS)oO z&v`u38|$p?=(u(lossq|=YWy77r%t{hTVPy9^k0xX!VRH1gcAGZJ+be41tqJP7$0n z77gM|-&?*2FH-Z_&A+njF%GTL^H^5Xs|cmJRG+w&>npU5|KQ^5wfN`uB`9B}DkPW3 zy{W;>LCey)XjNi%wgy;v_l70c5+UC-xHkTfmZwq=lv=i;tduWY8nyK&UI4d}VUh1( z)Z$-LS$B@mIrC+dm< zPjjpwEkS2-qCS+l`0SxfS}n`QPW+7Xky9{81&4-&goN2mCZ_s^2ASRah?#CHJ_ny~ zuV{*`dan@*u7_?-1ZT@M3K$>ees}O=l5G^fuWG`&nw;E=(ozhR84=N7F9p!d{N`;M zd+Bxn)V>|wMYDi0K)~iECrvFa*^GH^+*kz~l73z1IQ1Sh62v?=uX1oO!|pvck0!LH z=SQm7DpIFC8%|f|Fi&&x3UQb;huMJ7Wq)UFz6DGb`1KYpOiYLZB`s|%@Hz2H>!A`$ zkOGXn*Q9}UYa98L0&szjDbV%=MZ?R&&mVbM-5{3AUI~-&`sFiK2H~|PCB_;N3$%$k z0=7e@CMMna2oW;{bMxtBDSu()vWgFj}h6;R5mfeNoYTUtS!fMpf0Y6mnCH!$%(17% zokQ1nZNE3JH!b`R{Y>aEI#`c}tgcl+^q?h*1Blnrt~=F|#;^R=Mn^8W(2DRXh^I}! z#^M@uC%U7Os@da7P#CaHkHL8g3=rkOf9X4c+cb;
`g@^!-zn;Xnr`LsH_y43K| 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 H|Iz;iOcGh1 literal 23852 zcmb?@c|4SD8#XCYq*W=>hQcHx`&vYn2-!v`jD5?#(?*L@mSK_**+tBdU5_HhzGhF^ z_kCZ!^B&dvJn!>jhXwt?)$#3^E}SuIL_lCX?cA)eCXN(xSR1VUZAYx}2}8FNW{!?_4kA1} zc2>7-9G$GK&KucUJJ(dQ!XZAH-_Uma{XPXH9LM!_sQNYAjtg{!qgqo#6xUwHU*cW5 za8WVhwoc|D#g2RvUM5Q2{bz;0Y^LiclW++Kq-D)@)ljLTefo)Y$FXD6y~cnySmYwNi!%{zr8uc6|TgDT1%5F>TY73-|D= zICQgWhD7odx$D2WBX0aE5Rx_63Ey*K&Eb4HL(C#2-3Y}a??R_sC9Ub;4~^Ic&-RV>oRi)^^1QW%v- zW(?Xol6_v^y*+zT`@JOv1!hWK=F$z<_OZg<+BaGYKaTTLVq#CooG)eBevoivzcqp5 z$wiaT+x%XbJr@_3D1Xgv@jQ)ao?>Wms7c_=6Ag9i!dt1Yj?x~#c+K)dZaDR`$F!9i zC5AH3La+W+eRgGCVqtkw*}tunj;^$%V6wC{YvC1fQQxu_Q#_w(S{>iR0+WZrj$-8w zE%KrcCMX4k6zM;&hond&qs8B{tp}eRVj3P!VHq4;9^}KJbnh%!@!D#;Of7VjYrU^> zOmyjNk1|+0<iygs?OJ`>iap|NRKBG{E2by}`l#O^zV?b&Zk{?G7wfr;WB z7t7O6HZtGO6YaiZgwp+BNGx@3E8bjhUzr~r=FPrhRam>7SXJdz5Od3vS=hvx_w9mf zBXhBzk^`MZMDfou4DQWDUE$ip!}`(X-*5o|L@)NY^180lpK63$tHu;$oF2prd(-0w zjx=R^mDi&QbSNq*QXM*8Sc){1ZpMV6ma&VYK^eW0hBx6R)u9Oi=6mYUD_j^q9OXV{ zlr$+EzH7!5jirE3mtCas(k8*sOhclJ-(t;}_I}F$S?)K@2%n1{T~B^0ojHrqRK2q- zCy6`9ADM-G5JKaoSyt6c^Ux(z8^~y17`q*1uj^ zS=;TiIX3B?vv`-L$h_mzW1MgZPJCr3b<%UN{@%UIyfcg4tHz~%X&*k^F=O(*Z>HlS z*VLVYH8DJlq1Iz<(qoMfs6#K4jM@n@DI4wwY>$bH47|^u*t2sdCes+dGU*jpwJ^Rq zkw1C&r1S)nMCWL|T-4Ii&*X*U3O?g^P!4zQ2s;c+vTS^bHh!-&t9I+wRP?3${fq6y zV|2UIb;D3T84Hs=1_GNatqk!hDn|vX^t#vOj^ppFIKIQ!kGIc@==n0A6cTd$S=NJT z2&+TeP3^R?&j^3~jEPBS-#%6J+^N%Y{R123>nmYcp|A04^qy-=<(TP(@f^vJB{9#B zgRMmi{IqGJE)zNOziwCBw|AOo_JLzAJ>&b29(@y8c&(yo*EP%m+;Uiz!LHI5UoW=O z5UMzLWa4q>s4DDHqOMbcs;aU5E;?;&v`m`|w$ruZVefIY41t|Flh@@dz65h9s;e~w z1+)IN!Bbh_i+yg{Ohn-3YSMHKUYdGqmJw^FredwIhBq@wpO7Se%M(WGi~P^m182KSsd3p>J)? z$l~r_fBlG#-b<`HW?PU}G*>ToXky~H8C+mnwzY?tm>&mweCo|y&A5WRl~&ZNin{|+fH{^sdkq~&2bk_WFj%>tRG)8V? zrM38c`S3IYZ+`bh-R3%_vAoG58hvj!E&oj^4E?nM4(>GMsieVE8C<&G{udD$>_Q`& zX+KrRkqft^HaFJU3>qx(vxB1|Icj$|EL2dzQGt^0-G|?W_1nrVJKWr$s3wV8%tRg) zaSXq`_=3=v$i~Gbscx{+(eq?(Ws;6{B5BT?sCCt?lz}Crr0cf9Wm0sjIez)u(qgfX zjqCQQtvCH<&5J`OdkXvQ=rg31yTu&{n5HWOic+#ql6aAN`o={n}asVq4{ z>gcu6cpBp)W#?(Hu@jZJF6!{#cCw*1el_ZWFVKH25r)?wi+$W#DDA zmWR7hGJX1E{jCpT0+@H$k=p5>tPD){f!9tYuSc|8!!UMrB$2 zeGI|H$IG7O`?RD^ZuIj^YH8@9xVbmFCKsNwZboZHE=*JhODgDl-XWE)R`qD&{&?R-G&J#SkqU2W#})M$^I5-OVRv#7Mto}g@G zVSQiP*J+laef$`z6|MR#Qq(})D^HF3maJ?`IPV96$B7HJuhJ~c*q!BlXBHM-k~D6v z4M%OR2k^mYkjnbm1A`z z#sA&$8IDJ5_?a}@Yi$rN{PmUvi`!7M(#T!*6Oc&N*qH1{cO}GyHC?VKg+WxM++T?dFs$7?!`jZi^k4r5mITq;n^z6$b_V% zSegxeJ;a5s=6-aEL;<-F$)%89@zR^oSYKSs@2^1eJtYK*6*)~kd<6LzWL&y`!l4G~cjU`W8O$}DY`iTqKK&a52>6sgBU(*%YZ5UWUY6a|+PXRAFF8SFvM_3}IdGpr;ye8g(VrQ-S)==irV+o+?ouw=o$mEez_vTn zzCRhD$@AGPcc+2fJOymF@4lTT0H6IN zQM~y#_U>xW_*ot}JF!iivP76hIf`jX=0b)p$FM%?=P@=Z6$-odyN#yQ68q@J zTIAvOCsJOpOO)IPcPzSi8wEyI+E@7=j`9+{?_KHj$G5)AV9L<)(Hs;)<0ZE%BrjlC z6v?=c0!8%)1O9#;a2tQ7?f}JW=kFPPtVhzGzr%Va9T}pfP!_dwm7>0YssDX4dP+jT zd%C&p6x4e#Py`U@c3M!-F^{N7Q=l3@+mOzz&O3yphhWr#0|Ej*f0kie@AjB{=yTlgBnGgL`b77q`Do3!ZyPV?6hZC8E4sS6T4|U=2M_j5Oh~v)bo%*Gzth&y z(Xp^d_V+KZi;*_1dF?hoqQSNaN17e14O^?LtE-L>jA%v2IuHp2ZVcgTM~BDfNBe@V z+iJ@53g2*aB&4K_4%Nr@xDB#=cri6)cldA^?E&_XkPz)tY8IDMu6+9RX|N_zefP0$ zr>wOTYTsvTC0T{-jqlvKvnpbycX9WzL?^YFf`Xgpg-WR@D54k5@%Te_Z+BKyR2=5f zzafy7nHjGfiP6x|(9#lw;eB~}m}}XnEa2SPvt||+dEVuFA@my*Mcy6cohC#T8oZ zf86~mC#uon;c)nC7UZD>$q^ID$iFDWTm$cKeD>L|j-a`dSC!k7-5 z-i;f^-q!f~+{>3Q(=BS)ZeIP+-i~2I4V;MxJFllEsKHV%@=z7-+4=M5ahCX&OHJDp zaoo#owcaLWhv|78n^;a&>WWVe|Q3ayPm2qM#s`xxAxmPSw;++11MU3NNAnsz5is`R(`b-=93$wVS9k zdcxxFF+rPvV}cWrF5SFUO?hUF0@p|5T-pH#B(Wt@-l8&Nk}_ySmsUS|^k`&cWZ}zY zX=#`7cBk=nqHc~&b8~Z&hkQ|9>PQuyk5MG}9zGu{(1cE7eE06%cxP_oWmKccqh9@n zwZz24l@<5Wr$#exb-qcZ1$Ue4&PZCeaNj#hA>fOnoWr7Yi@m)rU%nTvX=L>C@d1t| zxvQ=o9)kk|*#yE3P0jfD_+*cF2?;6@0^^MW#&RhHtF}z+NPFhe(o#Pu%*7vPPQ3cS zyexo;(E@H@yFuZk*QAF zx1#Y8rV#Ns=wi5+X=GE3%<+OkOcD|jyu7>(qN3atN2rJP9)EF3x};4+UNR5u`24TG zF84bqeX6bHId$st1FN59&$Qm(R1N4XNOz#5tV18&h6GNlVdLAkZ{NLpw`YCAC6Gnb zB-b?tDJ$tIWw|ia*>})BK0Ywy(heid$55a7;_CO_BDCw0wAtG@BDuxH3f9MY33R@D z+qDuX2GEctdMTN1?I03~kOBqWJRrLwL9b*V~TZ{Z#z&`yFI~970jS(WO+@&38s)9kKBBoiS!iNG6aXiAd6|IEn2=qtP%k zLgzdt3lASZZbJxTqxm4|Ug%x@ir?|7mG4U9UMUzYRG|c1(y8VcRsM??UESSrVPRYm z!R*&WT&JRmG{gH86ch>y3SPZ>H56R954YC1*DhQ6FDi7&IYMer@!Nh=OkZE$88)`0 zh{a9^6-C9TM4Fe|0>x&&j(6mwwL=u0Un%rhY~Y}zU}h!Iy}m*cSxNDH2Ol>8wKTu^+Sv_2TfUVCag4Na7&i!#c} zwY7TY{?)s+lAE4=Uthvv7$3c^sfl~_YNWT9*Kw#0&u6M%=&pgvaGM<%8Zy(;YORlz zE1sm52hNPyZmYkAughGLIfkuf$lHaAZS zD)L;mhZS>XW@hG%>knG_RK5Hb63Mb7+d9a5ZMvL+MWksXW4skdR0$V*`u)cb!(5y> ziwr8mxFRTOeazIv^FvXQenMl?4hu`m=G}(P^QupCb93uCJWg{jC!G9l75RY1*tgUi zUvX`kK|1{?gl=Q+<^C{AO3I)|j~`dm*7{6+qG3Y`2ib09U}Ui~+(xRWOH2S$TPWem<86J+n~V+KvxX%zcyWYkdYJSJLxUcYa_GSHnU8s->Mi=HAVRWeAAL8S;b;UThmpp zUOjvMyp5HW*qt8_Rz5y~Z>}saV@*vJ-An!GMIzxaPLVC>w5&%Ls>69p$$3JRCGOi| z(V{rN`uoR1SVcue2&jNih?saMwUfNOcWU2=&&mH<;{JDx9yf1{Ps0Br;E&m);mjieg@u$? z>>o;!1h6=^=?{@cheO{<>2DExAc|*RUwcMHx}>J5rDb4nFvsWC$1V|ChOgxK^nG(L z>gn_6`X3A*_6in`QDdmhm>_CNR**=u^Yfue3hAxI8!MxcAKieK!vFxf#mBdsjxMB) z6G9RxjN|x3-2WMM^{-1>knLjVBMHsK|%N)W0Sx zD+|!>%KdBuno>Ey6(q#lCI}n8;HT{(p74ixS=!+Mm32Rk!kRB$x z3+JR^_;e+`1gmy}xr+Gw4L3J8n6gez^IYi#Xzw-G^4yzSC_Vdn0e5{Si>Pze8}SJ5 zofL2z9E*ydI6zVeILcpHU2Xl>1KKNBt|)k0T8<`bq};oAud}NQuyaRU-3fe5OpIym z8;xCKow@4rU(Z9nmGy_fS?Il7@ET}QvE;b7$_mZ`kpt} zfgtYWM7&xCONT@Gbz+|>7JDsHgqWP146&o;weZu!Jh&z0hP`ncU}AHq3g-o+qNZ(Z)BD%M*@0?41M!sP zv=9|#H)FY(bUz~E*m_0|z+v!egEiEl@_dO>)deoz2PbxHZc3RyS>#GQ!o}PxZTscg= zhuN&iT~kB%9D)>yp0Gl%TzS}XrA{OaxpJ>Z=N9B8$Hu38>EP5%dQ8l!q*JF(K^pA{ zixP92*;rp?b^T5$PnzuP>^!F)@2Fjf6A3;ey5XKRYG}v!iHpeR6c(z5iW60Nou?w+cIJ zeA9Kh^mp&B%&4oYi>6^QaDJX$LPlkDmJp4Dp2Z||bD+%Gq&fwJKajw^1@E?&63758m|r7P|%4Jvw3;nq5s>odc{fzHu7 z`hLLpJe6rZ5EyT<6yL8GEVNq|6&3A&2vw%O&-%PF=x$OZ-;G^Jh@V|tY#ny&St=8h zea>t?Ud;zFWGJ12BKsm=zmLaGAOiO=Fboa=A@#jr{SZY-Ox>^}91LK3c_8a##)V7A zwPzUSv?vCFd+3sbU?3y&ASx@rLC#*^T4 zyEm_V1*98zTwGy0pkg?uFRrblVjC5em!~J4ZQ#C7kQ7$9D59|o&PZ@);xjqYb^P=_ z$W3rMDbkpnwe|SIc*nJFc=N8h8I$71aQb$BByJbxY{*;~ia2 z>X1=LZKo2U#Zbe?DNY@U#+E_Q-B7qrPE=4!zj6TNPRWFP+qcoLu3Og!`H+;)4hlj5 zatNdSK+u@c&vV>sd%i`<(4@!dryFFM&?8y(5irJ&ecTvGn}}G3WXB*MnrVU9;P#k3!otGx^74g03R_0!Jr*aN7?F|zQq-yN zEOQ7k?Gs)39$!2Pjmn<`2#>`|U8kZLvfQV{e_Z}w(L4T$8o-hN2H)3RdLSGrCye$K z7iZ=I-gxoiMQ^D;GGBpeVSkDj!>k6s0y>aiP`w!*KP;byw zwYyy~)~34v|K`o{y?alzs$&w2VeY<*k9T)a9LVfI(~Toz_qUK zI+@p^@Y4AWz<2%v;K2$Zp`rXvBTcYq;Zz`ZaqAaoqj0ZZdrtqj;>36IWN)LunQ5R( zJB@ky6U7XrBc_2s@vMOdmU^`cLqU8CzSP_45a6D>X>M zVIaWWr93el9}CNs-4X`l10vzr*sE7ZOJiaEAF;q!pkXbHRHK5)%uC*$^aKqef1Y8b zzKxAd&08$@GDjj*rmz|!?J9~}XdYsg-|q8cMejLsK?>yzA-J?FA|fJ`a7M;miILCY zVhW+kxTximN~B0=P!QU42^Pc@tgy3q0AYs?9U8f$gnOx(_)JaMZN}KsvjFh7J?<_Q z4aP}aG&QaMP=4dWNt3HrA7z;_F?>ZBVPu)qtohQR^sa|pJSQU~b3;ojLil-}&dr;t zaR6&AfujkEWr`#?0M@nJaVK(Z&2zpoZi_?lWKtz8xRBz^A)4nokGH4k<^U0s+T6Lv zvZH7mNWXA?OGYxjjK(S_VD|P_yDyf_Y;I5z8RCHudBXml9*6 z$g6sJ(F6#9kbF0$z;F-|aU~bxW{8q%3atM`8eSdt)2EG~TnG&f^|K`PwGWW#n5*6v z78VJ_s=sz~ondEB?zxOqdQ<@B9uv5sxcioI+pp(yRZR`7R!0Yir%#`fNTkMgug3Um zaQluQKW=!z5XJt~oTYjwZoU1sd^K^8H-u*-N9X0ico`2KJc~aiy+x>)RC>-gYbl1E zZyt6$WucpGrHW=?m0;etkJokTJHS(6J@P*&D*!+CJrgJpH;LM!(kaqnAV4oA1V4QEknPMF2{i-9Mr~? zQK5%^r3tYURN+uW*x{mE(pgzQQDJ1)e@iA5bw>$wiQVARxRpoBvr8xz|2$LGgT zo=w=G@&TBr_^dPn(X6GV6{)=V%_y)Cbo_z@-Y3TZ`vgbYbd^+Mt5f#pavT?MHx)g9W6e?}lAlnl4DV<)b|lh&+YwQtR^-98r)* ziNi&!n*^mk^ZK_}?3MNj$$yOx@|hc||MpEAh!5a0AuyfAr=_K(Xr}Gjwaebc1xOSd zX=&-z)1>pQ=`d#+A_Q&Y6B0ld{5mXP-5&S90=9-_cyKVEMblY9!5pB@4<0&%uWe0^ z2>FvSB=vT~oFmXho35mUYhtnQ+)xKp6s}(VSXUNuPF*uqJEm`SX^C0LE*c1ixH#j5 zu{H%0sPmeV)Kij^;Tj<^WVufNSdfGC76^bTf3m2fsmXXQNazQk(OR%=3^%+ped8uu z!OUl(bm`LFgN%6Hk9NHUZnI5CHe85by?3tD)59LN}W6~A_=$=`O zvCmQJlh+VLo{EIi$PERB%Bfx`+e!nOh2I)Kp_=ErRpLu&Qq$eu?hbbVA%Y)2emq|L z&i)TW-XD%6v*eiic+Dcst}|Yc0z?i$9cZQ#c57=IAu|CY$HjCk#)WiH#thWUW<}) z{@mJ+r#$)}?P7|GHpX*$y!&3t1sG%hPG)m0g9yUvy>#2bA_qzKzQ0_aw zeRG9J5f>M?z`-Kvy$0}vi;D}$K~)Wn`SnR3gY;G|9;~sk(i<@yee_LTcK#|TFU`$g zt~E6^A<(z04xR9j#uzEhdD&xVRxG8ZOD)q2*?%+_Wtde0hwo2+Ou+c-3s7Q{Smly4 zPyLt&;Qic8djE)j01d-&W>M!#6InjHIOF&g&&N4u78gAGmz#*Wd^ND@gF(r(SY=eSU7Z5frgb2-mxI z@6NRWVj0PDM*GLQ42~T=3e;!(wFvfMUtiyxZuh58fnJV*uR0+tTXFUve0j#g)paQc z{3|fkMjZ1bH>Lw`^7o_s?TJM?{^iu3Xu1 zmNSmD&B!UDMpo|hjsMz zyS*$DugJ?k4hz##S3dx9?k^Vpc_MaQ>Gp=1iGp*Y&KCIY8hK<=M@HWuH|^b`+^Y5w zt1!GH*W0Tm-;jy$i8l?u8I)*hspy1_i`(lmYi^nBxcUE}Vy2YEhT5tHU@#a)6sB){ zT-@;UPKX^$J{FrNP5#ZfMEB8_gMJIwRToUE!XY_>lm+OF=jKN{pl=j5Ko^aA z@nUK?Aqs-R?aGjI$)jfd5p!vCbB^acW9ZKnfPR@m23G&gng{VDH+}nNW+FG6ulNC! z>V2X>0tN(}l=cI$K|@oMGlD^U?uA-adHEo?H>#_vPg(fol*fhN@O{q!PhacKqd{Er zzm&?jqk)=5^1QofX?eL*yN%Jg*{NQq(CAE%;p7d9JcTb@xGtan@uT)zECx%dC^8;D00W#2u9+(iOqsOqj-I z_-DZI{ezx1b=69RA<9PyJH(fI20t+xu)(uo7{P$2r`J_v424}yq-e+Fw_+ckQbSC> zZX$M9j%`m(ZSCU1f~EsPg@QDh#|;O^v@lhr`X1>0N{*vRsi{iWu4%kGBQEX*v|m*A z%NH-|ZWqZX=ww^r^Rl@mB)mZa)--PeE)nbUq2xFE{<1glHLsEEDobHO!42%ito(-< zsJGU7{aFPB1)t)UmzENDKy^-EOj(zI>l3%{fj!K)HLBR=4}_|!#VdaYyuM>&RvHR2 zO>ewc%o!L0p_)YLW;=%4s@?f){>E#eZJ+hk%j;5&Gq#2bp{Gut?&|CWE(Z$25YKvU z6_wh|OmyrFEE(Y7N9|m86TzZ$ABtOGh=6xPojrRU4IHN1Yi{4HPgH2LokC#TkkiV3 zvIU_#HVf?4HFyd4x(1Am9TiG(ns^E=?9JA!)7wdV`4b`+WgENl8f%Eg=jR zEd6+j>lBOS0G8q6_9JQHsfbQlYQhMp7wTGj_9uYMOg09Xz&b)JeO7VfZvBWhhT5y6 zN;dE~%l`d8y8Iv+_6yd+b1CV@4A9ren3*Mlz6oZ8wfef-x66)GQ26Q*=~gcIto>wl z5{dkw4J)AT0qp^}2?92quD~CC`C7dya(FKs0!0-etfQ^14Wjef8$sJ{$P(O#dC1~o zH;6+OMI*)=)b#|tte@_FLu3l^f{7XQ6x;0(fQ`(`=qKmLN!41eh2Z_#ow1Q!|- z;_Bwc&(B|9{+jZa;tR>lOP$otVRe~oL{S^$wgYtr0Mc4>x_9%Ht|oGHeiyiJD>wrQ zubhV6;eD*n6NR@{y-wn zjx?tzYyfdMP#eXw3=}t@WljDoTn6%Ud{WJ^8Y!B<5$ERT147M-iMfR0$(NIp%g@Vu zeq4M7dcK<>@jCeP z`eKjI($sDKo_1$i(D{SpSx?uglbKy7NRg+$j`3_PJ}ITT74$UXJZ)% zQ5DJcIq;jP$1ABK!yL8I`8UiqB)d$`hCRak%Vl!)9D75{w{J_e)3fO`Dk>^rl{d|# zIkO|jc-$a!AFqWQZx_890(Pu-`ZSs1z80{ZM1Xq18Wa$VqWVwQx>4#jflP0jrUvlD z@w~$&)dqp8O}b#jQNc zK;SdGFoZaeG_FTE-;TjOM%RS%N>>YtEM;OzO++j(^Q15yE$&LY!#fJ~(}yC7RE{|BAi*4E}{VDI^Ndq@LZ&DYAxqXJgpy@I^`882VH1PTfaMIaAp zn&ZE|PDn7-(ZN^T2Q$xa6N$Z~QjLAz*L|@j$3+~6HdZGmW%3n}Fq}GDf`|__E%H#? z3*m6W5_mkmF+pWADT|b}Jg8XsyuH00sG?Gucp>?n{gh1K#ilwDn}j?4TP$$KAWMbx zYRMvYjV7fMsD{q-fkZqtKR-V`O}levxS;Ku zPsH2oMATRotAM3JHyFIlY5}rUL^&pO_bI4NM zDu^@<3~EESQ!7t4qj78ZXG_#KVr*;9Cn!h0;xkoNQc}8o`()U@BSM830Me-Y`oj4T zW37Pr0(EOf?fUh-%G7ksNM5AMSRAtl+=j?g%eB=T8yl*sszOW`>>#7SReNVWb@!;M ztyNjx^aXD0_b*cOZ{g2mJ#9$=!57&7ZtAZClRlfPhxJ`AHB@S0t_C}26I|rx-V4F> zusiNrDGBUHN>WnA*RMy!-RHa(y9Dj~u3{@`ckSW?X=8+P?ir#8BYEi3WF4CA4iqM9 zYil}LCcp@F`E0I-Ga=4P3REnYbgdcwiTf-JiAPB22pNrg5p=KpY`?Y?&C;-MXoi#XOn=1WTw3HZ|MyFjntoDXcT&h z`>-{yKt9g=k8AU{pbYZwKhouY_7)-Qo!H+lQREnZGYv_R z+^<5POO{+%b{{tr6B7^u;@a|Zw7f^35f@H)nMO9?r}k{+^zjzlexk-I5wsv;Ub*C(YZQgR83cO;^^> zM>NKDh_C1#?k>2u>iaB~a(kiv{Y>G-wUom~zJm-H#}_m?v>8ycvNXr2KB zMN(2ykmMi#&U{UAH8Y>Ir)V1&n zF^P#+t#5dHZ-9B_%$?2kMOF#VkELZ8k9~wnOQ(p1YkY24ZcmzrK#>UZ3zQ)BF0%Zg z#`=#UakB!_@nGoM?!)Jm@aQWj$^TJNu?I%|Ti^HwHqUmwfaDJ!RJ&ADf-w1i=gnja zZ~s;?#(%3AmO)#3$Znpnmi|M%!G?$1UmSg}{oyj|MNp8Mo*t?Q%+i(MQ%qhRnO^}T z7ne&YU2$i0v$iGAJxw=~$MXs#tTZ7L4{1&DZWsB_P9ZbuF@ib*o>Bt=3Zi9 z&Zn!=i*gqmSL{FSunq{ps^~+D{`RyP+#++ZR@q-JQ_3Cw;f5*VqR+{Wnl`eH2DpmS zRV6UUqUQp@WyR(N^kQi~)?x#!Xmpd+V}HjJ>a(GtvYh+&?E^z9OU*O}6HoNms`BV3 zaro4@mWf@4hme|uxc>^DTaHqSA3IN&>MSZ(x234S-lHmGz)!HYs^GMy9*hcO#$WAO zjGkp2121q(s!jlwB7*~n7aZ=|YoR;+m7(A#0s9&VhkkE(t=lhRKQxsxNT#0mR!~vV znmw?8f76Wp6Hw-HI7VJSfW7<%W0xYw9?p-plJtX4J1ijX)&z`pBHY2J`w$qiH6=MX zIDD3R{SAfRV!@fIU;-!-NZNP8vX&%*h1rZf6Tbnf*s2ZfWUb@rxi-^Js%AFu{F33c z%e_#aS2gX|N-7k^T;uCWC)AuLYcn}y2PG2`{9|TdGXX3D2?&T6SpyV^iwjdzd(WvB zbDn*i5ao?QOOqY0Z*h{IOLj6cpP@FS+O{n-D~mqNmEo8`)znkh84F|MxYxX7uT?F1 zO%1qim6fxhP3`OdswRtp_XF$4h@;3pe&MVB;N?Ru<6*ZazH8sGn z;RsDvwVCGD|5r*0vW3l zn=Y@=*eA)!UH%0wYqM;i(vtmsRp!K0e;R?X6qUarDWt*@IxBYKKDkCB(7A&@=~qFv zm0=J^ax|<7VybB`{Wfr%@rB)OG>2FpsY7Dc41mTk)b9$bWygI!&eMk>nKAGEZE8aD zKAB@fe%PHtAdAo~74QH+PXnG*!YhiH#5}%V7YEQqy$7sTROMrcMbFa*+?uZA#MY6~ zQLsc20?3X!zc<6_U=xN4Ri6wzV!Aj1RtZSKq2N3#qnq`0bs5$j*&ja&@y3;uNO_0= zO-gofQE>ozk-w*^BILC)=d<4G1MCdg(hUrH9zEJADheMfyz?EgN+~xW0P`Ew{DL;b z_8GAMudTU%u0Z%fJ8igHXCS`|S?IbCk|&cqq!fS}kDfev^89(ru;Y_sfbKN`7Th5x z+zdger2#ynOJBRpkDCGFAZ;vAnWkXhPw||M!$%HMf0!K*!PXq6u}~ z;^nh&gOC(om|on{)MV9_*KDJ*Ota-#`)v*IBO83daX{t2a^O=5o>(Q1lV2EZoyJyu z{d!eNiQv;U=f3`m-_m_;|A$+QCA0`kBr^&vDOW0I?mM~?pbY{hFC?5}Z@Mo3G4UQj zhWmViqo&)NM3>Z4Y&d=ixMpy33u5|~a}z%h?KGYCB;p|8Ov^xvg!^DB6i!;X1i@$vWb1A~la zMNh6nLeN=GP9VYgIFnYcuO7Q)qHHXiEYc~yRrkt@Vw@JBTjQTKa^tRl)W~DdtMTE( z2Q_eXT0s3cG7JP7_`Z;_zQ&M%<5GmW^l#GANjy^XLc!LI2D*3o6NC4O$G~PMsV8V^ zXgq#f4MBMN$Cu>vGaMWS1+JW_fBC%mX1(g6o}C}iR8@UxFDmDG>colf0C-&5k5jTTGkb2Vxyk>^ zqz|_|Vu>qH)TF+WNFF~PbDTM8IN0A$wC)g)M?6ISdsxt%=CT1*uM^j+(-vscy7X?| zwsqoXwi?w z8gg#Ynote{*emi{J@dh3vKw>)wTgqY7YJ{ma84|;2eFB5y+6$0NrU_;c6N42$<0qR ztRaNHt3|5ve1^sYGVGuw-8UOQ?`^(R`!LVdIj#D?ldHvDn6)o&A>9*F&?g1BqO7kA z-CHe)s0PL79)q0d3AseU1iS`d=VRhk3;!R!v2ZOWY!d#-Lym?_uC%VkhK8no8$HSV zf4MEa_IRpS zn_F8SY6GG1kKust+*#1?>!EuaQVpNHL9YFk1_+}9>F6!`lW*;O92-YN13IniN|uRUXl5a5JJtlRf*?py7k8ito^1$Q7BYF z3`7qB8Whzi7=Rx?Mu_3wup{u^-#a*LeO5cti#J5bR3-#idA{AWwEOsW)6<7;C%?z6 zhcrp#R4cu%%BKgv!NG&ZP;CE$7agEi20By)xX-zoJ&I^QN)hmtlS_n#!1r{Ku^AcH zmzmX1iizEPUiWmPo{&I`8E5O4@&q zJYV(ZqN8v37e$`J2M9hu^hUToiaBA(@WwpNXsoJYR4cmlkXR-@EbQ>nqawFTD6m=O zWqq3|Du+pqE-Yg@tih9qF#}6rt^isBQ6a4fN?mk2cfP2Gf?#ecN2-5fax<1(`PpW&+b2Tz z%Bv)|RSV1JPZ{CB#zBP##=^f*2(|Imik+s}ggjLDW%ayl#1G@l zbBr^UTLSR7h^bCmyX|xEMnx6h3b5=CzS>M7Nv(|xE(hmD26k%h}poCe9;+T6sKR!?yf5w=Ple6;9 z>r`pfF{pE`1b}iE5K#E5v9U2j8+tBQsT7z>BcxnmKM?jzv9n;pojzJb))DsriBZ< z3ou>!S;ykA0MUbr?E9Y}CTVVSaINeyPtX7>h zNN7A4#ECZjn9qdb^EuClC5%K9pFYHxY_1@A$g|q?JhgLvK7L zUd}7Z)T#e)`}1>Avm0Jgupcc zL7UDYA?21B+&RS!|D1a7isA|?q=V)uBWh-GQR}#OJmYF9>&Ew=KN~mlw}IPJQnGkK zaRb#FZLl#DR{2bvO)dpFv2L@RJl%0I*QP{Ox#vL9kg3SjiL6=)@R{j=wDk0;B20OJ zC@W5id_3pmz7fpTA>M*du3!aB93mmXU3ZGggBMoJzWg)>;%Iai=vnVDElzop6{gwt z0O3>fLH#8^lGmyvJD_IW_x+|MHO<=8Rm7dX7M;bIbQp0yEx!Z5CXH=vr0e>gwvaqJc_X?@@s0BOndD-6{unuw(nziShBSVJ*tiRKO&zLB&)f0zAJ703-9#zDcEcqO(4zv0jMV4Rd#B4xn+V-n8 zu5`rww*?@W4{_T4B59q>XC^Yj@tY;zdVe8n_v?OR4kHl7powWpt9T{!v>Cn!dH2me>K3h2n zB|O-o$SgJ;aDtFn0|suC*3tt!J;OH&zM;e1+IBz7=-CYR1B6|in%W6ka)DbGrik22 zp)mvaPz2i4pp&6{xz*#=$m>Fj=H%$;6D}@`xekK@7cYjt^j%;zv=~1Q$aA7o*hwx; z!D8I|Uv4p|ij-7T7$DZCaD-h>tN7E9AzE;AJR+Ta%bsvX?l`aEgELL}*VImMaG1i> z1fYo+4LCW~j)g`=N!oM@$#(*0i`e2awpf$_59L(>i)Qr{IrILAVNQ0Qm-rR%&MUH$ zNnO~yAX7gTi*!h5pL`5kLJX2U2kCtVTXqAB<^Lgk@wu)20sBCy{6hO6V6;pa-T)nC z`sRc-#1t@B$f= z5gxX8{)l>9hb9A&dh{`iHjo=b=b#>Gil7g=J`0gpNx2(T43Ws1zUkAaPlKWzItM+% zR8&;Wh9(oJq%DX~2YtH;5%|Zkpvez?S5qdTm|&O)WY)?SY(cl_=}Av_aDs=5^8naj z0lc1i9)yETWx(5maD8l(RzPdSzcD%gvci*3?@J#WTHWUy7-a|O5UUTFo)?P5oeNGu z7e84{+-4k}j+6W&vHj3Md}wZ-cp3V6OE9fzb^%WbW!=ZOZ!d4LLQx`4oNR2^r77^7 z^g@_2_t{&@*#%nz%#hwWxjnP^c6*sk5qAVX8tAiTG>eegW}!I>q^hQ^+jd)PIHQo< z&CTFUjhJ-l+;ebD-KJpH4(h$B`yc0?@=j7lC8@SjW7d47y+=BJt>EE9vPnva%LK4=7*x;gkzj zk@xh|wUln8{30xiMF&QcoE{TqP-C1d*;)`YZxmPDMcl@)U(S0RI2nNI{siraoSd8- z9OXkP54Swer`SfccCbwY*ii&$_*bZ+nr8mqcqj$^HND$rZuNL%U63sGerK9gdX$bE zBqw_llI;Q3txgvAC>f;{?!@%>crEIc+8z&gbE#@oAKh=>ulr3y#0pgOq**a#Mha#{ za{IH>4~<4~V$OQ$+bt)^;Rl(AhVg>MT-s4D>2NJ-(ipAhi1I}6j2Rmbc5>1j3i;K*ECeWr3j zdzKSOP{`+_6GUitUweb_VgN1@x<+#c-#`I(j+=Yz zWgftNgeC{}Q62f3w6byy7z?f4DtdZ0({j2;l74@pPLSM}uH&E1nNxmQS{iBF>5(p%nq37>QSsCYMa>E{FD5Q|zoDBSmNVSQQ~B!zCHc+*H`v(D3vw^8b-`88jSHy zrJ#5}>(;{o@L-02M@A52-(jcVX%8^qDlU8}E&UlTFf*b^af^{D`;Tnga0$lfevaJw zd;@8Hp1T9x0|Il~p%K8RSysP`f`ajcbhr@pcQK$`Q5o6blH8gc$PeTuP%x{LC*f8D z$8Tw|=tclie?d!!+t%(bb_Y>>3}HJ##U$6SzR}brC5Z8TtM>{SkE~@NBG}!1L-C#P zhf4yA7HQ-}{*TbLe_r$XVS~1|t0C|A(Jn=TVS6u=4BGkzA9I+r^$7tj)>Z5yIq5El z2&%{y2zb1u)qIhQflA#9;3?PD@fiS zOVP(IqBg169Xp^;EIp^0yy4*bssor#2Ime%0Q#AUWnJ%^Z`~a8wax379IQ3a{qW;3 z?1s|&zxVNhW9??-w*Pj1)nBr2y8J=4PR>M_TwqZT&8hZW2Q7WiX}0d`8GO%~`SOpb zdK8#HH;|4OrY2VRz*dEdDhA^j>+^p-T!CKg1|us{WhfKuJ%}}~6EEo&vacF5{O7(y ztMl*mYkW#Fgx{iJC%yv~I{yFM(MXQG6B4p{QuqKolwZ3GzC4cXM~H~C|K7I{szM{! z4T;>nfpGMV%yYL$>*%c%AkD+whvrPIlrf(#!~11v~jOtNv3HW zz%6&iYE0J5(&-ZFDz%ynGZRZwOPxl{Lyei?aWu*^Q)XCS)QdT_s z9R1u15|KMks)k2{b@Ai*yRct<{Wa=aYdoZ057Cy7ZGTI^$xI8q>t(7TP-LBW5~R^Iqg;WEkq}n>u5yPW!}8 z773ZOW0x;R_lSP$Os7>Fl0;O6b6PJil|r3}3eNgxYn+5y;NqjeJ@(zzcO@{=G%S>R z3Sh|M;?aQt^*j^RxIasnLR6W~L&gbyy_u}rSx1bp+?rioSPa=%VFu4VaGSdffZ-qxU^>k4P z0Z0WxXSsaWD87iIz9rG@N~7`27x!f}J|A1O*B^3gi=u{;>eNiEL7MGA6%$Pl+R&y% zkWWTkE1NhTR%+W*7iNBZwf&3$HQ91fy6_%VS@7dMhmv@)R9g4?wXv(Kgs6qKo$7E# zc}!%mHG1ABTdllhK1gO__rY*&@WQjAVFSaRn0$ek9|4=!w)*mhj0lETBq(~mlE#Co z+M7E_Ep(53>)np(T*95&THDQ=T`Xog){&~PiL-|;vDrEV_=2zvK%>$};YI_;VGOr0 z8QijdI~kkAS#85&H8(Gh?8b@gW2YBZt#KW>#Y%}@e(Q~UXgqxu@U-){HPT|}Ry^U) znkQxD*Mu2usyQbA)Oo~Nz|j0V)&^{ibeR)8OjOkyT{fFBpbOo{v6p;*IG!Je?28%w z12i}bMMR!%+JzWhBg;E9wJH-E(FpnO_}l&!P8!;?yBDy#2eVK4)Avh}-P>tNpr`Fx z^jvAOM^H=ofpEGnGdsJe0;`-Lxt>>&FQevtG=t|J(8Yq<;caSaI_n)79wLXn4oI`&GI2G$M*~L@!WmEbOfJ@3BA%` z{JqZ1O4!Ny@^xu8vB*SMM#h@Rf!d!Y&D^Oo1zE>e>^@a;xAG0f&@iX}=yle?r=NeU zW9W5_HXi83$GCKCp!_Pxc*M;$ei;MMIhiYqf2M7v8RSZvG#gQ)F4Jwcob%>)=&Ob_6f=c6?5e!*` zX7c2q&HaO@i>Z!CM7XpI3gjR^$|W^D3zFTu!>C0A7uCT<;r+6AgXD4^11S)_qb~v^ zdcl4@PoK37H~$!-i}+;#xh~h!3#<*Pd$_HJj8|EOQ=B^Pd_Z+s+K&SeYGShY?9>R` zWe9?RCl}s8HHE_gP)%WuiZ89Tam&+Ftb&LKrhO2#=9{q6R|K=T-yqfp^J@bd&6|_U z%6ki>|MhI$E1IUoOP?^WucJjdSjT(vtMixSjmrz^#~fnbJML&-Vez)T=;cetZj2VJ zs?U@DBB6!CV^)pCi&UMKKGNJqypY9ST9#wv%=C@#U9SfLpQ+J!HQ~gMnxIhI5&m1) ziuFL3*ZPe3iecV~H4i^^q5lmS3W{kOq~rergqn|hdT9<$0mI?UPg-^ZZmJr0_+($b zmt##Zn||(jM|D6RY-enX>GA)wLIBJ-oA&{Dhq@5x@Xs0zPG1eK_Qg01RMGJ6Q8`#I zKnm@~x^^^N)o<+ltP2hzCOBdJ(O@M{rEJlAaV#C99=YeJ9DwJQz#;$2;b z`ahqb?mDF2LqK#B>5+(X- diff --git a/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml b/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml index b1893b274e..bedd73d016 100644 --- a/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml @@ -1,4 +1,5 @@ @startuml +hide circle class Storage { +readFromFile(fileName: String) diff --git a/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml b/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml index 3b5d87875d..a804cb4202 100644 --- a/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml @@ -1,4 +1,5 @@ @startuml +hide footbox participant Client participant Storage participant Itemlist diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 66ebb9729e..96d025e4d7 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,7 +2,8 @@ ## Introduction -StockMaster is a platform aimed at helping SMEs track and organise their inventory. +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. It is targeted at those who can type fast and prefer Command Line Interface (CLI) application. ## Quick Start @@ -266,5 +267,5 @@ the application. | Create Promotion | `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR]time /from [TIME] /to [TIME]`
`e.g. promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500` | | Delete Promotion | `del_promo ITEM_NAME`
`e.g. del_promo apple` | | List Promotion | `list_promotions` | -| Help | `help` | +| Help | `help [c/COMMAND]` | | Exit | `exit` | diff --git a/docs/team/fxe025.md b/docs/team/fxe025.md index c9e40ba017..b1914c2488 100644 --- a/docs/team/fxe025.md +++ b/docs/team/fxe025.md @@ -2,7 +2,7 @@ ## Project: StockMaster -StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them manage and operate their business. @@ -29,6 +29,7 @@ to be stored in itemlist. The transaction feature is useful in saving these info - **Documentation** - User Guide: + - Update the introduction of user guide - Update feature guide for edit command feature - Developer Guide: - Add Storage feature From 38cd86fadfa4ae354e681553988e6f85b215c47a Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 01:44:04 +0800 Subject: [PATCH 362/421] Parser class diagram --- docs/DeveloperGuide.md | 11 ++- .../Images/AddCommand_SequenceDiagram.png | Bin 46571 -> 0 bytes .../Images/Parser/Parser_ClassDiagram.png | Bin 0 -> 91062 bytes .../AddCommand_SequenceDiagram.puml | 0 .../Parser/Parser_ClassDiagram.PUML | 65 ++++++++++++++++++ 5 files changed, 74 insertions(+), 2 deletions(-) delete mode 100644 docs/Diagrams/Images/AddCommand_SequenceDiagram.png create mode 100644 docs/Diagrams/Images/Parser/Parser_ClassDiagram.png rename docs/Diagrams/PUML files/{ => Itemlist}/AddCommand_SequenceDiagram.puml (100%) create mode 100644 docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7a6bdc1755..9d9f9b6845 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -40,7 +40,7 @@ list marked items, as well as an `Itemlist` class. The `AddCommand` class extends the `Command` class, allowing users to add items to the `Itemlist` -![AddCommand_SequenceDiagram](Diagrams/Images/AddCommand_SequenceDiagram.png) +![AddCommand_SequenceDiagram](Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png) The `EditCommand` class extends the `command` class. The `EditCommand` is responsible for editing attributes of an item in the `Itemlist`. This includes changing the @@ -70,7 +70,14 @@ process had concluded. ### Parser Parser class processes user inputs and sieves out relevant details before calling the relevant methods. -It contains command formats that must be adhered to for the methods to be called. +#### Class Diagram of `Parser` +![Parser_ClassDiagram](Diagrams/Images/Parser/Parser_ClassDiagram.png) +1. Parser takes in the user input, and parses out the command word. +2. According to the command word detected, it will check that the input matches the required command format, +throwing command format exceptions if it does not match. +3. It then checks if the inputs for the various parameters (i.e qty/, buy/, etc) are of the correct type and appropriate value, +throwing other exceptions accordingly. +4. It creates a new instance of the relevant command for it to execute() its code. ### Storage * Storage class contains method `addToFile()` to write data of items to the default file directory, `./StockMasterData.txt`. diff --git a/docs/Diagrams/Images/AddCommand_SequenceDiagram.png b/docs/Diagrams/Images/AddCommand_SequenceDiagram.png deleted file mode 100644 index c15e26c906b6a3b6033a4971e45f2cce23f4eacf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46571 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 T@zXamXTXm}*-9=ZdBy$#q>BhK diff --git a/docs/Diagrams/Images/Parser/Parser_ClassDiagram.png b/docs/Diagrams/Images/Parser/Parser_ClassDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..0e14db32319fe8a04a60bc6931a15e44c5749a3f GIT binary patch literal 91062 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 z z%OP#nKah$xWm(ovu@l96?DWi3z@Y8WRe*W8iAGV~V?`Exefg+*2 ztc)s4697d;*H!}y0QHbBnaqQJR<=$AI7{k27T171pN>}&)id{>>REN&+O-6$iRDWX zyaZ5-ZQr1F^=!U*o%cTb8eIkHBa1g5KT3CzHOMkx~&>QJWXeNyW{JpPpu!C(iFW3KxxGuQw-5Pe&vlDULbVL%vgr0B2KMi`;2xF9i)l0n+yyoUA2$SOsaB=hLM< zw^mgX32y+YcDG$wYx1)E!|1<0Q=!?*SXivGBCq zIGr|zv~{UZ1_zJh(srO_tGaz#>FAw1w<4H1SFJ+3dqwHGlZuvK;}2#;#l*}6+(W
NIQ&+q6_ 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%0DeIMhK3J{cIGv_z)X{?_wEIO6-_-|;PHipOVXE| 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 E2b&>6TmS$7 literal 0 HcmV?d00001 diff --git a/docs/Diagrams/PUML files/AddCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml similarity index 100% rename from docs/Diagrams/PUML files/AddCommand_SequenceDiagram.puml rename to docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml diff --git a/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML b/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML new file mode 100644 index 0000000000..2adee39dca --- /dev/null +++ b/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML @@ -0,0 +1,65 @@ +@startuml + +package "parser" { + class Parser { + -logger: Logger + +parseInput(String): Command + +prepareHelp(String): Command + +prepareAdd(String): Command + +prepareDelete(String): Command + +prepareSell(String): Command + +prepareFind(String): Command + +prepareEdit(String): Command + +preparePromotion(String): Command + +prepareDeletePromo(String): Command + +prepareItemList(String): Command + +preparePromotionList(): Command + +prepareMark(String): Command + +prepareUnmark(String): Command + +prepareTransactionList(String): Command + +prepareLowStock(String): Command + } +} + +package "command" { + class Command +} + +package "common" { + class HelpMessages + class Messages +} + +package "exceptions" { + class CommandFormatException + class EditException + class InvalidDateException +} + +package "itemlist" { + class Cashier + class Itemlist +} + +package "promotion" { + enum Month + class Promotionlist +} + +Parser --> Command +Parser --> Logger +Parser --> HelpMessages +Parser --> Messages +Parser --> CommandFormatException +Parser --> EditException +Parser --> InvalidDateException +Parser --> Cashier +Parser --> Itemlist +Parser --> Month +Parser --> Promotionlist + +Parser *-- Command + +EditException --> CommandFormatException + +@enduml From a957bbc713d884ebc3c723b02474cabdad7e467b Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 01:51:28 +0800 Subject: [PATCH 363/421] update UG --- docs/UserGuide.md | 47 +++++++++++++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 18 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 96d025e4d7..cb805c5d8f 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -221,6 +221,16 @@ Example of usage: list_promotions ``` +### Low Stock Reminder: `low_stock` +lists all out-of-stock items and low-in-stock items.
+An item is considered low-in-stock if its quantity is below the stated threshold amount. + +Format: `low_stock /AMOUNT` + +Example of usage: +``` +low_stock /15 +``` ### List all available commands: `help` Lists all commands as per the command summary below. @@ -251,21 +261,22 @@ the application. ## Command Summary -| Action | Format, Examples | -|------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Add item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | -| Delete item | `del ITEM_NAME`
`e.g. del Apple` | -| Edit item | `edit [ITEM_NAME] [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | -| Find item | `find KEYWORD`
`e.g. find University` | -| Sell item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | -| Mark item | `mark ITEM_NAME` | -| Unmark item | `unmark ITEM_NAME` | -| List Inventory | `list_items [marked] [cat/CATEGORY]` | -| Get Best Seller | `bestseller` | -| Get Profit | `total_profit` | -| Get Revenue | `total_revenue` | -| Create Promotion | `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR]time /from [TIME] /to [TIME]`
`e.g. promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500` | -| Delete Promotion | `del_promo ITEM_NAME`
`e.g. del_promo apple` | -| List Promotion | `list_promotions` | -| Help | `help [c/COMMAND]` | -| Exit | `exit` | +| Action | Format, Examples | +|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | +| Delete item | `del ITEM_NAME`
`e.g. del Apple` | +| Edit item | `edit [ITEM_NAME] [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | +| Find item | `find KEYWORD`
`e.g. find University` | +| Sell item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | +| Mark item | `mark ITEM_NAME` | +| Unmark item | `unmark ITEM_NAME` | +| List Inventory | `list_items [marked] [cat/CATEGORY]` | +| Get Best Seller | `bestseller` | +| Get Profit | `total_profit` | +| Get Revenue | `total_revenue` | +| Create Promotion | `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR]time /from [TIME] /to [TIME]`
`e.g. promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500` | +| Delete Promotion | `del_promo ITEM_NAME`
`e.g. del_promo apple` | +| List Promotion | `list_promotions` | +| Low Stock Reminder | `low_stock /AMOUNT` | +| Help | `help [c/COMMAND]` | +| Exit | `exit` | From 78d5d1050ce699ffcbc3a68e8fa54fe7e2cb0f0a Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 02:55:11 +0800 Subject: [PATCH 364/421] help, sell and lowstock command tests --- src/main/java/command/HelpCommand.java | 8 +- src/test/java/command/HelpCommandTest.java | 174 +++++++++++++++++- .../java/command/LowStockCommandTest.java | 88 +++++++++ src/test/java/command/SellCommandTest.java | 33 +++- 4 files changed, 292 insertions(+), 11 deletions(-) create mode 100644 src/test/java/command/LowStockCommandTest.java diff --git a/src/main/java/command/HelpCommand.java b/src/main/java/command/HelpCommand.java index e70df9e058..867130562a 100644 --- a/src/main/java/command/HelpCommand.java +++ b/src/main/java/command/HelpCommand.java @@ -20,7 +20,7 @@ public void execute() { case "NA": System.out.println(HelpMessages.HELP); break; - case "list_items": + case "list items": System.out.println(HelpMessages.HELP_LIST_ITEMS); break; case "add": @@ -47,10 +47,10 @@ public void execute() { case "bestseller": System.out.println(HelpMessages.HELP_BESTSELLER); break; - case "total_profit": + case "total profit": System.out.println(HelpMessages.HELP_TOTAL_PROFIT); break; - case "total_revenue": + case "total revenue": System.out.println(HelpMessages.HELP_TOTAL_REVENUE); break; case "promotion": @@ -68,7 +68,7 @@ public void execute() { case "exit": System.out.println(HelpMessages.HELP_EXIT); break; - case "list_transactions": + case "list transactions": System.out.println(HelpMessages.HELP_LIST_TRANSACTIONS); break; default: diff --git a/src/test/java/command/HelpCommandTest.java b/src/test/java/command/HelpCommandTest.java index fa31c0ccff..6228927891 100644 --- a/src/test/java/command/HelpCommandTest.java +++ b/src/test/java/command/HelpCommandTest.java @@ -1,6 +1,7 @@ package command; import common.HelpMessages; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.ByteArrayOutputStream; @@ -9,13 +10,174 @@ import static org.junit.jupiter.api.Assertions.assertEquals; public class HelpCommandTest { - @Test - public void testExecute() { - ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { System.setOut(new PrintStream(outputStreamCaptor)); - HelpCommand helpCommand = new HelpCommand("NA"); + } + + @Test + public void testExecuteWithInvalidCommand() { + String command = "invalid_command"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.INVALID_HELP_COMMAND + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithNoCommand() { + String command = "NA"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithBlank() { + String command = " "; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.INVALID_HELP_COMMAND + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithListItemsCommand() { + String command = "list items"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_LIST_ITEMS + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithAddCommand() { + String command = "add"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_ADD + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithSellCommand() { + String command = "sell"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_SELL + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithEditCommand() { + String command = "edit"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_EDIT + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithFindCommand() { + String command = "find"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_FIND + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithMarkCommand() { + String command = "mark"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_MARK + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithUnmarkCommand() { + String command = "unmark"; + HelpCommand helpCommand = new HelpCommand(command); helpCommand.execute(); - String expectedOutput = HelpMessages.HELP + System.lineSeparator(); - assertEquals(expectedOutput, outputStreamCaptor.toString()); + assertEquals(HelpMessages.HELP_UNMARK+ System.lineSeparator(), outputStreamCaptor.toString()); } + + @Test + public void testExecuteWithDeleteCommand() { + String command = "delete"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_DEL + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithBestSellerCommand() { + String command = "bestseller"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_BESTSELLER + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithTotalProfitCommand() { + String command = "total profit"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_TOTAL_PROFIT + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithTotalRevenueCommand() { + String command = "total revenue"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_TOTAL_REVENUE + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithPromotionCommand() { + String command = "promotion"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_PROMOTION + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithDeletePromotionCommand() { + String command = "delete promotion"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_DEL_PROMO + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithListPromotionCommand() { + String command = "list promotion"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_LIST_PROMO + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithLowStockCommand() { + String command = "low stock"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_LOW_STOCK + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithListTransactionsCommand() { + String command = "list transactions"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_LIST_TRANSACTIONS + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithExitCommand() { + String command = "exit"; + HelpCommand helpCommand = new HelpCommand(command); + helpCommand.execute(); + assertEquals(HelpMessages.HELP_EXIT + System.lineSeparator(), outputStreamCaptor.toString()); + } + } + diff --git a/src/test/java/command/LowStockCommandTest.java b/src/test/java/command/LowStockCommandTest.java new file mode 100644 index 0000000000..1214edb8cf --- /dev/null +++ b/src/test/java/command/LowStockCommandTest.java @@ -0,0 +1,88 @@ +package command; + +import item.Item; +import itemlist.Itemlist; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +public class LowStockCommandTest { + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } + + @Test + public void testExecuteNoItemsLowOnStock() { + new LowStockCommand(5).execute(); + assertEquals("Out-of-stock Items:" + System.lineSeparator() + + "No items out of stock" + System.lineSeparator() + + "Low-on-stock Items: (less than 5)" + System.lineSeparator() + + "No items low on stock" + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithItemsLowOnStock() { + new AddCommand("Item1", 3, "pcs", "testCat", 1, 2).execute(); + new AddCommand("Item2", 1, "pcs", "testCat", 1, 2).execute(); + new LowStockCommand(5).execute(); + assertEquals("added: item1 (Qty: 3 pcs, Buy: $1.00, Sell: $2.00) to testCat" + System.lineSeparator() + + "added: item2 (Qty: 1 pcs, Buy: $1.00, Sell: $2.00) to testCat" + System.lineSeparator() + + "Out-of-stock Items:" + System.lineSeparator() + + "No items out of stock" + System.lineSeparator() + + "Low-on-stock Items: (less than 5)" + System.lineSeparator() + + "Item1" + System.lineSeparator() + + "Item2" + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithNoItemsOutOfStock() { + new AddCommand("Item1", 100, "pcs", "testCat", 1, 2).execute(); + new AddCommand("Item2", 50, "pcs", "testCat", 1, 2).execute(); + new LowStockCommand(5).execute(); + assertEquals("added: item1 (Qty: 100 pcs, Buy: $1.00, Sell: $2.00) to testCat" + System.lineSeparator() + + "added: item2 (Qty: 50 pcs, Buy: $1.00, Sell: $2.00) to testCat" + System.lineSeparator() + + "Out-of-stock Items:" + System.lineSeparator() + + "No items out of stock" + System.lineSeparator() + + "Low-on-stock Items: (less than 5)" + System.lineSeparator() + + "No items low on stock" + System.lineSeparator(), outputStreamCaptor.toString()); + } + + @Test + public void testExecuteWithItemsOutOfStockAndLowOnStock() { + new AddCommand("Item1", 3, "pcs", "testCat", 1, 2).execute(); + new AddCommand("Item2", 10, "pcs", "testCat", 1, 2).execute(); + new LowStockCommand(5).execute(); + assertEquals("added: item1 (Qty: 3 pcs, Buy: $1.00, Sell: $2.00) to testCat" + System.lineSeparator() + + "added: item2 (Qty: 10 pcs, Buy: $1.00, Sell: $2.00) to testCat" + System.lineSeparator() + + "Out-of-stock Items:" + System.lineSeparator() + + "No items out of stock" + System.lineSeparator() + + "Low-on-stock Items: (less than 5)" + System.lineSeparator() + + "Item1" + System.lineSeparator(), outputStreamCaptor.toString()); + } +} diff --git a/src/test/java/command/SellCommandTest.java b/src/test/java/command/SellCommandTest.java index 0b5491c980..7219f2badb 100644 --- a/src/test/java/command/SellCommandTest.java +++ b/src/test/java/command/SellCommandTest.java @@ -11,14 +11,45 @@ import storage.Storage; import storage.TransactionLogs; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.fail; public class SellCommandTest { @Test - public void sellItemTest() { + public void testExecuteItemNotFound() { + SellCommand sellCommand = new SellCommand("Nonexistent Item", 5, 0.1f); + try { + sellCommand.execute(); + } catch (CommandFormatException e) { + assertEquals("Item not found!", e.getMessage()); + } + } + + @Test + public void testExecuteInsufficientStock() { + SellCommand sellCommand = new SellCommand("Low Stock Item", 10, 0.1f); + try { + sellCommand.execute(); + } catch (CommandFormatException e) { + assertEquals("There is insufficient stock!", e.getMessage()); + } + } + + @Test + public void testExecuteSuccessfulSale() { + SellCommand sellCommand = new SellCommand("Available Item", 3, 0.1f); try { + sellCommand.execute(); + } catch (CommandFormatException e) { + fail("No exception should be thrown for a successful sale."); + } + } + + @Test + public void sellItemTest() { + try { Command sellCommandTest1 = new SellCommand("testItem", 1, 3); Command sellCommandTest2 = new SellCommand("testItem", 7, 14); sellCommandTest1.execute(); From 008598971c1d3e208391e04e757c03b78af5159f Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 03:14:54 +0800 Subject: [PATCH 365/421] Edit Find Command --- src/main/java/command/FindCommand.java | 71 ++++++++++++++----- src/main/java/common/Messages.java | 6 +- .../exceptions/CommandFormatException.java | 3 + src/main/java/parser/Parser.java | 10 +-- src/main/java/parser/ParserFormat.java | 2 +- 5 files changed, 63 insertions(+), 29 deletions(-) diff --git a/src/main/java/command/FindCommand.java b/src/main/java/command/FindCommand.java index 69924763ca..377ce44643 100644 --- a/src/main/java/command/FindCommand.java +++ b/src/main/java/command/FindCommand.java @@ -1,6 +1,7 @@ //@@author HengShuHong package command; +import exceptions.CommandFormatException; import exceptions.EmptyListException; import item.Item; import itemlist.Itemlist; @@ -35,7 +36,7 @@ public String getKeyword() { @Override public void execute() throws EmptyListException { if (itemInfo.equals("NA")) { - itemInfo = "item + qty + uom + cat + buy + sell"; + itemInfo = "item/qty/uom/cat/buy/sell"; } try { ArrayList searchList = filterList(); @@ -43,6 +44,8 @@ public void execute() throws EmptyListException { LOGGER.info("Itemlist successfully filtered."); } catch (EmptyListException e) { LOGGER.warning("EMPTY LIST"); + } catch (CommandFormatException e) { + LOGGER.warning("INVALID FILTER"); } } @@ -52,34 +55,66 @@ public void execute() throws EmptyListException { * @return a list of items that matches the filter and the keyword * @throws EmptyListException when the filtered list is empty (nothing found) */ - public ArrayList filterList() throws EmptyListException { + public ArrayList filterList() throws EmptyListException, CommandFormatException { ArrayList searchList = new ArrayList<>(); + String [] getFilter = itemInfo.split("/"); + for (String s : getFilter) { + String filter = s.toLowerCase(); + switch (filter) { + case "item": //fall through + case "qty": //fall through + case "uom": //fall through + case "cat": //fall through + case "buy": //fall through + case "sell": + filterItemsBySingleFilter(searchList, filter, keyword); + break; + default: + throw new CommandFormatException("INVALID_FILTER"); + } + } + if (searchList.isEmpty()) { + LOGGER.warning("Item not found."); + throw new EmptyListException("Item"); + } + return searchList; + } + + private void filterItemsBySingleFilter(ArrayList searchList, String filter, String keyword) { for (Item item : Itemlist.getItems()) { - if (itemInfo.toLowerCase().contains("item") && item.getItemName().toLowerCase().contains(keyword)) { - searchList.add(String.valueOf(item)); + if (searchList.contains(String.valueOf(item))) { + continue; } - if (itemInfo.toLowerCase().contains("qty") && Integer.toString(item.getQuantity()).equals(keyword)) { + if (filter.equalsIgnoreCase("item") && item.getItemName().toLowerCase().contains(keyword)) { searchList.add(String.valueOf(item)); + continue; } - if (itemInfo.toLowerCase().contains("uom") && item.getUnitOfMeasurement().toLowerCase().contains(keyword)) { + if (filter.equalsIgnoreCase("qty") && Integer.toString(item.getQuantity()).equals(keyword)) { searchList.add(String.valueOf(item)); + continue; } - if (item.getCategory() != null) { - if (itemInfo.toLowerCase().contains("cat") && item.getCategory().toLowerCase().contains(keyword)) { - searchList.add(String.valueOf(item)); - } - } - if (itemInfo.toLowerCase().contains("buy") && Float.toString(item.getBuyPrice()).equals(keyword)) { + if (filter.equalsIgnoreCase("uom") && item.getUnitOfMeasurement().toLowerCase().contains(keyword)) { searchList.add(String.valueOf(item)); + continue; } - if (itemInfo.toLowerCase().contains("sell") && Float.toString(item.getSellPrice()).equals(keyword)) { + if (item.getCategory() != null && filter.equalsIgnoreCase("cat") && item.getCategory().toLowerCase(). + contains(keyword)) { searchList.add(String.valueOf(item)); + continue; + } + try { + if (filter.equalsIgnoreCase("buy") && Math.abs(item.getBuyPrice() - Float.parseFloat(keyword)) + <= 0.01f) { + searchList.add(String.valueOf(item)); + continue; + } + if (filter.equalsIgnoreCase("sell") && Math.abs(item.getSellPrice() - Float.parseFloat(keyword)) + <= 0.01f) { + searchList.add(String.valueOf(item)); + } + } catch (NumberFormatException e) { + LOGGER.info("Keyword contains non numeric characters"); } } - if (searchList.isEmpty()) { - LOGGER.warning("Item not found."); - throw new EmptyListException("Item"); - } - return searchList; } } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index c80cd4bb68..769269544c 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -260,6 +260,8 @@ public class Messages { public static final String INVALID_TIME = "Invalid Time Format. Please ensure that the time is in 24 hours " + "format and have a valid range:" + "\n" + "e.g. time /from 0000 /to 2359"; + public static final String INVALID_FILTER = "Invalid Filter is used. Filters can only be " + + "[item, qty, cat, uom, buy, sell] and must be in the following format /[filter1]/[filter2] etc."; public static final String INVALID_DATE = "Invalid Date has been entered. Please ensure that the date exists."; public static final String INVALID_MONTH = "Invalid Month has been entered. Please use format: MMM (e.g. JAN, DEC)"; @@ -287,8 +289,8 @@ public class Messages { "add a new one."; public static final String INVALID_PROMOTION_FORMAT = "Invalid Command Format. Please use format:\n" + - "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DATE] /to [END_DATE] time /from [START_TIME]" + - " /to [END_TIME]"; + "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DATE] /to [END_DATE] time /from [START_TIME]" + + " /to [END_TIME]"; public static final String INVALID_LOW_STOCK_FORMAT = "Invalid Command Format. Please use format: " + "low_stock /AMOUNT"; diff --git a/src/main/java/exceptions/CommandFormatException.java b/src/main/java/exceptions/CommandFormatException.java index 4e018b265f..d7f17f4cf5 100644 --- a/src/main/java/exceptions/CommandFormatException.java +++ b/src/main/java/exceptions/CommandFormatException.java @@ -65,6 +65,9 @@ public CommandFormatException(String error) { case "INVALID_DISCOUNT": System.out.println(Messages.INVALID_DISCOUNT); break; + case "INVALID_FILTER": + System.out.println(Messages.INVALID_FILTER); + break; case "INVALID_ITEM_NAME": System.out.println(Messages.INVALID_ITEM_NAME); break; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 309c1085c2..3134c53b8b 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -322,17 +322,11 @@ private Command prepareSell(String args) throws CommandFormatException{ */ private Command prepareFind(String args) throws CommandFormatException{ final Matcher matcher = ParserFormat.FIND_COMMAND_FORMAT.matcher(args.trim()); + // Validate arg string format - if (!matcher.matches()) { + if (!matcher.find()) { throw new CommandFormatException(CommandType.FIND); } - /*StringBuilder filters = new StringBuilder(); - for (int i = 1; i <= matcher.groupCount("itemInfo"); i++) { - String segment = matcher.group("info" + i); - if (segment != null) { - filters.append(segment); - } - }*/ String itemInfo = matcher.group("itemInfo") != null ? matcher.group("itemInfo").toLowerCase() : "NA"; return new FindCommand( itemInfo, diff --git a/src/main/java/parser/ParserFormat.java b/src/main/java/parser/ParserFormat.java index b142291ef4..2c6ef453e0 100644 --- a/src/main/java/parser/ParserFormat.java +++ b/src/main/java/parser/ParserFormat.java @@ -23,7 +23,7 @@ public class ParserFormat { Pattern.compile("sell (?[^/]+) qty/(?\\d+)"); public static final Pattern FIND_COMMAND_FORMAT = - Pattern.compile("find(?: /(?[^/]+))* (?[^/]+)"); + Pattern.compile("find(?:\\s/(?[^/]+(?:/[^/]+)*))\\s(?[^/]+)"); public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); From 6914fba2426a2f5e4e623688a516805c97af456e Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 03:15:11 +0800 Subject: [PATCH 366/421] Edit Promotion --- StockMasterData.txt | 2 -- src/main/java/command/AddPromotionCommand.java | 5 +---- src/main/java/promotion/Promotionlist.java | 6 ++---- 3 files changed, 3 insertions(+), 10 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 0b8ea9f22e..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +0,0 @@ -1. | [ ] | testing item 11 | Qty: 2347634 t | Cat: t | BuyPrice: $12.00 | SellPrice: $23.00 -2. | [ ] | testingitem2 | Qty: 321 t | Cat: t | BuyPrice: $123.00 | SellPrice: $321.00 diff --git a/src/main/java/command/AddPromotionCommand.java b/src/main/java/command/AddPromotionCommand.java index bfa6d4cb53..a81e54723a 100644 --- a/src/main/java/command/AddPromotionCommand.java +++ b/src/main/java/command/AddPromotionCommand.java @@ -3,8 +3,6 @@ import exceptions.CommandFormatException; import exceptions.InvalidDateException; -import item.Item; -import itemlist.Itemlist; import promotion.Month; import promotion.Promotion; import promotion.Promotionlist; @@ -23,9 +21,8 @@ public AddPromotionCommand( int endDate, Month endMonth, int endYear, int startTime, int endTime) { - Item item = Itemlist.getItem(itemName); this.promotion = new Promotion( - item.getItemName(), discount, + itemName, discount, startDate, startMonth, startYear, endDate, endMonth, endYear, startTime, endTime); diff --git a/src/main/java/promotion/Promotionlist.java b/src/main/java/promotion/Promotionlist.java index 26d1a5f959..3bb300401e 100644 --- a/src/main/java/promotion/Promotionlist.java +++ b/src/main/java/promotion/Promotionlist.java @@ -8,7 +8,6 @@ import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.logging.Level; import java.util.logging.Logger; public class Promotionlist { @@ -113,7 +112,7 @@ public static boolean isPromoExistNow(String itemName) { int day = currentDateTime.getDayOfMonth(); int hour = currentDateTime.getHour(); int minute = currentDateTime.getMinute(); - String formattedTime = String.valueOf(hour) + String.valueOf(minute); + String formattedTime = String.format("%02d%02d", hour, minute); int time = Integer.parseInt(formattedTime); if (time < promotion.getStartTime() || time > promotion.getEndTime()) { return false; @@ -141,8 +140,7 @@ public static boolean isPromoExistNow(String itemName) { } return true; } - LOGGER.log(Level.SEVERE, "Unable to create promotion"); - return false; + return true; } From 2d10131a03d3d970028bafc5904ba948e7265ca7 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 03:31:10 +0800 Subject: [PATCH 367/421] Fix Find junit test --- src/main/java/parser/Parser.java | 2 +- src/test/java/command/FindCommandTest.java | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index 8478caaf1f..daf8a8a9b3 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -333,7 +333,7 @@ private Command prepareFind(String args) throws CommandFormatException{ final Matcher matcher = ParserFormat.FIND_COMMAND_FORMAT.matcher(args.trim()); // Validate arg string format - if (!matcher.find()) { + if (!matcher.matches()) { throw new CommandFormatException(CommandType.FIND); } String itemInfo = matcher.group("itemInfo") != null ? matcher.group("itemInfo").toLowerCase() : "NA"; diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index b7922cb21e..7767124163 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -28,17 +28,18 @@ public void findCommandTest() throws CommandFormatException, InvalidDateExceptio "NA", 1, 10); Command findCommand = new FindCommand("item","testItem"); Command findCommand2 = new FindCommand("NA","failFindCommand"); - Command findCommand3 = new FindCommand("qtybuysell","1"); + Command findCommand3 = new FindCommand("qty/buy/sell","1"); try { addCommandTest1.execute(); findCommand.execute(); findCommand2.execute(); findCommand3.execute(); - String expectedOutput1 = "added: testItem (Qty: 1 EA, Buy: $1, Sell: $1)" - + System.lineSeparator() + - "testItem (Qty: 1 EA, Buy: $1, Sell: $1)" + System.lineSeparator() + + String expectedOutput1 = "added: testitem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + + System.lineSeparator() + "List: " + System.lineSeparator() + + "1. [ ] testItem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + System.lineSeparator() + Messages.EMPTY_ITEM_LIST + System.lineSeparator() + - "testItem (Qty: 1 EA, Buy: $1, Sell: $1)" + System.lineSeparator(); + "List: " + System.lineSeparator() + + "1. [ ] testItem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + System.lineSeparator(); assertEquals(expectedOutput1, outputStreamCaptor.toString()); } catch (EmptyListException e) { return; From e28e7480e1c8492c76a9f93526e35ff75358d4c3 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 03:32:57 +0800 Subject: [PATCH 368/421] addcommand tests --- src/test/java/command/AddCommandTest.java | 61 ++++++++++++++++------- 1 file changed, 44 insertions(+), 17 deletions(-) diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index 5f5d4749c5..c21ab6445f 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -1,36 +1,63 @@ package command; -import exceptions.CommandFormatException; -import exceptions.EmptyListException; -import exceptions.InvalidDateException; +import item.Item; import itemlist.Itemlist; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import promotion.Promotionlist; import storage.PromotionStorage; import storage.Storage; import storage.TransactionLogs; -import static org.junit.jupiter.api.Assertions.fail; +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.util.ArrayList; +import java.util.List; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; public class AddCommandTest { + + private final PrintStream standardOut = System.out; + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + @Test - public void addItemTest() { - try { - Command addCommandTest1 = new AddCommand("testItem", 1, "EA", - "NA", 1, 10); - Command addCommandTest2 = new AddCommand("testItem", 7, "EA", - "NA", 1, 10); - addCommandTest1.execute(); - addCommandTest2.execute(); - } catch (CommandFormatException e) { - fail("Unable to add item."); - } catch (InvalidDateException | EmptyListException e) { - throw new RuntimeException(e); - } + public void testExecuteNewItemAddedSuccessfully() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + assertEquals(1, Itemlist.getItems().size()); + } + @Test + public void testExecuteNewItemAddedWithDefaultCategory() { + new AddCommand("TestItem", 10, "pcs", "NA", 5.0f, 10.0f).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00)" + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + assertEquals(1, Itemlist.getItems().size()); } + @Test + public void testExecuteExistingItemEditedSuccessfully() { + new AddCommand("TestItem", 10, "pcs", "NA", 5.0f, 10.0f).execute(); + new AddCommand("TestItem", 15, "pcs", "NA", 6.0f, 12.0f).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00)" + System.lineSeparator() + + "Item already exists and item information has been updated" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Quantity of TestItem from 10 to 25" + System.lineSeparator() + + "Buy Price of TestItem from 5.0 to 6.00" + System.lineSeparator() + + "Sell Price of TestItem from 10.0 to 12.00" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + assertEquals(1, Itemlist.getItems().size()); + } @AfterEach void tearDown() { // This will be run after each test, cleaning up From 10697b70297a06dd936299ded0fb8571125d58e5 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 03:35:33 +0800 Subject: [PATCH 369/421] checkstyle edits --- src/test/java/command/AddCommandTest.java | 8 +++----- src/test/java/command/LowStockCommandTest.java | 3 --- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/test/java/command/AddCommandTest.java b/src/test/java/command/AddCommandTest.java index c21ab6445f..bc51ef9ae7 100644 --- a/src/test/java/command/AddCommandTest.java +++ b/src/test/java/command/AddCommandTest.java @@ -1,6 +1,5 @@ package command; -import item.Item; import itemlist.Itemlist; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -12,11 +11,9 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.util.ArrayList; -import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; + public class AddCommandTest { @@ -31,7 +28,8 @@ public void setUp() { @Test public void testExecuteNewItemAddedSuccessfully() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator(); assertEquals(expectedOutput, outputStreamCaptor.toString()); assertEquals(1, Itemlist.getItems().size()); } diff --git a/src/test/java/command/LowStockCommandTest.java b/src/test/java/command/LowStockCommandTest.java index 1214edb8cf..08d8ecd901 100644 --- a/src/test/java/command/LowStockCommandTest.java +++ b/src/test/java/command/LowStockCommandTest.java @@ -1,6 +1,5 @@ package command; -import item.Item; import itemlist.Itemlist; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -12,8 +11,6 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; -import java.util.ArrayList; -import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; From 9f0a69739560f03b73f35855fa5a8f74ec070dfd Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 03:38:45 +0800 Subject: [PATCH 370/421] Fix Parser Test --- docs/UserGuide.md | 6 +++--- src/main/java/parser/ParserFormat.java | 2 +- src/test/java/command/FindCommandTest.java | 2 +- src/test/java/parser/ParserTest.java | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index cb805c5d8f..e3e2a5ef3c 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -190,17 +190,17 @@ You have earned {REVENUE} in revenue so far. ### Add promotion to items: `promotion` Creates a promotion for items that changes the sell price. -Format: `promotion ITEM_NAME discount/DISCOUNT period /from DATE MONTH YEAR /to DATE MONTH YEAR +Format: `promotion ITEM_NAME discount/DISCOUNT period /from DAY MONTH YEAR /to DAY MONTH YEAR time /from START_TIME /to END_TIME` * `DISCOUNT` ranges from 0 to 100 and can take in up to 2 decimal place. * Format for `MONTH` is 3 alphabets `MMM`. E.g. For January, `Jan`. For December, `Dec`. -* `DATE` must be a valid for the specific `[MONTH]` E.g. `30 Feb 2024` is not allowed. +* `DAY` must be a valid for the specific `[MONTH]` E.g. `30 Feb 2024` is not allowed. * `START_TIME` & `END_TIME` must range from 0000 to 2359. In addition, time range must be valid. Example of usage: ``` -promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500 +promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2025 time /from 0000 /to 2359 ``` ### Delete a promotion: `del_promo` Deletes a promotion for an item. diff --git a/src/main/java/parser/ParserFormat.java b/src/main/java/parser/ParserFormat.java index 2c6ef453e0..28d7e81baf 100644 --- a/src/main/java/parser/ParserFormat.java +++ b/src/main/java/parser/ParserFormat.java @@ -23,7 +23,7 @@ public class ParserFormat { Pattern.compile("sell (?[^/]+) qty/(?\\d+)"); public static final Pattern FIND_COMMAND_FORMAT = - Pattern.compile("find(?:\\s/(?[^/]+(?:/[^/]+)*))\\s(?[^/]+)"); + Pattern.compile("find(?:\\s/(?[^/]+(?:/[^/]+)*))?\\s(?[^/]+)"); public static final Pattern BASIC_COMMAND_FORMAT = Pattern.compile("(?\\S+)(?.*)"); diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index 7767124163..acdbe346dd 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -28,7 +28,7 @@ public void findCommandTest() throws CommandFormatException, InvalidDateExceptio "NA", 1, 10); Command findCommand = new FindCommand("item","testItem"); Command findCommand2 = new FindCommand("NA","failFindCommand"); - Command findCommand3 = new FindCommand("qty/buy/sell","1"); + Command findCommand3 = new FindCommand("qty/buy/sell/uom/cat","1"); try { addCommandTest1.execute(); findCommand.execute(); diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index ddc8320802..a841d826d3 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -669,11 +669,11 @@ public void testParseFindCommand() { @Test public void testPrepareFindCommand() { // Test valid find command - String userInput = "find /itemInfo Keyword"; + String userInput = "find /item Keyword"; Command command = parser.parseInput(userInput); assertTrue(command instanceof FindCommand); FindCommand findCommand = (FindCommand) command; - assertEquals("iteminfo", findCommand.getItemInfo()); + assertEquals("item", findCommand.getItemInfo()); assertEquals("keyword", findCommand.getKeyword()); // Test find command without specifying item info From cefeb07613adde2e4843214adaeeea1ea4d7d6a0 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 03:43:42 +0800 Subject: [PATCH 371/421] Add Junit Test for Find Command --- src/test/java/command/FindCommandTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/test/java/command/FindCommandTest.java b/src/test/java/command/FindCommandTest.java index acdbe346dd..f01d669c42 100644 --- a/src/test/java/command/FindCommandTest.java +++ b/src/test/java/command/FindCommandTest.java @@ -29,16 +29,20 @@ public void findCommandTest() throws CommandFormatException, InvalidDateExceptio Command findCommand = new FindCommand("item","testItem"); Command findCommand2 = new FindCommand("NA","failFindCommand"); Command findCommand3 = new FindCommand("qty/buy/sell/uom/cat","1"); + Command findCommand4 = new FindCommand("buy/sell/uom/cat","1"); try { addCommandTest1.execute(); findCommand.execute(); findCommand2.execute(); findCommand3.execute(); + findCommand4.execute(); String expectedOutput1 = "added: testitem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + System.lineSeparator() + "List: " + System.lineSeparator() + "1. [ ] testItem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + System.lineSeparator() + Messages.EMPTY_ITEM_LIST + System.lineSeparator() + "List: " + System.lineSeparator() + + "1. [ ] testItem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + System.lineSeparator() + + "List: " + System.lineSeparator() + "1. [ ] testItem (Qty: 1 EA, Buy: $1.00, Sell: $10.00)" + System.lineSeparator(); assertEquals(expectedOutput1, outputStreamCaptor.toString()); } catch (EmptyListException e) { From f83d093f5d363498c790c793fffa4cde614e0a6f Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 11:31:07 +0800 Subject: [PATCH 372/421] PPP update --- docs/team/Joellimjr.md | 36 ----------------------------- docs/team/joellimjr.md | 51 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 36 deletions(-) delete mode 100644 docs/team/Joellimjr.md create mode 100644 docs/team/joellimjr.md diff --git a/docs/team/Joellimjr.md b/docs/team/Joellimjr.md deleted file mode 100644 index 84a37bc875..0000000000 --- a/docs/team/Joellimjr.md +++ /dev/null @@ -1,36 +0,0 @@ -# Lim Jing Rong, Joel's Project Portfolio Page - - -## Project: StockMaster - -StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them -manage and operate their business. - - -### Code Contribution - -- **New Feature:** - - What it does: - - Justification: - - Highlights: - - -- **New Feature:** - - What it does: - - Justification: - - Highlights: - -- **New Feature:** - - What it does: - - Justification: - -- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Joellimjr&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) - -- **Documentation** - - User Guide: - - - - - - - - Developer Guide: - - - - \ No newline at end of file diff --git a/docs/team/joellimjr.md b/docs/team/joellimjr.md new file mode 100644 index 0000000000..fe3835683a --- /dev/null +++ b/docs/team/joellimjr.md @@ -0,0 +1,51 @@ +# Lim Jing Rong, Joel's Project Portfolio Page + + +## Project: StockMaster + +StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them +manage and operate their business. + + +### Code Contribution + +- **New Feature:** Added Parser feature + - What it does: Parses user inputs, and extracts the command word. Then, checks + if the input matches the required format for the relevant command. It then + trims the inputs, converts strings to lowercase, and ensures numbers are of an + appropriate value, throwing exceptions if it fails. + - Justification: This feature centralises the processing of the user input and + filters any erroneous inputs. This allows the commands themselves to be more + streamlined as the parameters required would be prepared and checked in advance. + - Highlights: This feature was challenging as it had to be updated constantly throughout + the StockMaster's development, while working closely with other team members to + understand the requirements of their features, especially regarding exception handling. + + +- **New Feature:** Added the ability to sell items + - What it does: Sells a stated quantity of an existing item and calculates the total amount + of money earned. It then updates the remaining quantity of the item in stock. + - Justification: This feature allows users to easily update the stock of an item when it is + sold. It also enables the cashier and transaction classes to keep track + of when and what items were sold, and how much they were sold for. + + +- **New Feature:** Added the low-stock reminder + - What it does: It lists all items that are out of stock and low in stock. The threshold + for what is considered low in stock can be set by the user when calling the low stock + command. The reminder is also run automatically during StockMaster's start-up process + with a default low stock threshold of 10. + - Justification: It reminds the user upon starting up the app to restock out-of-stock items + and warn the user about the items that are running low in stock. + + +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Joellimjr&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + + +- **Documentation** + - User Guide: + - Added documentation for the features `del`,`sell` and `low_stock` + - Update the command summary + - Developer Guide: + - Added implementation details and class diagram of the `Parser` class. + - Added implementation details and sequence diagram of the `add` feature. \ No newline at end of file From a2b40c48523b8b52901522e58b2e5f76ece5ddeb Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 14:07:05 +0800 Subject: [PATCH 373/421] Update EmptyListException --- docs/team/lowtl.md | 26 ++++++++++++++----- src/main/java/command/ListCommand.java | 2 +- .../java/exceptions/EmptyListException.java | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/docs/team/lowtl.md b/docs/team/lowtl.md index fce8af4c15..5fd9b02b1a 100644 --- a/docs/team/lowtl.md +++ b/docs/team/lowtl.md @@ -4,16 +4,30 @@ StockMaster is a desktop inventory and management that provides the user with a range of tools and features to help them manage and operate their business. -### Summary of Contribution -* Overall organisation of project -* Logging & some testing -* **New Feature:** `Cashier` class. +**Code Contributed:** +[Reposense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=LowTL&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=LowTL&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=functional-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +### Features implemented +* `Cashier` class. * Allows users to create and store `Transactions`, in an extension of the `item` class. * Contains the `getTotalProfit`, `getTotalRevenue`, and `getBestseller` methods, for basic business analysis. +* Logging for all necessary classes +* Testing for `ListCommand`, `BestsellerCommand`, `TotalProfitCommand` and others. +### Contributions to UG +* Feature guide for functions related to `Cashier` +* Initial version +### Contributions to DG +* Architecture Diagram of overall product +* `Cashier` class + * Implementation + * Class and sequence diagram +### Other contributions +* Reviewing of teammates' code outside of Pull Requests +* Troubleshooting, debugging and catching exceptions. +* Assigning issues to relevant team members +* Organising and Formatting UG and DG -**Code Contributed:** -[Reposense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=LowTL&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=LowTL&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=functional-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) \ No newline at end of file diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 85bb6ad980..6166b52e1c 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -78,7 +78,7 @@ public void execute() throws EmptyListException { showCustomizedItemList(); LOGGER.info("Items listed."); } else { - LOGGER.warning("No items found."); + LOGGER.warning("No results found."); throw new EmptyListException("Empty List"); } } diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index ba92bae009..4ff0f223c7 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -13,7 +13,7 @@ public EmptyListException(String error) { System.out.println(Messages.EMPTY_TRANSACTION_LIST); break; case "Empty List": - System.out.println(Messages.EMPTY_LIST); + System.out.println("No results found."); break; default: System.out.println(error); From 19b9da6402dc13bf14eb47bb47e5191e2bff0dfb Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 14:13:28 +0800 Subject: [PATCH 374/421] Add PUML styling --- docs/Diagrams/PUML files/ArchitectureDiagram.puml | 1 + .../PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml | 2 ++ docs/Diagrams/PUML files/Style.puml | 3 +++ 3 files changed, 6 insertions(+) create mode 100644 docs/Diagrams/PUML files/Style.puml diff --git a/docs/Diagrams/PUML files/ArchitectureDiagram.puml b/docs/Diagrams/PUML files/ArchitectureDiagram.puml index 3fe41960d8..3ca76c432d 100644 --- a/docs/Diagrams/PUML files/ArchitectureDiagram.puml +++ b/docs/Diagrams/PUML files/ArchitectureDiagram.puml @@ -1,4 +1,5 @@ @startuml +!include Style.puml package "StockMaster" { Class TextUi #Blue diff --git a/docs/Diagrams/PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml index f84574bb26..3a8cf09653 100644 --- a/docs/Diagrams/PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/BestsellerCommand_SequenceDiagram.puml @@ -1,4 +1,6 @@ @startuml +!include ../Style.puml + participant BestsellerCommand participant Cashier participant TextUi diff --git a/docs/Diagrams/PUML files/Style.puml b/docs/Diagrams/PUML files/Style.puml new file mode 100644 index 0000000000..fee1d411bc --- /dev/null +++ b/docs/Diagrams/PUML files/Style.puml @@ -0,0 +1,3 @@ +hide footbox +hide members +hide circle \ No newline at end of file From d90f0146ecb1f79e769edf80128dcb932163dd0e Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 14:17:11 +0800 Subject: [PATCH 375/421] Remove unused imports --- src/main/java/command/BestsellerCommand.java | 2 -- src/main/java/item/Transaction.java | 1 - src/main/java/itemlist/Cashier.java | 1 - 3 files changed, 4 deletions(-) diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index 415db12815..d1f0aebd9d 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -1,8 +1,6 @@ package command; -import common.Messages; import exceptions.EmptyListException; -import item.Item; import itemlist.Cashier; import ui.TextUi; diff --git a/src/main/java/item/Transaction.java b/src/main/java/item/Transaction.java index 9a3e435217..c675fea320 100644 --- a/src/main/java/item/Transaction.java +++ b/src/main/java/item/Transaction.java @@ -1,6 +1,5 @@ package item; -import itemlist.Itemlist; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 21fed1ce66..56a1681697 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -1,6 +1,5 @@ package itemlist; -import common.Messages; import exceptions.EmptyListException; import item.Transaction; From 7ecf8b3fd4f8cb206ef8879e036565e0cd79a938 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 14:43:03 +0800 Subject: [PATCH 376/421] Update styling --- .../PUML files/ArchitectureDiagram.puml | 8 +-- docs/Diagrams/PUML files/Style.puml | 67 +++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/docs/Diagrams/PUML files/ArchitectureDiagram.puml b/docs/Diagrams/PUML files/ArchitectureDiagram.puml index 3ca76c432d..e35dca80da 100644 --- a/docs/Diagrams/PUML files/ArchitectureDiagram.puml +++ b/docs/Diagrams/PUML files/ArchitectureDiagram.puml @@ -1,15 +1,15 @@ @startuml !include Style.puml -package "StockMaster" { +package "" as f { Class TextUi #Blue Class Parser #DarkMagenta Class Main #LightSkyBlue Class Storage #Green Class Command #Grey Class Cashier #Orange -Class PromotionList -Class Itemlist #LightGreen +Class PromotionList #Gold +Class Itemlist #Tan } Class User #IndianRed @@ -38,4 +38,4 @@ Storage <-d-> File Storage <-r-> File2 Storage <-d-> File3 -@endumlenduml \ No newline at end of file +@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Style.puml b/docs/Diagrams/PUML files/Style.puml index fee1d411bc..4ece913730 100644 --- a/docs/Diagrams/PUML files/Style.puml +++ b/docs/Diagrams/PUML files/Style.puml @@ -1,3 +1,70 @@ +!define UI_COLOR #1D8900 +!define UI_COLOR_T1 #83E769 +!define UI_COLOR_T2 #3FC71B +!define UI_COLOR_T3 #166800 +!define UI_COLOR_T4 #0E4100 + +!define LOGIC_COLOR #3333C4 +!define LOGIC_COLOR_T1 #C8C8FA +!define LOGIC_COLOR_T2 #6A6ADC +!define LOGIC_COLOR_T3 #1616B0 +!define LOGIC_COLOR_T4 #101086 + +!define MODEL_COLOR #9D0012 +!define MODEL_COLOR_T1 #F97181 +!define MODEL_COLOR_T2 #E41F36 +!define MODEL_COLOR_T3 #7B000E +!define MODEL_COLOR_T4 #51000A + +!define STORAGE_COLOR #A38300 +!define STORAGE_COLOR_T1 #FFE374 +!define STORAGE_COLOR_T2 #EDC520 +!define STORAGE_COLOR_T3 #806600 +!define STORAGE_COLOR_T2 #544400 + +!define USER_COLOR #FFFFFF + +skinparam Package { + BackgroundColor #FFFFFF + BorderThickness 1 + FontSize 16 +} + +skinparam Class { + FontColor #FFFFFF + FontSize 15 + BorderThickness 1 + BorderColor #FFFFFF + StereotypeFontColor #FFFFFF + FontName Arial +} + +skinparam Actor { + BorderColor USER_COLOR + Color USER_COLOR + FontName Arial +} + +skinparam Sequence { + MessageAlign center + BoxFontSize 15 + BoxPadding 0 + BoxFontColor #FFFFFF + FontName Arial +} + +skinparam Participant { + FontColor #000000 + Padding 20 +} + +skinparam ArrowFontStyle bold +skinparam MinClassWidth 50 +skinparam ParticipantPadding 10 +skinparam Shadowing false +skinparam DefaultTextAlignment center +skinparam packageStyle Rectangle + hide footbox hide members hide circle \ No newline at end of file From fc279596946a193e068bc230286ed4f312b55139 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 14:43:28 +0800 Subject: [PATCH 377/421] Update styling --- docs/Diagrams/PUML files/ArchitectureDiagram.puml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Diagrams/PUML files/ArchitectureDiagram.puml b/docs/Diagrams/PUML files/ArchitectureDiagram.puml index e35dca80da..2742808a37 100644 --- a/docs/Diagrams/PUML files/ArchitectureDiagram.puml +++ b/docs/Diagrams/PUML files/ArchitectureDiagram.puml @@ -4,7 +4,7 @@ package "" as f { Class TextUi #Blue Class Parser #DarkMagenta -Class Main #LightSkyBlue +Class Main #DarkBlue Class Storage #Green Class Command #Grey Class Cashier #Orange From 88017f99e7c8748dad40a9a351b5405b5f9ceed9 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 15:00:58 +0800 Subject: [PATCH 378/421] Update PUML diagrams --- .../BestsellerCommand_SequenceDiagram.png | Bin 12729 -> 10205 bytes .../Images/Cashier/CashierClassDiagram.png | Bin 24718 -> 25913 bytes .../Images/Cashier/CashierSequenceDiagram.png | Bin 28959 -> 39707 bytes .../TotalProfitCommand_SequenceDiagram.png | Bin 23735 -> 20824 bytes .../BestsellerCommand_SequenceDiagram.puml | 10 ++++----- .../Cashier/CashierClassDiagram.puml | 20 +++++++++++++----- .../Cashier/CashierSequenceDiagram.puml | 1 + .../TotalProfitCommand_SequenceDiagram.puml | 12 ++++++----- .../Cashier/TransactionClassDiagram.puml | 8 ------- docs/Diagrams/PUML files/Style.puml | 4 ++-- 10 files changed, 30 insertions(+), 25 deletions(-) delete mode 100644 docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml diff --git a/docs/Diagrams/Images/Cashier/BestsellerCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/BestsellerCommand_SequenceDiagram.png index 89db33ff2bbb7441d9cb25b2be14c75d803b748f..49f67dee35e07d81d98e98f8c324badee521282e 100644 GIT binary patch literal 10205 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 diff --git a/docs/Diagrams/Images/Cashier/CashierClassDiagram.png b/docs/Diagrams/Images/Cashier/CashierClassDiagram.png index 2c57a5abd1d1d909226fc0cfe74946cd27947615..2227dc069b19621c973db87aa13078e0153a28ef 100644 GIT binary patch literal 25913 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 QKTK$h51Z*%=(@%H4{h%7ApigX literal 24718 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 diff --git a/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png b/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png index 552f65ab1971b292593190fcd697ee3fba1a3fd2..c7f52d7ebd3bf6cb6adeb30f54a3064e454a7e07 100644 GIT binary patch literal 39707 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 Y7QE4RGq@uG@gixvCRHOv&BEuu03L4a>i_@% literal 28959 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 diff --git a/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png index c3981ad17c7eb67d536814b57773bf58a710102c..70e37a5f062ba954143b80dc191df585ac2d4c5f 100644 GIT binary patch literal 20824 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 Cashier: getBestseller() activate Cashier Cashier -> Cashier: Retrieve bestseller -Cashier --> BestsellerCommand: Bestselling item +Cashier --> BestsellerCommand: itemName deactivate Cashier -BestsellerCommand -> TextUi: replyToUser("The current best-selling item is {bestseller.getItemName()}") +BestsellerCommand -> TextUi: replyToUser("The current best-selling item is {itemName}") @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml index 23524d34a8..baccae83ff 100644 --- a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml @@ -1,6 +1,8 @@ @startuml -class Cashier { +skinparam classFontColor automatic + +class Cashier #MistyRose { - transactions: ArrayList + addItem(transaction: Transaction): void + getTransactions(): ArrayList @@ -15,7 +17,7 @@ class Transaction { - dateTime: String - totalPrice: float - profit: float - - item: Item + - item: String - quantity: int - buyPrice: float - sellPrice: float @@ -25,12 +27,20 @@ class Transaction { } class Item { - - name: String - - price: float - - cost: float + + isMark: boolean + + isOOS: boolean + - itemName: String + - quantity: int + - unitOfMeasurement: String + - category: String + - buyPrice: float + - sellPrice: float + +Item(String, int, String, String, float, float) } Cashier --> Transaction : has 1..* transactions Transaction --> Item : has 1 item +hide circle +skinparam classAttributeIconSize 0 @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml index dfc779d2ad..7b5052702c 100644 --- a/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/CashierSequenceDiagram.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml participant ":Command" as Command participant ":TextUi" as TextUi participant ":Cashier" as Cashier diff --git a/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml index 1a49a3b3c5..79f89dc5b7 100644 --- a/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml @@ -1,16 +1,18 @@ @startuml -participant TotalProfitCommand -participant Cashier -participant TextUi +!include ../Style.puml -alt getTotalRevenue() +participant ":TotalProfitCommand" as TotalProfitCommand +participant ":Cashier" as Cashier +participant ":TextUi" as TextUi + +alt get total revenue TotalProfitCommand -> Cashier: getTotalRevenue() activate Cashier Cashier -> Cashier: Calculate total revenue Cashier --> TotalProfitCommand: totalRevenue deactivate Cashier TotalProfitCommand -> TextUi: replyToUser("You have earned {totalRevenue} in revenue so far.") -else getTotalProfit() +else get total profit TotalProfitCommand -> Cashier: getTotalProfit() activate Cashier Cashier -> Cashier: Calculate total profit diff --git a/docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml deleted file mode 100644 index e866dd497e..0000000000 --- a/docs/Diagrams/PUML files/Cashier/TransactionClassDiagram.puml +++ /dev/null @@ -1,8 +0,0 @@ -@startuml - -class Item { - -} - -Transaction "1"*-- Item -@enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Style.puml b/docs/Diagrams/PUML files/Style.puml index 4ece913730..0130c148b5 100644 --- a/docs/Diagrams/PUML files/Style.puml +++ b/docs/Diagrams/PUML files/Style.puml @@ -31,7 +31,7 @@ skinparam Package { } skinparam Class { - FontColor #FFFFFF + FontColor #000000 FontSize 15 BorderThickness 1 BorderColor #FFFFFF @@ -58,12 +58,12 @@ skinparam Participant { Padding 20 } -skinparam ArrowFontStyle bold skinparam MinClassWidth 50 skinparam ParticipantPadding 10 skinparam Shadowing false skinparam DefaultTextAlignment center skinparam packageStyle Rectangle +skinparam classAttributeIconSize 0 hide footbox hide members From 220d4a127954420e4d9408e95d036488e22d26e4 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 15:07:49 +0800 Subject: [PATCH 379/421] Update styling --- docs/DeveloperGuide.md | 2 +- .../PUML files/ArchitectureDiagram.puml | 6 ++-- .../Cashier/CashierClassDiagram.puml | 11 +++++- docs/Diagrams/PUML files/Style.puml | 34 ++----------------- 4 files changed, 16 insertions(+), 37 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7904e65e88..947e11bf67 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -10,7 +10,7 @@ * [Itemlist](#itemlist) * [Sequence Diagram](#sequence-diagram-of-listcommand-when-used-to-list-items) * [Parser](#parser) - * [Class Diagram] + * [Class Diagram](#class-diagram-of-parser) * [Storage](#storage) * [Class Diagram](#storage-class-diagram) * [Sequence Diagram](#storage-sequence-diagram) diff --git a/docs/Diagrams/PUML files/ArchitectureDiagram.puml b/docs/Diagrams/PUML files/ArchitectureDiagram.puml index 2742808a37..cb267e1848 100644 --- a/docs/Diagrams/PUML files/ArchitectureDiagram.puml +++ b/docs/Diagrams/PUML files/ArchitectureDiagram.puml @@ -2,9 +2,9 @@ !include Style.puml package "" as f { -Class TextUi #Blue -Class Parser #DarkMagenta -Class Main #DarkBlue +Class TextUi #LightBlue +Class Parser #Magenta +Class Main #SkyBlue Class Storage #Green Class Command #Grey Class Cashier #Orange diff --git a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml index baccae83ff..f27d392971 100644 --- a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml @@ -1,6 +1,15 @@ @startuml +!include ../Style.puml -skinparam classFontColor automatic +class BestsellerCommand { ++ execute() +} +class TotalProfitCommand { +} +class BestsellerCommand { +} +class BestsellerCommand { +} class Cashier #MistyRose { - transactions: ArrayList diff --git a/docs/Diagrams/PUML files/Style.puml b/docs/Diagrams/PUML files/Style.puml index 0130c148b5..5a0d5b5aa2 100644 --- a/docs/Diagrams/PUML files/Style.puml +++ b/docs/Diagrams/PUML files/Style.puml @@ -1,28 +1,4 @@ -!define UI_COLOR #1D8900 -!define UI_COLOR_T1 #83E769 -!define UI_COLOR_T2 #3FC71B -!define UI_COLOR_T3 #166800 -!define UI_COLOR_T4 #0E4100 - -!define LOGIC_COLOR #3333C4 -!define LOGIC_COLOR_T1 #C8C8FA -!define LOGIC_COLOR_T2 #6A6ADC -!define LOGIC_COLOR_T3 #1616B0 -!define LOGIC_COLOR_T4 #101086 - -!define MODEL_COLOR #9D0012 -!define MODEL_COLOR_T1 #F97181 -!define MODEL_COLOR_T2 #E41F36 -!define MODEL_COLOR_T3 #7B000E -!define MODEL_COLOR_T4 #51000A - -!define STORAGE_COLOR #A38300 -!define STORAGE_COLOR_T1 #FFE374 -!define STORAGE_COLOR_T2 #EDC520 -!define STORAGE_COLOR_T3 #806600 -!define STORAGE_COLOR_T2 #544400 - -!define USER_COLOR #FFFFFF +!define USER_COLOR #000000 skinparam Package { BackgroundColor #FFFFFF @@ -34,17 +10,11 @@ skinparam Class { FontColor #000000 FontSize 15 BorderThickness 1 - BorderColor #FFFFFF + BorderColor #000000 StereotypeFontColor #FFFFFF FontName Arial } -skinparam Actor { - BorderColor USER_COLOR - Color USER_COLOR - FontName Arial -} - skinparam Sequence { MessageAlign center BoxFontSize 15 From 67f28a4af7dd748cb2e66b4830a09f0119b1f159 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 15:32:43 +0800 Subject: [PATCH 380/421] Update DG --- docs/DeveloperGuide.md | 17 +++++++-- docs/Diagrams/Images/ArchitectureDiagram.png | Bin 37401 -> 30365 bytes .../Images/Cashier/CashierClassDiagram.png | Bin 25913 -> 62212 bytes .../Cashier/CashierClassDiagram.puml | 33 ++++++++++++------ docs/Diagrams/PUML files/Style.puml | 1 - 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 947e11bf67..429b890cdd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -15,9 +15,14 @@ * [Class Diagram](#storage-class-diagram) * [Sequence Diagram](#storage-sequence-diagram) * [UI](#ui) - * [Cashier](#cashier) + * [Cashier](#cashier-features) * [Class Diagram](#cashier-class-diagram) * [Sequence Diagrams](#cashier-sequence-diagrams) + * [Promotions](#promotion-feature) + * [Sequence Diagram](#promotion-sequence-diagram) + * [Add Promotion](#add-new-promotion) + * [Class Diagram](#add-promotion-class-diagram) + * [Sequence Diagram](#add-promotion-sequence-diagram) * [Product Scope](#product-scope) * [User Stories](#user-stories) * [Non-Functional Requirements](#non-functional-requirements) @@ -136,7 +141,7 @@ the Itemlist by `addItem()` method. ### UI UI prints command output, and useful messages to the user. -### Cashier +### Cashier features Cashier class extends Itemlist class, and stores `Transactions` instead of `Items`. It has 4 main functions: `addItem`, `getTransactions`, `getBestseller` and `getTotalProfit`. The main function of this class is to track transactions, as well as provide some basic @@ -146,9 +151,16 @@ It mainly uses 4 `Command` subclasses, namely the `AddCommand`, `ListCommand`, ` `TotalProfitCommand`. Each `Command` subclass executes their respective function, and print the result through `TextUi`. +To improve the robustness of the program, the `Transaction` stores the `Item` sold as a `String` rather than an `Item`, +to allow for users to edit or delete the `Item` without losing the history of which `Item` was sold in the past. +This also allows for the analytics to work with `Items` that no longer exist. + ### Cashier Class Diagram ![CashierClassDiagram](Diagrams/Images/Cashier/CashierClassDiagram.png) +Above is the class diagram for the `Cashier` class, and its dependencies. +The `Command` subclasses at the top fit their respective functions, and `SellCommand` maps to the `addItem` method. + ### Cashier Sequence Diagrams ![CashierSeqDiagram](Diagrams/Images/Cashier/CashierSequenceDiagram.png) @@ -174,6 +186,7 @@ own business given a certain period and time. Additionally, it implements the fo Given below is the overall sequence diagram for the `PromotionCommand`. The reference frames are shown when explaining the operations. +#### Promotion Sequence Diagram ![PromotionSequenceDiagram](Diagrams/Images/Promotion/Promotion_SequenceDigram.png) diff --git a/docs/Diagrams/Images/ArchitectureDiagram.png b/docs/Diagrams/Images/ArchitectureDiagram.png index 1e7579f60acf057db88ffaf92fbd4d7ff37ba863..3508d20b7cd9cae3729655e80730e4409f64ba77 100644 GIT binary patch literal 30365 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 H)~o*qfYSAQ literal 37401 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 diff --git a/docs/Diagrams/Images/Cashier/CashierClassDiagram.png b/docs/Diagrams/Images/Cashier/CashierClassDiagram.png index 2227dc069b19621c973db87aa13078e0153a28ef..f41c3acb9eec518f2693381cc2cd12cac4b3fb76 100644 GIT binary patch literal 62212 zcmbTe1yojF_b&P((kUqoB3()1p5|9j3D z_a4V^@Cxj`=9=+5&zyU017xK|P!RDEArJ_PnCN?X2n1RT{4Ium0=^Rq`}`~TLTfLi zYOil)?P6|dWDgNBv^2E+U~gzZs^>!b(ca$Lj+2SW+Wdp1y@Q20qrR1e<3JAyxWzXU zMOFKMz7K%{_i;|%Q&)~%U8 z`1$^#pOaoK7an`vhDgdB7*w12TF>>T+)pvlCG)iJ!tzgD@jvXS=vQUrv_!5BEatD| zK3(i`fL4`ARs3zoiYnt&_n_yYlNwb3`O#W!;#ebUjS0cco`D~Xs50^T#TH0tp;@lT zT;9o8kl|NfAk$lM^fqD2rQrBELp6s<(`T*^uvG4T4w2jR(Tpy^Ma{$pLReDj2$F(# zW&^%UMjFX=8B!+}LGK7$K5G*7!IZFi7+Ivm$d47=;4GE5GFRv-)x7zZ{A7Ymp%;=Z zpWW4lbawRG6r;D*%LwkW5-J?YlGvDxIfYI${goT%>nuISF~_i55*s=_`XWJSpX(e? zjwSM!s52T&TUt%MY}-y}JZGpk@*-+XLN|-3RLhBCtGex3fmvT)Txjurz+gw@a`W+j$Cl*-_X<1RK!iy`IC7>5ig( z$EJ4ZOe3o?66;Fm7jU@%{}~OZBV|cWPJKbgm-e&g(QcmhZQDCBp3zWb+UPH^U-ah? zCgd%IPyR`Tlh1*?6LtFWU2d%hm4rijm}9tSP*^%DTmUXEYq~ zNibul%(Hwgl)G%tE+MD`9q!jiHHR}&6VuRfBn+xAn$?bjv+#)qM3PIn*{XICU+#|m z7@ia}G;GAWf#UvP9v`1ml#r37Nl<63kQnAviUs4@w88LZ4~K=OU(vEBExsT=I*g#h zruB{G^G=kNnh&>w9Kkl?-Oi{ax*_5kQ}4Vs(FSi0xT*tN8Kg}lAP*ka`*8O#!5Iju zjuSh+PMAZ?Dy)&1h|TdtRmIL1=KYH_Iao7&d`8s!eD`XYi)f|m;y6(~^$!^PPkECs zENjyD^Qkc|FtM?@O5sbFtHXUiB3Jf+ut~Y_qix=JhhLxK@SDToNj+NFg6#bM2@+}5=U~c5J9S~XU--bF z&%6`H)Z>CcUO^K_v^+r#+uJ`d&;GL8H|FMIHAVe(;@gjrk=}CEDLpAT_LTEE)+=gqa=b_->#?|$pP&5`G| zIYf5E3)Rso9VWWi5RY6EYp1sG+>E<6Y?phj5358^fw3xl$p zFJ)v<3!l-Fd{oWT&Q38bQ!$?~`&ir--PYHeU`s&SH5ctdQ9jdP`R?aC_=DiE6yPbB z*T2*UC^(G9Wy;l2&D3fPK3MS`1Xj|9PO}Bp+E8=39&BzZ4-1K7(<~}{GjQ&1vO2>y zjVefSx3wMqE#zX-18n)_`Qfbf2RHdc0jsiweC1%0hcBjFE{Ca;C5k#*xvRGG0gS1O z84^MTiaMpYKC9Uke8r_bDmOpuQvOY<>uy7p$SAe9$XA}0@qRcsoxjH4&^u%O4#lfFRwjzstM;K<0!LV8fo@CKWTog zoGMpo6c|Enu&SnJWLl(HkKyNPV8v6!Cgh1_DF0rxRQF)5mgKlME-7I?ceaGtkGb6Q zK8{bzEiI<@!7Mw2dDw83tfYAtXU4_VWm!axR5Y)TF2U2&bGh&d@|XW|Gv#;FuE{%n zHP_>SZs615V}p$6?X9hXhp%Z4&(9d~w2uQ+Qsb{y?u1f;$(sm&nw6{v_axRvWMtv- z-R_W-ed-(KUM{#n`BoEBR=n%tN0P-I$7U&x(D>T6Q*??iR}=k#&-UT$PHCsKT=G0{ zFW9;i-GFs!5B4b~kg^ru#FPzz*ty?YEmF?-=|mB|pZ=a#z$aKbLpF zd7pJEA7fnjHq*442&y*ZV} zI4Ayq?xxG2IIA5V7wMgF)SM;%VT-P>Hw9w8KP8l1meZktyhYKBJD6u z!N_9&=S~k6>GOyJC2{J?_2B#tkZ8vnd!mDdo}m;!@}?w}dl?NF&cB48(JyxEH<>J~ zHxcF9+kKThS6BbvZ7jab#;|k$X5%3~KSDfxQJ|REBPL5^|2fS~*BC8Dw7Q+JlK#P3 zBi;B9YIo0|=~fPn(rhCZHHP}|%1HtNc2a8H+n-1DDRnes?mAN z(4XL7$)D2e=B`OuN`j1EyFjBx|KJFUklZOW+1dR?*5jTmJgY&}1*=h&JPG)vbH%C0 zI5U5T zsGLW1YfA(@V;o=lz5SGd3zvQ0QR%-z8OBoky4*8yY&DA#CJ5`L92T?vjI5Cie%dO* z;?Bx};Fb>w8gd@~vcizRKtc{KH-iX^ZKXIumb$TG-BCpu-tOeN!gO3HtyBn&e7PC>a-53+aUxTZ68M9Fo})Be;Slc{QlIPc7_fWa?Ec&yC+^Y zgCg3iIT+{0d%Q^=2!no$6gZOKrZiP+mowzBO^$_+IjwJk=JKA5{Nw1p910hkq_{YS zzZ8k2bMiabDBu|+O0QT){?@(SxM&)U%ZOhQ{p3@^+&yblNCZyxv6AO?P&3~v@=`TZ zWH3aPunL7bgb}rJcm-H%OZ9Ui*jDQC=I7^^OSYhab;AbLSujz2y@8XV<4A}H)Dbo` z-%CNg#J*3ZL?M-CtM?Y5FJad=YAcXM7I9cqd<<|cH& zOZRZqS@4%%exZD1?IwS*j<+ehB0(&X(qiBpOeyKrc(P|t1j^WFx*Pu9#R`4J3# zj1+m_#}Z9sD$mbhAzS;c1BAi{L|R!k*nz8(E@n?}2F!6l7HcICIzcxb&LaWZ_^3VnwXHfN2N%uuWOW=7 zfl>t#VfERw6Xd1msi~fZ*OMOlI~RF_3!;O?tLbIh>f{C?npP6_V3*5Kt^}X#u_^hU zzLgEFgECplCN-b*@|U`?oF27PxG6r+VN6fn-gx6Tju=26hxFH73nxQOmX88%vs67P zCX5;tMY`~7S7SGUGv0f;5qvtu`R8`fpPpnVCuCFv&%Tbdip!*UYir#Y&j0AVS0poX z;RK3|UyVsfj+{Zje}!RLa^`OJksNp_jwhz{D0%dac57sqN5&fe%Z_E5_7e6{tg)PA z$+({g86`b|*dcU)hK+^)9;0Q67N^Wj`cjkWW%#3~ef6DPJJ49Pr%uGp<;^DmSY*xI zTFNlFyI#j^C8#hHTv*K-=@A%J8|BzCkQ8#RJ!4);h>sK<3%y#1r^lVc&;n_LK7jNN z75AUrM0HR_P~>XL7Ft$P*F5tK>XZCm)_cm$&3%a~jGeFY4LvZ6iZGSGluAOQT%k5L zOgZINHTBiX+vQ%bc^LY|K#h!~@1>&%W9Ne5(0<)$?@*(mtyR=U z#Kg)_4>m{WQxcQr{sg-+S&ZCJ}LHKFTld?ey=C?^JxOZ^7UXA?Q=%ohqRqGGOz;eT6f^Y%W zKxfryJ?<9F{}|abVzAaY)4h;EkE!s*YNn8)Fr}x`y<$6>uJnIb9kY-HPXEhrT<0PmjNTb@^hAETfM25ulu#k z7Y;;YM>9v-iR0mXg(lmeRL!DliaIfTiIi}zku8IM3P~Q0n05YPW}(KrhTe|Yy~-bP zyZWp&IpM*(2h7Yd(=(MlN24~gEB&j4!nv@R6IUP8sQcAj&nbS2scf(|ZN_NtL+yhC zLphe)6D3PkmsyS#XNCHKy~KJtnSd5!96rILMlU(9wJIJQqP|_|Xl6Q!T=(!2w4pu{ z#j^Zz$olGjy#3I>Oh1dwqIe0_Qy8Dy8eS$ zZt?_ymI?)v(@*ig1@2%Y^r`rs*4A1><4ZlJ87$}MWn`y3l_C|i5bV~*h>-pmdLV)- zP?%nx4ZfzjZZJ~K%qhP?QY<>s5k;2)t85Y0E~%(i3!x0Juueau-6+OjYQ^bpT?r4; zh7=sq`$guZWieN8OmGhdkJ2_-IQwm5N4L^8>=_d#5ORWQ?EjY(hSEFYxMMlfIq@1i z8vU5?4A=G$+8%;L5Z2BGdeXd>4*ZW288{8ryhuo!*s>bfzR{C-kt|ii#Mox+V9?v2 zzsL$K@o0eaWG=B+G}&hdPK?dQyn?+hs~Crs6OQUm|33ueCr67)EgpH44jCVDk8IoG z($!$S?5qe|p{Zi_Nj+LPGi+ovY_t+(c3%zj1)or7v<*#WXCyKG-unp(4PpS>{YAA8 z{)OY|>c^)y5Bd}wO+GiLbR!Iw=!UHS=RFGK`yMWO7np0RtvxWtxVhMoj8){zB@7(! z@~;)dY|MoAYC!jxzWqV*@PY@kU84uZBYCaPptnsQlSYrA-s*?f>xWaMi-!eq%g^kn zdRs?uowx|yosKcW;s3{trjO++H^!dzG(=A6i-pNYT=2!jFtZ3DF<*FtcNS#wM_;nQZ*N@w{pqq z8ws4^9Eg~C7>GkjD3%>w2pVRO6|g$g&GhvkO!w*AlGmu*l~TUv8cc$7-m|dD^B~epuKV9C`2#1%w9%t27Qin60O89XAcP_Dfdy!(!Sm^lpZSWIpcYTrD^0j9k>h%(FcfasB(@e;W1o4Z^vhkUDQ(OKa}2y zH(o9UeK@n5`KBK8Td(QotW@RT8f8M>`{wiZ`B9i-Pgk4uu>_D_v~qb*Sxl8O z>bz=(p2xoWV_!v4;*8QvoL8a4IJ}SC@ZQ~b?N~dft$u66F zYN%Gu;lO_cQ7>Q9SE7@f;uN}trH2(Z+@sG$7@l);^m3ZnZ7ELMYA~a)wPs7GNqK#>! zl#W_sw2Y->5~mV1T)ve_$CgZbiX)Ne59N!SluqidXHReBOa0CVVNnTm=0w?voTvKR07v zP&R_8-wn?imoChV4m5w3Fk$zAKE^D5W=&QwhM=xtM;E44IO2X&=(5t&AXMCpr;iQ2s}iaq)92<6)P;Pjp?-Qc0AeRz+CDcP-dUJH8gtby2&8y zFssv`boy?eL{#aI{P`O!oRuNS-fyJNej2p@URLR{0_lWKK>T)y??#D{;jOG!=_rwj?XMau+(kufN|_rsU_WC%QOL zY6*1+9nEEf#u#f{HqZKN_}I2DeMn)gVYGv~d9%<_eg(Zc3eIdFhgbo|-IsasgkXDU z0X5VAcQ^M{Vm^`Jx5oce8h`bNXs`1u`%$(SX1#&YFZ5DS=Rcc{zeQi=UxH;#{9jRmUl{XGi|{`Uah3U!K65|S&?3hy zKtQ^)#te8kS?-_TYV9HlG>jJmT}Ic0!K*y7dYblXaSn2AgyNCb*4E;1osa>x)kfj| zf{Va;mJX=V>H|g;NiN-?A=J;TusvR>sq+%jt-L4ylUfm6qlvPlI}5!@R}R0#9s!Sg z(xBv?`f)t^`|X{8YtN5pUq^(pW;{9F3DC>_Dt=8{&|ecR$C-Z$Mj2AvysuAejli5N zD3ADLo}B07kv(}~rA@u=Y2`G`^%>a0|9_O)*RsxPS%=$tA4Yw?~cnmCS= z9p5N%;Dc8SOX^vmdCrS%RmWjeo17V}w{7iNX~OHAeG^U8=wxqSunBYy)*+27bA!P` z^)+H8!kCeE_bJNZnh-P}u_|>9`i&2%nRMp^Z3xJ4ciYpbo^n}dTy^s3ETsa&82gkN zwr|e-U?dGRa1<+VcXKXZ5P6~fE4w|cU$8M~$A_n~*MqkMwADDqrfMzrj{ky@t7T{zfigi3{Q5^ zL;f^u>l*ZNyu8acuCpW1bz9%EPfI8z`Y>Muq~fOAD=(9IKLXD%NFTB$@&>6l5i34V zR&~CtuLx6`7IfwU#FpuJWpZQlj`A97Oa$ZG$`a@F1R7QPMx7=L(h|+#_p9+#G?(b^ zzNRdUhC@Rq8Ew(;Ib-imYuIuW3faMov}A8NNxR&$>47&b!L)!%CC$~6){l3-X`Zcq z^t;4nBlpEavodFV?Ku$GSS)e`(f9voY=wy9YDxm$g_67IbNZAR-2C5oH1PY}^(=Eb zeIIWNNGoN`WF~%F^4wS$LEeCGMrR`Iu%60qvv1_c;2(PoqUdhVc zYW%#Z=u~UxC)FBT-=eMecF&*Pf?%F)7SPXmc|3USKHU48i^hZl0OEFA_;^`BiUOuP zJ1|Av&mV=dLPsqW4BS|F3sJ_i$FWnZyFX$UXzFDdi5s}4vnnML!$)mZdtDp16D}0B zJb!FS6(X(;5+tZmB`ZFTgSH=w`3=0k^OfsS9CI|7NGqQao^FvQvLNhX0Nu19)bq5p zbtF^PI-PTHG<_xpcNnF6r*z%k_U@%?JNwEF9yeW=WaX^1$vtn{G1fX!Sw*qd6tQK_ z^XOD%dY-jiEK4TU@4DB1UY3ZaOML|wgT02g1zkNi*e(wl_uK{1f6L%M+b9fgSBLJDyt9jcE)=>=IiC##rI2|~RJ4p*<$hLhB>5qmXarvMZfKDMg9KH*7Z z1WJ3Jez(r5{Jq>T#%0DE4?CI}@&VFnDX><=-1|v34WiOr7=b_DrkGY5>h%P3SwEZ@ zOJeb!tN#9+b)rqi3hz(%g?d ztxR3=8Toq3hZM9cIVx$fVmXvQkN)N4-IIiSwTf=30epBso9iMXUwao%wLF3q*1+$peB}gXHrf%KVy&*&Vr9?Y0b-An?3fwoK)CNIO$)z%G{mLf z7D_R$=)eT1KUaMr>k@rzZIihDdB`08QyJhXL{xP$pI(u_0QL$MTfDa|8qdqRVRxLd zP^+ge8jJ>SwPYD&#@0k!Vu#&C3eK~Y{eB(C8ak#}%Rde`uM&}sc3JVF(-xSBloF@z z5U)aJ-$wf3+aEY2ErjfcgCP+upBfXD0fLZvj>6*z`jHS&JXvcz)ZGH#Zk~;gAf=+h zBR)Uf`UaQ#pY25cX>B@ybQi!BtZmd3s3l87Te>e4uH3HtfvYt0S6}oXr3+JM!Yrib-Z6OE_C@Uyg(CP<4Min>GQ=n( z+#LzZe=Kbo@MN%29R~9W=HOrs|w<-;9^$8^?AWx3Y^L9-hL3s0{Y-Hi-2Ysul=*aOq{P zmwuB6L`ZCbY*yprTyG^5NK6>_GKnH|kBcz&_=y_joVw z@YhG>v-E^0Uvs{%_%B-d1w;9{K0rI^_yPV+Uhds(Ru%ncNzYov`G!%VKP$u5LZt{f z{*C0go3d-iMxK8sC*vzTQrxI_l+CjFbuM{af1HGD3(Xny58o9Hrx!8&Gdo9SzVeeV z?3d8;Tu|(qGYBU@U;ZQFZJi7vst!H}le-!oY-~`WCh;!re+s6&dY6rvAGPpZIQD!! zi?P{?cGZ%3Y6tf8=tORg6;(cv7$2qq5&rSv0|jmL^G2r%O&A08vxJ2lwQ{4!e!8TB zKfKkjI;;J56<55HoypdllcuXcdZG zW#u4~uv=NNYIa;;slEMIR@BdV=WEtG?oAn|Sxi@K3K2$&7J#tKy0_5AfbU7{q`coa)L=nOQ#eIjzINB&MxV2t?wd?T0L zx}-Vauf8^=^_wZQxK?bXdeGj6Xp{y8z3ZbZ59;Q8iorgRD?0f!}4FQL!XniTce zv>^6OwE%ncTrAGXAHsL6hr+AC>S$~0OJJem;?kgp#-DWX^*%FSXlj(p6h38M1N+oV z@Q~A*mozmnIYA=H~h#;c~7DI$s6uRh-MVpBILs7*6*Z%Ca&iz>{hz=f>guS)eb-ZMUuyMVsId`j zP%`fIsUGiO+Z;*nnL=|ofCGk zXMEsDxwyD!XiT~zDfFNqvB1M3XWL^`lJSe-Uh=gV&hI(#oc3qc8k}wH?N4*%GB?jc zRDVE&9V1hlFKoLCm>V0c52VbL>UX+b><7R=J_`PvUG0uqSy`#JoTH8Px&18iT|q!@ z4#c14S9z=dVKPru@2~ShMyfW)FKcZ9m~wJ*ag16RNRXlR%cGV4M7Eu&@{K{h2l`ka zxF=zvRO_R83R-pc!#9G?jOa5TZj^Ds$rydxje!*4$Rf>Jd3p%{XRtPdW=*&@+7I)C5uU}WF2f;vcOI^=Q)yvDu%0Q{m#rpWehKWur zP3U+Lu^1uGF(Bd4mn``omVoM_?yu$Uss>h|W0wOCbS|14a22!{RI+V^1 z+t|MgcM??v7NRS^I{>%xyt>{gURho)(r%>1fqYxMy*eS{wEs9)clHN^bj`r6=uh*% z-VyGVd}uvvw~h1vmD1Mses>jhw-1=UGgfeM)JXyya@)T*Q@zobfQg4!tNZiQ?yh<1 z^G%2z7w*P%rP)en*rSD9PDLnuzHrE0krWb}Y_ECak$1a6g56vkFsVabCV>sGnvQNJ z7^l`cA7!Y*+C!J7XjrfJB@pwtjuvSVFcoXXgTPWyQ4OZ@Xn-)2fU1iK4?mo-Y6h9M z>d|{q6y%M7t7O0cVz>L|^a$6BSOMO;DJZ6Wcxl`BwY z(BhDW8|Ve)2U2w8_wU0kRe$fvfyNrJQcnz>zP>&j8u4u_8sFFUmMgVNQ*5Eb%LlHZ zqz|oMQ1F=FS3IfS05N-X+CtM^cNA4Svn~^G8aY6SG;SAL0|NtP<#8RaI|>|Vs*SCj zwCuRv3~b0usl`kcKAY)K)O&h}WnZC2H8V3a1_s7FAdOPwN!&Ka{ayejsUGKQuKdM1 z&D!+P1ASiv~o(2bUIE0MP`f)T@E(5!U?o{vC4_Et}gTcf7ogSVw z`qw@F{R_IO4Q(Cwqjr#9LG3MXwhW8m>a$s~4=7?vPic2t2l0NC;6;b$$`#r~Wd@Fz%DDyc+YCK0Y@!0bvwZs!t@ zn{%lo_Vx|qlu$0GeeV0q6%adIBuL5A#)_bTfbyiQwT^q!@vrrlmzR}` zwHacejDg3yH~__`ayc==Ac8vYyvLVrD>Lj>uQYYo7$5?fiZTzvzuup;(pW2okj-$W zNc)q;jNPg79FQ(RC%v`b3h6X=d~C}^ub?#NHY~CpS60lV!#i;(WOvrA13t*c%9F7 zN+4|;C#x(pGKE7TqoR&@xb!1qW5KR_hOtlq<*|_;wzLFl4waUjm8F6v-I{Q3TNHR%P zvlyVI(&hjz;I+*G5MfHmcyv6xt7)_1B|+ye%YV`T#$XyQlD7sk&>5jbT=Vr#GGJ|F zur^>ufKGD2U@n{U-KkU_xAA^X-G9k{0c7_b97$Qw{5ms>WUTdH!iVEE}F`)y!*>Q&~owrk?0kT(pI3vDUDr@K;) zj_eF%Ha0eSd3k)dho4oEcLzXm>gnkhIsb{}=Ud$^cb7VormL0tiJ5D8J0iOqw>Z#d4oJDF{da>zBBUnw!9JA^2?6Rp`Cm z9w0+ofVg^3XYBwIZmz;)gw1UHD@;pX%RMDOf*#kRv*Z5k6i~NdKZI|r`RSq0KWQH+ zgf~7WKct3rYinzAeQ4?@_-#<3ub!S}oa|LEgocHYys;*|=UAm~y527E^?iCvSaMSW z^z7v1dPxDN9k@k`n|CXCag2SDYtJ(}lvcMS?3rx$X`0irj21wi}-zFH)ivA-8ZPhdaHqrQjv3Uxq%`B`S}?Z)CcpY%Ha^&&cs{FB2LOr((sE&!tWW^Hg9k_b(-SV}sN2(%lEm520z9mC$^5 zrwZ=wx4^N0*L-g`_#X1q$|>i#^q^iL<1%TxFZto-D;1p2y8$)^wFuk73D(clXTD>R zaB&4S362^zH8uVG`4el&OJr3evb?e7AqI3gACtLs>L?C zmfggwMdPrT#v&$WbbCT@{0jQ}8Vx@j<;$1uXJaa0UGOYt_iP*VeWkdsokbs)%dFcS z7H7AbZvZe?q*k77K2-*|E-R}DfICoV4R#v?8A3sqe5ui?A3l6&psoI;M{=Bs$NDjR z);~2h6(Fh83GZl(KOw1-j1LqvY%m^+aK#g7e&}kw_Q1(W)mT>78`zY@Zt?rr zp5u7NUmR}Wk$b$YXLv`klaRy5UmnahTNJI%L0vnot~1?2=s%KLC-g#9<6R@ zYy{MJ0ldTeaC_oD6%-t-+33o~gEN)Wl@LLQ3J_^$ybv@)JhZfdPoBA|5#r!by44Y& zjr#-Ul5_pN6iqGr4Z`w-KraePK4le9lErMz>m~_H^pA^^+HIJWk}cY8{Ctmb7YxE= zP-zduPU7?8)j0>Khlh*1v9{KZBV=@YwUGw+gy8veRUpL3MM8(Y!u53#C|F) z?$6a{bXPhr@?voZfG|;4W4EEHOg<$*4Y!RP5p8d41DYvZ!#lHUU?BT4N%(R4!sE1` ztcvU{1@K=p8K`y#Koy+5m6?dZ<{vl9uYAlaWsO z$5$-^aHR~+6?i7N?{bOS))cF#S+(0B^lXtEQ!g zgG_0O9?(E!81*MUoWq2sgA`%)2RYvex(s}L_ENiJ?Lk5wSNqOTqRWR}!3_Kv7dlU@ z)nO5mtVvEz&csv((B@o0-@3y?*r5Q!>QJkifarixn&ZK|RB>VN`q8+CRe&ccmA`V{ zgtl9u?OG3zg!r#?Aq=_zE5(2s$On+ssOYzrPXd9br>D`;Sb+^R zi{DNGgfbFCjsr~1JH4H!ObszUz__$vp*B1ad8g-gI0U%~(y=G;_ zB54>|22=}To~@lh8o$haEwS}GOG2l?S z2Sl2IS;Dk4Q4BB`pClp>n~wLW4f8TUKFRuQTPb$&i16Vm{Bb6?H^afmxF5nXuUew} zu1oNb^ME?G)|uQ0=e=C~3`T#etE*jIqKLbj2^#4Fet_JiPhk;3qsgw@0@y&E>SYGq*mTO=tAqX!U5&?r zS=lLW1~lXdl>BBTn^&6PH=r#K8csr;UtV%N+$=m`U}EMGU}9i^21SP$B$2Bj$OiGB zzP%3vfpc$cmfx$YK7T-b2KMt9qCFtMJ;C$}?h?EY)f@r+SN0`>rf8&h2XxccK+yp5 zGzGxe=z5lskwLragEp_W3Z^BXsEZZzeuMacrI>P0=v0ch!4};={Q5FmW0MJTAE?*$ z*xlV-rv;C=UzNb>R9+ADB_!|C$B5&*x}(WR6>8?acvvjQKtn?temV*u&l`;FKEj-T z@(9g6_HcLL1!cfquH>U{vK4G? ztIzjBEoLH5_F&*Y&8ih_42A@S7|ML9o_8$}@IwS@Km&9tpict2LK8?eG!V3fK{N<5 z;F`tpOI-TPjl7j(1>#SnP9t+j##1VU(#darHc?@bkUaFU47P#hORenvj$1M0IXZap zt?+e%%!9|6`j`Gn@DDP5$l(YD4j_6NqhN07q2UB~j zhCqk)7L3-($UY1tzXgh~;PNR{OE{1mmMD5$@Skb`ozav4&iDaZAmDdmx7|`$6#UUb z4Gvb;=;a0g)sm^)S3q}SrIACPBR^UKR(Xd$60kQT9!rl$Lb3pu7N9#C96s8X96caepxF*Z2?wl%uS*PF4U1G;Zr1m|Hf4Lvz}U=}W@$hGkO}mo z1-fKTj+N%4AMcj^K1B%d+-s0iHBXLb3!N~Nk@3#YKZ|K)r`PJ+-N9ixJwMJsK*u1w zeIM0{dbh!1MAiE#I8TYVaCK`-47I^_O%adpW#xNWbfPyIUd>z^gVz2NBRNi&((?sO@+3Hg^8*VSi6IW-nq z+Oy|30huS+lA(xb#*T>?VPl1M+r1C+u6r3Us~vmvrF!Q-sBExb1Aa>;{cO z@%oACoIc7_mg5*zEP8%~ z=f;HdLlH{oOxM$8*gki9b9qIX&fZn)JBeBY8{hdD?u}jAvo7+5g9r60y0fvHosMi& zNikEcJa-q~WfDdW@vZUx#3GG`!#j$g8Wy|*?KcH|hyfXXNJ&_iSJ$@wNygI0&}7Dn z`_#~jw~rC}!ZaBkl`j>v{`d|SNwI1NMi5JmpWhe82$)QyCinTuK4L3 zi5w7+TORHY;)nDyScu57Axp2~H2DGXnt8h*&*J~+94M*`!WotNQRJQzV(;8*6ga6` zXJ8$0&@|t=mrs6w))BV$T)OM{y}RP7-yGMPxT4vYWQqT}p7C4s_i+XSw&}a!FThs$ zQ8xYA=ZMYD+_*USb$aLYv>6aaM&?gp&Xw_-E((-7e5p6xwP!9135JeArE|A=CJMr+ z4|i?D1#lNRAM7U;$DC7`C~(lW&}_JjMU91(lFfj_ze_F?A&=Gx9%AkJ=fX8p)2t+q z)!Yu?-tlUQ4R(gaULp43&sr*fpUrKdtStw)KLI&;Uc)y2S8Sg=9>4J z)0H%Cpq8-qqY)5}j?P1K39CMA>3NOWfRL|Gjdjbrqz+mB`peC(xTiQ*8IcXITOpq&xwD}Cj zki@pKo)8tp%;GHilJyHkb{G+h-R&fw3=x%KDBfIwLJu@+Yj6je7}0Pu359Uu8{J>w zKW7WI`9-=3IQ%YA*W4E$?L0WPHhY?`Cnwcerq&0l;r!d1$m`DoL z#SEO+7D9<|2o*DZat{wd!Iqz*!JR8nYkcA2R%MCKn9S1L`VDv>HtO*RaQCl3-}#bk zyLk@}?UOGkH7PIBQ%D*HLu0^sV5ONK+&%xE2(E_P5xxng#C*}L*4|a3 zpl{(AOjeBbJiD(e&4X5mR9B(ZNp+K7F1E{A!=L29(92gQ;&4U}3$LI(IyqCihF78) zY2xK|8c6$KB0l6ZOQzE=JN6|jh+sUwy*xU*RZV>p#f;NGQHAoQuaKh74>u@>@e50VQs& z8d=gX*pF8iKzXP5{g_2&;F+rEUbwSK11!*k-J@2xlL7z3Se%)Hv)Y2is>fhVUuh?L z<_CS{Wk-xVA{~MGI`i7&!R?)o>#9dp6b5p&T8Q2!pC7T@rBo$m`$?Z7b4{C*&cTPR zRtMxlajt{6p5#jRLv(+Ulj+>p`jYHho1eI_d4-6j94+HRyWmJpw zYLVVDH{8&iudbHWZAl=~d5X>8x;Oc3OuyEkzO3IiF9BZ0v8wFnIulFhaArX6fO5~C z{J%+5k&lRr$X&K(S2c_1@9X!aD4r+i7m@nh$_sLOVd#pM;#9tifh(4slO{crrpN$6 z9qn>m-l>Iz3w6n{{Jz}jc)+MTVbUicbd#e#Bf`xup63J;@>(8#Biy@As3;1G zjvTF1`+PmGZ!(7Fpyo@7S?^&v{k~&TyteIA}X;cO6uodgGu_^KY#XCyZbmY*` zPoCV~9q`>@3(ZUv1t6kbFsX(sAH~=iX#~SMdLHtEH^W^@i&YbgePhpaQa`S3?0|Z% z^coR1QnZjfZ?|i`=FzFJUeXf^v^R~ickGP&<>L3llx1}u6f`~C?zIg#cnqo}yX1>_ z<+kzfI>z5#6HO9ofu7NwJ=8mjkH*pms$>}so0cpZHHoRmY;q)q7e>!yLEi8^3WlHC zo75>YS4vsOYld9lmC65NCe-1x6%jbT87GjDweX(^ss9yudR+e0uSmZE#RRY{JczW* z=U=7vM?NC`gYsZj_lcD8zpeu!_FriJxIQO^?Fn1T-lG}jpl?^G)nLYoNqW-TRQuMeAO>0xA+&$b4s^Nx= z3zVzON55uSDCJ0fHxE{><}Q&m?XpCTkYa2Q%KXAwR(AK{``B}adJURt%)cosbHp`U ziJ`hTz+drfG9GB9vWmj(ih$jb=Qqg|I%Q%}A0B62qlHA?sahZ#Cr!YC}H||Jw;6ezL6f20Kg{d zO^NGIe0L7SI(WiFbr%!S9*A{xeyrZ?OlCJ(`oUwaZF^Qtjp}Z$$x*6%5d-M;fniI& zT86H8eD$IqpxY{2cL>6jA0M2kRu*_N)*7rHGt23=y_LiH^zueTC9muv3QdWimAjlN zl^}_;WRyG%>-5A-zIgvii>r_0Gf6JR)K50XWW{3P2F`|w+(rZK80t|YDKRq$e&mPm$^Dgr{_C6cGSGqhi#13Ki8yBXL~!RR-2;B1ddTn)hQtbu1mEr9G#t+%$D4z z3;MSud_dae2!nb>N-43EfaedIg+KaV&wTd}whk_+wTJyK>qU?+^z{YhzOH5%Z4JQS zt&8#Z)2zmNU;UVeaO~~xr#}Zdj(*7ZoJajjrgEb%{vuOD!F-*7 zJg|FWmr(P8@lzv)jJG=>B>xX{Ul~^A*0qa*A}Sz)AT8Y>-5?^}-5}i{-Jqb--Hp=S zA+ZpV29cJv2E0NAN`yfd+^SN3zg`SRUKPoy9Ay1lP*)hqpll`~JT zPvJY4m4}R}IAPg{fWdrOQy7(4xpG3R!bDGLw#PmV*`xk)TM`OXI#7um55H*a#>)G} z3OrZot||>jZzh$bE>*6^#isD6?|r8e9)F3#bKhhZkF8yq^u|w(x}jf(Azr;| z4@Y+tPAo@U?#;8pl!I@xyCnqO2uJJ7?628KMBYUA6cfr}@ela0Nr<`%bLd$oS zxnTP=v(3R=M%G2uhU!P~&0Bovo=;_T;Uu+#Q%);aT|?$w&Hhjl>@n7s4@R$0E^Lc{ z)!iLT+TI2ZUsASn2(xx#LrTn_hXq~(yQONLPS9JneNRpF!fo~FQ>xxb zN!-hUZ$5$Q-EH7^mgnnM{<|(#n{@GrM zRb7-O82{WK_;2{^dR<>XFqLXNO^0vxdNAZzr~nJuySAbfL%bUv8t~v-VG=vpl_IBz z)`)7SR4A)Nzei=jdi>PwNZzL0mGLj}>jR6kAQ7%%dWv`B73oexnzdd7B`x1X^GhL3 zsM@#0V!o8P{-_p;ARIal)4>7YpgsA|mCFlI4Obj**LM=rd|_`+&DMboosnGcjnC`$z3H*|{R^5Sd=8PH5jxhYgo<6c$3F^)!etLR%a&iG*`1&R-Ud|>5(DGzSxkV;Ga%az*l3m9nFAP z`KM^I<)lNZpVtWUNQA4X-ct*bts~m`7~@~4nr-3eyu$p)eQ$fN{969TJ$2*iS0hhF zI5e5QI@f$TV88kE#V^||_3LI-B_qS;5{4jbG-`z+`OUEK_34O)Y`x^1z-VNbMYL!| z-fC;r)~siRv^L5NPKtj${f|+R+_9HiDetzJksLsY_f#+!uFpbWKWN@x@fgb%94Z-z zm@4k7GhH8E?p~Nm7YrF(TSCod(|FsuP!JRQc`S;{lVI4-U##^d9ptr*Co_ z{~@^`S;2O1rKZ$9_M#*`9)BLizej~8v>;oSmfs|G-4f~ZRSAmFgLtCCBJ2{Z)K^_N zD%2Sn5^qYwahQ@~pfq`A89V8f-L2q6*?OzAu}Ta@CVT}xXgE3!5k*J|m`Ij%hrr}d z1F$DhPLX3lyBZ8dtRF z?VyY665)s(jRl8fW4yAneb9HjfU_+=R_^S);2hBO^pm{f7YaS)5y@=MCT7tCZ9!Xg z6*Kx(%iz+nh6t7-5oNz-96~6to^pmhnOwF#$#XRPF3-~yTSS&*mZd~s(`iROh90prxO*pAOI5P- zjeo87o#3?;_*4B(K#784>2%zuV!FBqw}lm@kZ!$0LJnV^-UOZkTs`cVr>nwiJqbVn z-bjhec(k5X=Ib13@qqAJmlq3Vs8To%wYPAUgnMH5K|TX8s>{R8l#-rPevkhuR&e)} z=H7?YMz?XCeqa&RS0lylo*c91s~rOO4gGrvA^zx?OwqSN>3s|GjkBK@;bvVrEl%c} zj23*=arH@qz~_!_E8%T4X4T2BSj5kji)dvML$gRtg)Pu2I>!F*f(I2>!2|YR!Gne< zd)}|Q3EI>=Gf_;dpZycPqLQ%~<~KJ%&9=$Bk7@{SLM?K4*0Ah^>CVq@*2yCoFD&}0 zx{5Q>(JT9jhUiKxZdD**?S+Ql$u{fn4NOsU@8yAw-Fc1KGRDDxf+m$?dayot3}U1M z7I-+gEmCT|Y3x20c(+giA)_LeEF>y1CYL%yTfYR6)7iAt7@2^uq-2i3im@<434G=d zRqYK?%hkYjtxX-CX6J#MnwE*F=V|94#y&=$K#Yyo4R~h=KA+im5iW4ewPO-n{D_RB zUENQ9Ftc`qpYIOaDJ~`qH1TBfJ!8Fnuo1hz>Z;3aKKjhE9UY3EJ9E& z2*J=<)`xwhUMS`LSKLB3(i1Cqb(vmkEMO)KZYATFn7p4_q!Q?DD5EAhw&sqZYvcdp zUi3W?s_(7he;JPXY_$cA(#}yyajx?b=eVhz4c^8Wcrzhy@1*jW0^@kXY0RZ(G(0i- za5UK8AK3-SuX2Yvjv52&g;bqqkp)HMOl+)-v7*jq=9g9)W#biMGq^f8?xkuhaK zbn2%zgWtpNn+IdxxCITKNPNPu8-XwRd+_msv&NkpdSy?FQ+t;{M7vji2TCxzoFkxG&1eP@xo#G4g$ZGwS+4t2J+w|G__Ho!J-AN^x?eQom`WPcPYg56Y z0Y5uv(UnKL9u}yP@5S!$i)if76oFIYm5}Ia;8_>N;t7(gjBJE-H$Cw9rwODlk?<9c zeE!bW%H{k>L06Od=`-~*74$KdyK!xaLtmZ?Ritr%>p-IZHb@z;^-`Y@-kN48o# zsrF3YbrV1@Lbq!$a$8Yx8>OpoDp2EXn3IZ|f;gixg@y+K#(g-awD@ZV0D&NTtp#B3Z&G_xx&aX*~+G`wr9VPNGixx z*eblb*VYHzu6g1zB_6GDr})G5?4#4(Fecw1?1fFTZicZ6x>9jQ_UlvIi(KwSI!pzI z-A&K_wb=6%N>?ghlEUh-Rq18kly#@n#FLLHRgm4fyK}}U_ZExw*Rq`bHD-^Q=WoPn zJin>QjPMvsfpAsOcqMhlhkdQ%P}JggadBHCyGv8tJ|ir@Xtm z!TFl8xUuW=X{EVx3f>UiHNC{e;E-5LO*LT3(^EAEeyDwzPRiu8@`?Sk|?Y9XM}k{H>2q( zs7>F=>L{x83Ps?;*cr4`0InLAa+O)z&H}cv$&srEt04%#kRk6e=@zNKeD+Ln*95Gc z@d2Q;Q52u2^)&oE6 zc)Lt}!GLVc`-w_txXimB2b9>WN0O#O$+tP_cSr8uePyx*2-;rx}wy5?*3Hs)yt*PAa*pJ<~MJzw4G69+7i`{;~ z;9GZr!b;a9IZ6J(1-%U$1}UU~^iKi52Oc)t(Ktj{&sFx|4bm0240Vu*$-~BEI9)DY z>j)oo4JD4E#R1d^Rc)M**I60VnSiPzP+IUwJ?7E zfh_f-Y-Hn}IO9NCl>+&CPzC`iopxA&PXr=dFAc%sJ@^Wk_$eq|ulQU7lJ+u5Y=NPn zsoV~W;7~@$A$ajWNo1dz#$9-K42=?4t0ZgSQvp=PzpyV9v3V6~I}5_kpM%o38fzHG2dr|!uSPJ9 zj{J>w_EEm4@^u%hUJ1!KjoUK&bO*FZu#?*Wuk3`4UN^Qiy zCvI?DP`6x~u_CZaRIKNlk&Ga9E`^x0Lx5vyy5xeY4H-B|07@sA9hbj@l9wQ3w*W8H ziN|*Kd~AOR;4mjDZIdI$;=Dk#LvoB#B|LOS(6udl4cBdfgZmzP8lzB6A#J`}B}9j( z)_g!4yoU%LwBw`UX~Q(^8CGdDqY2uxoO@7!mpcs9AjzWOQdg|cNUHH_&7P7UgnDt(JU{G zW$8|W@BpA5AhWHjy9L5suk_PAd#j*rJi3P22OUoizkUblm17A&Q+ft9yNf6OWn>_-W)iQ|S@ZvW2GUp8xZ$bg2(cj`>zWU9V|7n}{I-J0ZS*HG zGP5fyh8?{Gf(QLd9TJI#qKB(7I|zM$#^6A4iz(ZX$0W4&bbpz|;;G2(t3X{fb$=d3 za=I}fZ;m88fk+B)aRsug#M5hC#8(YZA*1&>MHIS;x71U(L-E?f9?5otMl%JOPl($- z^6>PGvK!Qq@oIrg%HLPTQs7I^f2@iduF{q11tkZvKGmt&wT-7}OcbZK9cT`mBkX}v z9E$=Ag45(4i}OvPGcz+SlW4Z%MSMXNSBWWm>c3)XN{Py2-vIRA^;19bM?9sCVQ3{R zvVFgWuCY_~P1vS@B zmu~wJneKb|#jSfg(-A;&cUYr>uo;W?_ICHrP4ndowQGQM6wQxU&z%gFkaNhZOOzpe zhq+(%mSlVO%lbDvl#6+6ww@5lnW;RtR{ATmbw(T?Bd;5?-5Q$T7_ zS3p&TL-3vmK8P#NXsB4L*VpM6Yw}5%uRe(5xKd=RFsQgfbT=rW3|I|z+H4bjv1J&G zOuJ@;GNK?)Bx3$M_4Sv)@`u4bE;!K6{FiYq=y%x$yaSs?IiSONESz{D`zi|8CI|F3 z^QA@#Hv>JJ<4o0_4l%^XdkjsNwvMI}3(0e5amStgq0;FAvz`Pn-@ul4yT2`Pt$+35 z8N_+e0MvQY@ZQt-gsZEo+xRdWaC1v{Il5xnq^8^g7kxfG*VX zX@8TCa@u~76{v0bak(iDazQiMAWDbhyyT75bvC0Z+M@WkJld|}Zm_ECR5RKqkgM(7 z>TXWwq9w>H3d${PdqH=()OPrxQ;ikq|JT^=6`XiQ{lmu#>MfC-tkF~fr| z?{0=$9jBB&D{$(LEBpTaQKhNEt7n!UcJT2vK?R{dD7iR$5pWzn)zB$FrjP(dJuyoMg-#&WB?7My3n6)$Vd`q{USQR^Hh4Z}IHx z_~v zYATgqokMfjkFae&!e8+9-y}wF(VGzucyh5iWa4A*ePUZ%ldF9H{OgOh;79lF-x0T% zg6}|@debht#VbHsgw8TTj#j;1fC7yJ)TH%gZ#1Nt~64Im-|JF?$ z$FcL>%Z%}gnnI79XbD4>-HWutnS4+mR$AauKgcwc7=kmo+bIKWbRlvz<~7EpqUN^ZCysg|(E$hQRYYPFy$j~+@W z`C;qfqZvzD$lai^4@v4Y)dA4A#^$5BS*kCZ*OY=wD5mMPZ9djk3XJXti-#ppt{Jc@ zvKG^NFORDBW!H3>J;1b*lqx+>UYs6k5EhR}ANWZ`h;gQay|4D8=fz_UYP&#FMkn z5Xyl81A;*b_X*>XymE!SH*8_q%reYMA;Z#vGWa&`o(01t8Zrz`?vB!3UU}0~p>0Mh z2aW2EdY2%AJE`JvxEd4|5GEBOH8@vLcpii>OjfYAPTKlqlu6Hdp*Npc&YQ~^o?t#l z^w8l+qT)l$EWzhmaw5^TBPdLWmu*!!%d~s*+$+md z!^PXZ2#cJWpocB`xDY80mF!zKOphvrjNuH-9}ALs4$T{K zxR_6G?5xPO=|sp5&M_9=_L;+>fJr4c*~(Gz?kw)QRcWy7Pc;Vmb*8M3%d01_zlG8> zaPU~cf>vTA(yUykVMi85@@ceqJr>x~M1!?jmgCfClr&2%0z(~pUba%W=Bvw7=MA+A zJw_NiJVu*g%@t-{MW-Lhe6urRQFc4n8*Mu#{7(YeM`-0svHL!T+32ZPe|npOeXORz z#NH$)AjWAUuiGBRPvaX;!GEvnqWLf_qMuR|44r1T*MivNak#bivLhN z|0kW?*&RBnsB73SYSd~ZazYOYJT*raALh$Y`W3w|Iz7_oKhg0iaW~B!ZbU(B+o%BX zT&i8?d6Nlko$Q+U+?DU6EO7@@aV)m|_ySQc4(vo)5~{wolbuYuQd=2+Iiqx==SZ{lR@I42N51+#|&xd0IL6G=V>{mRDZ)OYVT(z`%CX(Z)`2tBpl7 zDZ+k$Ww7MYF{oy6kPL4q!W(4>Nb-olnkL@~WgqiKl!jM3540*KKYZ?cW;A(OZ^M|F zHI|mTu(`%?QIp7({r1Q0Gggg*L!ntid@E1-u)4ff8rZ^a|ZSHiQ(Xz6wQeZfbzNLeM&Yx=~M& zjVmP;6zuJ_Zv|yv+$eFGh$D5*ec3Q<;mqb@}c-% zcf6d8jG1-{zcTa@K4A@)%REpZ{y3L)#7cTS>n~@o7?MP+T^(6qd)o&SH3s!YjF0FV z_dUJsJu~M@=}8ABvZmk6dE^Jm$}aNbYNe-$cI+QO&uB8;QP-Ucx$>Ze8Q4t899Bk` zvTPFeu6xh7%pJ8Q`aT}%db%99>2v-Nsk!mMK8#;~S#K!);^mg{3*C zCF^{+42|N3@OdVguZ*a$qtRBQgiGZS09W?#Kt~ssXo06at9ddB#9<)=Rm@&LOb!s6 zsHb~|vQ%ddoEd&l`KV!stwazptx*s~lJEFpicJXZa^g)e+<+YJZ}t)$X|8meadsssdQTF2Y&hs-al`r$BCz8qq()vsbLL&N`x;*{~t zYC+9nhRB&Zn|@MFLS{}fw_Ip}pHe~Y6<)tjS}zmRw17a|om*c8KQ6te*|0p5RcFSm zOT7Q>#0_rPmX&3qz(jvM#~`8W{-=?6+n4+?LH?;z5XIA{v@G@_E7jpbUyPO_$nmr)0VZp;pV)r`!WU2uzcxN1% ziC6#W6E5m|>&x?#oZ_+OoS~uCxwtB}0E8zHBFUCR2FNdWjtuE93kJL3 zE@I(h7Zs||2Cscq7w45P=p@nmA1=9|mpM*mLnoicy^GUS(gdx;k+7$^$)NU4w{sumyX}O;hf6L zB$EuVezN$RZu|(9m#KI=5>8L#u*p9S@rki%I>SjR)v9qc*63OoO7}i&VebA=W8hN# zL`3vH!B$Uxc(dy!f^`l>wQEII0*BAV(F=(U$9n$CD#mq~SN&4z<>}5uoT+MgsZKm3 zXZLW|v`4Mj3R+i=rA)`-B00J%6|c?hu$tI*uZuW9$zWYxXEX|P5LhV?xNzhZ;IkZ4W(tf1E!hLlp{3QJ&% zrC{W=w{UNx`?(jMnwnZ%y9b^s6&H2D#-V{;8)=|j-%-A#A{#Qp>};ow#JX)5v9VrS zAqVO>q6W5F4^`>GA=#$HdM&3-nHx)2K79&5ouJ1KP=+76BI5*_2M-CxtCda-HN?D* zGYSXC>ol|*tlq--=HFh^!(kgMMoIYz7>NG%|L7-9kMPYx5EK-+(#mkHcZzn*_6xl< z0u{EWsw~XHCwn#zz1CY*>DO!f<$|4@`7Q~nwc0!SQ=|3);|An?;)p+#dwYjexnBxsx);9}kpxaW z1ZV9PqKitg>|V#C*VCqkCcnGaNa(2ZdoSWA)3;2I#k(~Cs%qrn<<(o!&;WEPgMJ4- zD>Fqw?TR;fwS6MgpFg8D1M7C|-hU$$vn+@@J^!kkkA0_mG{p0`%E5fooJwAEr z@XY3OU!RQhA}8u?#GWNE%EsE$h2ahkIZC&r2Aj?2$ouQ3BU{dzvuxIWi(=6g5Q7)% zy@fK17L%@jE-4_da7+9rxg#^{!A(s~3xG#WG_E~<%@fcEM*G3by|D81P;#ALt9yKE z7&~wYUH4RnZf$bJw?bT9{Hcffu|k`cX78IUvIggh49&=|btdrw{4{HMW@wt#(zC>? z<$_foI6{ABWZWYr!T|%cR#IvfaDHL2>Eo8%7k#|kc$SMDQ$n4pS8Q6LIqR4}f_;y; zoOHXYht$GU*P2DzXQKyMC-z%=A1Mi=iQR_ywh20SxURQ_=w$=X)tO;{rhR=4VK?&p zel(VMJp`TthcWzd{imo_GRrRqCG>POsoZ|Ej+_i#sZ+&<$TS;EYYrc0t(}8aifBZW zIBXhi#s}$4We57wE+gJRbrLrYnTkDkrkB21HCzNrt%(HXEX0&*N^FPHrJ3OpGu=9N ztB__}1NYAN#c_2-Das0+>T{BxlFj0@F;A6^ke>%m0 zbd^usb7n>l9W$u4qT*McAp7AzHKYyFJ;{*NQU9sF9>J7?vc6@{TWv0U2i>2UxQ`wZ4DEIf6lTVEtFISgIXk@3}k($`r zLVUUM=qpU6+=A=4Y?+wq^P`iEfHqm}ex`%b4843Ro?cg_`*vf`&wXlPWhOFi*w<_C zO*&OimS2*90PE*|rti}}X43+2RH0SM0Yy8eTOvUrlqU>HJmQ3*V|>! z_57Wa;uqj(R9~WEwbj9$K9~MPYUIrUQ|21D%t9D$)B!Im2J%N#c~A(3bpEnWB45@Xhl7r``<^B|$Z z`P&_!Ru&oiuiv+)z)wn7-k*BRt6dx&T?*Z{zN;xqGhbEjtaC&DvIPty z2~P_tRI#Y^v2skDbX+SHFy4u~$mk*X+y?M6k2Xdpp_ML%aWxYKKMp{jI)7Mu9IRY= zZXc^yn~Ey1Z`|SbyPg8a=AOaxmSLK>&!6);J0E559yjggm>?tHdguRkUiPuvsN`x- znQru%r1!ymz;}5jx&9JD8-BHFJ-Bzl&Lo7N1@EnYa!C7I6B#}44Gj(Ua`-#+aBzCD zTxR^fxvi1Tc?8b0r^n%y=xt6?C5!@Dp=v#+jQu8dZAE( z1{A_-v)))rEiP7D;C#h}m>`qDg3ej(o zkb*v*AIV*KKH+MFsUHAy;IB@vsAcy)a})P@Yxx<4!|qN6Wj=+Jup{u9hxj+orsJ1t z_$q_osk7fXSXh zEYz%^od=3%Aev)fF432KHNKjFV6sE9>Sk{5DuveD7Ku^b{HKY9g@yF~a+Jcm09B92 zqZ9QNQ)bFJog-HwA>8YFOW(fNEuj<1OU1pT>lQ@+Pm4a6#@QTU(?hSg^N!i z>snnUs4GJa5{_)JHcr>hg?VF{ll9%9LEUOxXDgV=$QKq1zGg>>&5g+-Dy8H{F{pjM zXE~aLK||wn4H38Q?;S3YeLPZ7*IFOesdlP=B0gN*^IL91JrB>kyb^00j=Cgj#>P54 zfniPtX2csJ(3=tAX7AvD$(pXym}frMF2|%PUu}5$so?yhhJGk8Kh8i1=e4?~UZn;7 zTiLO4?Hm?YF*3j^bafiq-7BmXXTPhJ;?pPRw!M5>HfP*)|I+JAA*DCgs4A}$ha3)4 zV7;>&!XG;bFWJRiU>JpK^nt?m90haixu;n{SAv2Rfgyzo_E8Vr7!Y zIbs&94i)W`$)a#M@(z>QJ4?EZUCyFTWhrv%bFVohj#gd2wRDt?8rYFXFq_w zv0x>CB$vLpW|$^uh!>nkQRv2-*;2MYo_o33<6s2uRD$v`0CYizoUrHxalo>&wlEZe zrexQL^HUky)R271uQm8ZvaynzMzrtEn+6{<(=-~t8?i~YT%k#CASV5rHv%RO=^-0> zg#6@fIK62S7?ri0dO`#-^>W1NxIdS0mNx~fY>5v>pG564O`QbGFEpU3a8`0AxU!LgTt!7xqRe(}b*Q8AK|b90{t12>_|_tZ-MBJ`pRcmj*Q0t<3(f#vPY2N!lsIDkWtT*4ZC&>E z$G&DbkB>L0D&s7^s{SU8Xm54>U|@gXYchW~GWzT~IyxY;x`EG^S3g};4a6UMTNsQ! zKM5A4*ZF6}-!{TsxB9NnvhlM7txTGrO?wtyyu@X6iRl%zzRWdC6pb)hG$S-Ix zs>_2H`|NlQvk*HDAcR(LEvfxWSelpSNf-;|IKg1F7LkWx{BX`~>mVni*&YjSQjw85 zG9>eBOWU4f_yF^6j%+#7ZBY?X!1nq#Q#sjrxu~i6$jM#49Qma4lI9u znB~RinvS8>rWHb&oCQ^mZKjEEQNOgxh#Eex%wZBdEGkMWf&=M!_L|gK0_7@;`1x%e zYEBS#-h+JD+_*kEx^hNM2(1#>>JHt!8*OhCrSg(H$f2&lJ^|R1tmqP*mk7f?SEQjm zM=gS)$lGW;!DI9I;5^ev2t<{COgZ($0p|G0^JHjKfJ>BnSQTD^?MW`UIpB7Dc?QQE zoNeUJe2<2~IuxbJr=fTTyud#lKYNi10*!I0^fdC!F6Yq4T(3{Ox2JA|w$j9<^0^Ni zzT5plX>Q)4eRl`!IpdMVm%C3%#09VAXvK3|;|qhidG6tQB=iwDw9VYmN+2R~5`^uyz--H!G~X-H_XtMB zIvS11CWjk8>M7`Z6F;l}Ji_~00rR+T<4{mUYbDqqb*eAA1k76jgGzPR^IQ z`Aw!$+^}RQ>GoNRWplSlQ-fxiN)P$P4T@6_Vowuw@vZ6bMyhJT0#_+Eegh54aYhCp zFI2R<^;m zu19@x^Q3`hDH^!wUa4({b3%~mLthKEYj(`e`%y%XnD^t+iY)Tzf5LCU=C#%-kHJLV zzbn>*z=6&Prk%Y4Yd6%+Prk@i1GXMoQ;o2NQYH`&GqUe${`EXZ_MO3g0KV42&ffiU z^$H?_J^|J>K4`VK^&yN$(%Pc&;tS7z-0}c?Jn8xo|D^2y9TpG3V1!=h?967ldwKbV ztCMd@av%K-i#s5aYpeUP+pYa$0Ht7ZDiAv7avF$9^;fi-+hXU7@Aq9CH|VQ995-Gh z8-z()#o)<3_O+?F9tis@?vaOj>D8CJZA;TWdlw-nbBYgbJqJ{)mFKu&bL)SHQ*M@V zRsy7Rn(O8JQAPOQvG&VN2h%Lb{qkWDt2#M7(Oi**p1_Ah{aSv7>8gMi-8 z^Gte}C0|or{MC~4x|zeDG`v27r^?*xXDq&+7zr;UrStIF+tPyYqq9K@Ec9}9T~GUC z-*HyN^YfMOHTbSm+gVlvtfBJWM$5EHZ8vWKKzu`2Oc6yMWS@IsBO}C{VtTsN(qA!1&If#9#WEwCdiVH8?1{ z2_vhfy54eR4hQSlhwkdb!{HU&W+u`M~O? zBBpAAA06{}tk?aJuwPItnPF~jNw(|c{7j=f$G}&UeKeB2$VivlAt>~@xnr4C^otAn z@6+kw0T2BfESz3k9Mh+gmNOx(6kCqrBkU7jv6^yoLL-z52&5OLb2d*7TU#?+?29mP z(a6`6^|E5Y11s#cb%0-bZfxz(QC!)F0g`{Axhi{_#N z3$U=hGpO~~+TkUS3dMaFXo}rij;Q)Ok|vpCHxvzzb%ecm`(AVN+m)peDa=a9P?afq z$*QFIO8z@=2zMia1;sWf4Cj-U$c{b2r(3 zejvXusOKr*FpDJhG9!F^f-3V=O$=RP`&Ol?;#c^(*ZzsM@RyMh_OAvchKK$A0_9WZ zAfTf35cB?RzdbkgKLj@b8}E$)eP+8R_ynFOgTy~AC2KjCpgsdxK{biEtxm%fLf++7 zbRm>~bO!KMJa(%m?Syh3wbtgzN!?=5tSsgAx@}OX*r|U_4gX8RYA2pePD$Wy?LV9& zS{Nq*$mfX5HJ1S7la|BUDm4YZu!3t)Zp6=(rG_{nv34Fb6Mv)$D-2;kz^b63|OTwUC8 z16+e}b#WNt|M7vJX6Ky{5NswTUI;1wk3anX+XudCg?*|UUJU=L=Y34U!=p*0Lh|Iv zvnv_kDI^PaA|Pa>DXvXzfYy1C-EX|rSnz?&4$xeB0(AHU9k-|KItX_r5fJ2MtS%>j zApCPjn{+^nJJ5bqnBmq{^Gp;>%A?cMq2_7N-B3?X1O#PFn4k*~?Tr4E4d_UX9o%Nd zW&^8{fvTvej6l3RD#r;hFv>y8ahf{Nv8j7|Z?AD7P75@SYh8Uh>6Gwa?*GsrZg&it~w zO9y)VvJd72|6vEdj=<{-2Mx;5jda&RL+5_J-H_PkP-LLDb;rL3p}y;UadF{~PJ98n zH;RQ5_4x({27<1hgUy%cwkyJqisJ7BRsYW|3A8Q{{PbM*Q`6BGvanKi!BxG9s91b<<(#sPtCbq#z zv%8^z&9*D5aU4b$yF#c2+90fr+8!yzA+?Pm)omVqaH9Do*`<-rV~CliMAhF>O*P*~ z9WgrolSaeFkc%hnBUABYMU#~oy@s&VIeY^By)BCv_q7-XV)gXeGg+8Zu z-tC9|L?VOkXmk^&tyS@YIenc+!``gKOcRHOLJRMRFoQeQ%By~G)Gk@^D!9+rVuV|f zicz%X3mt^vDSwzQTF@^KRMaj;JML__r>3+s;nKXqZ!OXK)loG)J!*KF+gRUUKl(0h zGZXYusULo;3)in$?)D(#_38v{APq8Z!xhLahZLBjm9?F^Mn+<@jpK=zJS0#Zo^3@O z_Xm5qZ99?94Rvk>atBR?rObv9=4KtF)Lt&);B`I3qC&h11|i_JDBgJH@`|kX*Sgw` zhzPLQ^lg+FE|HtwN3(d)x|7d*`IE^Y^)%i()A`K0NtB+3_;?vR*(oG#D%;;@VaVv# zaZSs-5JcW0o}gYjnI2HY2xq`~GBD^LAvhv)+Ix_v@oN};pHPX*`|-w&j;aWj+_1~G zxjyVJpMr)9{^pp+=iC`6JtV+f4jB_^lE(+wR3f)8_qKdX1MURLA{_uBTc?nRGVKH32t#E&7Kx zcdkde9vDUTjywWF7L~JQF%n)XtzKETuSqogqt!n~t1!~AUnLf9I|IA{b`Z5c3vrANM;%(KP>pfQ&DI9VBdu|{% zHqLadA0U+ZKk{eTJ%kL72qp%E*AK5&FzntGh>AAcx}Ge^!Byy8OXn(Ndip>A=Rhk= z2D+8@xM;2*+~NId*fk0%A=;W&2Di+U+%~pX@LhknYbkOo76*!syNORQW5cHL(SVf_ zD~13mPLkbpQyu$X_>=6rA*y61edZ+vzV^xe zK4z4Gb(-LT^dzs~(^Sc>pkU0G7#0&cbx9{lh{78*T0Tqj51E>ux%k=5NA=NblmiDh zYM{07)pWR(!-1BbyfICBI_r7zr}{4)53!@C0!u|hZ@AIjB*Xty|EViyfS+|5Ha$x` zS_Xi`B2yTR9tQ}%>dh5wnlY1lo1BuCs&)#(X11co6tC@J?flk#%6?TZ(ZOeAMB^_Yl7@DPUkore zyJ@pYXBoZmhGo~dL&7WLT6L~z7ywmw2~O@ouTFZ; zLo4j~l^L7@U%an%_%eOGQzI^m6?T@+l{zf8@zpDNb-{S!3mt7-GKNsPbn*4_!YQoq zJNB;E03;TS!R+qd@3Wb%=&{i-y`|GhmOX+Izdj3AW zn(p(Q8oqtAA0^Q*dAzNS!vjV7piV9hoO|6G^o2Cl!G(-F$wj{~G36WjC%JqbdAB!A zx3~j;YZe(^q+sL2C7py?x`{)wVDzMh?uUW^-c8XDM>Kbb`4LiG=LAsLV)|GYAI-*O?V10p!<%!cMO>dwp zteT9l8)WqUWW!SZ)KZIn%(BS1StP_f3d1|5l#O5 zR&2=jZf8_IzKkOmp_oynSp8Yb2w#e3%CJ+fmF;E5=i8yki-IC;$84RrzhRplA8AC| zVd{kC38`j?a2Uhipmdz6IU?Z0?ijY34v-5BOu(kWwjcqKyXJcI0En8~OWZ5<4eAG4 zdk7v6>i;0Wn8S;R{*BlF?*vM-aT4HvU<=+n*ZY(uagz1FZ7W;Tr)~k@pR#i83lKCb z^dB!(*~A#cc^)vx!oQAJo;5M~(kdZA*F?;iLF_Jf^7V)_+h&K|(bBc$-SnSL1wNPY&68zC-2G%e!cWFL!4B%+ zz4|g*(%L?+_t)bRZPD%=RKIoce(B!zp(kixBO;x=M}hAnOKfJuqc=|^elxFuS%ssN zG$rhVZVm0KODaV`jaIxiaU4kJlur9R8v%X-{CAh8CxwysM51Z}9c3}KQq%0$A9evy zbX4cP$S@v^NK?TR3OF*@6_jx2iJv9{0>WYe;UvPxqys9qw zlkaA>DXZe%jn%U8MhPBMM5P2!KzTClb5T6@`Z}2$F z+PDAAxXt`A+u@k0#KuM-u8aebn113E5vHQ;6gi@=W0nEP`w@wF8stV1Rtse&rD~{c zA)!KI@zv9Rn}Pt@cP>)&Uk=<8&J!?`e70~{Obxzed@7_@C`a5?l~u3hbXhVl596Ya zw!(n{F^Q+Y`MIEfun?Ldv)!hlwH{zabPI|36Nu?#pk8q~v0$Ycu+l?ER0(i&-z{!1 zFb&(3cqqVM5j7)Yd3IYIDEXVF+77G%K8nL?){2ZrG@$;0tilcJS6cN?e#9W#)(Yn| z-aU=Fu`0MEaS@F?)2A844cH+7A+V;h&{t1M88sY5RBx;7I^)hQq3TsdT1++ke7BV& zp;!it)`n|c0v~ZG%+Nr=3RYqu)MnucMmrqlE2wxU>i3SO;|N~))SOAIJJ{6z2m zila|huI=l1y_fdk4W@7|ibbQ6k~_gNZ0_#S6nH#7#bzr-_X_~&bfs{@fBDo+v^`hW zdpiOvtIH9Wy%je7T$svnmHo62-?lP;L=9xU#j>2S&LW>jkY9^5Z~Vy}->Uy>$LRmv zrTY7wyQXdp68KY?e(uXTs7TzE*IMg<**FB9Q!?z&(wXlUWgORbKT;FOGuDP=#(7?6jQ?~Js?>?QaT6|M%METt~(o?Ee|*9&!m6HNcSlj*N!l?(&6F3$e(V2-9dfikn09hTy^gJ_ggkJERe z0GdBAZyz#D(qg}Pk~;s}6J*How||~YEw#bxru;mG)-RPcS8e=M8WbqNGrbuV^%H@ z!@3$ssOYg+(%));slf+4r#R7Vuy^<*yM@`4b{C2b$KrO{&yxY-KQgc#)LhLlo%J}ct{_aL8 z6~B4XDf^q0R0%K=&?^FX%GUueT3+d!^%O&|BzDj-x}h^U@s$liIjyE}H4t1jmssGf zyqxMrSvy$V;M4i_pug|Q{SPU2{Y`Y$4tl(EI3Ldnts=M0&xRBaI>fLTlG^RsYM|7A z+o*-?50J)buGRHwRWM_RO@P&Zv~m8SXL$k`0{U;c`{}#nmo)xcCJb$CqX$ngd&50_j|Zo3}e zqCBkgXb<~e?Y(7GlbhETdux{(|j z-GFp=>(HG;3=H#}qXO=@-}iq%_w#&s*Lpv>T*F*(#&P`Wx<<{2(sEp=w03go@j5r$ zzSg)ZoB!VQyzj>W$;4Cv3X!O6|AHRCom3I;|@Q&(8bA?UwYwq z3IiSx!;kR#3+w+gbR^c|=l&9q@aQYK_zNBFL@sF&?5%5vKDh7v0rPgP>NC-@bT9)e z|KmFnjo)r`aom`&h!p>Q?ifuxXr@xXQCemZ$(6QU$Y48;dBdiEAcCD0q%Utyqv+z$ zuYdh3g<>z3Yl41ziyYFR?(5k2Z?eRId+)Axx;upZUU%c}N+Q`l~*-@U2N(}qKqYHbjIywBp zzYktJZXZw9geyFZK7*o+Zigkzerk6nHM|hD&0D0cWYO+Avvd$f9rt;1Fr&TUWfMM* zB*5geT5hoMujOQ^-Xn8dn@|>Snmn|}VJvQCz*MW7jLi%znI7hxGRdXLaxwBf*7^T{ z5VYDJ5`sdZ3uiN4951H21!fnKpSVAGYPH==K5(CLOI-~x?)uzpfN9f!9t2r_V;}^t ztLov%DQmFK|FZ8{?F|Ksvs3|x_$8WoucVdPya37q)puSzYY&MiTKMRlC9!^UZ=Dvt z0x8IrIz;u^Jt{F&)pK(b?at*ZnIad?cG3T3n0*geegOEa>$>JQny4@Tsc<>{304_A zvQ&jb&9t#2N-ok0O?vu|Y$-23ICWe{;Qfz;XickGqQ~1acYKEcmVwsS)V+4~c;5;n zC?oJH3x0nCi<#kRATH3aH11cVA2X5nEkcGLNhn9e1FPvmbU>tD^>ysG}VYb+Q(4=#9QW z-0e?m0CodG4dWVJ|MT}lmwr8tM2F(VqyK}LK?Ce)1o1$?c=4DC{q@6C4kuh+?Y^8v zI;TltqjU5v@PUYDqh}GY6do2CZ+KhiQM~LqzNcuVSw>kXf$wLXcd*d!Nrl6eeL2?B zkdt4ye^|Vs{t|!5SM5HjzHqDQr{a+vr3k|(N#&g+l*At6UD<3nQ2wa_%ok+&%me`C z$yYo{zj*@8yqZWtvlGeM?!HaMqDBHQe{z}NrG?Zl5ZMR{w2UtIkrBZC6bIKOoVu@% z-C8q$%EK*IG~QB=zm3rX#j3uR9yIE(jwJh;7%QfGf&2W(cZ!pUT4AHLh)t!$IJZ!S zKcdPr)Z^bhRU+57#3GV=$t5i5CG$bRw3lz-5a*cI z-FB!Us~X7CcMQAz1-d_Uub9O*_o1!e*$i9``-e0r1MlRDxHVI~t(+coUJGI8S1 zt5Ovh_Ll3U%X=!F*WaCb9PK%slP_6E(4s5!Xmkwl6w-}dMX{XAi*b?hW7}dDNh4fI zKtXW>$uH8Z+N%w)U;ApOc}yP{K(VT>`x~w#imGkJ#812HFMWyoW*SbX*)k(wQ!uh=ZHZgymQpjc^J`9|8lnB&acY#8Dr2bfcU%aUba z*BaRAquQwGZpx3dO* z5UtBrZXvt{JYCC2E!t(R0_047ym->mY+0&)Q~LD z$$;1f79rfch=bb!D8d|~`<9V3c&ZZtzY=;KJ^U#J*Qwx1T1VFi4033@!Da3&ycxWq zIM9pF>N6gkV1JREQV6Ju#*KCA!4Xm4_%L5-q;X@(FKbFvSiYg#1) z0Q#k|-4}BVUK|DVZti5pt3t-8vO_n**UHv)xvg9E7HFHV+A7WeJklI}rLM?^fG3+y z41L1M`Gq^AP3Nqmfb}C|+;FB>c%T@Yph0wT7tG+O< z=KMBB(6(P&tYG-Avm<#ewcJuw#iZu3TiM#70~Szo7<+IEUqSO#VmBHY843 zaxvwUU2&}@3G`E564-!7$^G;`_I060#RP^d@IOfhZhTO2-5fMN& z^D8g?gH@|&q%ICIUA|>52s;~;YJK8{)cpW92^_Bmt7P#J2j33;U${A2Jm+r`3BO2w zWn^PQd9s}c@kv|z+Xs!$8S2{k`<;z{xeKuUUC}XkQDY?He?dV08 z4TlZFgF6mt7JnBDr`w-rvHiaG3(_F#zavD9%{R1Y2mVL$BVsZ$A%Lqswt`y3gvak* zpE`CR0Ys2m4 zK?bp!{JoCJ5%~PPoW{Q~cs8(s!&P{ma5GxR1J$qr%1TC*xn{-MHFrP_kRWIEC$Ndz z2cY+S&AuxFNj29W3)mg#gyDpG%C<=pvW2_%DZu`U`fiu?u)T|oTAMcm9%HTG??Oq( zgXe_+Wxi@+H4736-kNaMM)tVf5n7wAZ<%+M*>=8&uhYLc`S$oOX#om}Q9MF5{}UUf zAm_UhaPd0Gs{ceC7Nf&?FWqoSsot8!{*3LjMVu=cqm6!As>_g@{0a)31&Q2y8QN#_ zkBfiLz-Ahdtnwlk8ixLT-N$Ig+d%q z^FhP;=!9r-v%UQ>m!V?gRJS~VzNvsv(VHZoCj&L67=9kD^`}vn$XaBbdU%)11p(*C z8t`y+$-#*QOLs{F4r(_7?MeVxch1OM7OgNE9*M(QW9@@5?hm%s)g7{qi7dQ~2UW?s zbs#$ai{SMH$_}2U7z?GY;&$tl24Iwg`X4Sw^yp*{WzhNUgWJ=7OZOIpvVdlYV<od$pHLS721ZX`|NH$Nm$o&IZO&n7 z^KXj5WuhUPHaor~o0}J&eY+WPYfw??sccDE>8{qFU{ihsmHnwE@N)StF5KxIxUB$A z;iEn=d?pyrHA4PERYM71Ik32cW4Hvrfg0R=Sbms;jRJ|>>`urDQ%kj*1mWj>qc zjba!*t*PNy*xG0>CCEb$q%;o8p#S)tvxum-mfXw=C>Q@_0qf&-K5KMbzLbh8ngPVo zhW#i>-a-jC^0{9{A@Hq&K8+1OR;5x=^c~~i7W4ODY(A*<31oPRvy5;>iaprtFD;&9 zvT#|y(b{VsQ6bkcYpwyy@-_Ql+`)>Gu7RmY)KUh97zNPEn|_BghqW;h82s z#AOBiqP{Izb2;x_|EUeS_=L4JU9=br@Y7U9oIDe3X6!aUNlqvy5q+%*)ZaAO)IHl< z?x!mDe+zaU5q(_G!V*_nM$g9IIXkB)BmB3bgL~xU=Qi%~Bl=xp=va^czhu3VpSW#x z<$D<9yPHj30g@gL|JMagf{7(YD<|bY=2N3@#n_J)HVTg2E@C)Z`VX3iOPQ~xU|6^# zZfOn2Y5NFDjzs+PZBzq5CB!rk-Qh(DwJgQs6!y#&&DlK%cPkkT$ocuH2tO_2h! zAEOt(yz!Ycp*){4r%aKiz4wQUN^OiV!!Zl*SzOjFFeu9?PU*Sw0ld0~P;TkJGKDj; zzgbA>Fy4h(0`C??AbKNmnb~P9-LJR^%}Np3&W9Wo#mAWC%wkPHwd=O_uLBv_7%PeY zmFig?QN5sZZ;@TmqF~KDP}TkZ0tXUJ{d)_1BaPaF4tH${Z z(z&hsW23J#!9FBt@c<8Q3NrL9gQQDtOr6x82R*9A;O*EpY@xdZHRk22to!FYpeh}^0yaiu@P-N_qDwRn`Me0w3Ik>>bTb@igMS&lGDCfBHAw#lCRi? zX|9F##QiA8+Aop3J9zm?UWRGsEiO(#c==YGG{+;Gzhn=xJG>hLBdl+cD9KP1yVb;` z>bjUAP#4S+-1?ILMuW}MI68y;aAk$Ja)B=xtpv5|>6*)q4V5*>Qo<`X37i@JF7Pe! z{CDr?VZIDoJSD(`^nIlsgZvg=0*don_i6VkUg{8eHU_u93q^uT{!?@AdB?!4RMRbR zdy7N=U-T;z{Um;mMSj9QP+P>LExMl}8$%jRC89}CFyMlzO&92pVWxsTCt!mxOCDIA-exlG=3q|H&CO5`+@!%j*6LIbuDXZG^Qog}WR_a6+NV?u=hWEjHI5~eJQzY__{J9#BKZf4fCB;U)|k0QNB%ZBPch$e zn`7j@&FngmWCmq^@9{PEix&W3!*~3rKh^Qm+j{XZ5;JqF5qsXlsUR#LYJ$_KK=i2| zd2Eo+i!GpR9Zf=uskqykp5Wm_HRC4Zf-B+_d~5DjadbsIShEX~ zocBNw$>dZo%du2ZpOSY!WI&$m$S+T!;@75#UN#1-s>#k)K$b3|$l%q!#9=dH-J7k6 z4VDL?BSuah!{W`=+}P#zwap8w>-Y-GPyttjf)%B4sf(h1Et0`2_if;HEQrzoU?CjP zU|Ox2Dj1U$^$#nZ)VB7$js%R`DC%tm0XQALYh~AtivOqKMiQcMHjJn-W|I687l;r5 z9J%4(0Yu9_t8GP-@_}uGfkYja1StVCP=o=&sdb7y768948B?Na15yxn#1lnnARq$l zaLDE=H{KgN;4WcH&Rq932mrj8^~=I>>HhEK8-Epi{`Sp(G`61b7mJGq#~N;`&RCn& zIj$vTqCMX(?$8zaj|2_bHK(}|Si@^1S6cpg;3ik4!d(fz-t-rc^~~-p_cQub;BA4&LvP`bnW@dGudb_R@wUU) zJy5&ZPogrFJ#ueZz?gDm?4`BkZ?NR@fj)inCDSS;qh*1lpM(q&)~ zoTdqU!NKW8MAc2aH_Qa}bRtyxRwSz1EpFBxa1X5-SV35U8=p2ObF^QAu@IZu(mr#X zvo?`bqm7nnHsOOUvkGB&O`TbBdhS+}C ziK9K*I>CLhw#Bi`qU*!nGW?yQ>b`28i~7LjsUf#2l&rf4#IsS_rt$7+O#Q)cmBlLHw@0F>7~9#Ms`m6?1v5*pCCX<@xu_?Z}9{-hwu=u`B@% z0YVFe=b_!0Ay%o45%}P@BDn|Io)o-ftDoLg5!tY}cpr_O-;CQjtA8~=Pm6E2>$elk z-;-Zj)jk=ZW|A}x**$1sD?i|m#>uhG9O7-;L6pC zBW?lpH*BcqJ{MZ1p?&L2VEa*HOPH|E!iQ%kX#Ug)`PB7o`r zfK>r5B<|IDIJW&g&6@`!R>xKQcM`UmATfwHogMQLVhwaQi|wZ{9?R}dys+vnW>g>W z7IZm{*0<~k^G*jG&4FnqQyE${NZi_cf2bT8^1~xc;1SA8Mr;AUMqh= z0!2KAsb_-b7%PPB&f2|R#l0NwduSV%DL%XkB0BkjEP*!pB@pc5w@y<4CaW=6Szy`# zXT7qJ<|G2Nwh6k^`QrW`_(9V5888nYLP6N8yfxT&3o9uA%L7lV6*<}2lv9W($t{5t zDpKz4QO^erH&^Y{=)R^Gfdsnb4f8Pq{<(a93CB+M?ik8qv0KZhg?(8+W1S3Q?FrBZ)}w zpL}%Z`R`}FIUlT6&n!k3xSF;v@5GOanqeK;u>C_BIZB$rBpti3ww0FjD)$8q`{rbi z;EOlWw@K}nc1_gb?fah|l(MO5tE&yZBt!ZqP*GtG{5$;Pan5+4GPWsJ$U8zPn4 zo#inyI}@q}y#2km{FJM6S4V?wDzF3Er@pj0+qXMI(Tm&FG`#kWcWanRN@7g;64!`K zMD_w=Sm)DcFP@96L|LaWvU8+WQ6#3dTdiTZTxP5@@wKsrGW$c`?InipVQ9OhzTdw7 zp?ms?Ejt;0YG-^h1x5AJlcxx~Xi-VGhj7AXGV%LN%eOd8(Ytue;y1x>rmShl?M8n% z`C_Y0bU9QUy;>Vm_u}fK7oR`On}qZ3kHa`a2Wqapqm2*>&Eb6 z9>P}wJ4HNn^&8MwVPyXsC(`+Xo>WT&*$J}&*4xpx==4Dd&!fG1-0emXxGL%jlbsY-0$~kFR5M~B}SXe&pA9F#(gz$*xW{Q+cl(`uyhIOU1}*g z*d~>VUGi5xC|zktuZBUR-0mGTpBD)Jd6Y0pY(G&otMK+tD6HyI8O>M5;`1HTvkp;y z>4FjKU#&MMvLm3;V&2Nt?PMg>loT7!4vbNRzrWR`O$1l2Sr>sIn47urVfZA(DD#9> z07Ryt)eC}G;*64!n_p45w z$R1y!b^7`OPR?13e0kz4BW(QSbHg%y@Z_1DU16)~aJ5JEde2;U>fYuYF(su-zrN$r zNU0jd2*Nr(;xS^F&TaLxvN+~J&NUh_w;d0iBDUY2NAI}foq)|bfFEHv2*mCLR=RHc z&Zpe!Eih{@D=VY(*oT6r;c!31ai*>S_p1^f*lmygzP^;Cqy~FlFp*jHD<~ z9=qfwl7`I(8{$|s0s`dA7MQXZj0`g)9RnE z@uPCKCIZDFgZXuJ)?93>^a};i5b_D8A zI1!f7oak8k|HQw~w`Q9;s~?E>*om|joOp%@w)m4ke#poUc%ZD&YaYV%rLJK8>WL9; zFm*$T;@I7G@Iw3iu||mF`lK8eM;yk4^~8t@?!$DmIOi10{+xT2YGtE7#7sd!LHF+6 zD^xrAwM_zXszV7ZI-h&}m9CB|E443}9l$eTj-&Sdb7SLRr7L2~{6tANn4LmP?4~l- z4y<_wMn+Q;6WrIk#V-8#%GNU7!8f|)s=ejjOij!96VF91juPB<)igAWkBVv<*Zkv? z2si|sS_H<;cdfas$UY1cA;E+^XL)-06TO|tom=>$1UFw_IHmOpBI9iahAQRb zqZ9CsrL${n;1DGIe>@~A8)f%#8#c=t&+rHvAv*pOh}`6G+n&eF8wg&+pKngG-9eNv zd>D3?I6699_tKQrwu;IZFY-`9`b2tR2TEZ`SKRc<)MTk{CbB&F%)nDeM@6Fg;O73Z zQ1HIl_IB}4{Fz4OFn6Qlqm=7j+AYo;$Fel{RhF%1&*P742M zx)mV-zM<>vgcTEI9rW}5`nzt^72)lv0JZRSxO@S6vsb}k=4#&2Y(#y=&4x^9OP<%O zGpD`0C&1;rAtQM$BkB8YkB+7Uwd34s>_~g587%CdH*xX5J>xW2<6a-l>b2T}!<(6P zc;!S^M)UAI)tQgpgeR20FE!js5_203xEOeJ%Kwc;_Me>cEI3K~;Yql9m-LjEyLcYk z?CP|B4KZ0LOEQ~hD)(N<9BDBoH_x`0-8=VlZ6}e6_-ke8ei0Q}$ZdGn^d?ho)HSN| zRr+oUW4Wwl_T3@n!!?^D;yXDX zpWLPbR)Y9N(XVT11ATGA#&jXD*Mp-Nobp;9u&4~b?;Yl z&myOp*!0HcmVY-C7hj8O$r#}1zdA;9IQ}YTLGcDkbiS9a&Ffojpyn(E>KPcD&7@9( zzz6$`*{!z)(;ZyS8sVD?o%N?jIB>RqVm(1EEc-@;VO9BB zG)*dpqE3Yl^^FM*h(SdQY9&6ce7(jGrCTSGSS5eM{8uRKPA5j2+<DR%1(O>I*O$|V3q(eZ%4a1~!D^I;owzmoe=(5&O@z^m&*90VEB zIqA6u2DZ#%$$M~~nI?%u@5WHG>iYq8vA=u0zENNN>Gtl@1L#Bi^ERR!){H&h-g0Wc zCElVOcWbR%nWPp{st^+cMduG(`Rv!1+{i+In?EHp{WNE>Gjm(KidPA<_$3iV)X9~= z&ybX)PA!%$mih6ix}MSctJgOq?TNd4P_nk6F9pJ?9H(u$oEO$M=2JI`f-@I}230UvPW_bV?_O`x;VFK50=eShP9{goxm*@ROX{j>&|%%8dsQP` z6H|un^z~9R!|QYH`ihvDRlgi=*yns$X-$vv+%-ndOpK=u8(Fx=POha(7}_-#+$e6! z^<7M#3Oh&(Y1A*a66X^B+*Y;rMkV<2eU zJBaj2DvSenC51m79vH*#3aYi#=@w3o*7RubDMnK-(+OD1IY}mI z@r$I6PX~h44tC`q&ZRedzMZwTbJ}VAOeH3~;8PBbnn&QnDQN_{&lLy+}5FO*7A(A`iFFU}n<| z)zn&?es#ONa(-WPJsq?*8kNqbyiRxDHH6sC;x{HdJg?W|!wBsBIE~7e1&;BH&C*|L zefbJ#=gZfgR4zbK=om@98=H$ANT7F>yUiERCJG? z1DgOT8mXSApL6$kY7*P7i&w^oJvg8k9GYI}?uP`(D`=c4-)tFJZxm`hPZhAwlJ2T3 zz;rz+sq!WU1=>QC5C=U(E~W~=fXwI|pQxRNw`QSh;ij!r;Fn)B)-2zVo3+v0eEMnu zy4#h)rmK0g+Rbr7KtxGDs?e!OP~%H^l374BLh^w!)HUIQuLHAki_;Y|%pTKx&i>8E z7>%{IH0wYo=;7v!vlo#u?wMTYi)xhEdf4hMi+XMC`SR{a%tyDCy}WaBpaJE|z&4sj z>f{~hI@YepI1O*s$O+`ZS-N|gbqo$#i)DWDHJ?tqITg3ESk)w@o+ER=Qv(2s>Gwg{WnKs{*|-|y!WmB&OOoACZ83?`ra($ zu{~(_wdkg`sJrz582!Xc$TIk4((s*-Wd>`=NcTP_%Xeu#6>m!q&9U*>%P>aBv6*S6 zRt*4=mcdPfT-d3}Z3W$!n^_NS3?8jT;|2O^Fils0)yT9ilWBdM4k|xaNjK!O@7BAU z8y7EZ`*l^NX=mqjbB{RByO6Do@H75jrsP347PA>z)Ssy$A-!2$!kejVXrfp6QBLeA!`5}nrjm{TEi5uwDAsK#hs#hxouxr{J$=$%%=%Cflo!)_SR z8fy!{B9ydKSdLg*A5N6sX8BUzs(Xo+h{Bk#t!)mmJ5kW&1d#S!1CBrJ1^=X`p@rG3 zz6n$U&3OTS?k>J>?aQsV9RQUw>m+g;Xq1XyWl+?Us#s0G!FoJkcgU~)JHY&(R?V_s zAf-{paQ4Xd3s^^U7p=iH^U%Z57@2dh3E1z~v}QCa0^?;az1cm)`|kyHiiJG46TNpG zVSBiNQ_#NYjnYK$>&d7rVQi?2qcEEhLM9wv;Iy{&uJeOz!EJdU`m2_y!Ia|9`!jG*0 z_%ZoKBPJu))OZ)*52(ckT|Z5zq?GHJLp|=$YV(r(EW_-%Z14+@_J_HYekTUdN*<^QY`!R9QZ%>O20{5pw zOX1;*Vprl-$NdBi+`oDsus}ZooQx?c@dvF*K?p$3zPSZ@17bRG(la=oBZ9fB)*SLm zm|Bdr`27_j84P=8*$wf_?CTw$n50g2vE8uHFn9!Qd;dAXHC-862~Jre3pT~yOJ_lf zjozr8BIZ7AkKVqLIIS@u*^-)2&eM_%179aYH?XKEa7+q)uqH3nRm6pw{MvETenlmI z8LdV8bZ6G?USB03`ctxhuW}x~oq6DtkpNRE%F3w)#OCBWKjEdlw7io%9E-Wb zbnxX(!qnIl`F20W`nHmYr*>Ji)EYOnF+6wxit37q=2GVh*|p5ECO$K0GbX4_laf^fHvYt3S4?R8&&~e$ z2DyGDon~Et{Gpb0q$45E+<+I;G9)si}gZ z4l|}b=~h(-BOw$C_kc11hNSfImuBm^48uefFCI#AX9r~FBN}?)IwmE(LRGe$IOz(u zBb1-Gbr-@tti)eu7tkL_oO{STUqSkPedb9-?4_jayNetb#M^1~ZyGO3VyKaPhwP|h zNrwyHq0gbYg`jX4;3VbB9ba@kpZE6vD+T}0D&(ZYtiz3M_pj3rGn1Ay7?)UoR-t#p zABG2iJ2jP8L5F&uUby3X%OLWi{b6xq=f8@N+@y^mD84rYG3m-VLJz64J^EE#pkZlw zd3(=BBqUomsqxM6$%kQeDx;L8E056zZ2=Df~2a3tU!UA{=j*y*#__#gd zhIRo9fX6Xcd?&i1Jpc6|d8bb=m2Sq`RBR}R``-&fe+wGLTR#uCJ#!&IQC77*w{&Mi zcz!phd=w~OiAEC|bb|B&%?=oTmh9A+Mcxz+8SnbTr7#N*2=wI!4VFb-6?FWVu!A~+0*i|3;P zSzjt^?DiQv1R_HT!;O4aFJ8>A0T@TUZu3ZC#)*qI`Yo^BNK#XQVS|}j&iFLl!v!Gi z1ON&Xp;x6*u=qptvN%)85`}0sXQj#^pcG={X5{~53YS-a!RA{4?_rM{Bg2Ls)}tgv zaa1oHNIVO1?uG!>S$bgQfMg-ruDdx_wHO0K-j2NDI|?u>Aj8Z|4$UQIV1qiB&GG`p ztaxs8Y`tV--X^YrW^d@uTATO1?Y247H5dUqvklg+%lB{eY>soL7~+9VTf5may;R!qR;ONq054^MpTPR4px5RlCR8q&ZbcoPs^n7Zp~ z@)5b(IChFQ(AOXT;~)@?!>TX=+&OM49b_aSQKOkzHr3o|2B57{dkcY*O;Nd5QW6%y zU+U(6*-=u8Ja_13hOtsaq9@w@88qR*U9Iw@c=ah8BKzN#wm=PO^cq&;_01F!)yG_# zv=D3K$Tt2PFp{J>-c0exD53d;U(m`f!URP;sg09Ib|+(8Vk^Zl@N4x{xW^bo)p+l8!oa-wvQkhGXZpciiBUPl zyXeiL=!r|gD9s1rBzTxJ;@8Lq?Xo`C6&;ANI}Vhi;^A+YbRJ_8QMy1uaXADcHH$P45u^Qz%>gv1cwL!pdR1r-nNa8=DsV+)bnjs z1=Qb0TdC2;8*FV9yjpfwggmys#3BXLUE3?KKq+AP9~_)al%H8p-rgPOlyExQE4Vm^<>S21O}dEAc$*y^&ovc~?(4~Y-y3yKzKju|sJ zjjkN7@GF43l$zPE=l-=JrZrU51$9s#{v|y(p|);;yDaSB4PX6oOd2eW!jZ|O9Cl-j zdTL-!^a(Aczt<}f;G&vUuYOe;dUV_}-F!1=vOKVoa489oE9+fZ&Y(Z^Y)GYW7-AP| zHBrG+dFzQq>$zg@CdB#bc%phGCCNwD=bWdsFf$v*0EsPbZs}EUBw7kpK0@V*FlErq zuV~Q8JSb#)M6d2|2-iswA8nOy@G{>XOLgRuX%r)m3XAZ$6GL~eeg?Kj+l}e@m=Mj$7kot}zqs(i~|9Thq=Z>0Ap%%&H=d>W9 zt+)4gndT*@ns7{+b83YH$COd+uEN|{yawdPcWFv_YMKuo z2a4mJRUzWYU~r~PWwVegrBFkVsiNYzKQEZ#03B_hT2z;n|)^gJ*B9|E9By+7NY zb^C|};vS^t@WeWmH~@i8SAh3J<8kugj*^;N~sKyy-=8xtCh z5i#BGcu7B%KD?yS7<<&-MKCGoKM{d{IP)_LUgs*RUoR79_52r{8lo&B7s+3dR!c-d z+L_ng0S(^b_2BHMR(SxR*x*`D+i7dI&|n}_Hr!wf@bkG)IQ&zn+EaqWZ=0l&_P5xXT5zj`W}pDR7gs%h&A0csS=F%_{=%AoY)Ps z58T@V*5c;mn5y5qV81Z%kV(ZT(8Ck~X#g|bWYNnYYCBTFkih=~^pd_-fPHNwPW`Sy z>h@JsRjpt{<>D6m5T%?9?5vv{*$e$c3AKj?qf>hj8C9?TLd_q2L1!n7u}nyFz9@`8oR1L}2B80si)@s_ z^l)PhB*&&am(QSQ%oCe%l1x~;uL6nkp;`7Vsm+_6zlBaLF>y9{*^p5KD*1m;z;}zVFYXC}5szpJVI6uJdQGdtekj+cS#$Ii# zsuBMAAaRfP0kd*HHOKWNj=MH@(rUgX()X!+@m&18ZpfDXw1ibT@AR3bm0{mgLWT-y zkTS-4fW<>-HHsGya^|8_Q+}$ByKiPacI%Q8NYHzDejKr!;i0xY;rGQE2rM{YsdNG^ z=aMi-Ei{3X0bA{ZiRCsTJV%O><;gy>Z<;I#tZwP#f{Rdk_9UY0X5%YRu34nbs^6x9 zde{tMq72QAkGIJxZ6uOn2qeJlAuRXA_>#W*C(ozq_@#M*ZUKf+yOklPiW+q{G5q$B z@^N_z2?B)=I05Mte%=9txa#eML-Eb`fB4ItG0Z^@EAGI#$fgcgUk*>TQ*2lDP}Vr0 zVTg(zaoMkU;&1KY#F};YRkyfoYQQyCov@ql0K<}ER|~LC8K$TNtMIUJKvP3*0c-}a z2++b6bt}2j_u9u#`O7QB%X7@85IGMc&xm8yxcuLnXtX(BcXC*${Q9C1b}oxv@auT&LyCxiI`UG^XH*8{DosWcMLpn zGjzzBr9&I?pNb4#_n_^=JQZ9|1$H84huz1F^To*AAv_)lf{^#JIDp}qPqAF-^N15E zd)P4GgBIdYb>6~<_N^vd!l;E!F&h51_VRF_LF5p+9}9|gOkE_?gJ=Ibh0e*Gv|1+}k3NoXlvAlO%Tz1I$@b;GNL>#9JFUMos z`}+k1*($Kz&g=03z3n}OE-{e{h+VvaG85C4N}tfF>ZkJFe;iV<*s_VX7_vlzr2KF5 zuURpP3xS)#kg|23a2c}C z$jT1^^}lrzj3Q{y&PJfm0zJZS%)O^s!*FK{IM}#+1YdYRMkP+<@5P;5C6^PA0Y$BX z0zBl}W1~|`TUlOc2-vuOnm_bauwSSJ8LVq`a959n>4Pprzh1vBrf=uF-KZZDZLbb91ujWqLweisjr-szXY z5L&>X>C7Hzsk17_TeZkr2uMh*^#G|?0OyvvUx65_`=h!FF%NYC=^_eeU|;mN=xE?t zukFQy9q7DwF?GA=2o(~_xz1M}?s9*_TS+Rl0L$oHVB4#1bDn2;a%;(K@x&UTYXS><)>gK`i^sAs#_bT^+$5-8$IgzkO7I_0`oqXvXPz}x1TERA}WkZNVkxl4_9bCG$#ylQ<92bm%L?t-52 z;82e`IY~P|rx!m>qFSk=om5E1#ZajVR?;q3(u0B^0FczD_P>5yE%FlMN8|6x?j3DXsVP;DH~!Ix>$m8+8)#!< zyRA3sf%}Qm_g!X=0C8Hl4o+yf&wCw3j}DC$W1#azqJZQ+`0^#l-{g#7KX7X~?tTGa z49fG<`=LzjmfFlr53HmAyH9ju!X$JLSbVk3By|vA&}(VX=~^3p{7H{_wS@$|Kphx@@C4lyG<*9y#6V9%mc&#oOo zT_Cd%bzPee5pH_ET1*~3$(RT7afL33VEhb15&(BTKl+A=Z{tDZ(dulQ zg30?K(o}9UYJ_2_DULz*Ee=s>=+M$+0f4$7)f30_SvRe9TtWwG^4 zmyW{~vC9c=CtHq04(fk+MRZQmc=rIU9lU#IO3mo=&)Ub6$?3KSd~4t&10R?zcQ5f) zKZ>+>O+}@hNSzaeT!22*0cm$h!_m_wr(aC?EANatR* z3m>F%^fd>n4Y*p3VK;pW;AOf!0F`R}l(NVBRn!LDJAgvaZ8FE!uqhQMBj7ix)mp6I z;g;6q_0>~!e~SM{$ao7W-n>-UqS#watr(ss&w$VvlM5o5_D9eSy_~SDZ1W8D;+ieL z=GJWQ9-Sd&svk}gu#808C7yEURc`bGeQe6?N)H!qnBdJ5Uq3z@Tms;eX&!h-TE(ou zH~I5V(kVVKpualKOv{M`9*HIo9JK)=iy2Qg13w*TwrRVW-B8EiSEdgt{BDsbMdA(0 zI&;JVhz%UXW$oWk0+qSg&BZ{-0Ekl}0?NO3c=FD|dq;U5%&DhM4}XLb;b#~#RDZDX z^;7M$x9Jig+kY!YqM;H$PDJ$s>jibe3~v1}dyu{f)r{M+;Tu21;DK4r$!kkOhkht| zoxCaVq*WY$c+%=;0N1+w-M%p=JXeYBe4!hN-IwBYPqu}gON21__TLQ@H^DzY9~4(= zgY{~92-obX1zAM+-}5`!egFmk#D91Sf#-O2Z#9V zui@8UOyoO={~`+cUjr(!6StB_l}`BKipI{WJ;>Xh{|SozAM&>Uvs1>|mxu0&br2To zvsJ|`j7+wUOwMJ84o~ur1eype9=ty6Kq+OhF<|Ke7%4Grm0N|d_LwRG`0V|=$3T7u z&<8{*W>VX-tND^)aTwz8q(>9^h>{Al0YGUiGQFE4o%sZo7@ zt0vIfFaa%e@8}$2zfBpdnU%^S{9HAbvG;}Aoar4GE%AZ&Lxh=#?QR7Q8zDQhYMe!O zbJ4w#(#YY-q7g>KRdnAE33{>8XQ9m2DAQ1OA4yUziL#wkSaSI7p&!ohL&?0K)}HzR z{1UOhgF7Z=4#R6-fR$F4$qzh1;_2DYxLsf@*85PadWVNmX@fz+hl&2uS!1leU zYK$27-E|kB&DQ*K<1iaqaw3|&O4nj;cx9FxO4&*+w86;Plc>1@0&A#nHAYKZP#fp@ zuJg2*^R_p6&98wB0%;59_~=gSAts!P0pYx{Y^)ydEs#eAJYADtFE$UB`Q%*Ft5gFg zXE2&m!hkaZ)}-H}VyNO#TFoi4L!qJ#(lj{kdTfoQ<4-nJ> zWeKJ?G6pz63N`0|_5vD}q0FoEv5s_Wj6ZjZzw|3C;+iTMmwGybUq zTPmpp0PdSk*W?)mAD^oSS^_dySBNZJjdO~Zonrub{vO1uKYx3x zY8W7J@>I*8LN5!wS@koFOD_{8J2)YFB%?o}F}v(SYX5lx{BSHv%5xL7p%#GOtO25b z%337}71JG{u}cd~@LEByLUVRrXVAV|1EtLrm+LP%Xy8TLX$Cs}fU5m7!lDk6(v`Ml z+5sX72_}y(;?T9-*&k<59d(Ug&wlg{*lsz7xoFA6)4F<(R;)I3Ai=}WT(WcKwCAlu zo2s3!(+it6r_O{<0CGk#>epRZ_qw*UiSYgGuQzMHIY&!PR<+ep-y~ytlyXl#R0|ID zQtL;#3!1n04FU*nM8s%n?N5JBOn3=wl@a`ILl1h7!UG#=gfXueaMG7&e**!#fTXdF z8~wSO?g^bQ=YMX=;NknqZ|f(>+0?M!cU5(iO@4Nt!>ED81;??i;*z&J3{gS$xzl&n zFAXjI{^>GEdC0=)TA~PfrXKz(9!U28O+2u?swDoTw?2W+FAnvFI`>Cf07)zW3^!0d zXm|`@nVRlGiGM!g)&*u&{}qHi_K;j#sLVcr^H0HGi2sS15^YTpm0PU<4jkD1AMu zbiGst4W!WddR;D+SfkXOG$4mVRS}XmYz}d>45^g z2+#wa<{@@2EgD@$v6tgm3ao;(;Gvn-U*+TCuK~@tDj7Wd@d}cBW+Yo34P`h?9_S7) zoh`LJY`-A7n+Dnpc7*;_iL8A$AMTMs&@(&1Q!=#-*K<6uuMQI77m@S~H~K`k1|EN( zvQdJM4N1r#nKR-A4U*>anK;d1ZIi@JTS>vlDVsN|HHu9=`lv DCaEG; literal 25913 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 QKTK$h51Z*%=(@%H4{h%7ApigX diff --git a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml index f27d392971..a177d49e1e 100644 --- a/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/CashierClassDiagram.puml @@ -1,14 +1,24 @@ @startuml !include ../Style.puml -class BestsellerCommand { +class BestsellerCommand #LightGreen { + execute() } -class TotalProfitCommand { +class TotalProfitCommand #LightGreen { +command: CommandType ++ TotalProfitCommand(command) ++ execute() +} +class ListCommand #LightGreen { +- transactionList: ArrayList ++ execute() } -class BestsellerCommand { +class SellCommand #LightGreen { ++execute() } -class BestsellerCommand { + +class TextUi #Tan { ++replyToUser(text: String) } class Cashier #MistyRose { @@ -22,7 +32,7 @@ class Cashier #MistyRose { + getBestseller(): Item } -class Transaction { +class Transaction #LightSkyBlue { - dateTime: String - totalPrice: float - profit: float @@ -35,7 +45,7 @@ class Transaction { + Transaction(String, int, float, float, String) } -class Item { +class Item #LightBlue { + isMark: boolean + isOOS: boolean - itemName: String @@ -47,9 +57,12 @@ class Item { +Item(String, int, String, String, float, float) } -Cashier --> Transaction : has 1..* transactions -Transaction --> Item : has 1 item +BestsellerCommand -d->"uses" Cashier +TotalProfitCommand-d->"uses" Cashier +SellCommand-d->"uses" Cashier +ListCommand-d->"uses" Cashier +Cashier -r->TextUi +Cashier --> Transaction : has 1..* +Transaction --> Item : has 1 -hide circle -skinparam classAttributeIconSize 0 @enduml \ No newline at end of file diff --git a/docs/Diagrams/PUML files/Style.puml b/docs/Diagrams/PUML files/Style.puml index 5a0d5b5aa2..c9c000600f 100644 --- a/docs/Diagrams/PUML files/Style.puml +++ b/docs/Diagrams/PUML files/Style.puml @@ -36,5 +36,4 @@ skinparam packageStyle Rectangle skinparam classAttributeIconSize 0 hide footbox -hide members hide circle \ No newline at end of file From 5504d2e09805505471593d406f491d012b63cab1 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 16:58:03 +0800 Subject: [PATCH 381/421] Update DG --- docs/DeveloperGuide.md | 146 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 145 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 429b890cdd..7135b957bb 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -155,6 +155,9 @@ To improve the robustness of the program, the `Transaction` stores the `Item` so to allow for users to edit or delete the `Item` without losing the history of which `Item` was sold in the past. This also allows for the analytics to work with `Items` that no longer exist. +Note: To simulate the reality of business accounting, the `delete` command for `Transactions` are omitted on purpose. +In actual accounting software, transactions are not allowed to be deleted or edited to preserve its credibility. + ### Cashier Class Diagram ![CashierClassDiagram](Diagrams/Images/Cashier/CashierClassDiagram.png) @@ -334,5 +337,146 @@ it also allows users to see which item has generated the most profit in the busi * *item* - item to be sold at the shop, with key information such as quantity, buying/selling price, description etc. ## Instructions for manual testing +Note: These instructions only provide a starting point for testers to work on. + +For the most optimal testing, please follow the instructions section by section to test all the features. + +### Launch and shutdown +1. Initial launch + 1. Download the jar file and move it into an empty folder + 2. Open the terminal, change to the correct directory and run `java -jar tp.jar`. Expected outcome: + ``` + ---------------- + StockMaster v2.0 + ---------------- + Data is being extracted from: ./StockMasterData.txt + Welcome to StockMaster, where you can master the knowledge on your Stock! + Out-of-stock Items: + No items out of stock + Low-on-stock Items: (less than 10) + No items low on stock + Enter Command: + ``` +2. Closing the Application + 1. Type `exit` into the terminal. + 2. Expected outcome: + ``` + ---------------- + Inventory is being saved to :./StockMasterData.txt + ---------------- + Transactions are being saved to:./TransactionLogs.txt + ---------------- + Promotions are being saved to: ./PromotionStorage.txt + ---------------- + Thank you for using StockMaster, hope we have helped your lazy ass! + ``` + At this point, you should be able to see the logs folder for logging, as well as `StockMasterData.txt`, + `TransactionLogs.txt` and `PromotionStorage.txt` in the directory that the jar was in. + +### Adding test data +To test the rest of the features, there must be data to work on. By running several `add` commands, we can populate the +`Itemlist`, in order to work on them. You can use the following command: + +`add testItem qty/10 /ea buy/1.00 sell/2.00` + +You should see the following output: +``` +added: testItem (Qty: 10 ea Buy: $1.00 Sell: $2.00) +``` + +You can also use the following command to test optional arguments: + +`add testItem2 qty/10 /ea cat/testCat buy/1.00 sell/2.00` + +You should see the following output: +``` +added: testItem (Qty: 10 ea Buy: $1.00 Sell: $2.00) to testCat +``` -{Give instructions on how to do a manual product testing e.g., how to load sample data to be used for testing} +### List Items +To test this feature, you can use the above 2 commands (in [Adding Test Data](#adding-test-data)) to populate the `Itemlist` first. + +Make sure that there are no existing `Storage` files, or `Item` in the program to get the exact outputs below. +You can clear the existing data by exiting the program (via `exit`) and deleting all the save files +(`StockMasterData.txt`, `TransactionLogs.txt`, `PromotionStorage.txt`) in the folder. + +After using the two lines above, you can test the following command: `list_items` + +Output: +``` +List: +1. [ ] testitem (Qty: 10 ea, Buy: $1.00, Sell: $2.00) +2. [ ] testitem2 (Qty: 10 ea, Buy: $1.00, Sell: $2.00, Category: testCat) +``` + +### Adding a new Transaction +To add a new transaction, the `sell` command is used: +Input: `sell testitem qty/5` +Output: +``` +Quantity of testitem sold: 5, for: $2.0 +Quantity remaining: 5 +Total value sold: 10.0 +``` + +### Adding a new promotion +Input: `promotion testitem discount/50 period /from 15 APR 2024 /to 31 DEC 2024 time /from 0000 /to 2359` +Output: +``` +The following promotion has been added +testitem have a 50.00% discount +Period: 15 APR 2024 to 31 DEC 2024 +Time: 0000 to 2359 +``` + +To see the current promotion in action, run the following command: +Input: `sell testitem qty/5` +Output: +``` +Quantity of testitem sold: 5, for: $1.0 +Quantity remaining: 5 +Total value sold: 5.0 +``` + +As seen above, there is a 50% discount applied to the selling price of `testitem` (from $2.0 to $1.0) + +### Viewing the promotion +Input: `list_promotion` +Output: +``` +1. testitem have a 50.00% discount +Period: 15 APR 2024 to 31 DEC 2024 +Time: 0000 to 2359 +``` + +### Deleting a promotion +Note: If there is a promotion for the item, users will not be allowed to delete the item until the promotion is deleted. +This is a safeguard against bloating the `PromotionStorage` file with unnecessary promotions. + +Input: `del_promo testitem` +Output: `Promotion for testitem has been removed` + +### Viewing the transactions +Input: `list_transactions` +Output: +``` +1. 5 testitem Sell: $2.0 Date: 2024-04-12 16:37:19 +2. 5 testitem Sell: $1.0 Date: 2024-04-12 16:41:24 +``` +Note: The date displayed will differ based on your system time. + +### Viewing the bestseller, total profits and total revenue +1. Bestseller input: `bestseller` + Expected outcome: `The current best-selling item is testitem.` +2. Total profit input: 'total_profit' + Expected outcome: `You have earned 5.0 in profits so far.` +3. Total revenue input: 'total_revenue' + Expected outcome: `You have earned 15.0 in revenue so far.` + +### Deleting an item +Input: `del testitem` +Output: `testitem has been successfully deleted.` + +**Note**: If the item still has a promotion, the item cannot be deleted. +Input `del_promo testitem` If you receive the error `There is a promotion that exists for this item. Please remove +the promotion before deleting the item.` From c5b924c65e6b6900b78dfe8b26fef7d69b947dca Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 15 Apr 2024 18:33:13 +0800 Subject: [PATCH 382/421] change messages to match format --- src/main/java/common/HelpMessages.java | 9 +++--- src/main/java/common/Messages.java | 38 +++++++++++++------------- 2 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/main/java/common/HelpMessages.java b/src/main/java/common/HelpMessages.java index 3623d6d0fd..b4d031ea89 100644 --- a/src/main/java/common/HelpMessages.java +++ b/src/main/java/common/HelpMessages.java @@ -10,7 +10,7 @@ public class HelpMessages { "|------------|------------------------------------------------------------------------------|\n" + "| list items | list_items [marked] [cat/CATEGORY] |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT [cat/CATEGORY] |\n" + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| sell | sell ITEM_NAME qty/SELL_QUANTITY |\n" + @@ -51,7 +51,8 @@ public class HelpMessages { "| exit | exit |\n" + "|____________|______________________________________________________________________________|\n" + "* type help c/COMMAND for more detailed explanations\n" + - " (use the command names on the left column)"; + " (use the command names on the left column)\n" + + "* parameters in [] are optional and can be omitted."; public static final String HELP_EXIT = " ___________________________________________________________________________________________\n" + @@ -215,7 +216,7 @@ public class HelpMessages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + - "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT [cat/CATEGORY] |\n" + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + "| |------------------------------------------------------------------------------|\n" + "| example: | add apple qty/100 /pcs cat/fruit buy/1.50 sell/2.50 |\n" + @@ -230,7 +231,7 @@ public class HelpMessages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|-------------------|-----------------------------------------------------------------------|\n" + - "| list_transactions | list_transaction item/[ITEM_NAME] |\n" + + "| list_transactions | list_transaction [item/ITEM_NAME] |\n" + "|-------------------|-----------------------------------------------------------------------|\n" + "| example: | list_transaction item/apple |\n" + "|___________________|_______________________________________________________________________|\n"; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3522da50a2..66f478969d 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -4,25 +4,25 @@ public class Messages { public static final String INVALID_COMMAND = "Invalid command detected. Type 'help' for list of valid commands"; public static final String INVALID_HELP_FORMAT = "Invalid command format. Please use format: 'help' or " + - "'help c/[COMMAND]'"; + "'help c/COMMAND'"; public static final String INVALID_ADD_FORMAT = "Invalid command format. Please use format: " + "\n" + - "'add [ITEM_NAME] qty/[QUANTITY_OF_ITEM] /[UNIT_OF_MEASUREMENT] cat/[CATEGORY] " + - "buy/[BUY_PRICE] sell/[SELL_PRICE]'"; + "'add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT [cat/CATEGORY] " + + "buy/BUY_PRICE sell/SELL_PRICE'"; public static final String INVALID_DELETE_FORMAT = "Invalid command format. Please use format: 'del [ITEM_NAME]'"; public static final String INVALID_EDIT_FORMAT = "Invalid edit command format. Please use format: " + - "'edit [ITEM_NAME] name/[NEW_NAME] qty/[NEW_QUANTITY] uom/[NEW_UOM] cat/[NEW_CATEGORY] " + - "buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'\n" + "You can edit at least 1 parameter up to all available" + + "'edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] " + + "[buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]'\n" + "You can edit at least 1 parameter up to all available" + " parameters. For example, if you only wish to update buy and sell price, you can input:\n" + - "'edit [ITEM_NAME] buy/[NEW_BUY_PRICE] sell/[NEW_SELL_PRICE]'"; + "'edit ITEM_NAME buy/NEW_BUY_PRICE sell/NEW_SELL_PRICE'"; public static final String INVALID_SELL_FORMAT = "Invalid command format. Please use format: " + - "'sell [ITEM_NAME] qty/[SELL_QUANTITY]'"; + "'sell ITEM_NAME qty/SELL_QUANTITY'"; public static final String ITEM_NOT_FOUND = "Item cannot be found/unavailable"; public static final String ITEM_NOT_ON_PROMO = "Promotion does not exists for this item and hence " + "cannot be deleted"; public static final String INVALID_FIND_FORMAT = "Invalid command format. Please use format: " + "\n" + - "1. 'find [KEYWORD]' to search the entire Item List" + "\n" + - "2. 'find /filter1/filter2 [KEYWORD]' to search under the filters"; + "1. 'find KEYWORD' to search the entire Item List" + "\n" + + "2. 'find /filter1/filter2 KEYWORD' to search under the filters"; public static final String UNABLE_TO_DELETE = "There is a promotion that exists for this item. Please remove the " + "promotion before deleting the item."; @@ -40,7 +40,7 @@ public class Messages { "format and have a valid range:" + "\n" + "e.g. time /from 0000 /to 2359"; public static final String INVALID_FILTER = "Invalid Filter is used. Filters can only be " + - "[item, qty, cat, uom, buy, sell] and must be in the following format /[filter1]/[filter2] etc."; + "[item, qty, cat, uom, buy, sell] and must be in the following format /filter1/filter2 etc."; public static final String INVALID_DATE = "Invalid Date has been entered. Please ensure that the date exists."; public static final String INVALID_MONTH = "Invalid Month has been entered. Please use format: MMM (e.g. JAN, DEC)"; @@ -48,28 +48,28 @@ public class Messages { "Please ensure it falls within the " + "range of 0 to 100"; public static final String INVALID_MARK_FORMAT = "Invalid command format. Please use format: " + - "'mark [ITEM_NAME]'"; + "'mark ITEM_NAME'"; public static final String INVALID_UNMARK_FORMAT = "Invalid command format. Please use format: " + - "'unmark [ITEM_NAME]'"; + "'unmark ITEM_NAME'"; public static final String INVALID_LIST_FORMAT = "Invalid Command Format. Please use format:\n" + "1. 'list' to list all items in the inventory, \n" + - "2. 'list cat/[CATEGORY]' to list all items in that category, or \n" + + "2. 'list cat/CATEGORY' to list all items in that category, or \n" + "3. 'list marked' to list all marked items, or \n" + - "4. 'list marked cat/[CATEGORY]' to list all marked items in that category.\n" + - "Please note that marked must be in front of cat/[CATEGORY]."; + "4. 'list marked cat/CATEGORY' to list all marked items in that category.\n" + + "Please note that marked must be in front of cat/CATEGORY."; public static final String INVALID_DEL_PROMO_FORMAT = "Invalid Command Format. Please use format: " + - "del_promo [ITEM_NAME]"; + "del_promo ITEM_NAME"; public static final String INVALID_PROMOLIST_FORMAT = "Invalid Command Format."; public static final String ITEM_IS_PROMO = "Item already has a promotion. Please remove the current promotion to " + "add a new one."; public static final String INVALID_PROMOTION_FORMAT = "Invalid Command Format. Please use format:\n" + - "promotion [ITEM_NAME] discount/[DISCOUNT] period /from [START_DATE] /to [END_DATE] time /from [START_TIME]" - + " /to [END_TIME]"; + "promotion ITEM_NAME discount/DISCOUNT period /from START_DATE /to END_DATE time /from START_TIME" + + " /to END_TIME"; public static final String INVALID_LOW_STOCK_FORMAT = "Invalid Command Format. Please use format: " + "low_stock /AMOUNT"; @@ -87,7 +87,7 @@ public class Messages { public static final String SELL_TOO_LARGE = "Sell price is too large. Please input a smaller sell price."; public static final String INVALID_TRANSACTION_FORMAT = "Invalid format. Please input the format:" + - "list_transactions item/[ITEM_NAME]"; + "list_transactions [item/ITEM_NAME]"; public static final String INVALID_LOW_STOCK_AMOUNT = "Please input a valid amount."; public static final String NEGATIVE_LOW_STOCK_AMOUNT = "Amount should be greater than 0."; From e5f4965d26dbdc8406bce498147cc371c8836c3e Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 15 Apr 2024 19:21:01 +0800 Subject: [PATCH 383/421] change DG diagram to match format, change editcommand to catch if new item name already exists as an item --- .../Images/Cashier/CashierSequenceDiagram.png | Bin 39707 -> 39690 bytes .../TotalProfitCommand_SequenceDiagram.png | Bin 20824 -> 20806 bytes .../Itemlist/AddCommand_SequenceDiagram.png | Bin 29614 -> 25422 bytes .../Itemlist/EditCommand_ClassDiagram.png | Bin 97004 -> 90993 bytes .../Itemlist/EditCommand_SequenceDiagram.png | Bin 86734 -> 84867 bytes .../Itemlist/ListItems_SequenceDiagram.png | Bin 33705 -> 26957 bytes .../Images/Parser/Parser_ClassDiagram.png | Bin 91062 -> 82227 bytes .../Images/Promotion/AddPromotion.png | Bin 33637 -> 34388 bytes .../Promotion/AddPromotion_ClassDiagram.png | Bin 40769 -> 41956 bytes .../Images/Promotion/DeletePromotion.png | Bin 19011 -> 19352 bytes .../Promotion/Promotion_SequenceDigram.png | Bin 17492 -> 17893 bytes .../Itemlist/AddCommand_SequenceDiagram.puml | 1 + .../Itemlist/EditCommand_ClassDiagram.puml | 2 + .../Itemlist/EditCommand_SequenceDiagram.puml | 1 + .../Itemlist/ListItems_SequenceDiagram.puml | 1 + .../Parser/Parser_ClassDiagram.PUML | 2 +- .../PUML files/Promotion/AddPromotion.puml | 1 + .../Promotion/AddPromotion_ClassDiagram.puml | 1 + .../PUML files/Promotion/DeletePromotion.puml | 1 + .../Promotion/Promotion_SequenceDigram.puml | 1 + docs/UserGuide.md | 44 +++++++++--------- src/main/java/common/HelpMessages.java | 4 +- src/main/java/common/Messages.java | 8 ++-- src/main/java/exceptions/EditException.java | 3 ++ src/main/java/parser/Parser.java | 8 ++++ 25 files changed, 49 insertions(+), 29 deletions(-) diff --git a/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png b/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png index c7f52d7ebd3bf6cb6adeb30f54a3064e454a7e07..8c8c83c5e254b5698d72e6b28b01bc352d53e1b4 100644 GIT binary patch delta 755 zcmVV$-YJJTVArUNByh6H*R_9oFFOQ|G> zP^SOhwQPeOAQReabg?b%d;4~+-95IB8uX^hZpejK}diOof}y`WE zYwUk|O)W}`>vA_rt?4XLe_JMhAf%(MS`1so^;%f3Mn(5#ivSuz#kl&Hn?pP$_;~>T zuisyyOQheBA_H0mr=XXlsG$B(4@o;NOLPB6M@CPD+ZI|_`>bs?KSAp(RY6w2h1O$& zWj%u(KXw&nZ-t@`z!Mnp=$6U_9=w(l`kEP?s<^MEHt>GnSAM2Ve~e}_7tyVv8iSVK z9cbmo;x|I;i2bP&_a!HzhexA=Fz{;)+TGwF-+hiA(@jO~?iW~LugJ}IeZlmM;Igi5 zjK5M;Q5kj7GI~Jr_mo{#4|f7W-|_LS2_tel+Ul&8{V7u{zfp+uC~c(PjL_r=d5s({FGHIr4E zC==Fm&WIZt7-x}IK7RpYb3t=#sNK&z14KIMu zmSTifvmLZM&BMmP2pHfEO(X~o!%h$eT^N6zKz6*(8pE>*U|5|RYX32%#rG*+j^}*I z;WAZDBpAYv1*-GYZ{-GjQA=U8?~3gFdiZ2;)Hyg2j%JF<;IA~Uo#_xl(}9vUg9AM)_Qug5OQ|G> zP^SOhwQPeOAQReabg?DvdwRRl?w%OSw9QiCz2hW{5Fs^glQ8^lR~4-w0t^}kcB@1n7O(OQHT*5 z!;*&5(&ZA&gatkWPWryH6oDI%%0j}IC|`6YLE9H%QWMsC!I^@+p})>nXn;azo$Hbt z+uHy1npzYF*X3@M+R#~{f3^(%kPAyo4Ij4h>ovDt^@`rj77nzyjB)iZFNb(4@N)5{TcROaqR$6C#}-4$wtDXMYD~3`%LM$o&D+i&*Gl@Pm{&)2 z{U(0IrMs}7JhpS_fB7#{SLjZCKb*5z-Q~+OM$fypbA~gP37e;ni$qF+sG{*?wJ2Vo z>u{7;k!3Owb($y_*0)ykDYc>VNJ$qz-}C02y5meKJ5{SL=pB9~k%S0cTOo6(cO@zKF4x71*C z?#Io@E2}CYB9&L;00xUrx7YP9sc>eL%~XK$TO(q9A3*rk`wMk?IJM|G4F&)JfB;EE QK~#8N?41dGvtI+Nm;HKyxc~qF diff --git a/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png index 70e37a5f062ba954143b80dc191df585ac2d4c5f..ddb80ea787761609ff7471ac5bdd97202d772ad9 100644 GIT binary patch delta 702 zcmV;v0zv)Qq5;OD0gzgMqG?oEbZ~58Zgh2RYybfO004NL?Nz~2+b|Hl>npbDB{`5f zfpGAl1B9jnC2b}Nbb1u>Cea{Et}KV74FBG>90x%drc9@&;!EV!zJ05g)$>vAxOGLU z*gL6(DiVZt`@_Vo6}Gc7%re@SLS|e$Xv9THPTfXf2&-;`$xi!9`gT{ZWY$cR&|$$veDo& zc0@mZ_K&u=gXK3;)4=i+MqJ$RIl`Uq=Y-zo))YGF8)YoKANZ%*Gd4jxT}W}GG0&mn zqXVPeME*kP9J2eca9?psy4xmg3P%2U0`0v(P(^pq6NeUmjaz3JR1exMqhEQ7aBL-4 zk9(Wo&jPimPdy|y(%@LhxdwsSZT_7Tv)b)(HR4Gk^&Fxw=XLy}z$;!-sHW;hkMTpP zy}aLL;ug@0o-bXaJK_Fh!4q>^hG(2^Rj_l4GhQfH4xd*dB_V1x98{u2*oG&?y z3+-fzF?`EVpPzoI1Mo>Nr8WL`v-7LrL&D*~-idTD+ kmtD}EFUSO9K+XE}wQzPFQ)}!u8(A&ejgmXBvljzFPN~3KbpQYW delta 720 zcmV;>0x$i>q5;^V0gzgMv}sgWbZ~58Zgh2RYybfO004NL?Nz~Y+At8k>npbO0*6pT zLJmH3LY&e`T3QB^bb1u>0-DH@E6WthSnwqRa;q_c zO})k)NWE(iasxAeZrhC(LzQDqyUZ7QiF8%Q-zrzD`$xi!?(_eZZWY$cR&|%xWuuGB z*ctu!yMMNS9e(7uQq!g7DU7(d<#U9M@9CUYb88BnL`E44ZwG!eYxRiPUol>Nzi~KdL#< zbDHl;b%Tfaq166^eUph>KreWjdWY`R_u~am%+E4BvPU_DZBA#7>R- ztgO0$-l<`KjKXm}S9KauHr98}%4y;7QW)*^3m98Sa`~AtZfaK5BE@uyHm?>!T0u;& z#{X*k|E=+l6y441;b&OVvyetZr`-*@C+*|rz)Be4l#CmKZ^-Sy8wJb&`W8Jf9mY&W_X`)dUA9w9T}yi zPT*$9w(dX(VM9bC^*JYo{019%15Kyy-{*0VmhY){czX93zOE3{|U^ue{13^v> Ca$-mT diff --git a/docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png index f0efd61166f98e03d48f1637f0e81a075ccac4ff..63eab435b12bd20472474d6e71c565fd403402ed 100644 GIT binary patch literal 25422 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 literal 29614 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®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 diff --git a/docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png b/docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png index 192e698ed9035f93176bf0adef12b451d3c88fa9..c688a3582ede7d079c92689800dc159c1740bd85 100644 GIT binary patch literal 90993 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 bXGu~Mc1~`)I=+MW=L#~14kYb2zVN>Q;Up#f literal 97004 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%0DA}kU+e2}W8d|(G(kz50cW*)CCh5b@85!}g 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 diff --git a/docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/EditCommand_SequenceDiagram.png index 4e45af6b2aaf572971ce5d76a728376d090bf87a..1e7ccb6e71e80c5cb04d7f146ad7eb308b4cba7f 100644 GIT binary patch literal 84867 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 LtDnm{r-UW|8D&xU literal 86734 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 Zv$ND&JAHGg{e%R9>S`Nm5jCx^{u|-J9FG71 literal 33705 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 z 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

*D=WtCw#|Mw?}YIErJLMmMba{66GX@F zck#&Dh+z}KrX!syTmkZynxgKv5wJK=2j|baAeW#|qy7BGlQr<9oVm%yfQkr17D8Qx z`Jq=HhuWlffy=vQ)hbA{#^jzrYz9~ER9&=KK5MH{sP316_`L+Nn~%A8mUUZ&AM=1V z1(=mTy9M4FBC9*ATA?ywKgB_i0&!cZt^12FA{JdhCp38zL+{{dHqc?yTcsCAQA`?XzoZ zI;?HY4D|FG?=L}tl4G%m+g%fVE31|*d@9hTT4C~_b|ISF*NP{Oa)_PU-4$Bdy4x}GMY}7+$Q;VkBmoQlZkm>r$>OA2(22VO zf7{LedeGeuWKtL95EJW4gg?yOBVo{lf|U=SO7Lxo=}CH4nWcsirY>>_(QhENZEk)u z2wjCHd%PJQRrLtRKv`((m~^4$Z2f1VR`pD`n#(Np%R09>&v<^|&+FGwroyuLj;k!0 zxywCIa`1nnGodSFxmDF$6a%{Kx4T|h4B`bncyxu-8y&mGX@-(*Put=XUr>;Js!cNy zZPmWyFTU9+_aW#M?60no=?8_cl`+m@(qIWyB!>Qyh&%+AexVv|^cb#-` zhbAPGAyrjNHnMbwQ0b~Qx>V`MCD*w}B=(2W*?!IX^EUrt8vpr#&>gHmSjOz!^CPt3 z`~-Q294K3Q4eEvNRqifGOjd<@-IIy;E7@l0qr0T4OGhOtiXb&#b0SAN<5*1}(v3NJ z7R9`7dD18MZ``wYZ_8Qt2QR7Sl21;^8KXT9yj9oacgrf7;g-cmqTPRq-U)VzGj$cj zcl1N|_EggU+ZVJ#08T4#B8w=t3qfwT>8pR`{Fh2m85X0~Ns?l1r4iMrAjHWVf*7Ar z#laKp)sdL6aV!lp9{%NX`d7~H3!2ZbQHV<{wS!-%i})n>Rb@sz&a zNT;{oK|FQYZ$f=q@or;h3N*bs`@qn!`qix@eQC4BCE-VP7tN-wv9d{75FqGpv68UGWiXt3Fb zLnjS!9BL1NmK~jXzc~8&PZ>6Gu1U5rbl#yo!?CW9MjdicuZxl<)ls1x_?!nB83xx1 zz;MG>!&&D*u^M=+e4D=cbo7A#N4EQd?5oKG>6>r&YVA(YMqjw^B6|5*OJ1s*&PY(W zhoG7=6{caQ&_t>cYoIEs3IP(>)~+3uHjr|IaSs@4ha}0nO&WG9p>^PC;!rauTP?if zRWYWSgmFIm)UHqkv7RS-5{Dy*UZr8x+xiXV)=#{h+jHGY^QC45PqIksZ~NI{w8gzkt4%%Z+}*QzcPl)Q?@xM|AfDbmT;t0tRjfJe$4PmU|2S)vy1<>)<50oW8LQC|8x@zC$6W<|9XSK(luJ{L;r^{_+PvMBJVt40rrQ9P1yET$8HL)pa~2kmixoGQP5%wD;G%Pn$NF^$YW4F zKp4h!31r0fN5oQHS*aZ++j4oQ^efi2@Zw>$H4yo_40lG0`HsEyCa6Z}4f z#2ou3%fm1BJ09f216b<|>+fh&Dv&7kQw@lEr=gaUVeI~Vf8agrG8IJc>9#q)VGa$z z*i`>OjfC^GS&KOEp3`{F|L?=&A>|1wVSFaRpZyy+IRnuX32i+21+r0SnR%Q1PbA_^ zo!|eQF`tahoVb7(0hHg^7U=|L&&+Yg0iSIK`ucKEL;!1!$de*Z=?k literal 91062 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 z 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%0DeIMhK3J{cIGv_z)X{?_wEIO6-_-|;PHipOVXE| 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 E2b&>6TmS$7 diff --git a/docs/Diagrams/Images/Promotion/AddPromotion.png b/docs/Diagrams/Images/Promotion/AddPromotion.png index 107a9280abea3c6e869510cc55618f81bfe0d62e..a2b0c523669f500556088515a50ab7c4cfeb198a 100644 GIT binary patch literal 34388 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 literal 33637 zcmeFaby$>Zy9YWJf{Gvrs0fG%sFX@6sVJccC@CQrbPCd`Vh{o%0xANc5|YwABT7iO zNRHCoJ;b@+8C(LgzP!$vpaUiI=Yr9NgY!ii<_1@+J|o09n!b7ymME8 zi|dZ@O;bxN6JyTXW+v7ZB@8IkrXd5xYnH$N9JL9aWBX=ENye<{EP3uo!oDu~yFa;) zY-bZod8SxZb%FF(U1>YrjUyxR*$i$=xcH8yyk}8I(=WB?T4Nn1gp!%a;yMcLUM0!V z_MDUHRK zbXB_7O{?=}%r@4}t)zfuI!u2sB;{O>*8?iKp<~Cb^Asp$o9U|gL`w3||GVi& z8)LUiowVhT>n%dlr*l$!;ub~IrcW*}i&PHZ^epVA&yLfKY%senVe|Os?!cw(|l{7P9i*HEQoxcJMpocBQVWhK425vGkYZK1+T3U1a;C`)1YcQ0a!!5^U}z ziG8=GcVrCnW1hLP^5l`Q>l#008&;s%=T80M`^l$CrX$fs!r-73 z)hFs57ig^0DOj}Pr@J5p&-aVO;F(%t1VftfSiA>5de9>>`?Z@6c4muz$^xF{tq8^Ged*Xh?z z2aE3Bk$Vq`P$(%0DSh}C?T7!{f3dtO#?QmEK;3T8oMxhu()x=*HtoKO?trip8g1X0bAkX}AZ?PY%%i@66a!nw* zGx(1Cq=k)GOy1+ik9$HKOy?*243ESg9#SVqMru@?>7{h9)xh^ugW3ou-1K`1ucpM? zPYwz>Ob@o&U^)0oD=L;6E1jv26)w#;U_3}=g9Yl}OOjQqbogr08?;O;d3kyD_4OHE z8mxzQF3wfDXgbdIMTR=hWMj)qO0wEL*y1ru^D|f%Et6@#(1j!1+{w~`oLsq+HSfed z1#E`d`_(Ycxh5R(})9h{(Jg`p1kc0j)Z2atlsqt# zvs}dB!ajXP#;J=~{IezTena06l*3gBf26O};Zafg9p{2!Tp|+4> z-fWWY?l6{W)Zo$INmRB|r>Iqr4?UbU&}P>YJke8`jcwUNLW)A6-%0D6V~@#~=iWcz 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 diff --git a/docs/Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png b/docs/Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png index d622ee867dc74a20f97c1057df729f0980ca44a7..a21382bbea863aeae46956d26617bc3334473cfa 100644 GIT binary patch literal 41956 zcmeFZWmJ`G*EWnIA}XMwARu5MAgOetAYBsDp>!=87L9;Pce&^eDQQ@w(%s##C}Gi^ z-wER0?tQ<{Gw$)dzrHcPUobAN>x?<)dCX(RiRT*$LCos}*HKVVFolI)OQWD%W>R-0$0l4ZlpY^%so`tS2JY@c%k0qhJk1Z zjd;#Ugn)Jnr*Vztg}6UwQfjOdpdv8~<1$NGByi@vFC^2VkchPvn=tE7eS1B$@yS~u zz8SA;@v#&-1O_VJrIYJoNm1}|rRKV06qWkOp2~S%hH#I0Tl<6;MdrefbW(PLl_ai7 ztX&#cxk)uB9)uiI2~VPbP=L(qiBL#0t+B$gxYDGCD^aKI{7EYQW|=m;`VINF*%5Y@ z(Dlm0oksR|zN1+*-*E;ln+T2GvQ~&)ul%k*W|wBKzP^O}sxQ&20-8YvCC^QX3si0z zD;*4jHhy2}BaooEvqQvaGe}SCU9k0b?9h|k^J{GHH+xaHyxHR=(P7#qv)!1OFfFLL zWQV~D4l)F>HWd~#fbckxUgRF_R2Mb3*hThEUM~?WuP{hNze+;L9@Tv($5UY7AZ@DC z@nLQyqqckRP4Fz-MoI7WYnAr8#L7bvSoe#8{A3R`Qo(98ZN=Oz+Bc@gIdH2{i?k!S z)Yk_GDLv4m@6Fd&O%~5S|(n&7IhPkg_Q@h>OuQ^$GyaR)Z94ftx<(V-?J7whDd}bhxKfx-aqBe2jBqUN>h4-Lg~cTq$U}mg?kU_^`GaWmf(?R+oG^?Mhsf5LYJj4@)i#mnLs2SfG>; zv*Mt%fA}9BHKjAWO$&H#^;77X&}}cnU}V?PK8`I%D&7-}_A9+^XJ0j?Vq-#WKHZP*kw)OpJ+kU#ve|oqY>kxDM$@tRncBp8$wMqq?>gntlE)Bt^%l1#M65Wok%Eegiu{?o3 z?hSQKOZ{27CKLXPuqx+iHtXxZ_iR=TTbKw}cM3Z$tWeCaFEl>B>mPgvr{w|bx6g%= zvE#BOrZ-7S91o%0oEmP0yDO^6ZMibAeH02bLoAemna&kwy{RA1I=ByCpDoK`&Y^WC zsk-_@)#-T4@D??{yTj!6(qWQq?Nvi>=h}{VL)4eg&Q;}Zeaa`Fv*P8|?7Xu)S8lth z0uNbdlUvxc^1>17~XYh z)*YMfUKBCBY50T#^P^-7KR^~Qp+{6E}fdB6J z{C97?fRd#{*QX_)oc5(-&L-9?a=Lh>xd{ARe- zjih%HXu6kwo{K_HoHu`9!gv>XsM8UXBa;YS^*cVOcs4g$l3QiamxPMmFO&$kw6$&h z!ae=5C0w`MFqLa@q05m%@%o(XU(4txWwdt`a4UBw4&7N%<%b-E58u6QQF-b#*CWY8 z<{LEL+#}IasNciVUKNl2kEwMTacLr?%dDA*Q+KB8Vnx{6B3TZm+!ZxQ)hpM)uDx+Y z_)4T@iuqq7`gG=m{x#!_C;88zyzUY+$7l1^E=+GT$hz|H`tKbco*@HSkGT}VQ$q%e zq*nb)Z?2zNprGL$es5g3>3b@sY_+j_#KZ!=HSPm>9o%bC1qECHQApT=*4eI^eIBpi z@FU^z5KKteh~?NVW2|EQxVSvjhISn>@Xu8k^rkUt3Hbx?xk=c+87N4cAY^VHj?KM5 zlPo0>%dNV)_Z>Mo+rrTt?mr($`L_A=VCk`b9OFmN?gd-XNZ6CV3_vM(Z^l14lrj|a z`gMm%m+SUBnQ${rXAKQ}ddg=sOjgRgy!z`E94Y!e0vnCWCdU(vfvcjZJ=;;9-EgS0 z_&e$CB);$XbBS^sJEc}eW)A8+LNSz>i`=#Jl*QE^91~$>D6HCKO%J>KR+)YAHAMA{hfw@?r2)$NZY3uuv+8DpI_JV z>afgsoO5kJ-Fa)F>(R4Cr*SH|+J*kCu{5bB0G;g4PNLzobX9A-47kv|5}MyAk+{SN z{~l%C7k*ksD4oabh8uo<6cMdt+X;{ciE6-yY2}T7X5*c_2#}ola$N zxaw5-XtmnFd&E4NtBj2{n}WwONmyFlVJ5OkLS{aR1PCtI^rq+-h-9a>Aibpb+J2{g0v&xL({&qxNRs>`3 zB+9Z?hVX9%L>5|kkEA3cZFh#qC8GAkZ?gaAn-bB(_X(8)3JdEXzyWMEQ_)x>57Z)R zVbevwmE@n@vvAd-m;dVKN?G){!{$9}ihISX`8vkF1fdGK*24dmLt|NikZP&`ue5loqo?)uzAsAlh;jHcM z`uoxhW~+*-kw51$9NGpxic7nHDbVNBr#3l54|nVwWM{n9;ZBy#o6J5&bHw2jfpRFY+umLXmwlyL zm6JFwG;^8#x6NrH#89tV9`4P!aBeh_*GxE9<$rPbCpNbmU@PhXDhE}QRHZCagIjva zq%!9*!(>cNZ>^fg{XJG9)19Ka)v>a#BB2|c(y0>L$dM|X;KLoq;286?t}0%2b4lWC7r1-wL7uex|B{Bs!Fc8G`gRB{oWm$T9>>f z7;wST=l%{>R=R@gywDl1o{*S$a=hD7TT8#Z?m^D8{+jE%BfZ{eNhNET)EbdiSsYS!4hpcslP@qDDZ(&Ewm`Z`(qw(24_csa?@L%CWPSx0Z zt|Jh%Bo3X*1oQymxgFtNnlL|NRe7*Io>P@JtmM3<)yfgisMYRdBEXjy#>zBLPfXTn z(VMete!KO#cFUu^oZV52j_+5hd4Mb0pUV?z@n?{3oTKG@Hfs1>wrW{_ zB40!IC-1=zXlpIA@{b;wjlr!p*i8wUXWJ2#K>RsqD9H+zZCnGHwo7nKsQ3Zr@kn35 zy)ErkCt>ZD=A~*#8kB7J%u{G~G2z{L;9&LL9C?Da|JB$bpAuSsIwN)E4B@{mM6~Sb z^cblHn263|ffHYi59Xf~!wqRB0%-Pu0nG6oMokgQL4EPM8-wB-N~pqFbn>o?30*fY zPIl!RS-X~+7#Bd%sj2snVNS=LWu5dE9l>a;Y&)jd7^h~`Y^NJmTBqr44(UCD7GxaW>8Z&`j2k!l zkRmKu`7tqy!Rf|h1j@yEcMTtJA(#=##2Qz+y5l@q`Ef}-=dRlfhgF7|a{}{_=B$3ZmhOw~mT+io z?cGkKNJn-%d$jAZmArl&>K|JhuCO0nQdKwDyU(qAO1~IIu|>CKOp(#M=3{;@ zw7q#hI_Z$%o^hvQ%Xs@^^ZnVKUG)G?kK{$HVhoRg#K_h=+|KhAC0}^E5&m-7^&=`; zvPamuU&Qn}>PBEiyTNo3ayg2u^j_T*wo&8IgNTX$@O@;3K3-gw1^A;5lOcF zkbpWK^J_J9<0qRc8@MKtFRXZYsumW~c96>J9jt4#pM|5X3}iFEG*V*bxg4pSZ?icH z{rpU8JLF?TQt!Wp{ovnwbc|?^a+A$`$LK6*I2$145GSQF$Y=EG(xolUlWM%v)rmTu zwehSOo*8lxYPsp^Q=R;sMc9qSrVpu*$mgMj`ZFmtW5K6~IL=2ZWHlBc<;U%%wGP8e zr~3!?!~@M*y!N!??Tk_g7C;oHG2r2lEvwS#M6YwzaMkq|POA>}D>|R-lY{I)22ms8 zWwcew8E^37A5f`hiTpO(#n2WIKD^0iunRf9W9WY6YM10}rlV6k%h^gJ6z^=O(5QUJ zMzxqv84D|Hs#pj}^{kqV=d%mCg`H0nlc=?*lKD!KJXMDlVV1QV`(_u2^vN;(#tg8? zMHn@0NJFYvIH@&kK(To7I|ET#etQTT28u}TIgFL%zYi3t z*Dh9kDI?-CQJU-8GWJ5CSsc^;Aqj(34)FB_T7wiSPHhw{MH7R|D2F@L? zmAai-4H1^Si=7m-L{8m>=#Dht#8f(MedLpw*WwsmSTg4jya$_a&a0YF`vRv(Zz*qw zH@!svnaPk|Zi4b0U}i0*A+m8@+dK4Dap_iT@z;Leh?l;NYil(}sE{pgsQUUj!n;lYlHms)=F4*JhJM}E5Tnzz5l3$v6F2(j>B=aSfSl*AO zo8Ft>RE%toL7FD!v>+e6)rwiFY8!LW_^C2X8_d2$hI%H4q>ai;)d0?MSTYAJNP1+0V?v~kr5>ZhU`x&?G<5f?XhXq9 zjBJGTbA|1*q9HdiZc;wL?<;zh_@rmftAZ{14JV_Qs5_72bH5n%#mkLhI+o5nBU1wE z;UjFnTt=DjO2*$p3*KRBye?f@^VO1U_Yc7N<@qv2bj^!@I}lT{8zTP~juPH38_)Zr zK>tbdB*-UF%8A{5GMrFMqs$CrF>z%yZIAL-E;MK!)=(V5A$Q8x{!~XqYZ%FfdT!yt zl~ykN0Rt{0z~{B&s{fnz7V?|u3xR|mNCQm<&NMjFsB_0iKJEXpcd#TG!D2!x(TFfr zR1V$6MEU&d@XqNPG!`eDyEB=mTtbCA9<9G5-bVyatyWDaiZN5#iTZOO6pp@0CA#mU z2FUgonM|+<`nOAq2DIen6;ZAdqTKY(W@8OT`!zy^z5LsB=@`MEz3G)8!KRTX)ur4G zAU&GXmV$}q{>J@ykq2#M=k~}$joX!yoyqjV2IVO^(uYz zy>FD~NtSH-GDvl#n;{zEdD^Qp>y|wU#fz|~&%ervAMA{zGolvSs!$q=er7bAzGe3l z?qJ&hLP)wYQ_n*fR`lm+XR%j1@n_5ySHHVCr zDBSeYhCEd*`Btdaq;b^wpBpqw;d6KL^z%E|o!|ky?_0x@7$fN|xro;x3jK0-xXeF& zyt2vH&^)XYbNe@j>s!;Fi?{EfA)1CeQL4g@-_B^71XtH=Gog4`xTH3(D9L`+m&O`z&kGFrNsPJe<1T4Esv<-IQ) zEGCgE`I~uTkItyzqj<Bb2e%aH z(!1l+Eo_E+jVls=Y~nUXn#gr<*QhzsJf@a3c0NUGa#L_!c^Qeq!6>YQVfno-QS-=r z-!s^o-fl{o6EfxXZSvjttZGh|5PopR<1-(>n*5ultP{N%F138Giox%_`h^wQEZ?Hv zuzY}EaJa@LFSXWKP-@AVpxPjXPGZH+AoJ4E^W7l)<&R4~-aalY%WxAJ4 zv^Qa7&{>09sDG8X!}?+DXbb|0lVY%m4E*AteD!Pl&a=8{ zU4*Jw)2;<)hE#IpjeVyJSGTP6*zqOk(ZpHZfDKUOpcemYB1>pNYqTPIe;w4oj_ex7 z%>$Es9Gz>}7_*1ZAaMmPhCP-eYy^6ec{`mdWKG=L|A&PZ08W8k43YFbp)2RT!%`S4 z=ukWCp4v9$FVoE#DiV5o!fiU%y?@N1&f4$laBwCUW4LghWQ73mx1!_I6|%oEFOdl8 zX}}bweZsxi^s}&Xkwt8@_v;w+^m|8T5_#%4joM^vTG$+HuYP2D71v+MU~nt_Un zo0}W4!?%t8tQLjNsg0jOzdexvN5o14$zTd|;^E4>;F6+?mB5df2%bGr1T-h8 zcrVl5G3>LkJjhBO;6h8v;iSL4il24C zNMr=rHQR6y6e_iJEpIClz*R|{IoHOZ9QtKR8$UaEPLp;dztgkHsi_8CpgwJ?L~xHo zBP#GDeM){hIUU`d$g_-T-&bLDtjs_-_zcK_#YF9KTMa_N)=Kz76Qxn?;u4#WutBUU zXUG;&!7W;owsg3v%YD41DIG4W#zjGK=22Tho&~a)#Nesvg+;)9p?}VdC82rdZwkW_ zhk)?K;J{CA)nMn>ddR9B$Jnpv_slHPjfifTUs(I$$+kFt#t##G;AnW)9L+g)LGI(kSP*qi|poHKK6sF^fe zr2p8>FYj5{E}JNj{D{v^1zw;z_$|htbK}+xi7(H;Omjf9#Y9Io8%RV+fJN!X`rbO4 z+)=Q*LkXyYAdoVHuHW&*sWeDi+OALUoE%TsEyNoDr}T%_F~1W=SWPn1cZ6y?lh35f zrW?I^Gl_~VJD9I~&)<3P{e*O~7y8w!A+)L*8;E$tgIydqX! zQc_w;$hpzg+^29DDDrmkO(d!rFrAB0qTD%xqr>G(dmXEsx1JfwxM3Bt-3o6e>K}#K z2 z?hWD$T!_{#EvXLbnkI7i(+!JtPk75!Dy#-}#>M5;i5Tsf=B+3W#+P(`5i7Aq?4hsH zQDNo4-WZRiVQ5^r1J>VmmK-_9mF30hpq~t8Gz!m44F}{EM&2g(_e_aR8iN#01B>Gm zVGKayO@0uLWz!t3EHCHqIOdZVKC{sp9;HlPJ)B=!rRz|a<7C%4{Fp8POXBV*jvmf} z4*$3(1Ggr(=;pe?b9Y7n$J%yd@kNdmuDid}Hs*D&+d|-6_SedFQHM$y9radS9}ny*gXPOuw5x*{^+G zCeW{ZrKIn8YO=1ldq9n85C7sb-YhBtcLqiNIuB8itkfD<^;q@qd{$H07t=4~tfY{s z>ktB1o90_$innQNFh%cHh8kBl6WSLRDb9GO)u0UA_3>nPw8nY9RyQt=8Ak&E2*JMB zw*g)K!JazOP$k`AxD`HI@LkJ4_fVf08uI2*cJGwFMS(t$P6Ti+AVD;#IMwP~4!jup`uTxbz+xQorbbI=lH>jqtFms8rA58oV2gw zDGusBulo9)u1cVW&&^eg%ppV38w9cIRHR++cXgFK&y7@WiK<;z8Sg0&KBZ#bV2b#J z(5vteB}sP%mogU+D@jB*p>A(__yZ?jbw3_GWjk^G6n68>TOD|z_VpJgErlwPqoJdF z#^ULk|DiUJ$N@n>j*PU*vy)isbg6V%dq>%j9p-t)cZ^AJPPWSFI4d9c3LHg!{w3jt2P#lIQLe8kX_# z@!5oHzBT?;1q(xMPeRG+dA|M6Vmr)gci_Oq32zZNXHeACfTTA=qS^aScdPEwS1k?f zibu0=Ou3Uxs`|Yx{Z+G6#9|G;Y>7nF`yOwl6+l-h4SK42Q#`&M8Xmu_5)G1_wccGJ z*+5_vYV%@?O{@D`Wj6n+jkcRt!|uizl6&Kdr>m9`@Fbnp+^?5a^Yc>UFU zq(HyseT^Lm@(wp!`NuL56vx?c=isrC;(JZknnw9MUDRA*F#x#`AUw`e`{}{YWaw zS|NWpINzwK{MDQg1oy>F37{gh7ymD*F+3%Q?oYanOPe+Z5IY`NinGudb2y*W1_Zq8 zib|t#@>2mzFWnT?Y}h$m%HdgfWVFy3W7&ANieDAU{0F9FXhQ9lGxaB+)N~}yoDB+j z7#PVz^ACNzMpASmg78x0{ z+M6y8TB$yK7)=(rN5Z-W$-Vv=H=XLQVoKYMv{c=!e5d^lKWn7YTt_S&S;|>9rRx!} zYu)H)n<8gr+^E?P49`9sdZmFfsRn5AnC~!o#K#U@*)<*;-u@XX#lP0RLN{+%);I#1 zQy$|M-STFr*csk*Lx+;{iHMK&gXkY*q28OhFJ&_Pu{XE`&VvV*Aiv;bvw^sJ5?*Ds zX;s$Uy|Z>1Upm?#7xAyz0h{yzDAjF8!(abm)`H%;sPZg{XQUQI^_9XtD1$3wZJL`>=E?HhPSMaIXn zHZ}_B(skj~`_zn#AOF3%=Vk=iOonr0WMQ|ho!K6Z(5AP;)3TJqLn)*_lCb|v5QV{) z(KfvM`g7FALcub?teg4Bpr4uE5nP9fa#;}@d<`Ir{HMsRyFpzT6f8%IXvihmt&NV? zrYe99OAQ{+9vPJ-u`g|1*#XHOkod{fZ14j0T2GRCi+>5yketPMndEt#GS~&`WphD6 zL93;HS{exU#Bt%Z`iGKrqT=6O5tQa3%t;qK)$gipckf^No1Kd=CvP zN(Hs%F?iufsl_a4?Q2Yy%ZcgvHpO>j;x3cuu)hZ&F_yD*YPfKWO0KnJcYF}W(C}07 z6KARHZ8xzrkQz;HbwQnQIz;XOxPJ^%sMTlX^65E#lRx}~>gHL29oSy-Bzf#jNl=*| z2CzrOxImN(oo%KAeMh92T@tkSil4sC2rGb$m_N(cX`@swqSi!Kog5@O9Y<({gKX+~ z&%^mKe`!dZ1nTg9M9Oq%*u+PrAPn!95Tibe>ykf$Hc64&NQAVRa`(n8{%X504757U zn-HIDcEomdNtL%GE&S<0n6RaVguXHF?M~R+dh&<_I3bg$kce(&TLD<9#UU_}4~0!@ z3jt8r-HJavR>53gj6UZ;&T6phKsIu&{WT`URc^Q`dAdjdc5-rZgyBQr;&SOf=JMZa zg>Hh*1#&cO61A3zw#1JhABk&Er#}9|en+tT77_s(aFScWf!Tx;Ze_}Sdq=uT|IF?W z*w<@wW7Md%KWl75<2iL;JoQllOL9-Khr7;(Ym+NL04e0DxtfQbBzGDAy;x7`c*)r8r=qx; zr#(f2{#f0s?pQZS7?PjspQ)MCY`XX=ron6zjz};IWcUqd zq42*HZyb6I=GKzl`h(Db#OUJAy<(;y+kd=V!7wB<+As7^W87{>aQ^`||2MwtZWOm; zh)z${7&B$9#A(U2zxTot4s1uIGGX3H_iSN}s z&bnk8yKAS5dgq=pEQ8qk4$JQ-=HeskU0vlP(4~+Tm}8vvP9QYct`@v$>c`g7ak2`mV-At|mX=a<=kg zaHf+z&1Z%qiUwn(#?l7I65M}*iXQazEZd%FyD7kP^jy?OOW7m3x5Vst!l{MgN5T7= z0bc^H)*0(CB^J-f5T&YM?6by~bG9%%cG`{`+r?`7P8_7Y0C>*_8r{eZKEorx+6+3Y zwkGTT=MSCB#(>XQpFv+2D*7}CJIfd5RMCD_t4O$C@IUTv1SBV+A#@}iPlj+cbR#&R z4uH#nrf2G_$P0lwk&~b#ziT^3`GT_3XquC%8ql@qb-uK-c0SO#yr}*{PdD8vxC8_~ z9Otdnzg+p)@fdk=*smb!(l2`QGMOQ{EdL_xzt}e*SB@9a%!gm}@+{5&t4sL*1*Q6v zfWh0fT0~YxPj29fG5^$F8wai(G}VcK-rDcqU)`f3YmeqoiyDeCSOO<_WpKR?l;;~8 zJ(wXeDHw_m`ubhaFZk{)@uy3;rxR14#h#DXwUliU>%E4vmdR+z2`IHabW_aLsISny~F1hjg_METg29&9bL>veKy zX#H{owZqnO%H#}B+%=Ja)9!D4+N70LMvu9AA-@5gRyTNsn5U<<4VrQ`K>EDT$9?^! zAhY-YPdXb@ zamI8qdU_s3xE%5l8Ck&J#RKO#{V}ZwixczWFlAGHLASDpQOXLj+N|lmFb7<8D4$0I z)S{IoK|*mkUowhyJ@WqRLaRyr3wyCteMNZmGedaC;qqg)(iTAy%v(=DYh{*t6`A3P zI^=k3Q9P%-TLWZMl3BlIp-Q6u0*E-PPaMie&h9{ISQr>&7Tw5uR#QLv>9s|Ch{xu8 z(|rMBj(wpirlke0U9{>}0C}nZ>VX7)CAIAzD}dC8-Lq4gE=ocI?SuLqpaK|NLmxkX z?#)!x?)y4a-qLQcROdZm$jJ7`3LciaDt|Iqs@|>sMHJF3Q!IfJxX~|^kjoGc5q zwT`MDt&&nuq&XcQe0ypt|A7Gq?jDmfIFnIPB z&!w{qMK%x5UI$5)$*Fgmc_3Ux`QYy6+XO;(6cl1CW->so!Aq?Fcxi9xH5dfFT??cr z{y+N*;&6GSSdud&O86%lxMPJC)wBy^HJcs=mt5i(#O|i5Ib8$yt5CpWHt329FYjd* z@)fbW@vPe?;oy!aG5Eus0)swET3SCCjs=+k9+liOvUnm)<`T-JF{*Cf6`2$G$L^?EpJ+t9(@q|(<1`#JAI8jj6P$tFX z;&nS>5W>;yR*#hv1f-?AfA(d}l3x66YGbzL(+xborjMpXe$c0R;~piWK`%uq zDhdkcRo37_g+hb3i`~iVRfd;PVtgtYj`LQ+H|{kb?(YwM=(v6B)HoH@cuH=EAewha365Te8<&%XzDi2guU?4krEX*S}vFEwwncnxRAfbbr{W zX|?fF_@F(s3U+CYcPqL{CtrVn>&h!)+P|I+yokbZEtfJSn z-e5|0Z9@Q%LX)^EzbUa>2wwnb6EB^KYG9*TBc~Woah#n`?Y+lG3Izv(y^i%dP^_#-;}R*RwAAvw1DP(M`t(pV}rTAfsVrAr5D24 zsyRFLT!eI^@P`uZ=o?q90@*~|PoYrJ5X^OAX%5il$qV6H}wSHkv*!t4YkAJ8~aK62J_8e>f4OPt!W zDR62y;3D501npp@MX$!0&5wj4T!z)D_gtOjc)>+!vJ1m*+ZAuLg-yIq-v!303WqjD z($S?0Z<6sqPJ~(77CQB8s@@;-*6{N2@+}K9N2rVpmgs7ZeYR?Hr})8>8XmE284wBb zAZLcjJi+ql+J@Nw@x(lAB)l-+&kU~uSir@!Gf~~tb$w`Z_d=)bS6+=%06ky=J^Xnj z2~ny!0)L&~fn3ZEa1cNJbrAnAhW(#TI@b`)hK55Z2yYCZ4lcWTVR3`O(a)Yg4=7&k zw`y18jFjNgZF&F+7uDK=`%H^XN9PI_aUhyQsU&S;!XQd3JZ0*jImh+~UKjbru6Gb^ zKX9_Mq=E$?!-ck)i<-l<;f=WiUwWi8PP)7W8^j2DzzKmwaD?=Tep^r1JJ`nM}%E-;?yiO)n4r1@8dO}%mHe$LO6OK{I* z;9K6mdslYWh0?N+nxYwjwaf`;04Jzo{0IMa8RZ9$D@_+od&b2PT8z&hKAZ%Q5?QF% ze}DuJ@|ewDflv^^ttZ##)olD+IsBI6YF<6LiiyvJ zK=cJCxjaKvt{ROAZPaMyy>4t3_(j^``EW|ky_3X4fccQZksw?N{TFXUbLRf^lb#wY774T+iww&C;6 zw--Nkwz%+k<^j`}1kR#um-U3}xyd4De~O^{UabwWdYKiCWFqS+vaYh{(CaSMkDj6j zgS?n_dvVOpdy}cm_>JVn2 zfdFlJQkp-b(ya*lXU)uW?k&lE%N>@|P}x2370~Arj&xq`egS%tcFrZO<@)!Me0NwE z?LRmv=pY#eIzG-~%&g1kr-B}&cax>g9l6X*3*?3|^)tOGB<{8xBQBZmb?H?jnPVM4 zK8jc21>jypwCxX`~rJ(cOs8= zh{G`a*L;1Pw6L%+=FH6A0SI*{i$DIv{0b6b%pr)16b{2`!k%;DCqIq5WX!>Ja zT|ttF@U$}H(aaCHeehs=*Gv1LLieP;NI63{frRiT?!)RQTkl@cMV)F0i-ln=#%t}a zk7ZUk9omhT9o8D#jUH*9lHA^Z;-|*>l_LyXK+I7ep%Ph=B-@t`=PH&jj!tyhA@z1& zBmE2EgSkYHh|^TEHu~L^7n{x!& zJKb3sJ#i8vI}qP`gBkb$-8lY}7tTRCJT5fX5yT|p> z${|BDr;j5GFpTAmL~Z@;<-q4FV#Ui0ShBE6)4pOZw4^Vd-ZRoV&RdIK$ZfgU>X-i)V}+7S@T(ZDZ`VKjk5v@7qodcwfF; z(T%Yc8_|9Y#~6O7-!%|?1J|cKtVqV|)X@<-^`k3a$G;D&^l57fN7i6VQ}oDb1{zLb z6I+lCxs@a&)e_8?d%mGF*ZqbW+my_#2ga%o9E_x1&uCU!+BGmyE=^1n-^lD2%C{m> zjJDtI9!=Pvxw$AF|_Mw@31DladY!TbTDnKj6r&+QH^~zP;SHp4&h$ z4!06jc?U@HIaTmCC%eOi|MAl&Fh0$uBWJ2P(kKb-26-C)iW1c@G3U^o?78OwM6%po~Xs{S;&hQ zXbSdY2m4G0vNtg?J$-3dt%k3~@R;}7-=ie`LfTn#AIxB96+qXc1`0%F)&xgMsY& z;H6&MNpF~@!pH)*knibX6)x&k>oPkCI#WS~3S3p=`N&}okv7<@q4+Cw;$F@lu-YaI zyM(AY@XtO}-UC8iU>0h=+)NZ;laPq#?+0T{0j>%(S2sH51Xen1@%Pq05` z5PMvu{NlK|59ts>!L1DL3g-!4F>eM<>Rl4a93oIBJ0s93crq}7`{uA1^Ty1KsDX10 z=@@$YD@kTS|E%Qt6I31p`%=rY+PIx*s}8E7{0i*hmgnJyQNkl58R|Jlf%`Y`o^b+( zo?9$Gp%y3=*!7~zWXEB1v}%4(!H@MGlO8sWQaJ_90*Gv#b0=@$rb^{l+I-USpn1Tt zxG6jr%yWX6v8ak}vD2lE8j6!bHE<~2DMKfA_~4&_|G)CbbXaJWJ?XB8r!U5Jtgj&Y zD&iZl8UC1#vrsODmcSjotq<7$20sFaP5~O%mC-M*g8_%~h1gJuO{aECeER%pgSNxj zm!UG^mHVq#uig@;@yfTjCjDf}$WbVECE7YNARZgyLZ*mR=PK?HDv6B9=IQuz_!30$<%{&MfipA=AZ2Q_q5JXN5V~;V@cXShCx(LfW9X2SXmf7{ z$E`&{z_<4|TVo@4j42~!!*(U2xXpS$N~LB;4?A1)%)U|Ph$>E(%8^^o`M@J`o{Zk;kP0A+|KE5kv}a`q@K!t8+jN6kaW8viPYApnht`uM~$ULnmDQDMk5`c!^s7J9J@M-s!sPg4CzkZzgSJ)3+#Qui9E^M zHFV!(X8IB+WM&>Q)&R}lNeK1Mi;iOceo}K7Jlh$J>n&t5+jVm@tX&fsEeNeAuixAo z&N8$msN2uc-H9HTPg1xYQ#4zR`_Be@t+BHA{#B7$7`2+Y9Y_ z49erfvy6zB#Xt!=p8WGBo|E%zsIG0qmsp6a@nPYB((y?Hi@x(}#B;MZz6AFa1BzyF z$Oj@xJ!HUTxP9BULGpfDblXDtbTs0-(W={Ek)Q-yaLGYk4M4rADij-ZX4n>RCy;heJFqZodv zA3l(>_?x>1!^F zvyiB>QnP)_TZ-c2HS5i(a!7&X+iW@8)%1$YX7k-%Oij%FmP>L3P)fYzuSGfAe9tb!l~q>hFXH>^%;~P21~ z@{*PbxL={q3<9PRy||SOW)WsM;Z7sz5S5yy1MiWpx|4vU5Xb}Z9xb3d-llq+MT+H8 z03z3ibRobYWvr}1{ToT7GGFKB%GCcq|NC{HI(A^;|t%UTDLk!*0IW)}Op!mMObIyH!_dL(Jf86K(3-jH3?X}ik@mYJX zjdS6`*YUlmxv>Sb`f<}?f?+~Hmbw``9cF5(Etsh55*MCRA_UmI#Ez`5KVfDH5wWu1I9afjknRb#dd3$#4d!h*| z@+{!u$3nGPl5t3dA>|_<^NJxOztfPmS+{J6U~sSh$r|VTAJTs zx7N`0$^4-_1d13TKEkUut7Gg#bjiFE5ZjuO$qY>fanZPJ5KjvWqG;E2)YxSJNQxPu1>+9@YiM-g0f~^6@to@^Q&?0vMx6HE2NvE76ZzzQ!z~LmxQvRoYdV!^#@o zMje1;(M#tKQyNZXXrYU#9l8i;F$l*;*h`e57tlUBWl9MG`cewAeXdx6x7+JD9b`yQ z)IvUTdGvAH!Ic^-4zxFi5MQ#bE3((f1f{KMSw~zw$}7q&6P_|?@hg(EGk#0cDet6& z8-#72uhg)#p^as}HRPx{7`wkaGX=my2IcHaF}cpV>pX7NE+DakMm`v#=hhNri*gYwm`=1$Yrax&8y#<$W2PB8Gp5{O-(fBfk{fpq zw(p28J;6u3jGH7Ui+s(4(#*`n*x@zG{LexjgewTx%)Gzdm0G5zAb8LVJovR3VX=?) z6=|W>Aq+7b+IF{fMf=lNIp$j-L)(xDdbpK|FZ#5qohP zS8870NImMg12y&RPOXZfG~d^>n9y_$En7W4c*zoJG8autQb#1#wMd*})6p!r6!=yq zuPYoav^i*jW5A&dP^%4zSvK9|wWf9IhQg$c@-G(Fsr=nJ{d9dldRRgm$(0Lk!x%T_ z5!9c7KD-LF&y(J{Im*hz7jm;d=Oe zW%d2^Ban5WU!KjsdjG^*#`z{8ExsxV|10X`o@6$q@hg<1Tz%$4hYaw$T%HzWTPeQ~ z-JDKV&Qc*gTA85Z5Jj?2^h_nc#;W}zAnR71oXr_oTg&_V2YFFKBdYu?B={X+Ot2U` zGClt1?Jc)MvTFxfq{;1D)bDN}iSUdWG4WJg9Ewtf&-Q@9Q8n)>~ri#BTk zsi9-`ZuI`C|MuIw5Nn}|KN7A-V>Q~DQ!a;i5dQ0BV%*9zNO#Ued!CrbZxVjk?h>Q! zlIO4tSh$$hc=B-%FjsQfljOpS|YLpkx5v3jYYo|l)Gt7GV_F?3zX zuRrO4CMk~#L+)>n-H@T^G9tV0aq2&L}4Y2P#rw8Qz?C} zB6(nTFtI#Y;bH_^DGE+zb<2Era!JmtwaT2%=Gd|8g$;`9fCEpS(jLvMaml66JUsX)Q=bKhyL|%Lf3L-gsK}6J9iimwoTn zP+!hRR$B66m%8)?ZfLRK!4|Vp!G(jk5MvU$`2C}-09m8mxFiUv zr~8TPeW3@Mtf%kv$#N*x?*_U*pk|a}jg{2!$rCKWbccmLpBmD19WTAec6#|li3tGm zH%Q+k=Qm-NLrnccOauI`oz%?eJ=~(5Uj1XOMpadP9#AhlDNe3@uD4wcit%N*DH`ay zwR`H{ALd`O zyo}3?v>MqFYkU4m%C%b^63V*#ow~|s9q3!ZjiN;*hEtdH=Z9e#Im#)+dsk~Vn+)c7 zU`$SN*ub%%hwe1@>aN^1P8jQjzLW z&jSUPT~z@D2YlI>BP|S;F;WFF0hcP>kCT%RN-bM=~cydW7Df^P8JY3x; zlG<8Zm8SquaG!c}{eqN$3V97v|J3ETprFLoI@^Po{>)K4tyyzi@|tYX>&W+`A8!m_ z)#KSZAy}S8(jbWF-vn~7vB@kWVup0f%JpQwO2j$}GXD0FR{SCSExp%BQB@uX{xu(@ zG24rn)CiTz-KwRo>B*Fwol)`^98r&QcAwNu4YvGVsL*{?c5i!=O;d=i1RQmQ>xoA| zkObeHzC2R4$j?sq@Zsy&j&uok{9AyKGV}PCkK10GAHYi zisVEY<33QA(#Wu|iqvelgKWIV8l}Kb6w=z-3+n908EIs+G$U*c^JVV^p~?EggcKAe z9Pca@%^*w)6_jBhLxZ<|P%(A*b(l~fWwH}JTt{6IxGK*aCusvM!0yfo&V4dC`iTA9 zpK(K?T6$Ccf5|QX5FPz8nOBVp#^|R(hh|ZO&N@!o88JC0(rMvBJV0-Vj_m)URhbXp z;?B4s`yU8&M9 z-(@}Pg@~^GHM{mrE|0KG?sZDS{^NS%6Nb6Kwfi2sPtSpZ#`1w(*iB(O$0^V~?=n8V z%T^bvw-51isJurSx*304!%k2fW}`8!4{UIt<)bhqDXS2&iQfgIv|Ipf^VuKe4RDhp zy+eeP#akp8@*F(d;VPeIzBe$=8$XyFqqx1({7oII!|Qd0dOhkTXSx{ch?**ucZ7w| zvTV@R86__3kww{ZbXP!XL0WRDDz*D)w@Y>vh_&^jSh+SYrz#_*0k{&S%HV?%SozLS zZ#zDz;{xQCGxU{p_5PG$2fci3tz;tSy!w6E3S(xVs4NHs435tU~+YlW`C$XmvKL+-{~HqyM}xbsbzU*bpxpfk)Ku|3c~0CIyeua@E3)D*cO1 zpUWl;)s#(i$2PrD`DCgbwlzZM7(#HAj|l|!=}@cXU!#P8%C$?v@E`VZFwR4jsVi-Z zTR=dOa&N@d$-FNS{wU#;pgXK;QgmHXi;vQKN<4HlVrnJD_YM`ajbeQlraCE319Xso z9JGHY1EPSsCX>NV7AEfvu(0G4W97761p6@q*gv5hX5U?!#d&-{2@lAUPpEpyU>VA$ z&aUtbZS(6hsEjvV1wptnH5!(j6D+S_(JyKK_s=<#6IzQpatJwda>SJAW00p$HU zhwXH|nj6cQ$VVA@?M`KFd3}}r71IsC)+&}vBJ4pU63~E@O=|-^-At91j3*^U8XC-T zmnOxa<&#ih%^gfnB(K*BW?dU4zf3v7X$ysmbgz23t7Iro21FfXsxnAGDHW=|rMPTL zY|gfC_Nw5s>7&d#rrntXWo|H7w&n`NmtH+F>#5a`L)%uhrw_OBqb zrYiS{u2E_yjax@JO2wsSh*+N9mUM~-VZQ@UO!F&w%F@$T9xk<;MHW55m;h`i z8Ri@2_A%R%nQz=mr6+xDkut67LTfWUEsF~mhoY@%i7MAIoMk0#cVQ9Vw@~Ieo|vhq zq8cZ;h{x&T0lv(?C%9|1s2>Y!>51{d4b%tMio0(w$KACJ@y}&R3pN`c%?bXNsEh6{ z2qSRcE7~Y`{lUHSIOJ9bhWvUi3ujY`0}K=vTsN9=3=QvvG16F$qO;wVk{TS2c)caXe* z{7mGBNbw?a)bSO$LexWtr^c$rAa+oIc%VRS58zkM44O%AxX-O~*oSDnEkRghDq?Hw zbiPy!>1Wc9qz4)6@M5)lIWb(NDo6h-KEhbdMV01zG{~xrRcjmuyz5+dR^@C8Sl9C+ z$r@5j0}X`aR~jnnmA}3d$0Oq~YXb436t)UZiDwy?f_YbY!^Bl@(|1WMscJ*&_EJU+ znjvovD=VSF**XyQ>^E70MWnscXkXaNz{;c6#^Zq`)i1orA;5od#4Suh?R;Ct@T6>F z{eBKe=cmK&-pbLfmmqCuFg@AQ6_*8d)>!jzTDThtU?_h6t4tpp=|b8&>SCYvsId8o zP?=zJxx>r$v6jNKx$2Fr4mal2jpflLKq9AjL<`))^(*Vhe$J13KOh+1R+Kk_s)ZXd zx3#&+bX)H$^q}OBz;~!1{4G8n-Za-y`VXdNWwJn(C{Oy?WeePbk1;26G?0BmiAIUY z>E}6{ZZ|pNvK{?Tv(zKmD9Mmk#1y~k!-xid%E>c2%v|oM# zpzzE#TpMHxC1{&RH^_?risZz6Ps)m;b(l1=DnWSJcWk-r^m{BCHEF`J^a(1mzLA9b z)7~GM|+dK%QMv()nB1FGC=0;xr7d_gq-9r_RZ$K zIZe?EQ1n}xC=dYLc%FO7Y-%iNp z2LF;3cx-jN3+`mv+1W~o2-`tyn;8TEQnDkR4VXL`?wVAYtN$>%S*_b4RR=y>kLml8 z+a}i_4_7c6T?7XR%QTFB4@o}ba5AL!y!v*bsoDA$MD!768*xFv_r4cK?(T!@mnN=V zxqtohg<6_&dgpVDl;g#BuDt#B_R3q^q&w%Yyv1!vxNFOJ|9;n)f^MMRMTd(ww0J{B zZxB2o(bGt(m|VfsEN*6{6f$y`g+Ov8GUDq{|eb@C} z@4dW)$#X6;%bkV~KIbA-Vw4L`tUl{iM6&en4+fGt66&I~CcZc3eXyZrWuOe|H}}3q zozLSCyKo^`4;-$v)v~5lLm3O(*v-vc0p~uYWH5*Q)mY@?T&e=2T3sFv%+wNJ}&7Mh%JMtkG;@_n;!8SsLuv04X+ut^I>rpTNP4nXrMrc8tV<)p7blVwefn_Oj0(zW%Q$Wk|FVwx^>(LA%(z%DL=`YEV->&_p zKW${ahGn#?>OgBr1k$duDP}eP>E3(c8|$x);^Q1&DNQ~qLZe*DLrH%zu_DB{gbt4; zDqp%x2Ff1nFBlkbnWDrF<#?qkMKdA!Z$900l+cUCS~oD=B)(q3T73&`Vf3I~ooPO2 zdm^oO8?Z0RzHHX91roNL6Fs>clFFaIQ9W&46}*nq>7xsPK>cd;2=<}QPo5Q;#Xtn~4qZToU4F63>n;<^JZ zRNtXSsK|H1vaL>xCA0z3{@GB zUhk5_PY77KH6)Y2__LpI*@EF>(L`GM-fiJm2F+pSmT3Zyi9+A|=5d;CW|l6E);fxM zI?t9ts>`P2GUV3R*_RhyQqac7$OvY|X!^aqh3iMq5@s(}Iv{)JDftLX3G6r&;?B~A z2oFw+-xh6`2;F|S9j5!6-6B%y%Dg@62i+aJXisd$yz&E@5gv;XMfas0_6mnp+U<-0 zQ;nUpcCxyy+IMQWeVR z%hFH7THy5+aeTeAYBg*7S3MOe59aLhgc=tCM~W2_Upp>qIT&fF6;$ta@N^d&-Y?g} zUcNq=pvl&d>+QmF0}-zLgxu3NGI0Gr2>!+&!p4vnInM(*oJE!z2o_Ie7|{^-;PY#A`vcotM_9n zYgQ6M<#y<)o~KXD%>E;A$3S_IJ5KVZ0VHuF6Rs{)#j*2#nAlw7Q<$o3h4v-VPQ*_W zg$DvbkDQH46>4JIeFLg3+6&&+p05e^{k2^awzjM=RuFI;Z8@h%H12J5Tza#@^0y@H zbGC1CQ7ya+|0$QNYsWwH1AfV+7E^&r5S`!|vz$vi-fpk>@S)x1-5Md$q0zTt7A)Z(7kS z-WWON8SL)v-iVyZIgUe4Uf8vsOo+g+G~|->QHaBs)^kFs8ra%R*J+?Es#=gaOx_uX6I_< z527rpY%NZS=-2cujERwfYHvB8Q8Rp?0IAK1a>|@L9kTp=)$0e}OQ2UrNB5bTEL;xY zhlc|C9gi#qxCjt2wdL9c_I;fRN7(ywu-%!7I^4r4@0|dfrC^IFg$MsJAR}?K6nW#^ zJmL2FU@XX}pyS#&=6Lwd!CbFtsjo(iyR8SN>%CwQGB1w2vu66jBsP8?PfN+3*hwj( zjG67?$=7ty7SDTkF9*4(IXV*0Lc#US<-r5ob;dpn2D9T86L=KjdgpR_Xp8uX+FSsI z2iQysDE?3F7LnUn6OL!3l~gYkY@&*qVGDzHKA0kfh+Bi5O3VUKcNErz1QmrI@%d zjLV`P3oVPw(wy7BxP4a*oOU^)f`%^C>@Sx1vGUO|Wo=v}iEd~)cjR~36NQsl6lUaM zG%G4ct^N0VMN?x)+udje*M{rtlyx+h!;d)qOPO78$7L12F8P!C`*A7-ypY#{)r0G; zM0tANjz%Vu>)Wx{GUQBeUe8`(k}Y!iPP5S)_(LJ1KitP(uyHL>nsMDEQxe*u`!kkB z>hlg5iI9;MaWj6PyN@A-%Fj^E%a-52S0lME)aU$Lq({TU+-*XrNwo2u)`9pfWp73E zNxCUbqj#4=rY2++IWjFktDjZ^WW?HdkwfZbC)sqZtd}FhFK9g#>hjQ zCXd|CPsXd#84xAR>Yn4u{%YOuv=5SlDh?MavtP*0;6>WG8%zfjzmxv4ut0vl>IxLE zY|Os~yPHP0J3(`*fzPX0p&0T)-|cm}2vW$8djA4a2pNkUJl@~;GQFi{TX|;fF(i_8 zX*q1J7G2RF>^|QSv>ngGy~V8ey`{2F=;*+GJ&?_jYM5o4?Q?6ZDxGS28S0&O-Ib~X z^zqVA$H2-@_nFK$8Wj60LAMp;@fj~>nU7t!8Ge1+cA5XKbPn^;A%l-#V|2efzBHP& znNBhzdG(2E^ZKb_ZRm#=u}_>cU0jlSDto=dDr}WR(>uxuI*Xo6jaOHWQB0UMBQV2f z+N}vWnh~xso)Prkmc&mNNfDkg9lP$JYoLr*woP$8MLpc}IJ7?Y1;RWHCuQG%nkZSd z+v#rRv@-$X0!@PSjBM<+no+CxfXi&DJ$+d-szeopb+rwva%;yfBFrj(r}^YHI^h*C zeKNswhh_5n0Wu9i=40oS%u<|PEH={~Y~Qid=jWnFLLS83rOAgZTe$qtI9tjeAEEl9 z)^END&8U`@J~kY}caxyORX>$4;b}XPvX^Z6i4mMk^@=)MU)4P$?|UzrkQru7#W3^M z-a`gcw`=MBzGR^boWTk~!6kFA_tS%?1RtxwTMlM0GRxgFTmAZ8!Tp7{{kf3zCk!%X=!7K!yMU__|tVnxI6Y2zB}l*WIt1q zBnnApl@skm@re1~PBUssDKqWqoMQI^lQoDgY3Oz!6~tkE}tZsj_j6dw1g%AHBb$Dj<7E zm%hz_R4FWez&rYm^9G{{A#2YzMMtUC*v1%Ua4bRe9uw})VPAM+kAf8}Os!16ijPTs zw9&i53sDcO`)+Zie&!btcDvTZ>xcRKg2Y4jlKPIra*#Q)B~%$Gi#4ruifkuC5HyScd;tH0CPMYY4M#pj0^3_x#p*7ejJE>Ns*VEG`D5j~_j`-ny=VRDsXwkn&H@(=hV>xC@Q z8?=peaQZNg%No$1Da(6#1{k=Yvz|@E#Q-v{aoE>dFVB6+a)Bq4AAW>2v;IjJ#L`2h zzL{~dLOXy8+~$0_X17QM;P4L-Rbp-lB^-k%Xger1=uPWeP9?z2T$De!P200bX*OEPzBql%OH_9WNy8xyyo*%|V^bcPN@)$!El|m4VV|zh zRQwHUsdceApxA_ZDd&l;GGpi*)U!#5UIg@9Z*>}R>Tl!a#B9_VM66Wq$Zsz=V?%p0 zLT$;Fm1q*5p71-=|0FCv9pRajPp3 zrvu0M;){n_|4e>nAty%^C^B#4HrS`;uy=)#q&urD3lu}(ey!>CN{zF`&+?rGMl&)aX@)%a=Uv#7Ja@HA zEHjovsH7Q6?-8rrXAA|ZcaEoXtnmjTnH8rdKEN8C(q6Idjmk{sO!F?w4Ai6E5D()gg%^d22_ zZsDBZE}=J5#w5z6?aCgG88I@Aw9Ma*$UqXdS@Cs90XhXBfD^LFVbYQ`ccE3w3{c^t zSryNPPABgxSFZXCDiX5c{d!=$p!|g39{GhP=bU^Iftwrny^NU(oVKKMwA{~m^q)Aw zzyn(HfFbW-zV_i%;=v`J2U|m{Zoh;^F^4ppjq+rz)7SKy?ENL%{4gF*5%@eBh2K}f3S(?$r3s+_<`wGfrvRWw|J{LMFk?)o)Jr3J>XpV zrZ=>bUPw+&XLKxhjL{&Q*LLgD!IFDxuctVwqjYy5-r`M-vvBkqUeY@f2J!?cKZr|JZ}Je_jW3T(i7^b4p;OlSPv1 z(1k;Wz{oWEWhN6Nf=G}@Z-~wt45|6paaZ4x&JMuX&0DBvSI%`(&Z7Y1LJx5+A3rMA z&Ub7mn~P~BfUoa%&>IR-&u@-YnirzPgC84CU1bmo_Yyx6=>QjM=)iVDIV{evEgs=0 zrQ|3?2|@?b4YREqN1TR*jvUu(gFhy1zBRaIa8a1}dc1sl;lP%(U!cR{<+TiDLVosB z5_Tb?$4(laP=V1W(w^@wctvXGBNk&cJ9xri$6JI76IXWq(>pYdaDo`~tJXg}WOr%< zVs@z2Y4Ia{{Xoo%N`^_K>L8;|vb%4v7*yU3D=r^6nPJBKT;74n{m`mWudy7=Vt;D1 zsHT{OJ*>D5D+zh+nv>p7-p>;hJa+d-9Bs;F6*^syWn{Ls$r#hB*RE$x@V%w-69Qrs9NTA1PBYlHzYy13IGoq6f_UwWM zdO-G%I!0l9ctQV~i_j{lNg<@Wnr)k%3T5+L0!@b8qvk-9e%N!z7AsC$7>rWPa%9OD zuN3<$-e*dSbhSn33aW2W;KFY#EfV(Vj$YJP*5b>T6w_vwIn`m-OM0oK7RXyZy;azSIuq8fBAtddH`I_d5Uk+)1birIT&%evpwW8)zERF+c$gGW4^PE9z3%y$Q)G>S5W4IeQ^n)lIp|R}Gc|>zMQ5 z;JWK?d;MPx?#VsY;FGK6IQs{Wa}hU%;(I7*rlJ#Wf(xD}w)}GzXNFeRvBHnsqa*G7 z;0_Vy-B8fs&dd>6jlGY9`7T15ncc0_@NjtCTKST%$nSx^J&MXxGMfXjE0y)p>#J`1 z>Cn_$zJVz*Lc2}xjtLrQpDaYb2#JWlaYz1&2>YeqCK=bNeqj)(Z*RKRR6P#eC}!0B60{lzD0rzUvB01we zmgJ8;k)vhl`!Ip?KIEw)-Ue_im$!EEr_U{nuu-yVmcJHUci%!vChW++# zG5ME6Z`wU}xLG{Dc%ps+fpLU&qS&(3fAp1yu{a@t5n&5ngsdd|d zB?mKT@a$lrDptDl-q`UG&vyEB5+KTc5_vSELd%CGeWdDYlQ!MD3%4fa^{R^PX#F+wgswIFMv>iUJA z0ll)!yU8gj$P69G`1qTpe4jW%>XGxc3NBR|wU;z%t{3EU!&UL?@GsGQh`&7zd@K?0 zu{PA|G%@YD;q4&OZdv_rj->o#-G6o4wGyfhODvuBju%_z}Lyju4NJRkCK`1Pqs zK}P!+D8jWhEX)cCfdc>0qu9{RNpiLgFbE(Hu|MW9o)!@@6C1RMDZP&jI{%U;<_eK# zCJXFW?ZbcuQ7*h4EQ)_I4%hj$*N&gJp9TvhpY5+XFHH1a4?|i^ZHMx?c!7Ak;c1(m zRXD2yf|XR*r1G(^w&I`RR7lKvlrnyXa%LEQJ2#Ph{pPzrA;W9jS6q(W0}EW4JQlsy zqe+{L>e;_EPDd+z)_TjkMwr>b;p^^m0KR%1?2M_3UWxd#R9U@rIf)c96-4s?Ac%96 z*Ru%%-J5C>aio;%tg&mQ?$P7?j#fYnqOx+i43IAbK;jbzD0mBxic=Sgy+>GQ{jTmm ze%Z5+zc}RZ3Z}(SsJ^VtGisZ(8-ODjeETE$zcnAI(%nl1;B4;6COo-02GWGnO&%Q^ zi}0ek^fo@Z)4+3AW~L=VWLxNE%%4kIPKig{p%M7GjiNYx99u4@12_UDo&`Y zxyoWmPEU8Y0M-+Z&ScY&{HdRmg08Bk#@H2d{#r;>6qCj|tk-hi;mW5?XKcr18BV&M zJmqPTfGy`Z*c@B#i7ZG~e1|=LDB7NHFr1cGF%4vs`ng9O` z^NzR2Y0RU)5YoY@mZ_Sho?|su4fxy*VmlIY%z!@+u8fCISu5CV=q^nm78M|FY1 z$KSxC)Qvp6pQ$B2<5BR13hL#1dG5`?HcYXw=*>^$WtR%NvlOP$VAi~;JkxbbSJve| zPjx1UQt&$-PKPKA2n!!=sq8(%!V2XAQhmp(;_ABZb-YQ12_hbtSeL`Xx-0#Am@CAL z){y=Av^Wk9j?Y%0X^zr)u!h5$*`u{Of@AQ|-d+cv!@`}h3s_i*7f$Kq+ic?$2EEiU zYfWFMAu$ep{~pd1w2dd@T8Of$-dk^^ngeG!Ui`!>yMcuzh6{A*Iby4U#K0cB0}b+O zEiElUx9!7~iq%7v*qz0ryW!`s?tXc`BgMOR(p2aF(;C+7vAsIRMk$SW5ChuWG`-<0 z>qva&$89y*M(_+`gkEA62K*#{4gL(CR@GBf{NC=vPn2bd2A#j<&S8B&4`d^DI0aj0-VDVnMrJyDh}iVMQtr)<%JJ{?SB#M+YjK$b9M#L&+2+1jryyhlI2Cv zevSv|z}45BDOV%{DFxT-iR=Quz+g_G)n6+M=&f@NOkU5`uRF!B()gJo&V57bM9Buu zMKgSOZ2wEK$`!rPpJ$+{xtr&8BqM~6h2;pg1PeGLqS$Hx$)d zWU6vFR*Z!e^@bBZxSJ*?r*kV@MrJcQ-l)OXR?SwqMrrEHi&OJ;{2dER3N$8?)fdU? zB4B1j?OZeto2^>=xd+=>=t}ZFd~*&f_|D@H_y%!z+^C1-2x&r7@yo`>`T6+`TpTP( zVB}s3bg1lzH4)}3NcUDP9n9&opY^pV_7gPQ&mmpr^3RWY|uXs zYv+3=cgQ$Yo5FH$cE@bCZwg`+!ChgCTnbN%QLF`D47W2xJvcw#Amv@TQnr8YM#T#WZm|>F#fw&C*6wzj&MqcIcqH6 zeN>+F`2sT8@4R0#+tbx=X!z6#qDLWt7VdMkp6^`o$s0Oik((`aqa&D3D(=F%H&bc4 z0^|E?UdPs8(bzxbgr;g^E4A|P2LxhaQN>7!iKrekq_J;4M;}RyAS&PU4px$kK40N* zJSLo_@+^Gax_8H!H{Qmu5wU6DYBw_4(SRVL{=;P2bws^XN7M5TL5&d(%jK1KhfC3O z`ZEFK(_99-Ew^eaEqZdv9PC^Qar>;+TH7QCCJsq353U(jR*D5sxqBv|gxEo(hxPbG zNcC350NQqJM=0zXx;FTlJ9;d@;BNV%qyC^pjz)eO&3dP^iw~L1i*?)cAX5G=2$uiA zGfRyrqYwyU#`4F~o4Bw@C2vDkHl-KnhofieL0EC@{IdGP}QW}W4fq#(;51a-Rl zi9Z(%D*?*!@1b~PqgXtd63pZspqvXq<{ldc z4GzjubX5GRh8)L3#VM3wJ5++~g|_PADJ_O%Dlv58pd;BZb{0zZZK-y;*x4BWRd4^h zlK;eZr1pA__4)yB7RuinLhE<7n(uH6aFF{{CqW-Ca311xe!S@BmuHG@O&j(9{Kxsc zLtzU9c4nQ#* zY8NlRyLy11sb69FVQXtRM80|<+(uzlXgcnSbCpdD=N}qHq1mM@+Ai9qE7=d{yXX)L zE-B?NGGU>r*&!d>H#Mv*JE*)JZ-FwM;a4%r>1(RJ*hCOzbQj)ZsSK?--=KZIYAuyZdOOG zlHK&t)q}uTO_~bry({xmB+OIzI0|r=8GP#9_{zGAY*u{5t$SPxvjvSXuv_Jwou4%c zWi)?E)VFPDlkK8~RhPXBm@FkRU^|%8%ZhE!(5jfpNb{@8Kkt^b5IqpDs~!1>X8Waj zdj=v_#CzC=hpSv2gy&duz+fa=xr+bfg`xEUKl3+XU-hDRo-5F~e1MWv7d%@iQ4(Q#soh35K%)^Dtytwa z66B#Aaybddr9F?7)5jq_me63;Yp!!sn!8kj+mc8j|7mLvA_CJLwYcrcD(@qgq?4Bg zv+@iaTyAE$QlIO8wkJu!jk%ZKxmDED;W}2$aV47p%8U=WpgqUyPTT8sA(18HQ1@1? z!bKHz{X(ie-T6-Z4`wmm>W>j03i6a9Wdx!mZ6Q+$JY0mn1_n8 z#AD*(G!9Q_FfoC+onKP=2!Pvy#@Gkx@_eyQH--vQEaB{1WPBU`SKT;Dud`iV35k@I z%o(!VT}kUJOe^AsM5|T1e=w($MK3n^vO2L%+O31jtefZE@LHHG4z^ZAD_{Q7+nI~C-w5bgjY0Qr z`f*#Ru_d(h8XI-$DI6-itDN=J;t#i%L~7(l9%XSJ?TKb+eFY#r76N!E@d~8^Z{qFY z?^is$0}Tmzq%*$v($~yTlaDF!Cpg+c=``?2Sv~phroCL27~9=b_;kW3H=hz&Ia>b$ z^WN!OwMDLt=Uy`YnS#g4?Fxp#)G5bR-Ru@PVD*=QY0*8u|TP`?0mAz>j+NufDgS2);s-POjaX--rNV3Tt;T$!I=O2}!9C*P&QX*iv}V{0hN zGDn#uP5vmvvV2phuWW!>^K8S3LVFYiitKyjkKd6Qp1G0l@W~u9hlPShq3vDtK%a+T zE`{y915XB&{;#!6bv8$}q(v2(sjzc$R*1Lz;p(z^HrIlb?|+Oo{=3zt9gJbfEYeb1 zj{@CUPHnU(ZwPmf`Up?T(@EkW?yRu1cX7%?-bzw)*Y*D)yzvLT#C=Sai6}c5aWCHE zd&cty_XGd}{Wk5zS!SHj{uLo-k+E~UplM%vlv}IdCNeF+W)l{k7Ze-&rK?Epph8`6 zQ6qN{JwFIL=1x+c0ekoxWW>*Nrd-h54WB{_*bZMf9CXrPLw!|SkmlR6_sNfa?Hq;* z%-0uq)-D%SME=mbyY=MJkvkyt>OE2&HhVUZu}C{Q=(HPw91;$m)N*;_g2R~x1VqN^ zWV0egcMw+fF@Q{H@dp>baM?WK0CZLQzOIrR^UwjrBeEbMS+RXamBBRMNlo}7Wn27W z(Og=3*~JITnN?vvXM5!%O08IU0hO#qPASjsu&0fL7i9H6r+wg{CY%S4;9SfS(YM2- zRrr0LA=kfE20<0n*@qa+`s`Uof|Pl zS=;KgXWqP54@phWHwss`!ZhV=u}#1_Tvm`iej3HEycTG%aSyoQVTB;BWDZcykXEZc z;A~}pg{L|;kiGK0PLSf7bRM;-(mP!HU^zVJY|X!^l+!8IDK||sh%I~R@x9M|m6L6= zW#6Se*4e41H{M1hVV8vSxWPO>Ymco;3SR_CPTUzAmpFTi*0j{(%)h^KQe*6K1TOhV zLP57`>U*umm}TGWO$YOrw2$`RJX?D6;_$7>q0AKz34aPsr*&W!{UZz04GZ0CHa?mb zHdv89vN*P@!ch1+xCui_diVV~k@u2C*`eJ2MR^*0&)QjFk|>t>JGEy~c-Knr$tE}A z=W?@8k5oC@Z{}1T`gV|kwrFKFsD5kp(356pj6c@P##LNA>8<*X;DJPq?MQ4L?AY>^ zx}#&*l35JvLfKjvi)R(4s>0UPlrDPM`B1d=_pIteca5u@eIv=kie%aow$Au}-qDQS z_V0H6-wAI1Ya}E)AH(o5d;K=+7u9{rr;LW!re~a0MBJo>j%eU%O-<5_uCJ+nf8Ovg zUA?z;jxpF^B-I*^yqt%va zP_4ybs^59tUK8~UE1034R)vGp%O=6I`Xy(gDB@=eE6K%Ifw{(SH1#hXzAt6?!l^{D zfdk^?*w?o|TZRr8!jsEj|7iM%OM{+%y>QmYj7^ni37bs~qVu7uq^Wh%T54iLOkav9 zaC+(fn((9%my99@R(4svrF+JdE?+tK#tPS34f!lW$2PtMtV+hb4=t&Cy?@~!b*xlH zm2=DLwUKquY&4}P)ypKSWY77xNed9b78I8Z0UwUUN47!6H+YY;x3-7hj{?UpGQlyv z{_hZcA=`@t&%`3iBe>*ezQ`nff;l%*Z{O)m7^nl5la0#O4jH|Womy8mC$+v-oqRbR zt&F|=#OI{qc$%jv>Tnwa^8O~bS_Ao; ziTFA$aX;PdYuYadM1F!kSbx*I|B7ywCq(!m)|23OAoLl5H3+IE(_5M@wsk}nnbnzV z$2xwz?aXd{7z)BOy{aj!p4T=Z6}nyC2Cv#AAT#PU^IIp`Y{3AnzePmE8CyRMrO+>T z1T?Zit87FjKs@sGd?BkaYfPzWP=Bd^`9(cFt<4@s7>jNsNeOcVj}7)od_ zp~P;P=Er|7rP#oW-d6|I%9<%lx?5ldy9-0zG>hAJs<)g(3kwRfj5QYRl{!A;S#)hT z6BNgovt3TVxtJ6gVZe5lJ>nJ9J>@<_IR4i#%70hIe`7A){3>`#IqbTGVTmz}|7fHU z2bAByeSW|tP#Pj3yem29$EK3!>zxkkAg;?|5yq$xDLPmN4B?1;O0&GVduMo z6qj-p$^B2<>whyGhYsS>7he*0jZqwW16G|NjyL(RNZ0W#9pg~x3APLfj$LgV8(YU* zy$1Ywvvm`dYCm<g|rIvaK{&bWF)8O{T&+rbn}e;3xDIWB7Up;oKS2=u<6~6r})iUgOc9g za9~l3d;Xu3>MqEBl#M}J^+FXYE8>cc<+Yq$AvHqN^oC-3tpvp?a-dP+Z(Fr&nR~P^ zs^rcAE$fA6gH&qc9*+jdWXYUPxE&Id^eItZseeOsS(S+PubC(ShcN!wmjA;*gw(X` z<*Pyp15dyyl;40|DCY+S9RfC?a3=wQ3^q*@Vt4r}>b&g0PE@W`aKw!Q|?HQqp6<@ibRi8cy@7OEN$Y%ez=z;t7CrJ87Z9Cjs;J%tv68nK`6ofUUE!iV1BW`;gL)FJ*7IO>IEeGNc|3&%{B?f0MAAC^gog&FXyBdY5f zvqz6_aFS02zTIqj{m@}FB2wzMPfw@34u6#-sPX;&u9r3YsLY1(c$hk|1tb`C??O{q z4amFUVp4_+m9c-n2myzmf7|OL?Pw5-LirRe`#wX3^D;Hm`yBcPI5BjJivH^x>X#jh!mg7G6u7sl_Z{+i7Zh8^-O-Xbr{WMEMnq{>BW5WT0m^C{E@)$q8O|JXs0`8}T}e zh*+B?TVmbsuM+D`UoEEKpxz{go%sO8A)f!YTSZO7YbXK*Rkp@K%Zn68EQj9uLhXoBK?&nKd?I~ z8;{kWZ7{P6eRBvlzUK()e`j~SL+vR-a ziAR+TxzT{DyqFXd@!(8iN;|J?gozmvIT3>QO9bvhV~~$bksk?KSV^$ia6ZS`F2B#n za=P=J?4hMCjA{P@K|R}6YmR5ne1fpWOOt%L+k@PH9o&slc_maFc^b#*P>=t5)>>-v z(mlO(9Q=*Q&Fj7^^ZON4HET4ZkPO{v=*fxF-Y_Q1X(v;gnmX|GTWQozU{PqcT!k( z4d(>n#rf`d2(kg?4sf7cq4+ZO5bf;Q9zq?l8=5Y*qoQkL<#(M5Ts)@UK3xxdd05fk z`y}NNR&hQJ(I(*d3D8Wsd>rw$2rW`7_hJULOb=cFF#R9z`UBf%@0Tiw6QKW!6R1v{ zD_|`4wk{)dgiT=o=XTM?4BSczZ4ocy#q)@Xze3uvSe^u}3lQ&O$hu;iL>lTgQ^S5b zEp78zqFlQasHl3T>;DIUUmQeoW~fM!$r=9e(KdD01m#%0+nv8j873d#x%LG?Vvwp& zNT9?9m%&R6Q2&b)$ThO{I0AD)S4ywBKYL9d^NW0loV$Z0#CVEvfyUb^=;4`Z?Pa~w z|JSpQLQXyF4^d`km!1qg1ms9nQXy|FdH%h(##+LvHrhhI9mS#`81u)?I-+7L67uQ#;0_6WADvtB z3v{5x@K65Bx8iWPpf<5x;6B@L>>*uG^B^hLB+Rt6zLGBQ>vDZV78%LS0*<`2kJpP| z_NRfm`(|r)2X9AJX36ECU$Q7ul~t+9v&`+4(}XhwwOK%iZ?y$z(CgRA$p(@o(t3Qd@(nUB4NomzskL_9HX;pD@4~l1#zd z&-7%F|6x+s5k+b`wo0PYK(8?mcgHu$Wv1@;7OQ%^KU0jN3hPQvC^B5P_xjQsAM{Vk zv=xt8ll9h{W(49VPL}->H@H~x+wY-b^bXM8i3P1i$davR_%{8S5KwjLXv(g)m=AX& zQCzw2%l8a8^M<>qS7(dEF9n_4P&sdWr+?tC=NUKBp&C&oLYBwfpfcFQ$q`v%>ID{g zloO(Ila)xX{Jjj{O><4d-E7%eKF%Aa{#{!9@O>=p5d({)(usf?_-P( zxc&`KZEhc;g5bXt|dUu6EpPZIRk3U_TK_7v6(%7;D7dN{e1fcK7zR-!qziMY$ zF?ow^GR`DWh=?Tb|610?e^&QsA&rw)s1tH*Yy!^?LjCmJ!HLw*r}72?LMd0gqt1?S31S`TFbUS-o`$7jNBV zKdv8fY`=m++T`bLr(Lceo4MNfB50$Aw7)$%=yywR$&gk(^pw;TLd2?yxVm2ZQPQMzP_*LSG6xPUVHD~ z#4A3)?G}RmnWwL$9P+UCa;Ob~w}jt{`J~k+TwbjY2S2FGb zcgIZTRDP?$_%#rC7$Brgmv=B^nXag;_uKavZMqdGnjR ^%(*sIcA9qa8ufpX>F zIg^AtPv*?pdQ_c{H#yqkYzwUWrrYj1w+D0+GdzAWJrR}?U_Ox&gGbTR85cmACE%Jp`& zzfQn_vqjnJvM$ChM=xnNi|R+>Tf0CQNbfPrl~e=9VI_O5ga! z_O0Q@TZ#7kowXQh%ds~qTThOH8KQFiFpWs}9$yQ`C?4Zy3z9JT5IZh?$L*G{Uy?wc zeE8N4nF~{$ycTha${rK!1aH-5+OAlLlD{f>=_CBb6TUrl_qDaSVscNTvARp0`~@Ez)DEW?(` z$QtwF;rCb}<_tH`K3p&_3%fBH-#Av@Q_vpSSU{qZuRSYeK)i6Z%Gf|9LH_FA1(h%u zvDf{^B2)$0!zV(s8oe^)A zP3A(I;nq~^20EWrAoD$s9hjr!*jjs+^1i4@=UeF}zerPXP^m%>U7+B4^h3h}?yEB_ zPI`A+b%%V3sUV59(}}q$c}D!vROMCu$^JpuQ1E1lYDArr?V$U~KSx`<@Si3>_QufE zebO1?kzEEGA1$Oxy#$EJs>8k<|9%hx6+( z`Q}I>tH-Z2{l9)77v@)%PtiBJ?km% z!+L4Y^z)uLp6bD2lZcS&YyjWNi9as`KmJlxZgH~`J z3hZ=L=^O0Wya-LHz@Mm#a4bL%^xW^COz~1uTt1O-X|2y5ii$34t5ANr&GM@H2j*yKudw?~zbNc1q{LUdlQ2Smu-rz}ra9?wk+2nd)QK)-wW`6L?Jw;Ol3Hk2kiD-9iNbQxlmtE zU*G4{r4$+?gJl^Hyf~|@{#=L;6HXMHVp1PO+)GI*Z4C8&Y(zW$q%-j0??u@72xePT zUr&7ZmHPF$dm|26m)U~3Y;Y;>TQa=(5>r{JF;wD9%7MB^#%?wL^*SYKv;RHeOjV9h zdf1P5ccSEyBoe|VN=7BVsh=F@0~WNu(nW2mF`HYq)H+|Sv_hvRz`B)mm;^#K)}POl zP*dZaRk2G!CIZ{r%qVr(S{bjEtGBgPg_lW1&ST;_3L8DD6Z(@n!6W%}MdKMncNe?0 zpT{t9eG_WP~%TUIa~^S<|a{ACSek za4dF=6Pdp5hyD1xD7^?s5?Q5@`{)_{*2Bjq;Cg~U{~Jo`tk*h8p%Zcc@KF!SX@^S2 zB()t~86!*Bj^uK;-*mip|2{i2vxzsM4=zdnT}l!6d(YN!v9YgQx$>~y?71n`D<-cy zXlP*+@rcQWcaU=q|L@g~9UpD!=?NEs{g@J+Z2JzbcewAlZeraFjg~y#{=_^2z5->H z{H3h_?XB~O3vWwh{wMk$u(Aa#0PA=Yax4d6EARg=ZRLOb`G?k2LeFcewVQa8>QPgW z1bAO=-K@{b$mF(>4w!^ZrQW-Ye2KXsJtr;ZwrKWy&`hup-Eje&fFz64Qp8fsQn zul;8hFMy4?99UiClaL(h{yH|%kr(ttPqPO8k2H}8%l+*n3L%QaeG8ZNxDQ_#rX}F) z2^y7B^UsOdoDXN?gKMzTcfQE%pcYFZt70oP@|UtT$Ucn!M-Lb|@$K-8f;X2n zgpGDX`)^#csMyh2T5IK_^a)UJl#_1Cw?ZnwT=?;RTTs!ggm|d)i!}L{q{*8(+GOG! zE#WNtn*(;5_kkv|ScS63GQXz-&QVua-Ad=<1?c(BxD!{VYMBI$N=e&~c;+)N$^i)c zB1`#sQW9j)20y_Eajzp5KB5NaQQ`4&~pGk-6dH23q z7!UqbC^Fs7ezV1kN!~93PERdqA1(a-J4&r+C5^d~`TZR51{bj><)AtuzZv#)QKCCd z;SOth?^II*uoLHT&$Mw9wMJvVJ$)1; z#VyljsMuoGm(Lm5ohG2Fsx(X|Uo+btKNR)|t2cA8*w)OUH#4hZ-&~HcRm)7}A4)$! z9<~2?U^2{|&OlJ;v{Lm{A#?x0N|=U*OW^4{I|UuDf$wMG4x0`>w=`58%D8xw`3u(( zsiKvcO6J;3q0lqJ33nKc@#Wv#S%-^$j}dRTkM>+yU4`*DTtRlw8HOW+a)i!HJX zbj${b**43!$05m52lN;axk19;=At+w0Yw?(uC$4g&%%9ZYsE_PuJAMguotYPNG5Y=2ym) zA|uc1c!wq{PPTtDNfK&anv+z-0LS|2ed0CiZ$rhJ0{%EMMH8In@*jNlqPIw*zxsRq z|2!l4Q*r*4h+MnZ6ylWrpb_}gnwaetTn>wA`WIhbm0B~{MSjb33014Kn2`a(XvD(C zc3iE6N<|-jsBH;WbN_whaD-rzY>MoTH&Nl5i2i&gYAU`a>ly`%v1+txvS=VihvIOB z6>=+Hn9X{&t;A_hp8G+M{%xM!@`MDNERB(ffSg>LWj3IVRpZl*nbp6QhzEL`yQr?l zQ@~bhcin%vyjRFFa-xonfadz@O!S^NA%mciSvvE;hs%{H`+3>E4Rj(9|4Y_3JrS^C=WKZj= zhi4A*PaT{c0ja{`U~%~Ey3as`HZBaBI-z9&OtHRjLlzJG%~`@A5qcT@ig*|5XPC@Hs;a>;tUa(*hxQJ+a= z^AQ=HY?-b9)-durG6fl|M*RlaF%^tW5NB5-*k|>RX^u(=f8M`IN@|VlS$^~=v2W9( zR-)=-ubG^9a`v?6O?3g88Y3!|&MhAtm!Y379`%( zZ6B444-?=&w;YGxR+FM5U#e$81T}?WMGEr+32MiXP z)bYEOtTEzi_x|IzvLTV&JDuow+@{+rc-+o=n^j?99g~zDenCNzz!k`4fdKq6O{X{Y zAXd9ur)xR0^ak^a zn51N|%g>P5If5>Avbue1K(ge1v0XM^H=!%w)Ymop=e5F@hfD# z-8u&~|2ir$eHxFK(Giocs$k7nzZ}&tCcL5Q9R!AddIUW7K(~v~$JD=6z?ST@Ws(to zQkt9k13WXT3C($4US5#@=-%5 z-s9cNgAQqLX&?O988{JmLsKcw-qZH;7Y{7< ze(^vobuc7Fg_ju2cfD?jV3V~;RDnj$fjn5hC!GS9Spgb(b`PsYY2WVW;FIMBO@5j5>I5pNSS%B3u7kM% zq=sX;&TJTFHFoo2w?^dLa}+bwJUeXHhj{PZyYnoi9aoU)$wOHUFOsD;NVw!h(Ivb7 zIH+~fL@p6Q1KH+GM}D3{46E;m@}`k{aY5Z{s=1naDf9GI9%wlChj;m;*=kLnk7CUg9{D<2b`kZl89C%qlVuknev?~CAoTZl(`HgHgX=#A#@yD=BO5; z4`~jhp5Q@j5USeVgc|)WVXId2JV(r}rc^}UDZn1?Tzmc`myV&F6KRRPxtQ7U1mCI$ z_A6l+b@~#i_XMe6U%7pqWtY{(?iEtOZr_cq1lN8iKP@^dDG|b$bL046tRvr6VK^A51~t)P7P}-)zHhz0j1hH|x0+A*?-6&0 zjEpQQ#xBynm9GUI-Vm%g&tX1!2@lU;q=Mk+6Z*2|%`T)Lg`w zjS842B_6nU(-PI;rIZ_vn)W0G?`APozFzdcTv1Ypee=goV?Z^vu&s#h-bWwZftpfd z$Lx>MwQLHRDoqvIM*3}1?~+&9^LLy-M1OyE*PtlOajhwTe*Xy{-y_C`SF95TQf#j4 z6SJOJ8U3s-=~7yPug!ijlo`*IO2I27t+uoyBloaFycH42rOxBmAQ)*yb>eRXpNCqE%`^zD-h#m;eYsU)dRL#S>HUBme65B0L{P)90j z|6If}g>|8F>@GJQ*uLn)a-h@BRpZ3M(j|o#22GH)b^;73X__e=<8*KK zAtRdMI$Q$iYNCXAdcCOEb%iyI=HB)Mw8gv;Ix3I{1$r(G8j%A)e$!7@WtMl6`xYf` z(Izp9%|Fh}HGbIk_s83nx##n7$5Fz!H^ugV-6j55uo)&SZWaelrw zG5AGL7fa&Wz<4s2rZ{f`U<48;0Y?%Qq}0sOAsNE>kxX5=sLawo?v2K>1k!mvj=;jc zB9xDPyRIEyEm|@+C5ggHWg@w=u*5ZG5wD(G zHrHltDbSHIbm7xKe{lD_<3W8$JuVBTn0q)-aCvBsR7lSsZt<{-eexzp2dpDK{U5bH z4m}**u=KS5d_?%ai9e=Pn3oY+Qor(~72Z(^TtaxmX)QhK^bK~0o;~oiBL5Zm3b_6w z4V{lGWKdyM&(qCeHm!Q+nW4<`+9*4HF-4A#?&xE!WN7}cB>U|azjyDxvs=LM?0F7} z=yI-~)=-MTFE3K|YrO~T?z31a?4X_xa))&ZndphAs`h~jVaz{}+QrMqXI#!R{~@Ss z>~nQ+YO!Dv|7_{X6X-UD_3y5l_pF3H*rin9b1fb*t0UaxZ9+}~Iz}0b^+KgSmN|^h z;IxoAiPm=SAd4fFndVc9q$z5p{h4YS-iQQ+^^mS&ivhjPk8%^$c$hYGC~RMGZ6jiq zR0WVoef{eA0h{3dz(g%pXLHE!10JUW+*Ppu%ruj45td7qYMhT33oas{)9JXA1u_;mx`BcoLR+2nOC#)r8(hArqMM z&XhPASu}%6h$nw`dPahHs5SSxjG41;X8LJWQg)naOp%{;)(VXeNb%*ujeLtBw{DaN zQ(dDB$qyD($$X3E@?TyOOqFMdDv;c-9;Y`}U6<#<3RUb0Ss!)#AQia_%WsVwAS6-< zvH3R}KSO*-2BP}`z1Jpw2$^&Tnu=;0f%Z-t$PAl81GChJB&(C9$r?(Vga77O9ZV`} zf6f(?l-+R~lT^BJHpBipV@mo-S!}5r$>;LG$QJ`=o>3?KAHm%#W$!G&>g?usZ&=*Y zErlrEPiy+kxre4nau&Qy$}x9Y5G^XoWv_}j$?2vd=!i^4_9&HuM;U33Mkgll?_B+v zG#ofHK=8v$=;dcS{TfWN0%xlg7xnlbdq(~3=Ud+8**kY-K&$-P z9PQq5u^AudGu(#(6OUgk(qRZ1a61iO6EL^-9jq>>Ta*K9y&^H-#7~a2DtfrFXWul#$`Wl(dUp+a%6bY;E|# ziL9l#bf3%29I(g3QhPPkqs_65&SB`@9}Y#A6CeK|%Gr2WR-gN({Ad@vRmqRACRpIQ z(%$xh(4$&$)HX;7wiUhB3ZV$Z!MjRHq0@|@FOIe4+r%91WMFAPnE^_|s)Fu%;Bh9Q z^F&2pIJkW2+8=Ig9qyU_MbXv4`)=|$Kh+i#6Xk@lbkbRqAt5B@&bhMZ% z$zM?ENy0E9vAyjp7vVfIvuKH#^U=G((rDgMAz@ztuoFmUk(f2k2!9!H^3orPdpM#- z0gBaAtDxVHe_?xfm3;h4)j3y3p2Ukm@^)6IQBj`kcGF#sfq%1rCidk(tkHnno3^Gb ze_OcxH?ja;t;P6U!j;9KyvOqNFO?l}yj)0?EmjEzZrz?0%h_#H#AxVSA|3mu%n)dW zMWrY^bsua6MrFvarMcca-Y8YOku+-c)*>8al`xk$W#wDRmd+}UBfJHZ0`tr*1;bDJ zIqyruYI|la1J#uBH?;iVi%abm@VVisgVNYO7KhE7Et#Nqpg;{u0rJN=VU?95@xJo? z*>4Cghcjj|{w@WgAbQUGfD-XL;yt_L4BaV-V#>qDx`K_<*cm6U zw&{sR1A;D_DM+?29LK;Rht-EeT63BS0&X$&Bpzl4>(gw z6HxO^gIp1+`)aHVMHpW>Sw*;*8_pdE5QekYV*2*j^xqp^|fv89~ zz=40T*TQBI?Q%$yB2JsNG&58Bs;Z_VQGB{3VrD8dA}L{E61eL$@w1}L|2gzsj(<)( z#6O(HV0*D}t;XYp`T=ljx}DQIAdrONTMAQ=~m@M4o8e0Xe zrwbP^ik{k@_R4aRyAHIoYjck*Bc=SxXFC{iO!|a=e`~fuHL-4vfgR6 zxqLJ-`6v0usepDCr1-gf=-*Q3_yOyn|3i6?`E4EmQBwYcw&P%VAKEDPCsY5&HNLw$ z*RNPq4~A*KD}V45pNY{pJIC(n@ePhqC)*;(kV?i2{(RbC+BKv*85p6>%0y0lF#iM*efh8`gdWzD zF<_9snE9?i4;TZR*PRvK4lAmBwkx^^Vjy4u*ITaPIM3qOmT^MBkC(W%u{;MqJzn>1H}0uxY{@2%sGiGLAI9ddO|xm3Qjla&Xb*#ImBI90xGhd-msU z?okjLWf|`K4@Ew0Pa#@RCNBA(;rEyywDuKieDzSLVtJtC#MvV7D3gu6R*vYPX}Y@j>=89qCgoRg*S0Z1Tf&Far+GT1(Km=zb#kyQ z@du3m@X#iNn4>d8djxg7?`s4m>F6@Y>a7P~5bLaVF_2=}PWgZrZ6SJ-^}NevYbAg0 ze#ro*a5hExjhVHZ38>HUz}tc1x;qtm=1b>S2`< zpWx9)+OB2f^AaY3<%l3yctKpky8?+;-ho$R-$iBH82(T_tu7dq&C;WV;7u)tyj?t_ zfeQ5xVmG*X9iD>%te@2%)Lb>Z=VD=^xA&ua2{(xaOQUz3FoKw_HM}b}pWfdu-&$ro z`fQlu>`3X{G5Yq~Bu%a^h8q?gpXzjSwp@*OLN#q-{4oR7p^XxfD$iy4Rg&CEX+fh| z;cr3`kP-n)^cua%cF6s8uCJ9Y6T+lCEHi6)d(pQwSnm5%rr!yu=Vi%+iIx;-ZLG17 zg5C$$VXXTOH4$MY*ZXD~cj?a^LSD}8E)Q&yu4Ps5SEC>7U!htU&fA&YjNB#&nEg6) zIpY^4kDqtSONPtys{~Y5MsM4hQ5D|ElXQceD}6rsb_@7*)RP0h_1E2xwQDbdIg)Sf z2&8X8Vo8>e=$}<%Xi$n;p^$NxJaHedM6ooBG8u$vQeHZPZUhGOymfs2x#j9xh&*!< z&4caA5$iY%7rpkTshiNo#y@NrJ|^LpbZ0_BiT;mJ^k;$gace0}z5Ooq!Q9Xxs&(M; zDU89EEV?DU+^~K`10R<|l*U`(GckwQp`8lGDc~VXt2$>YzN8|utC(x@rq9x_#loI| zoSfVgS%LQ1%vp+>g5oLeIUBT7JOn!ld!W#94y;W^=au8QbLCNe#RxwWYG+2yVydyB z66W+m>gfzhbts088bQ3)U7 zUX$KT?LaD=niyAzKf}cf+ntqV1_-#B9qK}+M&(=Knm9=uV&22mx_B^&6b|RKx*7So zR7F9(3Lh_eKOC zR|4olGn`|0wT^5|ZF)ZIbkuReAzjYS#Q{vcv^~6+y#rU!T*|@x z1q@OvoSl|~=^ETHtW1W>u7P;!Lh`Gz{B7 z*mq@;gao9dKk!<*|Khw1m)z-0pz3wC{RSB8wtQXK1*nqq=l6vy;tIAo%mLd%8M8i- z@vVSKWxV9im9g?UKO0!uU#dXPam=(gnqq52eMPde*3X3bnt3r}6|8v{D>yt|^u&!; zTO$&7kw6f0KUeuKUY@3Y?&k8Ism1W%Y5`<+xTuG{?f|cPGXCBlI!*{9~ zX3-pWfsklX_&Qta9S-yN?(X>}BVI0f{HeLla~+?7FS?A2OZzgl2Fyv%qodn~7IPvc zPUnIrlD9|P*RTHg0gT_227ZD`HB}0t)?1k)=8k%j-~u>ke~KP^L}w1E0}q;B+z z4?|5h((3uzjLXl|m-wKY@*mvWSR8mn9*aaorZogg!GCg_Yej!1IjSzXvQQTzo|-Gg z^>waOSiJ%chnFSEXQYn1ul_UZLHp(LERzNb@o-58<6op)FSeM$#=}E`$v+sODE1z( z1!&oZ+S3BMcMFV~0I&rhCm7_YWa;aobPE21m|`{g-m^yHug#CA*SST1FBA;n2u%E! z0_8Nra-RIjxjzlye`quI2ulD0X^k?u!K7Z(%Vwjcl?_lfWsW<`Sy1f~OFiL2<17LO z<@%8kCQ!kEoSl=xSM3uC$C9o^kjFAe|$P4|wg`H(q+!k3ldbx7kj^^8|l`(;frv!@-)GhahV zS~I&k#c7oaybPC_CS>tBqxxWl!7RyD8T}MF#QB6$j+Mk z;r4{49%(*AwAN_jF(%GDucdA)$R9codi&e1|3qZ-+EJVv76-d5Ym-&?%9EbwF z%wF$-`G&ur3leh4g&P36wEkA~q*=^g_WFG z${A+x#L=7~Q~vW6NvP}%?ahTpvhNEwu(LZW6U9R(M`{|a)}~znexsp+u{Bs0X>T?m zi#)AJf5laM#0_F%q2asF6swD_aus(0DJJ&mG>d>CKS7UmVpoa!U{RO-X*Kyv1)?C5 zzu$6pe zMBb6S3$unfRIM1F(wz}FH0^6p@Nt(-!lav!B#{n2-==)V&B zDRQnY76%YIRN>?&+`&*IrCjOEzc%gjh5xAIhj*PCeZKKkwg>r9rxnAmw0S`y;jDR+ zpyClZ2ih+O>zy6?-Q%?}|MfE+R!Jbkc=IOS_C6p^;xdsGttz`C7|m$5{Z}r`apLRs zq_=AxuTB7PWS$)@hFyg#CI9W{AmyYFNc@)oa*hX4^na7>UyIOEOW8QBiqVeM&V$~X zO8gXH_kWRF{qI8y0MnsN%%>WQwHlbq)iIXK|4RTFZ_a!HurE#~b)S#0@bH?V`SK(q zX7rvC3g=smjsYm`i4ULU2(&G-T@3>B5MwFXtOuKv4)|18IGuKh9*40QOmlC)iY>ON zTf3l;nz1$8ZrmL99`xx{%Zh-5SI}@SrtyyN=Ug!bsO%HNQ8i1-+nW~TqApj@JUl2Z zKRV>n)LQJ9PE*LL?`M=(p@!UZf3pZ6Fy!P_WtY2qT&Y2Mc*2pfIEW{Ii+U13$&|fg z=misYrRoiRr0Pto3CN{>;5`S;>c;>ee3H3L!$onB*q2s98((`g>gHQ@0OP{HUV;*M zp@JFpi30PNIdMQ`w;o@_!1!X2ZK0jlzdP4i$*kA$1b+3e@2W#nWyp5{?4zb0)Egj~ zsqep)THrkKqk>4oak?udy7q2r2D&t8!2GfRA?WV@T1uwlc?yu(xRc=$-s?=l$x_I| zFep_wI#}q-$SUt~1aUrr{jb*upvpN~%1_?%!2)%%zJRe+5Tly;!p}nhgSbqi~ZM2DJ2%K?JwXO8xp{=N$s7+oN) z4wdYbHPz}PDaE+IuyOqL8qnSA-~sfE+y23bppW{I- zesXLI8XErc8mKghq=ZD!=?#RFA2hqZ9PT?T=HyF7_VXI`Gw*Do)jvH`2UbJHLPJ=4 z1Y6%zfMe{*(uj^=GifZud_o8SyvJhi$+le`Pe`aqNO;~S?#aLF6vYW#I2s-%V$$mPnguB+Vv)dIqjBG159~d@WMRv0N|l9+Ba5=EI3a+;?-@VRs%s{we5liW6P3`PZxG1v91PlNk-b@=fk4jaZ^64Z%fk%dZcB~R z_{0R5f82u}Urj=Tq9{0RmYU&nptBRrW)d}s1MV%IgEx4Kh>Fsv7MZ5VCThNU16nUM zHt4_BGXjXSa)OBeqc=b5Nx+q-N5I0ohe~Zi8P#sPs9i=|(aMXQlbuiWeZ4|#j>kynaz>uDEi8iO~C=!Gaq6r`YA;*W$X+5eL~(L47&@tt&>Nv zbM+r}x$qCLlMa_j-`&OQT^XyMI(hmHcDJ5GOiV1`2#Rr+_&oI8-I+^>3-EJrtatEx z?D(b_rc{^AKZC6A*2zjRm;y)qy{JKahMzXjye3xQ#AO=6!UfMn*}#HECZ% zCsivP&PVT}==#-n#);ds=9^!epK7tWQ^}-UNDRkHbVffXNZbHm zwr_ptLf%AEdINYy$v^t|T4f!!R);#8G0=A=Gw+)W=PN~K8MiI@a0fue%Kf^3i77{} zk#DlzKmL_%Rl(vwM}enJWU<*t=WdXbfDehUAOf`?2#5=e|WKtiZ?TJD_t$>xApi21% zIzsuh=Zh_c!!Nd;9>+MKMGaE7==)?9RBPE+tym8^3?<#J{hB}9ela%97%3T!A<6-F zK2FZw_^KhKs#6k%~NJzM4+YrO3j8_dsa}@L5 zma$&;Oy_zd=f)$w)f}u_hy&Q}Gbbo{>nzCO$%gBwn2dhAhK}xb9{oJJs;Ko4tjADU zjxkde0q5v*Ussg*M;C!1{7b$6M>g;ui)J}HKkYzfH7>o&@z!x>#RrUV&4i@5khtBg zuLij)0u6D2A8`%bEJJ6-bkE@BBIozn=vdF#jJH)jK2BPwegir3w$s&@!b@ z{CJa`Xvog)E~P=jR>pT{Z zxmc*^sR>Y+SE-}dcJ6SludSu+i)fc96W-ANYPrN)Q7YsA)Ur~@i!io;U9ik-&J=l= zF{#D;&}L~+yDHw1AM`xTGWw10&(oXYab^tFiA~T%`an9k%=b> zgzNtdd!3vWNrfYNr(?IfhdaX#IW5dYl9=ct|MS=jWGzP1AHEME4SDrYrtG6-px!}$ zj!9EuX=qJD3cvRrS>aJwzNx%ciU@Bk-8>|wRi%6+?wM}|&+e6l>WK~?arf-iY*GBc zSwCaQYu)o1l{XTsTvk(S9Y11qQny*WdXpH4lKc8`dIRaBsTm~*-Pa#d2;ZU3f?x5y zG;?+mS3b{Ut@fjVD(9JBGwAFgr={|$V_W)J-}wMBQqFF=`J{bZ$gY1=U?7D*0#ARf z1ydvW$_Yv~DZ`U9+PNjUHmFXG2zJgWSQkCW+=W=s$m=WP+>bk7Ox0@AZO=~V55-Zf;lH=%=$5RsPO^*$t zOYImRNMH2@&i!LDP~20eRH?MaOq$Gkz}Y-7hpUA{6gb!4wX<;VO8Zp2!`5<3MlC^$ z3g>dWvM)+Nzw<>p!%&f>i1NXNe!nWK(Quxi7M3-oWy%My8=9nF^{Z3Ee%|Djzw-dm za67!$n}m`|grkkyx;j*g^pD*W2B znh(z%ax>yK74` z>lf}-o@{>cQn}nQqg28CUDs7{qnfs7*ve8taLmC3{!)xY zzdUE8y_Jl#WyC@*9`{q?%Oz%qKLWz&Njj3WmK(~`%k6q~hD*1))ccJOtyc=$9AoR` zd<{NN$=1~(6}G%&_X7DVx~3W@x=%5{0X^Qdiz&9c~by`uT) zqIfiX;E+5U?d{1bA*UlvPJNGwhDbqbAyHVN)Ois^sCl24bu3vLj*sm%5AU}m$ro&s ze-G?B)!uMcsIsjfdx}6I?zqYg&Hh?0qSDQUaJKsBN2N=RLn=JhL=3P;3k!wI`{VAJnTrk|t$9jSbxSIEf$i5Fv!% zQOTbxI6BorTSR+dI?d7iM^CQ?sWGqR!c3{^A+?cnnFiBf5LB z%@+*^!xmNDtwFo=HH{Gb%eM{K%zFk8Hql>UpiO(F3E&JnVaVBH@?8>$xLbv=kIqnhy)&PEOoA? zB;Ot^cTm{JyK;Oqe_;-MPiqW*{&VxpY1(Cp43BF?ldAiJkF<=>#dE?cTb?B zqhk}$vRlYsZzbcI9s;+taIWh@_$!M8D-=1crc!Tp(N#zZapmf?L^VgSwOX{Yh?JMP z;k=%u6q!-m-_Z(hYi-@~7p6@=a^@8uy$&s1sp|m^K@3bxaFcG?*L$E#P83~9fQN7A z>J-y~`EBV#{hd1Pro-~r9S*p%6N5VpR!I3|?;YJ;Q!A!WozR=iwueW9CERYq7BLJc z&{&47(#8q1cWw<-C}5H>nG_kA6ba*n0*3T``%=RTZe_f7&qFb)GW%OU@8lz`(zqA5 z?-_^@&9mjr|D7(2TUw4mar?ES*bSy&GtT_^+k?NO?woA;s- zBz67vt^E4?BS$P`+zEC0$c8SNEpt6<&nnC4O8X#if@qeDl7?N}-(j`{i$R}UUfVre zgM~PjCkzK}bgibp&{^UXkUgxbtD}}SjS4YRzO7Jf6`x*OS0de&NEXM5D~h@R)dYF* zJ#OxFr@auZ`?83Z%1xT@jkePZt(o`z@?|2NRc6e39;laHvU=_o(pz62C!588p3lS$ zgJsUe-P?7BU(iv%z6*WQ->>(#G#d5YWE-xq`&7 z;-=GHYLpb=ZeQ)1m`M6;&|j9q*@CTPj}%Is*youFF1E&~$v z_*>WnG|U@;DL(@F4i-8uE6{6|TU3UrRK9l7cPw8;3X?j$_l>*te@rfEw&+~8#AXSe zKlt7{k|jT+%;mc`Q+5FqxAZAqKkxSa;K)TbFc7QUw6feXta>=hSKjIs@&|>XR zF=psWNU4()@y+t!$C4fy&cw2p9#!Yz+eHFd*}~4xGA6VwMfT2{#+}pAyuO}xih~bt z@nNq1@Vzti#3#PaS!U~Tc41LMro~L5?lf_Kvlt$4M~F&sYQZYZK2rpr5=x_ruFz(+LE*AeeFwk53Wa zND!U%i~9EUQMHr?m*njL_JobJ3_Inuo)%wqPB8p{82|xITJ^Iy)`q z6WN7_MH|1<+4EsjKG+>lU^^Uy*fs8Tr`6@&WvEM*GGP_Dn(XzNk>x0N)n%xkDRUyu z7KO|zoLtVzGa8WK0h;QzL!%D3B|#5}%f*5i0PQ$&K-Z07<pGb;beUA%_L;w;p5Cnem3a0o&cVeplCX(!5IEM;Eh)8PnNzJsaopI# zTbar7Y-j4F7ilC8P-spVso3EjhnJZxO>W^yn?ckbb*+Qj8Vwd28XB9}uNw~(Zq$0unCW*e@0CR^J?SxhbfQ6r65zjM zdH%5M)xf5a9=H?7eMCCL6d}Dhi)t_5+e(V2l8(_3oULmF#@M$caaHRnAdk`P9L2>M zoN0t$Wx|@e@_Mb6j0L-ixCKg}9VVs56TCE;7s6tj%CD7DKhk=Dpa6H+C+Xfa9>8|Q zBts?F){5Arqei(MZ!pBMnM89Ld7v=B+`0*eTZBK|~1SI3l*5|xy(GN`OfjB^VRA}irx%gu`RDt zf;)Q-1EbE6=T}?x2#v0+%P_ce2_qhg~Lqv4N zHE5D|LZ7Z7C^@&OQxh-Wb-*7fOz!JCxnCA;lM$M}#jNVjZ(dMTcbeCebbunAfNz(d zug2>ot(U-E&>E7l4sw8tW<)J-TxlUvF4J0FCG%;G>ll*X-d7rzxO&0P<7A1GlmwyV_h3%jTb%w; zpCTKMe?Lyh8&DF^$LdI&fJE215QX|S&vh+sPcx?D`*)Yja|~^$tb(}@&F_fIgeJe? zNOz75N-sF)W|xp1ei5A|xx%|Q1yz+D@fD)0g zzs6yh{j)%CwQt=L)!2~9Q%cC79weneky8UYBb;VC?>Qx}ADJ*C4g8Y#O9x8_$a;hN zV^aMLgel|Nc?}-QF=a7O^R_MTeNXQ0ro3YrGb4PYn z>@9QJ&LQHJ9<~waA(C#rAEXqAdp4~r-)poD0J*`76!}CsUn#!D!@0p0i%D6!o~$pO zF}OzoviwUh!*p zFEsD8wAftc39(_vBAxEVbJdvluSi~Pl?s38^fc?eI(Ud{^5+0prb<~p_&i(R>2zh^F5RHn?aEBcuLeKOOH~)>HEM1>HspU5s*o;H* zsO6bvsGOy*q$KJ*f4V(ier~Dcj)k+7)fzO7-=3T|UzWW`+3AaHGN~~9U*)}LSX523Hj1Jm zl9V6<0+Iy;gdroKl3@S^1|$ne7;?@@QKAYs!Z1W7Gi1rxK#np<8j=zugX9cf!y`V= z`|kI<_Sxrr=f}CuKONTUuI{R?y6f)lTC3h<8^wD3!%a<1e|0)$vy%tdBP>dMWt}X9 zo;B~#L13AbN7l1*oa?xMKHpQ&;J~3_&`%c69@Yzhhs)*GOh9ObUcJ>x=KjGzz?r2+ zakToqwo6>R!maKO>ADec^;7#xoS{Nr{|zmq7n1r`kl}mdIR^pTzL;n`xDHYeL6DmT6ESC)qGS&kVP^^(PWc)zirONxo>O#qlhgGkaNDVv4s`xXam|ZH=X!XFw zsR#N?`r-;d=_zdjI5e~5uXZw#rK<*mRr9Hsq|er%YOPsi<8n>uXhV4>j7GD2GqOZr z8cDn{{>dYt0@5w01(iDOI>(8%#&X6}De5OP)VSBCvH+NoJifXl3cFU582g1N9X5UY zpPh#2(rJNcQ?GjIYoGmcOI@~rE!ewo3O3VSHeM&!yaC;Rw$szEg2*Z;{ke~MZ%}Qy zf!^;ZiW<0ToHWeFN>d8iXj$qZRW!G`Q`ae}IbFyQBDEPmAf+$I zO{ZPpeJ>z``j;deQzgirhx#(9=wg3-Sm9loCmnGOzy2t>LnjNz=tXSxPmnY%+wCvc8^Ia%mB>EP*m8JjiyD(U7{s9*%&c5 zTWqGwTz5#_wM=b4{a9rlmE>G|i`uW_EMehC7I&08Co-$^0Eu$~816N`X|0iBEk0`Z zJ=AU@2SQTD10kP52AK+n#U_&(FUft?3@YUDB_v;H(jCrOS8v z4|jp9^+<=9W)kOU^prYIty1zFv@-eW4QtkVQ;{iE7-S6-w)EsR@je5*31SM>`SyL3 z7BqeH-KUWz)oUM_=wH(R8ud!x<7Ytd=Zb!!@W5^e%brHEvi{EeB&TzU z^r=enyl(`#S;h}zl?;_5s;zrRoLX)eYmiK|%Te_wr@11zZSo9;SXj#$RjcTlz?SGq zczhzGJY@96tJKbKIZS}kL#sgvSc_XrzhHJ)YnU!N`p45q>xh={^7IRE{%fS_7% zYB(7MPU#KTOk43bfy0iAT_6LWvymfwrY5HUd#phhVeKby7iyai*G*Gg0OU|`7$;`~ z-0-t24WRwLeEC9X_LWd^(Rm8qKXDC!gwRec+;U8uf;eE72gA&iKA{NAYQN5%clm%H z0>c!k%}VeWhKiuWrSwY05HbQbWQbigubBe3)a{ehYW^g(qOr45;VkKiI#%(M5D1l$ zf?Z_C%h!5$)VTA8YkT(Gk7;DyLSAw$wzvqhsP$V9DoK=~cQ+h@0TOWZQr7Jg_FTXN zH^_18@)6_Hopv67rzF_9L3dpzoh+N{P*Nv9WyI8=lK_3(Yf8NeWD06ALp6|t^Cxod#`>01Pitjv$D1B z=M#?{YFWpBPopN1RJ9cM0J0}$t?6PFHPjkX*LH*VPT4)0Y1!dl&Yg)Xov3G38 z$&E$qSJJA1O8Vdrg4`lk3d9vzRo}C9qxd=hGz->j6uY@v@neVRciQv`TZ())XLGff z_Gi*ka(tG4R=m4&Z`^v`S6eRo$W6DlZIZoSC(k%)9gr;K9BRR+Ry0wz`(he2@xH2Y ztr?5s=;Ql9F96e-%9*yJ%2Q1r-qGlnL%yk4SM;R$c2Uw}irK1%yI%66A$6uiWQck& zTrFxHc<$=;Rwec=$;-lk&$-$@$-bV7%%_w)ZAu$pC}SUI7aoLxf?WXhk8IyZ4Osr$ z$-l;yhwZaepMaspYOwe$XVpwf)zR*A@f+S8Q!-s8_r$dIho$Ta*PlDiqW~;Co;$0; zzZ!``YhoST@rY)-%j9}~DyQN1vhg`wawykeNswmC)vt2}so{vrCGpv*HL1c-k4wOc zkHBg)l>-LEyfUR$BvF|RZe*PZKI$U*4*W8B{grQp5+?vQ_yEgaJ4?(0D#y~0^y)2hjbbt z+v|7S?Lie<$vtaZHH`S40`&Tu7~z||4j;e4Q)+c2Oy)~XfA*R7MBxhA>S(0MviLqK zGBXX$3@X=Z1U}L0sUCSey9sG_>hb=W>qDOl>kl&qIe~STgM*k=;JCJ!t94Jhau_8~ z%x$9_3&{yKLj7X*xklx%aJs#xesyTwC)Is4Y(kbAZi8AqS%uyWel$XP8J%ubFZ27# zDM7I)^+sk*1rowbIoeg}+goaMjK__aLlQ)s%!a^`f25y?4Yt0%-Y6twnT?fL1$sRu z=9}N4IieQSI@$^t)2}Pkt&x4Awv>Baes`lRpF{Iyh0pZesn)5ijtStT;sm_-z+Hwe z@%|edtHfHY(C)&ZvBAgTwhB~6fP=O$S>Vx-dwlXU6#;wezSFxmh-T(#1AX?Wz-|1CJa%<*o}J0 zd3bLL+zNgce`{z93WRDdHeaTm@{Pm8NI2D&QGqdC0{Iu&oZVC~yrHcX)g7jvI`a|Ke44QWY8| z_L!x~Jb9;gW|tk2-=SDX`;bR?W7J5Y;gqn}mk_G&yJL`wGRGT8EXk;QN^gFhkIO`t zI3lCku*UNaLAqE4C+2$dP%IM9RLvDsZ(RE!N~iS?#(H&GxIo7^Y-uy)m-|Cqs$KiCuckB1Hgt~c$}!p0fqEcg=H)sN7jWreHI6qiupcF6t1tgrD>Jt zClDaYTD(H{v^lnf5yh8hdhKfL=RX6&mLU9MMqXADbShvG`_Z8R*4sPDUXn4XTxH zomWB%S+^G)L&iX6V)%ijRbpSY%UTNZHRi0G5;VIscjisKS^+pFQR5kRj+n~`C1m{)5ePJj5Y9m-J7BkuF_^Yd+1 zyAK1j-lU!EimRROiVMuQhYHyD28F69k6Jre<;m{^S?^Bt8JRo()Y>9nyZ_uJ(pw{|7Eu=7!fw6V06pZRk>n{JfaZnP`m+#^TtBv z9W4xOQphS_i?Y>&MlieR15(PWE6+n}HSl>Lzg73k8XN93ceZ){)9m3EQ9~| z8}B}3em~1W9Q@3mAk*mK=FPALvF7x1@T&HC@-wu~dOC7V zC@;BXE)gB|Z;o@RJtG;FyIT@uW%zqwfxrQ9u|}%BjnTrH}+d#*X9J1_jDyyF2mmGg{XbCb%iW9g^w~ZjwfRgmx3@ z;v&5+LK;lQ^9%}>&E8yHC%DM6EnmC6x73-y)6p#Nw;!U-0VxzWhJE~KSAL5tL9v%- z388y7MD20;QI7U6Hmod0 z78Hf-kqh}t-?>fpY~cD>2Q$}9lff{&3W~z0JWcaE*b5H3U=fbyxIxRVk5x)7QV@&0 zdEV^)<+zCxQBt+M`Bo>{{8(P8s?=m*aC9dXbSWNycIC|xu8a>awLiZh*yILLAlOyN z-#&l-;1a8=P)c0|JwY%-F>erm#X;T z8EbD>{P_!)biIC=%fRlIzD{z63oZzz9$t|X4!dg=*#8YlLuJf9D|!ASA)mkuJ6ber|%*;ck@k6D@N z$fzI=T8z67aSrHOgRZ_4 z1Q)`v5;GI4pp##@OzR_5TM$V+x?UIOInvh#&u%U5!H0h_dFt9bi+S}bj^B1CcFNrE zPSxZJ%cSG7vx*jSMw5$yYoz1#bZeefQdnITtikl8gUwg2q=qgX9fa-A>rIlaSm8Bu z33zUAvKf5bwKLjAhxb^8Se<=Qt}DiiX?Mk5xocDwvQ{Xoyii$5m?Iroxb2D$pS5+p zvz2mZ(P_o441Mlgy@$r05tC0!LcP|h*rceCI=+N2vu+nM=U{GCwL_))L-(g^>DO9q zwLUm0wiSmFAOYzxZ)K{h{WV8WYzRx&wI@%#kovSAr3k3j8=3OOH$naIc?YcqIM#R7Dn@qWN>#32=SMq?57n;vNlsZ zQz~30vhylXg&(2n>8~GsSU2*tSa}n~2EBG4$l#@TEko>N$b4qw_j&lyp1tp#lGv6o zB?Mb*H(@B(!YgW&7Une#oP<<-SHG%ou6bU zDKPKN)orT~U=VszVrg2@-UaF}zkh##{ogdwr2jS{P-*J!IQr#F=kd}@6c}RKLx|T^ z)X~x5H04^PA*_svJ3&vErf1W{>Q5}FRrO?W&A&d7uDnKLSIr?Q88pwf#nL$`$qDGZtVmX0SmPB|n*E?b_T?swTKTa=K`5eviG8A<-^eBMJ zRauwY*>^fFNT<}c#nqFLmOkRsD|Q9F)_&0ywYz;&-`XxralYUqxYCu|;D_Evweu>pRNzMa9DXrI!ueAW%y;N{TOsUonHh}t)7n-f3 zA&|kd{Enl+=lnjpi{Lndk)qgd90vmVu)@G^0ydmxnolx}l|Fn(ihH-#b74qRIhli& zv-8Gg#D%>H+T9*`(Yqx#wQ4nYpV`l&Lu(Wb&j=c`d3n0;X}w4gSwNSgWnfObtHkKf zowr7~Y=l>S59K&0ERitmJ-F3Kt=3lhvv;nTd?Q))>Hn|fU6uh>r&zEV6R}v#jMaDlDM>z3j*c zTd|gwUsL;Z69E{`#rl;7s3@t<_tgwVcKOzLJvjJ* zG%(gcJSR^xX`rg7o4s$X`&*p_FZ5sy1{F09C5CAx19Y>AgQb>74dfj6hj(;7T9Nm%~6I(}OP6CY`cQCYvqP*eF%?Iwl$ppR(%9 zsWn^lt{i^$VnVmLIc*x_n-?@sxka^2v~r928325jso&rp+xd?UCFQg~eVwY7_GBDlPkbgVcw7Bj zz-mcw_=bm%kUG8G-O{s#Suk9st(%Q7YGRCI(3f)5KoKRo{7p7nTmdU7{y z?}=6S-=LpC{@RHYAEEMhE|_u15@sd6x-oi!M^9k6-I|e>ZpLp6p7ulWT3%y?@JEy4 zjsA-5N7*zXTgNZ5a+o0?Ku}4pHQ3`IVOgX3rL^q+8Ys>uCD34LM-f$XLlqRoFxc>pgDDe=~ zn#)NLV^grmsvP%K5wA%?QnO0MM)a=E^Qv;mR;Tg5U;f+Sg#~@=C6$rxs_pHd3=w7rNBZLGP{O_uXmor&W29MxRhi{6){?o=M*Q*A65%)aK%g6i4~TN^At1btZP_1C+P zSs&v?@*|4N%gNv+E;hLiSTF@YUGMj?xM>x8=B$OhwDUa-w8%OJndVugpZdDe6T->G zKl`3dhOeb#L}sP({-KbM#GiS|C_O2nfle56OY?FCIt`Z6UX4U7Hd(zCSm5@&>o74;`18CIE~5er8;4P^bTBXQ_+jRr}~Uous`ZD z^0}7ZNWRX9d^MigSyvp0jCezC-IB>)syrj+k4jD)?=#%`ZEgOvAE6hGRgVXFoHmoi z;18SuneOJflXn?{#h;@7`ACmPh{KDGOm52F7TAjEL)c3!RAKxe&_rFjwy z;|Dh4`7#FGSjHubZgrUsT|vsORnl;ZKJlv$+)$tJtMnYmdRxA{ZlZiZT{o&cmNG)K zCk^h3q4qb)nuL#gll}!fYdk*2 zvoZK4GycXDawNCE@)FSqtsC6cFHxO^Ohq%XdzTj|_Hs-*8$0WW1<+01-%IeRl%#|; zcTZVGBV@8Qvn#yDU-6uSC z*=}Yyd6MM*26gX{VfU!VP41>mFAqj$o1wCUwjsYO)A*mDAFndPS*HnLCVDmr>&4b1 zZ#u``o8XncX;?SDDrcTV4L9tY{je2YL%+M&W|ZKIJUfT>u}p%`42S1lB+$BT7m+m$;n&iEPze2Xd*^rBC%OduKEu@hkGn8jJonM-Hq2K=U zy*FB{slMTQqhkO|-QOii6up^uUwydDv5%>!+3vnW;^p>p)(mgVR^ zVFW^y5GVNYZW;QLSjc8Y=KaP3Nx@V}x3p>5iSrr_RF@~*)T#MAItZ*p)jVeNdAd3D zxR)d64k#qgFbC4+`!F)szXr>yLLvUxj6;n8ZtB9{`--%jpB$bOKqIp8cf?B8wv0vJ zl{a(``u1M?tqOJp&lk=-TD;V=%-jc<%tSj4!@IEfGrYb+F!p#o_o0tN@)JKLgm~Po zpY~*VhF4eDaX);ewSk~~y3hK=%i?&+T@gee2DCuU1w@@iPdH`IAsC$b9x#bZnc16J zKItIQL`nQ=Ib(YtDbMCGiVGI-)VvY%UiZw3#@do8`#j8J6?UF5X*~ zpsh)Wj#mOuB`8;rBWD)5`Bp@|{J0CG=A-Gxa`FdSi|QND!6{%)!tkG|sz)pA9>NZd z^_-P@44qxF-dDxNyklGWe0bcg`oo0(JzR_MIdQd`Is;9kpe#YK z!7^E9m@SxF?{WV&S-}hY_WBoxJ1c3}%AOm3CS3ZJ#cM{+rFCEe(82nv}-$FCztQA~@;2pv<1&AH)u$w8s|N3S;_D|8BhL{6#eBqr zgp_C|)WF7a1%#$iE~ z6BVhRZNH+HaO%(WTSCzx``H2 zu3Uw`^tNZ_jV})!uwR{(lwj#h2^tuG-_zTm`i1+4Vt<+q@)M>t)tFZg`A5ntx7Fvz zN=BW$!+S<6Z8*iz95}6shrNEajAe={RCKGH@SauMs<>edMt;Www)ng+xJsn*ocQmdxcUg$#tdBkLc6NAuYu+6 z3o*D*MABef&fTDJh56-QK{8#5yXLuO>rM}iU$PwR{M}g`M{p|__5*KNbKYyk?%R_U+{FJ$~Mb`_3yYlszfvv+s)UP7j2b zWOOF9Dyyha3Bj*dh5ivlGvQ|LYczEZAL0>Vf0{7+v*%ZU&E69>BZZiKj!}%_?9I|L zZ<$bPjpCekMql#BoJ~-U6%<(;p|VA*zgJgwjPu?|%9m#F5JG^-!IaKP!(B9bA4j3; z|7B<@w6BovWLkny!(nxiPx8Y%1C9Z*TO^6>yAj&hat>UEl&vX8|8r;$7QxsaITNfpX?FH1A}XrE4SbAM;Ug3uul*d(?dvh@Km0*$lR#Vu z%k|r!Y>EBj^yj!{XK}6(x4*Uj2r6`Zd5R(>j={%yEPPx2^BGY6gb>e6QTQ>akn-dI z4~^7A$9(r}!s)~@Jw2S7IRhE0Nj$aN&*+&WP^cC#m3N)}!TcDf!$C0~dWrqL<+`J# zs^!Mlw4i+YIp51)dbJG2ooBu-EG&Qz%epRNqa+D&a3U{&DGWwo%k1jx#w4bH$kF?J z1J%9Og5sM7i_8fwU1}bo*x3M|uAC;p#kre$tO4V6%U*P370dJwP_W}citMZ7hi7{- zz-fd%P)Y+~sG4}Eh5iDLzx=T#>!F}>$H8nyQhZSAJ-S56b2vEr=T7G^!ScEk6-Pr-9 zM?R_oI|+z^gXWk(IiTJ7e82sbCKjdW_88s(deGhBnG-RRd^QK8v<$T0-+xhDTudkK z>AkmD*7^SK_qsaz0YMy`dQv?fQetnhEC1iMyiKQt0p3jpbJnGsV9to!pGeBc$cVWv zyd%+uMEW|ul>oCr=8syKZsVzI@90Q#Og3W_Pffahu>1ggAQ>lyonfXYL-k;HgH}Yu zjB!!aWe$9!Ig}oJm)#er@?18kPpMsG1~eWV5sbRd6`2SOAmY!TB@fosYdkl=TiThx+qr*J{ zp6c84*Ei<->&8Plx37S=F5Ff>>o8d=$hfb0s{hpCw{vyRw?)8C!6eta1hxWdc4Hr+Knb{pqzJT7GR zDGEy5e$L+qbpDtXfeShFnEp0`E~aG?xV8bj_EbDGJ`v#dHqZRaqol3SwWOn>0k|XZ za|^g;7&0%&`4bqEHA^8nIxyc-MiTrbIr76)Yq#K_zwpQ6-_12qLb^9AN92|hM9W45 z#OsZ^<@E-F0bo6mU|)c&rO}5zGtH zdJ|h3Moc5<^-wmgl`1Ox<)eb?vCNfODheeeyO`~urMdsQv}gWLYkylQ(E+NvIob!G zv1xDK478X~0Y|;(k6H)3lKH4)w04Q8xU)xiT>r92t?{1is{O}u1zZBQ{4uX*sYe4L z30|YCV@4xh5+(B&SJVe5CtnL~vThleL`&S;|3PRk@^Cn??Rz@1Sa%l_7f0gPszTRx zI!;4KuGg{@V}RA}=sglH?;kMFVpms_UDXHKV_3t*XFARUt6Hva8XFJT6uhRamK`8f z@$zh2eD2+0Lk%m104SbJh&L}nDl0X$oufBzZUlLZRA{z*pmLz*kZsQ=brq1JEncCO z-BXAg?)h4}DV_1d;a3s8H{^l@!Nmli(3*em482C z@&PqB{j*TgJSAx-`cj|`<-9acKtoU=h_NR!Km~im)qfTwDQETw%Ux%+$yQ-5lM6HS z?pTR%y$wQS@C9Hnh>qf&uPB-&4*9lb`L4`?Lo8iq23@%kKn?Z2DUCp*N-A8-rl-#* z4#eTF(EZlMM<^?xEIvv+W);7UXnBglDIkeaAZdScYFoGv)b;<1k4m-kn?1a;L&3{s zLYWW3_Hj#H`sL<)!vEEV{|Dy&A0K7A1L^QP>@v=1Sef7X{MTxcGfihZtjw_NAdsJE zp{3WTdKcZJ!1)@8VD5>cA{FR`FTl22;HR;Q=QRv>A>ZR6wGN3xY-+~jK zs#uU7NGP`mf3L$R6x}Tyua>A0d6Ul*U3#MvW=j^*+)Yp3h`w^_TNdfu4E|yq?K)C9 zw)6E{Nfj{}L++qQ!5;0_Fu!}IQ*-{SPk+SH4SYQZ@g{^1Z+n}so+TPNZSqsqKw!pNt!v;11{t5AS$TEiyrl_CVJ(MQU8o=!a44OCqchO6`IF1mc# z3y)G5aByh)6{PQJXjox?s<{ecZt!Sq5Lh7<6~{}Z4cafEqMF5Lz6Y6SX(BKDHi%@@ z00D29Q}FBe6G2_teD13YL|&4ftBbf&X1ADaM1QU>i6>!Qo|mUuJ32Pec;yfIIJaZi znqhIoH{93;J-DLlJ|N;s4QwHdT;uqTtu{=TIAPg898`MEs#9HECx+xyZ;*us4NUK~ z(RmI-H%oyN*t`tquSp%jAV-J2x7A&hp3rD*RxScc1m%#&uFPKi3 zxG#N&W7Ti_+yh1pyu96J5zkedA(q5s%WOe1*>uUZAnf3)gi>d&rT6GM?-wtRVrOee zDvXv+M`giE>R5DtiAFx9tDu{?*wB+A5830~u<6#IprPe7%PfvZVj@W!p`C`Eu-o5d zs+ZxhMJ6)ZWD8EPfKc$@MMMs8-trA_rT%d`^e#wDf$@z*D<9IfN(g^=op_M^0k9eXprmYP_ggNz6U~W>boYH^^`x zUStr0ewn_-;3m12=!ZJ^=I=~bnu~pjyevk_BKg6E#sM>tU+1?sgFj+RGjrWIDZlkD z`fzWWYhJ?s_8{qs`j?+vMyxob*JBib1~K81=TO-;bq^=hTQgWPqDd0>%206^NOB{z zL)MFzoTIiK@L_RPvLtaeF`E%yVPNhM>S`g;%~ATEp~bmaLYgR=L^1cuu3x;;p`cZpgKZA(z5vVUL&XlZ1{8S=SRyf!ZM;|?*ZY$S_i(a}6qF`wpCt zp>8xL$UF}HbZZd819x%(v>11`9rjxdrSVOQ*EviMRQ_pui0G*RAxaS@0(PjAD00$&-_ zO$%!!MhON(g5!a1JlDsgv?+UCM7@ZpM65THU+qcM+F`wQTJ8P|*!Zm6AWnFbqtS7q z#DPi`^z%~L36~#e@@1Wk>YFpoja#0hjDqQOw z`Q)^LKPzck5u>2PTUxGp@nS(xe4wSBb-7~IxPLI9_)lW38YIgS%bJmDEBec7un$C! z9!@@+JCBN^i|6@U8MYKAJ6mRN#l=I1_)XiQQhMPE0lClHh)s|YnlHKXDD)b8q|i0z zd!t+%1{q0zPk*r4?v%uR*n6uch3aGC%#>U12p$T zQ$acZZvLUP2!LhvSbi#bsvGpMa_2iz0%!ka>0ZI+<}fEb!Z;{aR!G9yUCYfTL<^x<^!zCqEk zrC{OC3R&*&*04p_?W&~ghczfcBEM$Jg*Fp4m78YI29fU)(nCB~T7j16Dhe`HQm$vL zC9*pWs8W4{?_1TaQH6E{NwVlzjxO;z;4d-g+Vm;u-MSA{6`ht@tUE03PV#%9q?*0) z-T#DNp@z^60+9{)cByZT$KF=SbrxfK{gZIQ?{+ttuH~JHz?_0}{;j(QnNl#z}{zO0hZ4{!PA{V5-oHRcP_I;OOHC zLXV8aKjujO9j*Tl*5rSDG-J~2Qc9ouwG4aq9YQ*?q8A|HK7m%@txyAWt{8qwpRkwW zcW(>W-L2<^nf%;__&=D{2wnh+^aN~Ywod{^m~62@pU~@)+ipynDsx7vg6=cUVc`Llk2xA3+l;hIXbdap%e{5i(6cvQN;$68W^2pmmGR?DJtl=9-|_t(h7k zMV1?J7l_`Uzcmn?ZGZ68Sko!|6x1F^sOv@NC>p*cNU7+}MIvZ;Fm)ifFOipWxmH5u z@ko-2o&YaTv+27IJbqyNBYEujbM#k_vschR=>|_75ep zrx5mdMSxvrqp+-^e%tVk=8=v`@6OL~FI0hnN)N@**c9u^wb|#~2fU|wU8vuueT7xpUt-)cM2d?(B{qp;5PpevM99ZM)Awe6eiK!(7(BPYAN5K z!3@9u{eKVI|K}`#MM(YHM)Mcp2CrmM4+YZ3#y_T{-j2@gZ-a|kZyMWv{3W6^Hzi1> zx=xz+whHXfLkF(?UZxsmp{6Ap7nI}jM_ghybB271RZ`+_r@MSs<|h7ijZE;uA0%$9 zZIf_|-vR@zbpEt{zOHWh%(TU?;r{Urj%yFIbY3~KvwPTxk=qQ(On>W>b8FOlkbg!j zkU(F4Vav_r9#{!9Pf_c^X2$vNZ+*&y>9R>!0XM!0kS49}FXR6b3GSa31t zlH4K$#Tu3VmKgxgNZ%3nbuhp#KxxhkVs6Yiwx;#)mK4$SFp`4|Q}w8u^ZR>=N)t+l zm&lj`-royRzJq+va=t7)@$12BFZq6nD*juUomgAib#57ya{a zDk?w)3>glY>~M;uf$efkOIk*`^M?apn_CxwI+;MenuWS7^#}9(H)O|u^ojp~H0%|q z&+NTA`|A6lb-FM9c*epk_|T6^n#Nlm@nWKu-J!(&BR3N%US%GJaVlTy;(m6zGFqYF z$tu_WAC=0ES~V3&I?w%A;x5$F1yN5@s26{h;3k7(jKBRTc~NXBLetKAWR|1SwyjMx zl5V$P>+3^+0sz|a?Rm$r9#&J6bKm@3P&r+m_b3L}ccNq`154|}4Ym$QlGH*81EgV-A>xX9*ardsFqT*6tg)zLw_LFo|$PSD*b@h2*=M+?{_ zw2$nwF~(GULJo8mzkG><%SBDIUK)xln6~`KvsXImTm2hEs8?c3xf8PBvuZu=dJRe% z)9783Qw|{5>{4TCdajarO?*0MX&vY5_3}_;W+!apkB5wmJ?;=LjYpVxr)s$wFUjNR z8kGVRT|^WI8v}0T z=B(-kt-MH=qv13T$oa085MP;`;uz7IPs!7YZl7iKUd$tHb@iH?{zO7DFSr>#x-AKh zJgs&4x@0cM&gQqSvwi6HWfxv_W=~ha%XS@S0oNIZqHVj7e_lHYpxLb_uhH#d|KiE~URJEZM9FY~=SU&R|~bpQcl(X7>qC zXXd~2L;tX&|M+MVF$AUlB3cPw=VGgz7X8I62$EQSgo^HMpHIunUjD=b z-ZRkrXIGBdE|4_#mr8Y)>T?sEzcv#?FemU`@Jk>!^X6U^FZZ8tQ*WTE{cKM0!x6Ivf#Ezf3WuY`;N?T zO?~knd5#ervJ%bFa)G?TXv7NJ_d8-fD)cFXP|!XQtKvOCFZbFlW*mJ@(+MWSDGU<^ zvG&ivQ_Vt^m4^UNG~?R@P8-`zN_DCd&-xz|+w>G~0$mxf_Si1kJ6x|LAX z^Y>g>w5Kz-zt*JNfYG90=*W4oiYpGbtTX)@VdebF#gg;4~-N7gzMcu9yuUDX9!6+%=9&o zuQR4Sb3!^3Kj&r7?M$uz#f5K&xED^ms%hD`_Hl;2as{_3d2_c#e+%|k>L6Uf&S3jp z7R^1(Ezq5o5uA_%0Yo{(-Btx-u!Hp)#^Djb!v5vGlc?-hV8K-Z?T5eZv1*ogoSt-c zq_pJ$4fJ~!BE%C8{a+Wih!Y8YOp~n=T;NEjFbq2NXsny0UE|kT$|NSV@~klEjt$%k z-7D*Q;b1C)&?>XDm{PQC6;fWyVfN3)6-XX3^Ga19%R9(4N?Y*caWCp1_0C0iFR@@? zdb@x2^5i>G(WM5QRo#Hb5v08%05$-3&zvb0^oTBtoxwQ%OvXt)zS%&%Xuzod0-!h> z>%UQ4D!tzg)W(A5cpN6JO_(0zBsz$lq_av^YC|FGq2L|NpvD0QM8S}A0Hz)8D4AjZclH$yqX;u=Vm}`JLO{*TG|KWPiWsK#3yjCG9ZrVHZ~zt?>Q!4~wwDF^dE zh_?ZB@wW^vUm;tSq(3D39lA}@JA6I29$H8eo3(i2{JiZD9 e#lb1sJ}T|s>YkW77Z3i2qadRqop=B7v;PHFlR;_# diff --git a/docs/Diagrams/Images/Promotion/DeletePromotion.png b/docs/Diagrams/Images/Promotion/DeletePromotion.png index 133f6ed42a55291e46ca32389dc48a24bff80b98..850afc697d0cc4dd908d22d203b923bdf0f33c9e 100644 GIT binary patch literal 19352 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 S+y`et#GlAK&VBUk_5T8(R~T6U literal 19011 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 ZQ=|m*{NcCFAl$(p2{D=bS@*QP{tr*O+vxxR diff --git a/docs/Diagrams/Images/Promotion/Promotion_SequenceDigram.png b/docs/Diagrams/Images/Promotion/Promotion_SequenceDigram.png index 75333ef3801f32376b77f3ec0b8b3c101c32197c..c2b6b6090c832deb2b8f65c6798c97c955c9c969 100644 GIT binary patch literal 17893 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 literal 17492 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 diff --git a/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml index 7869df00ef..e03bf52445 100644 --- a/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml actor User participant "Parser" as Parser diff --git a/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml b/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml index 6d4376108f..d625b4a32a 100644 --- a/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/EditCommand_ClassDiagram.puml @@ -1,4 +1,6 @@ @startuml +!include ../Style.puml + class EditCommand { - itemName : String - newItemName : String diff --git a/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml index d873c85eec..3c32aa8b3b 100644 --- a/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/EditCommand_SequenceDiagram.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml actor User participant "editCommand :EditCommand" as EditCommand participant "ui :TextUi" as UI diff --git a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml index 6462af2dce..d0a95f1e81 100644 --- a/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/ListItems_SequenceDiagram.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml actor User participant "ListCommand :ListCommand" as LC participant "UI :TextUi" as UI diff --git a/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML b/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML index 2adee39dca..45c68b2944 100644 --- a/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML +++ b/docs/Diagrams/PUML files/Parser/Parser_ClassDiagram.PUML @@ -1,5 +1,5 @@ @startuml - +!include ../Style.puml package "parser" { class Parser { -logger: Logger diff --git a/docs/Diagrams/PUML files/Promotion/AddPromotion.puml b/docs/Diagrams/PUML files/Promotion/AddPromotion.puml index 4ff60d84ab..04d88a446a 100644 --- a/docs/Diagrams/PUML files/Promotion/AddPromotion.puml +++ b/docs/Diagrams/PUML files/Promotion/AddPromotion.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml 'https://plantuml.com/sequence-diagram mainframe sd AddPromotion diff --git a/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml b/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml index 33f8567b60..ab2d49744a 100644 --- a/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml 'https://plantuml.com/sequence-diagram skinparam classFontColor automatic diff --git a/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml b/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml index b6338b32da..73471ea824 100644 --- a/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml +++ b/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml 'https://plantuml.com/sequence-diagram mainframe sd DeletePromotion diff --git a/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml b/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml index d559337bd8..b01291e23a 100644 --- a/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml +++ b/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml @@ -1,4 +1,5 @@ @startuml +!include ../Style.puml 'https://plantuml.com/sequence-diagram participant ":PromotionCommand" as PromotionCommand diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e3e2a5ef3c..75bc3b1524 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -126,7 +126,7 @@ End of Edits ### Finding an item: `find` Finds all items that contains `KEYWORD` -Format: `find [/filter1/filter2] KEYWORD` +Format: `find [/FILTER1/FILTER2] KEYWORD` * Filter are optional and will specify the parameters that is being searched. * Filters can be `item`, `qty`, `cat`, `uom`, `buy`, `sell`. Any other values will show an empty list. @@ -136,8 +136,8 @@ Format: `find [/filter1/filter2] KEYWORD` Example of usage: ``` -find /qty/cat Apple //search for `Apple` under `ITEM_QUANTITY` and `CATEGORY` -find Apple //search all items that contains `Apple` +find /qty/cat Apple // search for `Apple` under `ITEM_QUANTITY` and `CATEGORY` +find Apple // search all items that contains `Apple` ``` @@ -261,22 +261,22 @@ the application. ## Command Summary -| Action | Format, Examples | -|--------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| Add item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/[BUY_PRICE] sell/[SELL_PRICE]`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | -| Delete item | `del ITEM_NAME`
`e.g. del Apple` | -| Edit item | `edit [ITEM_NAME] [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | -| Find item | `find KEYWORD`
`e.g. find University` | -| Sell item | `sell [ITEM_NAME] qty/[SELL_QUANTITY] `
`e.g. sell apple qty/50` | -| Mark item | `mark ITEM_NAME` | -| Unmark item | `unmark ITEM_NAME` | -| List Inventory | `list_items [marked] [cat/CATEGORY]` | -| Get Best Seller | `bestseller` | -| Get Profit | `total_profit` | -| Get Revenue | `total_revenue` | -| Create Promotion | `promotion [ITEM_NAME] discount/[DISCOUNT] period /from [DATE] [MONTH] [YEAR] /to [DATE] [MONTH] [YEAR]time /from [TIME] /to [TIME]`
`e.g. promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500` | -| Delete Promotion | `del_promo ITEM_NAME`
`e.g. del_promo apple` | -| List Promotion | `list_promotions` | -| Low Stock Reminder | `low_stock /AMOUNT` | -| Help | `help [c/COMMAND]` | -| Exit | `exit` | +| Action | Format, Examples | +|--------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Add item | `add ITEM_NAME qty/ITEM_QUANTITY /UNIT_OF_MEASUREMENT [cat/CATEGORY] buy/BUY_PRICE sell/SELL_PRICE`
`e.g. add apple qty/50 /pieces cat/fruits buy/4.50 sell/5` | +| Delete item | `del ITEM_NAME`
`e.g. del Apple` | +| Edit item | `edit ITEM_NAME [name/NEW_NAME] [qty/NEW_QUANTITY] [uom/NEW_UOM] [cat/NEW_CATEGORY] [buy/NEW_BUY_PRICE] [sell/NEW_SELL_PRICE]`
`e.g. edit apple name/green apple qty/10 uom/pieces cat/fruit buy/1.00 sell/2.00` | +| Find item | `find [/FILTER] KEYWORD`
`e.g. find University` | +| Sell item | `sell ITEM_NAME qty/SELL_QUANTITY `
`e.g. sell apple qty/50` | +| Mark item | `mark ITEM_NAME` | +| Unmark item | `unmark ITEM_NAME` | +| List Inventory | `list_items [marked] [cat/CATEGORY]` | +| Get Best Seller | `bestseller` | +| Get Profit | `total_profit` | +| Get Revenue | `total_revenue` | +| Create Promotion | `promotion ITEM_NAME discount/DISCOUNT period /from DATE MONTH YEAR /to DATE MONTH YEAR time /from TIME /to TIME`
`e.g. promotion apple discount/50 period /from 2 Apr 2024 /to 4 Apr 2024 time /from 1200 /to 1500` | +| Delete Promotion | `del_promo ITEM_NAME`
`e.g. del_promo apple` | +| List Promotion | `list_promotions` | +| Low Stock Reminder | `low_stock /AMOUNT` | +| Help | `help [c/COMMAND]` | +| Exit | `exit` | diff --git a/src/main/java/common/HelpMessages.java b/src/main/java/common/HelpMessages.java index b4d031ea89..e89921110e 100644 --- a/src/main/java/common/HelpMessages.java +++ b/src/main/java/common/HelpMessages.java @@ -26,7 +26,7 @@ public class HelpMessages { "| delete | del ITEM_NAME |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| find | 1. find KEYWORD - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + + "| | 2. find /FILTER1/FILTER2 KEYWORD - to search under the filters* |\n" + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| bestseller | bestseller |\n" + @@ -142,7 +142,7 @@ public class HelpMessages { "| Commands | Format |\n" + "|------------|------------------------------------------------------------------------------|\n" + "| find | 1. find KEYWORD - to search the entire Item List |\n" + - "| | 2. find /filter1/filter2 KEYWORD - to search under the filters* |\n" + + "| | 2. find /FILTER1/FILTER2 KEYWORD - to search under the filters* |\n" + "| | * (filters: item, qty, uom, cat, buy, sell) |\n" + "| |------------------------------------------------------------------------------|\n" + "| example: | find apple |\n" + diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 66f478969d..0207c323ee 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -54,10 +54,10 @@ public class Messages { "'unmark ITEM_NAME'"; public static final String INVALID_LIST_FORMAT = "Invalid Command Format. Please use format:\n" + - "1. 'list' to list all items in the inventory, \n" + - "2. 'list cat/CATEGORY' to list all items in that category, or \n" + - "3. 'list marked' to list all marked items, or \n" + - "4. 'list marked cat/CATEGORY' to list all marked items in that category.\n" + + "1. 'list_items' to list all items in the inventory, \n" + + "2. 'list_items cat/CATEGORY' to list all items in that category, or \n" + + "3. 'list_items marked' to list all marked items, or \n" + + "4. 'list_items marked cat/CATEGORY' to list all marked items in that category.\n" + "Please note that marked must be in front of cat/CATEGORY."; public static final String INVALID_DEL_PROMO_FORMAT = "Invalid Command Format. Please use format: " + diff --git a/src/main/java/exceptions/EditException.java b/src/main/java/exceptions/EditException.java index a12263b1c4..6db7bf2be6 100644 --- a/src/main/java/exceptions/EditException.java +++ b/src/main/java/exceptions/EditException.java @@ -5,6 +5,9 @@ public class EditException extends Exception { public EditException(String error) { switch (error) { + case "ITEM_ALREADY_EXISTS": + TextUi.replyToUser("New item name cannot be the same as an existing item!"); + break; case "ITEM_NAME": TextUi.replyToUser("New item name cannot be blank!"); break; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index daf8a8a9b3..b87b157d1b 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -22,6 +22,7 @@ import exceptions.CommandFormatException; import exceptions.EditException; import exceptions.InvalidDateException; +import item.Item; import itemlist.Cashier; import itemlist.Itemlist; import promotion.Month; @@ -364,8 +365,15 @@ private Command prepareEdit(String args) throws CommandFormatException, EditExce // check if itemName was edited. If no, newItemName will be NA String newItemName = matcher.group("newItemName") != null ? matcher.group("newItemName").toLowerCase().trim() : "NA"; + if (newItemName.isBlank() || newItemName.isEmpty()) { throw new EditException("ITEM_NAME"); + } else { + for (Item item : Itemlist.getItems()) { + if (item.getItemName().equals(newItemName) || item.getItemName().toLowerCase().equals(newItemName)) { + throw new EditException("ITEM_ALREADY_EXISTS"); + } + } } // check if quantity was edited. If no, newQuantity will be -1 int newQuantity; From 88036a8b7972d5c0fca4b7d195edb4927699e8c2 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 19:37:41 +0800 Subject: [PATCH 384/421] Fix feature flaw --- docs/team/hengshuhong.md | 7 +++-- src/main/java/command/EditCommand.java | 2 ++ src/main/java/command/SellCommand.java | 2 +- src/main/java/common/Messages.java | 3 +- src/main/java/parser/Parser.java | 43 ++++++++++++++++---------- src/main/java/parser/ParserFormat.java | 2 ++ 6 files changed, 37 insertions(+), 22 deletions(-) diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 1d06a55cfc..5f8ad5df2c 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -11,13 +11,14 @@ manage and operate their business. - New Feature: Added the capability to add/delete/list promotions - What it does: allows the user to add a Promotion for a certain ITEM by entering the discount, startDate, - endDate, startTime and endTime. When a Promotion is added for an ITEM, when the store owner uses the sell + endDate, startTime and endTime. When a Promotion is added for an ITEM, and the store owner uses the sell feature in the application, the discount will be immediately applied to the sell price and the discounted price will - be shown. + be shown if it is within the promotion period. - Justification: This feature improves the application as the user now have the option to create a discount campaign and make adjustments to the sell price automatically rather than having to manually use the edit feature. - Highlights: This enhancement was challenging as it involved the integration with the sell command. In particular, - one difficulty was to ensure that the original price of the ITEM would not be changed even during a promotion period. + one difficulty was to ensure that the original price of the ITEM would not be changed even during a promotion period. + Another difficulty is to check if the item is within the promotion period for the given date and time. - New Feature: Enhanced the find command to allow the user to search based on the specified item information. diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index 9621454c8a..ba62935a32 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -5,6 +5,7 @@ import itemlist.Itemlist; import promotion.Promotion; import promotion.Promotionlist; +import storage.PromotionStorage; import storage.Storage; public class EditCommand extends Command{ @@ -85,6 +86,7 @@ public void execute() { Promotion promotion = Promotionlist.getPromotion(itemName); assert promotion != null; promotion.setItemName(newItemName); + PromotionStorage.overwritePromotionFile(Promotionlist.getAllPromotion()); } } if (newQuantity != -1) { // check if quantity was edited diff --git a/src/main/java/command/SellCommand.java b/src/main/java/command/SellCommand.java index a0403545e9..79807b0b55 100644 --- a/src/main/java/command/SellCommand.java +++ b/src/main/java/command/SellCommand.java @@ -53,7 +53,7 @@ public void execute() throws CommandFormatException { assert (Objects.nonNull(Itemlist.getItem(index))); int remainingQuantity = Itemlist.getItem(index).getQuantity() - sellQuantity; float getSellPrice = Itemlist.getItem(index).getSellPrice(); - float sellPrice = (this.discount > 0) ? this.discount * getSellPrice : getSellPrice; + float sellPrice = (this.discount > 0) ? (1-this.discount) * getSellPrice : getSellPrice; if (toSell.getIsOOS() || remainingQuantity < 0) { LOGGER.warning("Item has insufficient quantity."); System.out.println("There is insufficient stock!"); diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3522da50a2..c990ee8e93 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -62,7 +62,8 @@ public class Messages { public static final String INVALID_DEL_PROMO_FORMAT = "Invalid Command Format. Please use format: " + "del_promo [ITEM_NAME]"; - public static final String INVALID_PROMOLIST_FORMAT = "Invalid Command Format."; + public static final String INVALID_PROMOLIST_FORMAT = "Invalid Command Format. Please use format: " + + "list_promotions"; public static final String ITEM_IS_PROMO = "Item already has a promotion. Please remove the current promotion to " + "add a new one."; diff --git a/src/main/java/parser/Parser.java b/src/main/java/parser/Parser.java index daf8a8a9b3..b17fd81e38 100644 --- a/src/main/java/parser/Parser.java +++ b/src/main/java/parser/Parser.java @@ -42,14 +42,14 @@ public class Parser { * @throws CommandFormatException Command does not follow the required format. */ - private static final Logger logger = Logger.getLogger(Parser.class.getName()); + private static final Logger LOGGER = Logger.getLogger(Parser.class.getName()); public Command parseInput(String userInput){ final CommandType userCommand; final Matcher matcher = ParserFormat.BASIC_COMMAND_FORMAT.matcher(userInput.trim()); if (!matcher.matches()) { System.out.println(Messages.INVALID_COMMAND); System.out.println(HelpMessages.HELP); - logger.log(Level.FINE, "Invalid command received."); + LOGGER.log(Level.FINE, "Invalid command received."); return new IncorrectCommand(); } String commandWord = matcher.group("commandWord").toUpperCase(); @@ -66,86 +66,91 @@ public Command parseInput(String userInput){ try { return prepareHelp(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case LIST_ITEMS: try { return prepareItemList(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case LIST_PROMOTIONS: - return preparePromotionList(); + try { + return preparePromotionList(userInput); + } catch (CommandFormatException e) { + LOGGER.log(Level.WARNING, "Invalid input detected."); + break; + } case LIST_TRANSACTIONS: try { return prepareTransactionList(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case DEL_PROMO: try { return prepareDeletePromo(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case ADD: try { return prepareAdd(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case DEL: try { return prepareDelete(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case EDIT: try { return prepareEdit(userInput); } catch (CommandFormatException | EditException e) { - logger.log(Level.WARNING, "Invalid input detected.", e); + LOGGER.log(Level.WARNING, "Invalid input detected.", e); break; } case FIND: try { return prepareFind(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case SELL: try { return prepareSell(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case PROMOTION: try { return preparePromotion(userInput); } catch (CommandFormatException | InvalidDateException e) { - logger.log(Level.WARNING, "Invalid input detected.", e); + LOGGER.log(Level.WARNING, "Invalid input detected.", e); break; } case MARK: try { return prepareMark(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case UNMARK: try { return prepareUnmark(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } case TOTAL_PROFIT: @@ -158,7 +163,7 @@ public Command parseInput(String userInput){ try { return prepareLowStock(userInput); } catch (CommandFormatException e) { - logger.log(Level.WARNING, "Invalid input detected."); + LOGGER.log(Level.WARNING, "Invalid input detected."); break; } default: @@ -520,7 +525,11 @@ private Command prepareItemList(String args) throws CommandFormatException { return new ListCommand(Itemlist.getItems(), category, listMarked); } - private Command preparePromotionList() { + private Command preparePromotionList(String args) throws CommandFormatException { + final Matcher matcher = ParserFormat.LIST_PROMOTION_COMMAND_FORMAT.matcher(args.trim()); + if (!matcher.matches()) { + throw new CommandFormatException(CommandType.LIST_PROMOTIONS); + } return new ListCommand(Promotionlist.getAllPromotion()); } diff --git a/src/main/java/parser/ParserFormat.java b/src/main/java/parser/ParserFormat.java index 28d7e81baf..b0c0ca6777 100644 --- a/src/main/java/parser/ParserFormat.java +++ b/src/main/java/parser/ParserFormat.java @@ -10,6 +10,8 @@ public class ParserFormat { Pattern.compile("add (?[^/]+) qty/(?\\d+) /(?[^/]+)" + "(?: cat/(?[^/]+))? buy/(?\\d*\\.?\\d+) sell/(?\\d*\\.?\\d+)"); + public static final Pattern LIST_PROMOTION_COMMAND_FORMAT = + Pattern.compile("list_promotions\\s*$"); public static final Pattern DELETE_COMMAND_FORMAT = Pattern.compile("del (?[^/]+)"); From adebf26bf286cfb2c143f0a96a3af1fa0df7e038 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 19:47:15 +0800 Subject: [PATCH 385/421] PPP update and add editcommand test --- docs/team/joellimjr.md | 18 ++- src/test/java/command/EditCommandTest.java | 149 +++++++++++++++++++++ 2 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 src/test/java/command/EditCommandTest.java diff --git a/docs/team/joellimjr.md b/docs/team/joellimjr.md index fe3835683a..36b0605898 100644 --- a/docs/team/joellimjr.md +++ b/docs/team/joellimjr.md @@ -38,6 +38,12 @@ manage and operate their business. - Justification: It reminds the user upon starting up the app to restock out-of-stock items and warn the user about the items that are running low in stock. +- **New Feature:** Detailed help command + - What it does: An extension of the help command, it gives users more detailed information about + a specific command along with examples. + - Justification: Some of the commands have many input variables, some of which are optional. + This feature aims to help users understand the specific requirements of the commands + - **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Joellimjr&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) @@ -48,4 +54,14 @@ manage and operate their business. - Update the command summary - Developer Guide: - Added implementation details and class diagram of the `Parser` class. - - Added implementation details and sequence diagram of the `add` feature. \ No newline at end of file + - Added implementation details and sequence diagram of the `add` feature. + + +- **J-Unit Testing** + - Added J-Unit testing: + - ParserTest + - AddCommandTest + - HelpCommandTest + - SellCommandTest + - LowStockCommandTest + \ No newline at end of file diff --git a/src/test/java/command/EditCommandTest.java b/src/test/java/command/EditCommandTest.java new file mode 100644 index 0000000000..aaabe43961 --- /dev/null +++ b/src/test/java/command/EditCommandTest.java @@ -0,0 +1,149 @@ +package command; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import command.EditCommand; +import item.Item; +import itemlist.Itemlist; +import promotion.Promotionlist; +import storage.PromotionStorage; +import storage.Storage; +import storage.TransactionLogs; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +public class EditCommandTest { + + private final ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + + @BeforeEach + public void setUp() { + System.setOut(new PrintStream(outputStreamCaptor)); + } + + @AfterEach + void tearDown() { + // This will be run after each test, cleaning up + Itemlist.getItems().clear(); // clear the list for next test + Promotionlist.getAllPromotion().clear(); + Storage.updateFile("", false); + PromotionStorage.updateFile("", false); + TransactionLogs.updateFile("", false); + } + + @Test + public void testExecuteEditItemNotFound() { + new EditCommand("NonExistentItem", "NewTestItem", -1, "NA", "NA", -1, -1).execute(); + String expectedOutput = "item not found!" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditItemName() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NewTestItem", -1, "NA", "NA", -1, -1).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Name of TestItem from TestItem to NewTestItem" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditQuantity() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NA", 50, "NA", "NA", -1, -1).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Quantity of TestItem from 10 to 50" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditInvalidQuantity() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NA", -100, "NA", "NA", -1, -1).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Quantity of TestItem from 10 to -100" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditUnitOfMeasurement() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NA", -1, "kg", "NA", -1, -1).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Unit of Measurement of TestItem from pcs to kg" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditCategory() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NA", -1, "NA", "NewTestCategory", -1, -1).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Category of TestItem from TestCategory to NewTestCategory" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditBuyPrice() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NA", -1, "NA", "NA", 6.0f, -1).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Buy Price of TestItem from 5.0 to 6.00" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditSellPrice() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NA", -1, "NA", "NA", -1, 12.0f).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Sell Price of TestItem from 10.0 to 12.00" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + + @Test + public void testExecuteEditMultipleAttributes() { + new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); + new EditCommand("TestItem", "NewTestItem", 50, "kg", "NewTestCategory", 6.0f, 12.0f).execute(); + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + + "\n" + + "Edited: " + System.lineSeparator() + + "Name of TestItem from TestItem to NewTestItem" + System.lineSeparator() + + "Quantity of TestItem from 10 to 50" + System.lineSeparator() + + "Unit of Measurement of TestItem from pcs to kg" + System.lineSeparator() + + "Category of TestItem from TestCategory to NewTestCategory" + System.lineSeparator() + + "Buy Price of TestItem from 5.0 to 6.00" + System.lineSeparator() + + "Sell Price of TestItem from 10.0 to 12.00" + System.lineSeparator() + + "End of Edits" + System.lineSeparator() + System.lineSeparator(); + assertEquals(expectedOutput, outputStreamCaptor.toString()); + } + +} From a279e5b2ac6dc97d26ae193e3c2d9d1ba7d21d16 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 15 Apr 2024 19:51:58 +0800 Subject: [PATCH 386/421] Update diagram --- docs/Diagrams/Images/Storage/Storage.png | Bin 16796 -> 0 bytes .../Images/Storage/Storage_ClassDiagram.png | Bin 32635 -> 37967 bytes .../Images/Storage/Storage_class_diagram.png | Bin 86195 -> 0 bytes .../Storage/Storage_sequenceDiagram.png | Bin 21376 -> 27172 bytes .../Storage/Storage_ClassDiagram.puml | 2 +- .../Storage/Storage_sequenceDiagram.puml | 2 +- 6 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 docs/Diagrams/Images/Storage/Storage.png delete mode 100644 docs/Diagrams/Images/Storage/Storage_class_diagram.png diff --git a/docs/Diagrams/Images/Storage/Storage.png b/docs/Diagrams/Images/Storage/Storage.png deleted file mode 100644 index a633a2adfdcedf5fefc1a1bbbbbcb7d355048bb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16796 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 diff --git a/docs/Diagrams/Images/Storage/Storage_ClassDiagram.png b/docs/Diagrams/Images/Storage/Storage_ClassDiagram.png index 882e1dd604e370bcdc5f938d30a6619d329cc684..3c1a885d788a3e3fa6c3d1d6a6a1bc9dea61da22 100644 GIT binary patch literal 37967 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 literal 32635 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 bkUNdS9qzIP=cNLCNFyz&a60wWr5pbTt@8Bc diff --git a/docs/Diagrams/Images/Storage/Storage_class_diagram.png b/docs/Diagrams/Images/Storage/Storage_class_diagram.png deleted file mode 100644 index 23ab02f3db116a1098faa5aafc9d8a7732eaa430..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86195 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 diff --git a/docs/Diagrams/Images/Storage/Storage_sequenceDiagram.png b/docs/Diagrams/Images/Storage/Storage_sequenceDiagram.png index 0d331b2b72b7a87e41d1d99b571425df3d3ceb5f..93d2c6bf21a42bfffcf9051ab4e891ae857e3a74 100644 GIT binary patch literal 27172 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 G@BaddTj2%( diff --git a/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png b/docs/Diagrams/Images/Cashier/TotalProfitCommand_SequenceDiagram.png index ddb80ea787761609ff7471ac5bdd97202d772ad9..4c8910f65d9ef5ed6636b568cd7caede21827e17 100644 GIT binary patch literal 22216 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 Su*p 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 Cashier: addItem(transaction) activate Cashier Cashier -> Cashier: transactions.add(transaction) return -Command --> TextUi: showSellMessage() +Command -> TextUi: showSellMessage() activate TextUi return alt if itemName is not given diff --git a/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml index 79f89dc5b7..1e53df17ea 100644 --- a/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Cashier/TotalProfitCommand_SequenceDiagram.puml @@ -5,6 +5,8 @@ participant ":TotalProfitCommand" as TotalProfitCommand participant ":Cashier" as Cashier participant ":TextUi" as TextUi + +mainframe sd alt get total revenue TotalProfitCommand -> Cashier: getTotalRevenue() activate Cashier @@ -21,5 +23,4 @@ else get total profit TotalProfitCommand -> TextUi: replyToUser("You have earned {totalProfit} in profits so far.") end - @enduml \ No newline at end of file diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index d923c3cf13..18effc13e6 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -24,13 +24,25 @@ public class ListCommand extends Command{ protected boolean isListMarked = false; /** - * Instantiates a ListCommand with the ArrayList arrayList - * and any other modifiers available to that type of ArrayList. - */ + * Instantiates a ListCommand with the ArrayList arrayList + * and any other modifiers available to that type of ArrayList. + */ public ListCommand(ArrayList arrayList, String category, boolean isListMarked) { this.itemList= arrayList; this.category = category; this.isListMarked = isListMarked; + LOGGER.info("List items command generated."); + try { + if (arrayList == null || arrayList.isEmpty()) { + if (category.equals("NA") && !isListMarked) { + throw new EmptyListException("Item"); + } else { + throw new EmptyListException("Filter Item"); + } + } + } catch (EmptyListException e) { + LOGGER.warning("Empty item list."); + } } /** @@ -43,6 +55,17 @@ public ListCommand(ArrayList arrayList, String itemName) { } else { this.transactionList = Cashier.getTransactions(itemName); } + try { + if (transactionList == null || transactionList.isEmpty()) { + if (itemName.equals("NA")) { + throw new EmptyListException("Transaction"); + } else { + throw new EmptyListException("Filter Transaction"); + } + } + } catch (EmptyListException e) { + LOGGER.warning("Empty list detected."); + } } /** @@ -50,6 +73,13 @@ public ListCommand(ArrayList arrayList, String itemName) { * and any other modifiers available to that type of ArrayList. */ public ListCommand(ArrayList arrayList) { + try { + if (arrayList.isEmpty()) { + throw new EmptyListException("Promotion"); + } + } catch (EmptyListException e) { + LOGGER.warning("Empty list detected."); + } this.promotionList = arrayList; } @@ -60,10 +90,9 @@ public String getCategory() { /** * Runs the list command with 3 cases * Depending on which ArrayList is not empty, it prints that list. - * @throws EmptyListException if all Lists are empty. * */ //@@author Fureimi - public void execute() throws EmptyListException { + public void execute() { if (containsTransactions(transactionList)) { showTransactionList(); @@ -71,27 +100,16 @@ public void execute() throws EmptyListException { } else if (containsPromotions(promotionList)) { showPromotionList(); LOGGER.info("Promotions listed."); - } else if (category.equals("NA") && !isListMarked) { - TextUi.showList(itemList); - LOGGER.info("All items listed."); - } else if (containsItems(itemList)) { + } else if (containsItems(itemList) && (!category.equals("NA") || isListMarked)) { showCustomizedItemList(); - LOGGER.info("Items listed."); - } else { - LOGGER.warning("No results found."); - throw new EmptyListException("Empty List"); + LOGGER.info("Customised item listed."); + } else if (containsItems(itemList) && category.equals("NA") && !isListMarked) { + TextUi.showList(itemList); + LOGGER.info("All item listed."); } } private void showTransactionList() { - try { - if (transactionList.isEmpty()) { - throw new EmptyListException("Transaction"); - } - } catch (EmptyListException e) { - LOGGER.warning("Empty list detected."); - return; - } TextUi.showTransactionList(transactionList); } diff --git a/src/main/java/command/TotalProfitCommand.java b/src/main/java/command/TotalProfitCommand.java index 4991028cda..9c5cd163c6 100644 --- a/src/main/java/command/TotalProfitCommand.java +++ b/src/main/java/command/TotalProfitCommand.java @@ -13,6 +13,9 @@ public TotalProfitCommand(CommandType command) { public void execute() { float totalProfit = command.equals(CommandType.TOTAL_PROFIT) ? Cashier.getTotalProfit() : Cashier.getTotalRevenue(); + if (totalProfit == 0) { + return; + } TextUi.replyToUser("You have earned " + totalProfit + " in "+ (command.equals(CommandType.TOTAL_PROFIT) ? "profits" : "revenue") + " so far."); } diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index b152c07de3..e4f64061b1 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -26,8 +26,10 @@ public class Messages { public static final String UNABLE_TO_DELETE = "There is a promotion that exists for this item. Please remove the " + "promotion before deleting the item."; - public static final String EMPTY_ITEM_LIST = "There are no items with your search query."; - public static final String EMPTY_TRANSACTION_LIST = "There are no transactions with your search query."; + public static final String EMPTY_ITEM_LIST = "There are no items at the moment."; + public static final String EMPTY_TRANSACTION_LIST = "There are no transactions at the moment."; + public static final String EMPTY_FILTERED_ITEM_LIST = "There are no items with your search query."; + public static final String EMPTY_FILTERED_TRANSACTION_LIST = "There are no transactions with your search query."; public static final String EMPTY_LIST = "There is nothing here! Time to spend some money and stock em up!"; public static final String WELCOME_MESSAGE = "Welcome to StockMaster, where you can master the knowledge on your " + "Stock!"; @@ -99,4 +101,5 @@ public class Messages { public static final String NO_BESTSELLER = "There are no transactions. Please add a transaction " + "before retrying the command."; + public static final String EMPTY_PROMOTION_LIST = "There are no promotions at the moment."; } diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index 4f359d3d17..06b9a0c2fe 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -6,12 +6,21 @@ public class EmptyListException extends Exception { public EmptyListException(String error) { switch (error) { + case "Filter Item": + System.out.println(Messages.EMPTY_FILTERED_ITEM_LIST); + break; case "Item": System.out.println(Messages.EMPTY_ITEM_LIST); break; + case "Filter Transaction": + System.out.println(Messages.EMPTY_FILTERED_TRANSACTION_LIST); + break; case "Transaction": System.out.println(Messages.EMPTY_TRANSACTION_LIST); break; + case "Promotion": + System.out.println(Messages.EMPTY_PROMOTION_LIST); + break; case "Empty List": System.out.println("No results found."); break; diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 0a367f5c2f..7e1c572dea 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -31,12 +31,8 @@ public static ArrayList getTransactions(String itemName) { results.add(t); } } - LOGGER.info("Transactions filtered."); - return results; - } else { - LOGGER.warning("No transactions found."); - return null; } + return results; } public static float getTotalRevenue() { diff --git a/src/main/java/seedu/duke/StockMaster.java b/src/main/java/seedu/duke/StockMaster.java index cacdf490af..dadd2a115e 100644 --- a/src/main/java/seedu/duke/StockMaster.java +++ b/src/main/java/seedu/duke/StockMaster.java @@ -84,7 +84,7 @@ private static void initLogger() { } } - private void normalOperation() throws IOException, CommandFormatException, + private void normalOperation() throws CommandFormatException, InvalidDateException, EmptyListException { String userInput; do { diff --git a/src/main/java/ui/TextUi.java b/src/main/java/ui/TextUi.java index f67a00a9fc..242cbcb781 100644 --- a/src/main/java/ui/TextUi.java +++ b/src/main/java/ui/TextUi.java @@ -95,19 +95,20 @@ public static void replyToUser(String... message) { * @param arrayList The arraylist to show to the user. */ public static void showList(ArrayList arrayList) { - if (arrayList.isEmpty()) { + if (arrayList == null || arrayList.isEmpty()) { replyToUser(Messages.EMPTY_LIST); return; - } - replyToUser("List: "); - int index = 1; - for (T item : arrayList) { - if (item == null) { - break; + } else { + replyToUser("List: "); + int index = 1; + for (T item : arrayList) { + if (item == null) { + break; + } + String listItem = index + ". " + item; + replyToUser(listItem); + index++; } - String listItem = index + ". " + item; - replyToUser(listItem); - index++; } } @@ -136,10 +137,8 @@ public static void showSellMessage(String item, int sellQuantity, int remainingQ * @param isListMarked Whether the items listed are marked items. */ public static void showCustomizedList(ArrayList arrayList, String category, boolean isListMarked) { - if (arrayList.isEmpty()) { - replyToUser(Messages.EMPTY_LIST); - // case 1: user wants to list all items of a certain category - } else if (!category.equals("NA") && !isListMarked) { + // case 1: user wants to list all items of a certain category + if (!category.equals("NA") && !isListMarked) { int flag = 0; int counter = 1; for (Item item : arrayList) { diff --git a/src/test/java/command/BestsellerCommandTest.java b/src/test/java/command/BestsellerCommandTest.java index c69b6fa2e1..776ed3ac3b 100644 --- a/src/test/java/command/BestsellerCommandTest.java +++ b/src/test/java/command/BestsellerCommandTest.java @@ -36,7 +36,7 @@ public void testExecuteWithEmptyBestseller() throws EmptyListException { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); bestsellerCommand.execute(); - String expected = Messages.EMPTY_TRANSACTION_LIST + System.lineSeparator(); + String expected = Messages.NO_BESTSELLER + System.lineSeparator(); assertEquals(expected, outputStream.toString()); } catch (EmptyListException e) { throw new RuntimeException(e); diff --git a/src/test/java/command/ListCommandTest.java b/src/test/java/command/ListCommandTest.java index ec00d753f8..b9ca186e8e 100644 --- a/src/test/java/command/ListCommandTest.java +++ b/src/test/java/command/ListCommandTest.java @@ -25,7 +25,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -public class ListCommandTest { +public class ListCommandTest extends Cashier { //clears all the lists @BeforeEach @@ -37,7 +37,7 @@ public void reset() { Itemlist.deleteItem(0); } while (Cashier.getTransaction(0) != null) { - Cashier.transactions = new ArrayList<>(); + transactions = new ArrayList<>(); } Storage.updateFile("", false); PromotionStorage.updateFile("", false); @@ -47,165 +47,104 @@ public void reset() { //happy case: has item @Test public void listCommandTest_itemList_correct() { - Item test = new Item("testItem", 1, "ea", "NA", - 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); Itemlist.addItem(test); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", false); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "List: " + System.lineSeparator() + "1. " + test + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "List: " + System.lineSeparator() + "1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); } - //happy case: has item, filtered corrrectly + //happy case: has item, filtered correctly @Test public void listCommandTest_itemList_correct2() { - Item test = new Item("testItem", 1, "ea", "test", - 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "test", 1.00F, 2.00F); Itemlist.addItem(test); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", false); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "1. Item Index: 1. " + test + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. Item Index: 1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); } //happy case: has item, filtered wrongly @Test public void listCommandTest_itemList_correct3() { - Item test = new Item("testItem", 1, "ea", "noCat", - 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "noCat", 1.00F, 2.00F); Itemlist.addItem(test); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", false); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "No items were found within the category test." + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "No items were found within the category test." + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); } //happy case: has item, search for marked and is marked @Test public void listCommandTest_itemList_correct4() { - Item test = new Item("testItem", 1, "ea", "NA", - 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); Itemlist.addItem(test); Objects.requireNonNull(Itemlist.getItem(0)).mark(); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", true); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "1. Item Index: 1. " + test + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. Item Index: 1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); } //Error: Filter for marked, but no items are marked @Test public void listCommandTest_itemList_correct5() { - Item test = new Item("testItem", 1, "ea", "NA", - 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "NA", 1.00F, 2.00F); Itemlist.addItem(test); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "NA", true); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "There are no marked items in your inventory list!" + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "There are no marked items in your inventory list!" + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); } //Error: Filter for marked + cat, have result @Test public void listCommandTest_itemList_correct6() { - Item test = new Item("testItem", 1, "ea", "test", - 1.00F, 2.00F); + Item test = new Item("testItem", 1, "ea", "test", 1.00F, 2.00F); Itemlist.addItem(test); Objects.requireNonNull(Itemlist.getItem(0)).mark(); ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", true); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "1. Item Index: 1. " + test + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } - - } - - //Error: Filter for marked + cat, have no result - @Test - public void listCommandTest_itemList_correct7() { - Item test = new Item("testItem", 1, "ea", "test", - 1.00F, 2.00F); - Itemlist.addItem(test); - ListCommand listCommand1 = new ListCommand(Itemlist.getItems(), "test", true); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = "There are no marked items of category '" + "test"+ - "' in your inventory list!" + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = "1. Item Index: 1. " + test + System.lineSeparator(); + assertEquals(expected, outputStream.toString()); } //Happy case: has 1 transaction @Test public void listCommandTest_transactionList_correct() { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", - "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); - ListCommand listCommand1 = new ListCommand(Cashier.transactions, "NA"); + ListCommand listCommand1 = new ListCommand(transactions, "NA"); try { sellCommand.execute(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); listCommand1.execute(); - String expected = "1. " + Cashier.transactions.get(0) + System.lineSeparator(); + String expected = "1. " + transactions.get(0) + System.lineSeparator(); assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); } catch (CommandFormatException e) { Assertions.fail("Unexpected CommandFormatException thrown"); throw new RuntimeException(e); @@ -216,21 +155,17 @@ public void listCommandTest_transactionList_correct() { //happy case: filtered item successfully @Test public void listCommandTest_transactionList_correct2() { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", - "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); try { sellCommand.execute(); - ListCommand listCommand1 = new ListCommand(Cashier.transactions, "testItem"); + ListCommand listCommand1 = new ListCommand(transactions, "testItem"); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); listCommand1.execute(); - String expected = "1. " + Cashier.transactions.get(0) + System.lineSeparator(); + String expected = "1. " + transactions.get(0) + System.lineSeparator(); assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); } catch (CommandFormatException e) { Assertions.fail("Unexpected CommandFormatException thrown"); throw new RuntimeException(e); @@ -240,21 +175,17 @@ public void listCommandTest_transactionList_correct2() { @Test public void listCommandTest_transactionList_correct3() { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", - "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); addCommand.execute(); SellCommand sellCommand = new SellCommand("testItem", 1, 0); - ListCommand listCommand1 = new ListCommand(Cashier.transactions, "failTest"); + ListCommand listCommand1 = new ListCommand(transactions, "failTest"); try { sellCommand.execute(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); listCommand1.execute(); - String expected = Messages.EMPTY_LIST + System.lineSeparator(); + String expected = ""; assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - Assertions.fail("Unexpected EmptyListException thrown."); - throw new RuntimeException(e); } catch (CommandFormatException e) { Assertions.fail("Unexpected CommandFormatException thrown"); throw new RuntimeException(e); @@ -264,12 +195,10 @@ public void listCommandTest_transactionList_correct3() { @Test public void listCommandTest_promotionList_correct() throws InvalidDateException, CommandFormatException { - AddCommand addCommand = new AddCommand("testItem", 1, "ea", - "NA", 1.00F, 2.00F); + AddCommand addCommand = new AddCommand("testItem", 1, "ea", "NA", 1.00F, 2.00F); addCommand.execute(); - Command testPromo = new AddPromotionCommand("testItem", 0.30F, 2, - Month.valueOf("APR"), 2024, 4, Month.valueOf("APR"), - 2024, 0000, 1100); + Command testPromo = new AddPromotionCommand("testItem", 0.30F, 2, Month.valueOf("APR"), + 2024, 4, Month.valueOf("APR"), 2024, 0000, 1100); try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); @@ -291,45 +220,33 @@ public void listCommandTest_promotionList_correct() throws InvalidDateException, @Test public void listCommandTest_itemList_empty() { ListCommand listCommand1 = new ListCommand(new ArrayList(), "NA", false); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = Messages.EMPTY_LIST + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = ""; + assertEquals(expected, outputStream.toString()); } @Test public void listCommandTest_transactionList_empty() { ListCommand listCommand1 = new ListCommand(new ArrayList(), "NA"); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = Messages.EMPTY_LIST + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = ""; + assertEquals(expected, outputStream.toString()); } @Test public void listCommandTest_promotionList_empty() { ListCommand listCommand1 = new ListCommand(new ArrayList()); - try { - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - System.setOut(new PrintStream(outputStream)); - listCommand1.execute(); - String expected = Messages.EMPTY_LIST + System.lineSeparator(); - assertEquals(expected, outputStream.toString()); - } catch (EmptyListException e) { - throw new RuntimeException(e); - } + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + listCommand1.execute(); + String expected = ""; + assertEquals(expected, outputStream.toString()); } } diff --git a/src/test/java/command/TotalProfitCommandTest.java b/src/test/java/command/TotalProfitCommandTest.java index 04585cbacf..78a17d37bf 100644 --- a/src/test/java/command/TotalProfitCommandTest.java +++ b/src/test/java/command/TotalProfitCommandTest.java @@ -1,5 +1,6 @@ package command; +import common.Messages; import exceptions.CommandFormatException; import itemlist.Cashier; import itemlist.Itemlist; @@ -30,8 +31,7 @@ public void testProfitWithNoItems() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); totalProfitCommand.execute(); - String expected = "There are no transactions with your search query." + System.lineSeparator() + - "You have earned 0.0 in profits so far." + System.lineSeparator(); + String expected = Messages.NO_BESTSELLER + System.lineSeparator(); assertEquals(expected, outputStream.toString()); } @@ -58,8 +58,7 @@ public void testRevenueWithNoItems() { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); totalProfitCommand.execute(); - String expected = "There are no transactions with your search query." + System.lineSeparator() + - "You have earned 0.0 in revenue so far." + System.lineSeparator(); + String expected = Messages.NO_BESTSELLER + System.lineSeparator(); assertEquals(expected, outputStream.toString()); } diff --git a/src/test/java/parser/ParserTest.java b/src/test/java/parser/ParserTest.java index a841d826d3..a44e8dc921 100644 --- a/src/test/java/parser/ParserTest.java +++ b/src/test/java/parser/ParserTest.java @@ -504,7 +504,7 @@ public void testParseListItemsCommand() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "list_items"; parser.parseInput(userInput); - String expectedMessage = ""; + String expectedMessage = Messages.EMPTY_ITEM_LIST + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -514,7 +514,7 @@ public void testParseListPromotionsCommand() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "list_promotions"; parser.parseInput(userInput); - String expectedMessage = ""; + String expectedMessage = Messages.EMPTY_PROMOTION_LIST + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } @@ -524,7 +524,7 @@ public void testParseListTransactionsCommand() { System.setOut(new PrintStream(outputStreamCaptor)); String userInput = "list_transactions"; parser.parseInput(userInput); - String expectedMessage = ""; + String expectedMessage = Messages.EMPTY_TRANSACTION_LIST + System.lineSeparator(); assertEquals(expectedMessage, outputStreamCaptor.toString()); } From 37f8f94c82683f9e783968e0db45e7fbeb06557d Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 15 Apr 2024 22:29:37 +0800 Subject: [PATCH 404/421] change DG diagrams --- .../Itemlist/EditCommand_ClassDiagram.png | Bin 90993 -> 43009 bytes .../Itemlist/EditCommand_ClassDiagram.puml | 63 +++++++----------- 2 files changed, 23 insertions(+), 40 deletions(-) diff --git a/docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png b/docs/Diagrams/Images/Itemlist/EditCommand_ClassDiagram.png index c688a3582ede7d079c92689800dc159c1740bd85..3c6ccfedb0b2e9cd802f650b945640e1051edf49 100644 GIT binary patch literal 43009 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 H|Iz;iOcGh1 diff --git a/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml b/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml index bedd73d016..e61470ee65 100644 --- a/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/Storage/Storage_ClassDiagram.puml @@ -1,5 +1,5 @@ @startuml -hide circle +!include ../Style.puml class Storage { +readFromFile(fileName: String) diff --git a/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml b/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml index a804cb4202..d41e1ecff8 100644 --- a/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Storage/Storage_sequenceDiagram.puml @@ -1,5 +1,5 @@ @startuml -hide footbox +!include ../Style.puml participant Client participant Storage participant Itemlist From f49ab34b5b3be2bb3ca16c9e4386779f1f8e94da Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 20:14:06 +0800 Subject: [PATCH 387/421] PPP update --- docs/team/joellimjr.md | 1 + src/test/java/seedu/duke/StockMasterTest.java | 15 ++++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/docs/team/joellimjr.md b/docs/team/joellimjr.md index 36b0605898..f99f57263d 100644 --- a/docs/team/joellimjr.md +++ b/docs/team/joellimjr.md @@ -61,6 +61,7 @@ manage and operate their business. - Added J-Unit testing: - ParserTest - AddCommandTest + - EditCommandTest - HelpCommandTest - SellCommandTest - LowStockCommandTest diff --git a/src/test/java/seedu/duke/StockMasterTest.java b/src/test/java/seedu/duke/StockMasterTest.java index 9e4f7147e0..12244d5595 100644 --- a/src/test/java/seedu/duke/StockMasterTest.java +++ b/src/test/java/seedu/duke/StockMasterTest.java @@ -1,12 +1,17 @@ package seedu.duke; -import static org.junit.jupiter.api.Assertions.assertTrue; - +import exceptions.CommandFormatException; +import exceptions.EmptyListException; +import exceptions.InvalidDateException; import org.junit.jupiter.api.Test; -class StockMasterTest { + +import java.io.IOException; + +public class StockMasterTest { + @Test - public void sampleTest() { - assertTrue(true); + public void testRun_ExitImmediately() throws CommandFormatException, InvalidDateException, IOException, EmptyListException { + StockMaster stockMaster = new StockMaster(); } } From f039efd8347ac70bc15faedd36e0a970d7550209 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 20:14:22 +0800 Subject: [PATCH 388/421] PPP update --- docs/team/joellimjr.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/team/joellimjr.md b/docs/team/joellimjr.md index f99f57263d..afb669b2fb 100644 --- a/docs/team/joellimjr.md +++ b/docs/team/joellimjr.md @@ -38,6 +38,7 @@ manage and operate their business. - Justification: It reminds the user upon starting up the app to restock out-of-stock items and warn the user about the items that are running low in stock. + - **New Feature:** Detailed help command - What it does: An extension of the help command, it gives users more detailed information about a specific command along with examples. From 6014ac35025a73cfe10eabaf7978ab185a5a3970 Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 15 Apr 2024 20:16:08 +0800 Subject: [PATCH 389/421] no message --- StockMasterData.txt | 2 -- 1 file changed, 2 deletions(-) diff --git a/StockMasterData.txt b/StockMasterData.txt index 0b8ea9f22e..e69de29bb2 100644 --- a/StockMasterData.txt +++ b/StockMasterData.txt @@ -1,2 +0,0 @@ -1. | [ ] | testing item 11 | Qty: 2347634 t | Cat: t | BuyPrice: $12.00 | SellPrice: $23.00 -2. | [ ] | testingitem2 | Qty: 321 t | Cat: t | BuyPrice: $123.00 | SellPrice: $321.00 From 4fcfc49adfaf89cbb8fe350afffba55d56881d71 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 20:17:08 +0800 Subject: [PATCH 390/421] Checkstyle update --- src/test/java/command/EditCommandTest.java | 32 +++++++++---------- src/test/java/seedu/duke/StockMasterTest.java | 2 +- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/test/java/command/EditCommandTest.java b/src/test/java/command/EditCommandTest.java index aaabe43961..d88ff3bbfd 100644 --- a/src/test/java/command/EditCommandTest.java +++ b/src/test/java/command/EditCommandTest.java @@ -49,8 +49,8 @@ public void testExecuteEditItemNotFound() { public void testExecuteEditItemName() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NewTestItem", -1, "NA", "NA", -1, -1).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Name of TestItem from TestItem to NewTestItem" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -61,8 +61,8 @@ public void testExecuteEditItemName() { public void testExecuteEditQuantity() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NA", 50, "NA", "NA", -1, -1).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Quantity of TestItem from 10 to 50" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -73,8 +73,8 @@ public void testExecuteEditQuantity() { public void testExecuteEditInvalidQuantity() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NA", -100, "NA", "NA", -1, -1).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Quantity of TestItem from 10 to -100" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -85,8 +85,8 @@ public void testExecuteEditInvalidQuantity() { public void testExecuteEditUnitOfMeasurement() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NA", -1, "kg", "NA", -1, -1).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Unit of Measurement of TestItem from pcs to kg" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -97,8 +97,8 @@ public void testExecuteEditUnitOfMeasurement() { public void testExecuteEditCategory() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NA", -1, "NA", "NewTestCategory", -1, -1).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Category of TestItem from TestCategory to NewTestCategory" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -109,8 +109,8 @@ public void testExecuteEditCategory() { public void testExecuteEditBuyPrice() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NA", -1, "NA", "NA", 6.0f, -1).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Buy Price of TestItem from 5.0 to 6.00" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -121,8 +121,8 @@ public void testExecuteEditBuyPrice() { public void testExecuteEditSellPrice() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NA", -1, "NA", "NA", -1, 12.0f).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Sell Price of TestItem from 10.0 to 12.00" + System.lineSeparator() + "End of Edits" + System.lineSeparator() + System.lineSeparator(); @@ -133,8 +133,8 @@ public void testExecuteEditSellPrice() { public void testExecuteEditMultipleAttributes() { new AddCommand("TestItem", 10, "pcs", "TestCategory", 5.0f, 10.0f).execute(); new EditCommand("TestItem", "NewTestItem", 50, "kg", "NewTestCategory", 6.0f, 12.0f).execute(); - String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + System.lineSeparator() + - "\n" + + String expectedOutput = "added: testitem (Qty: 10 pcs, Buy: $5.00, Sell: $10.00) to TestCategory" + + System.lineSeparator() + "\n" + "Edited: " + System.lineSeparator() + "Name of TestItem from TestItem to NewTestItem" + System.lineSeparator() + "Quantity of TestItem from 10 to 50" + System.lineSeparator() + diff --git a/src/test/java/seedu/duke/StockMasterTest.java b/src/test/java/seedu/duke/StockMasterTest.java index 12244d5595..1195625794 100644 --- a/src/test/java/seedu/duke/StockMasterTest.java +++ b/src/test/java/seedu/duke/StockMasterTest.java @@ -11,7 +11,7 @@ public class StockMasterTest { @Test - public void testRun_ExitImmediately() throws CommandFormatException, InvalidDateException, IOException, EmptyListException { + public void testStockMaster() throws CommandFormatException, InvalidDateException, IOException, EmptyListException { StockMaster stockMaster = new StockMaster(); } } From 428d41e0eb9363c438fcf6f727b93a2e0e6597cb Mon Sep 17 00:00:00 2001 From: Fureimi Date: Mon, 15 Apr 2024 20:17:40 +0800 Subject: [PATCH 391/421] change for naming --- src/main/java/command/EditCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/command/EditCommand.java b/src/main/java/command/EditCommand.java index ba62935a32..1e0b1a5b1d 100644 --- a/src/main/java/command/EditCommand.java +++ b/src/main/java/command/EditCommand.java @@ -59,7 +59,7 @@ public float getNewSellPrice() { } /** - * Edits the relevant params of the item in the item list + * Edits the relevant params of the item in the item list and prints out to the user. */ @Override public void execute() { From 6be78c03758e2b6ee9f358d4a9aecad5f929ecdf Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 20:20:07 +0800 Subject: [PATCH 392/421] PPP file name update --- docs/team/{Fureimi.md => fureimi.md} | 0 docs/team/{Joellimjr.md => joellimjr.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename docs/team/{Fureimi.md => fureimi.md} (100%) rename docs/team/{Joellimjr.md => joellimjr.md} (100%) diff --git a/docs/team/Fureimi.md b/docs/team/fureimi.md similarity index 100% rename from docs/team/Fureimi.md rename to docs/team/fureimi.md diff --git a/docs/team/Joellimjr.md b/docs/team/joellimjr.md similarity index 100% rename from docs/team/Joellimjr.md rename to docs/team/joellimjr.md From d139b5513d2819834cffee3c88572e206f7e78ca Mon Sep 17 00:00:00 2001 From: Fureimi <111426591+Fureimi@users.noreply.github.com> Date: Mon, 15 Apr 2024 20:23:01 +0800 Subject: [PATCH 393/421] Update fureimi.md --- docs/team/fureimi.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/team/fureimi.md b/docs/team/fureimi.md index e7c21e9d4a..0906c949ac 100644 --- a/docs/team/fureimi.md +++ b/docs/team/fureimi.md @@ -16,11 +16,13 @@ manage and operate their business. to keep track of their inventory. It also provides a convenient way for users to check a item of a certain category as they may have many items in the whole item list, making it hard to search for specific items. In addition, users might only want to see their marked items. The mark feature is explained below. + - **New Feature**: Added the ability to mark and unmark specific items in the item list. - **What it does**: Allows users to mark specific item in the item list. The user can also unmark a marked item. - **Justification**: Users might want to mark items for many reasons, such as to keep track of their sales as they may be a high in demand item. These items might also be from different categories, so user cannot list them by category. This feature hence provides a convenient way for users to access items they want to keep an eye on. + - **New Feature**: Added the ability to edit current item parameters. - **What it does**: Allows users to edit specific parameters of existing items, such as quantity, category, name, etc. - **Justification**: This feature is crucial to our application as it allows users to rectify user errors when @@ -30,11 +32,13 @@ only want to see their marked items. The mark feature is explained below. - **Highlights**: The implementation was challenging as it required integration with `Itemlist` as well as `item` to ensure that the parameters are edited accurately. In addition, this enhancement allows users to edit multiple parameters at once, which increases convenience for the user. + - **Code Contributed** : [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Fureimi&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + - **Documentation**: - User Guide: - Added documentation for the features `list_items`, `mark`, `unmark` and `edit` - Update the command summary - Developer Guide: - Added class diagram of the `EditCommand` class. - - Added implementation details and sequence diagram of both the `list_items` and `edit` features. \ No newline at end of file + - Added implementation details and sequence diagram of both the `list_items` and `edit` features. From 2a0436eac5fab7b652dfc79774b1db86d433b64b Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 20:27:56 +0800 Subject: [PATCH 394/421] Checkstyle Edit --- src/test/java/command/EditCommandTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/test/java/command/EditCommandTest.java b/src/test/java/command/EditCommandTest.java index d88ff3bbfd..74a78986fd 100644 --- a/src/test/java/command/EditCommandTest.java +++ b/src/test/java/command/EditCommandTest.java @@ -1,14 +1,11 @@ package command; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertTrue; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import command.EditCommand; -import item.Item; import itemlist.Itemlist; import promotion.Promotionlist; import storage.PromotionStorage; From b26ff8351ff2ec956449d0d3f319806d1e4de6bb Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 21:16:49 +0800 Subject: [PATCH 395/421] Change exception messages: --- src/main/java/command/BestsellerCommand.java | 2 +- src/main/java/command/ListCommand.java | 8 ++++++++ src/main/java/common/HelpMessages.java | 7 +++++-- src/main/java/common/Messages.java | 2 ++ src/main/java/exceptions/EmptyListException.java | 3 +++ src/main/java/itemlist/Cashier.java | 4 ++-- 6 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/command/BestsellerCommand.java b/src/main/java/command/BestsellerCommand.java index d1f0aebd9d..6b9ba2d764 100644 --- a/src/main/java/command/BestsellerCommand.java +++ b/src/main/java/command/BestsellerCommand.java @@ -13,7 +13,7 @@ public void execute() throws EmptyListException { String bs = Cashier.getBestseller(); try { if (bs == null) { - throw new EmptyListException("Transaction"); + throw new EmptyListException("Bestseller"); } } catch (EmptyListException e) { LOGGER.warning("No transaction found."); diff --git a/src/main/java/command/ListCommand.java b/src/main/java/command/ListCommand.java index 6166b52e1c..d923c3cf13 100644 --- a/src/main/java/command/ListCommand.java +++ b/src/main/java/command/ListCommand.java @@ -84,6 +84,14 @@ public void execute() throws EmptyListException { } private void showTransactionList() { + try { + if (transactionList.isEmpty()) { + throw new EmptyListException("Transaction"); + } + } catch (EmptyListException e) { + LOGGER.warning("Empty list detected."); + return; + } TextUi.showTransactionList(transactionList); } diff --git a/src/main/java/common/HelpMessages.java b/src/main/java/common/HelpMessages.java index 3623d6d0fd..95a285a5f0 100644 --- a/src/main/java/common/HelpMessages.java +++ b/src/main/java/common/HelpMessages.java @@ -10,6 +10,9 @@ public class HelpMessages { "|------------|------------------------------------------------------------------------------|\n" + "| list items | list_items [marked] [cat/CATEGORY] |\n" + "|------------|------------------------------------------------------------------------------|\n" + + "| list | list_transactions [item/ITEM_NAME] |\n" + + "| transaction| |\n" + + "|------------|------------------------------------------------------------------------------|\n" + "| add | add ITEM_NAME qty/QUANTITY_OF_ITEM /UNIT_OF_MEASUREMENT cat/[CATEGORY] |\n" + "| | buy/BUY_PRICE sell/SELL_PRICE |\n" + "|------------|------------------------------------------------------------------------------|\n" + @@ -230,9 +233,9 @@ public class HelpMessages { "|___________________________________________________________________________________________|\n" + "| Commands | Format |\n" + "|-------------------|-----------------------------------------------------------------------|\n" + - "| list_transactions | list_transaction item/[ITEM_NAME] |\n" + + "| list_transactions | list_transactions item/[ITEM_NAME] |\n" + "|-------------------|-----------------------------------------------------------------------|\n" + - "| example: | list_transaction item/apple |\n" + + "| example: | list_transactions item/apple |\n" + "|___________________|_______________________________________________________________________|\n"; public static final String INVALID_HELP_COMMAND = "Please input a valid command to inquire about."; diff --git a/src/main/java/common/Messages.java b/src/main/java/common/Messages.java index 3522da50a2..5e3d772a72 100644 --- a/src/main/java/common/Messages.java +++ b/src/main/java/common/Messages.java @@ -94,5 +94,7 @@ public class Messages { public static final String INVALID_VALUE = "Please input a valid amount."; + public static final String NO_BESTSELLER = "There are no transactions. Please add a transaction " + + "before retrying the command."; } diff --git a/src/main/java/exceptions/EmptyListException.java b/src/main/java/exceptions/EmptyListException.java index 4ff0f223c7..4f359d3d17 100644 --- a/src/main/java/exceptions/EmptyListException.java +++ b/src/main/java/exceptions/EmptyListException.java @@ -15,6 +15,9 @@ public EmptyListException(String error) { case "Empty List": System.out.println("No results found."); break; + case "Bestseller": + System.out.println(Messages.NO_BESTSELLER); + break; default: System.out.println(error); } diff --git a/src/main/java/itemlist/Cashier.java b/src/main/java/itemlist/Cashier.java index 56a1681697..0a367f5c2f 100644 --- a/src/main/java/itemlist/Cashier.java +++ b/src/main/java/itemlist/Cashier.java @@ -44,7 +44,7 @@ public static float getTotalRevenue() { try { ArrayList allTransactions = getTransactions(); if (allTransactions.isEmpty()) { - throw new EmptyListException("Transaction"); + throw new EmptyListException("Bestseller"); } for (Transaction t : allTransactions) { totalRevenue += t.getTotalPrice(); @@ -60,7 +60,7 @@ public static float getTotalProfit() { float totalProfit = 0; try { if (transactions.isEmpty()) { - throw new EmptyListException("Transaction"); + throw new EmptyListException("Bestseller"); } for (Transaction t : transactions) { totalProfit += t.getProfit(); From be27e77c4b803cca1a9e2e7da49cccc3ea9331d1 Mon Sep 17 00:00:00 2001 From: Fureimi <111426591+Fureimi@users.noreply.github.com> Date: Mon, 15 Apr 2024 21:29:08 +0800 Subject: [PATCH 396/421] Update fureimi.md --- docs/team/fureimi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/fureimi.md b/docs/team/fureimi.md index 0906c949ac..e319b81eed 100644 --- a/docs/team/fureimi.md +++ b/docs/team/fureimi.md @@ -33,7 +33,7 @@ only want to see their marked items. The mark feature is explained below. ensure that the parameters are edited accurately. In addition, this enhancement allows users to edit multiple parameters at once, which increases convenience for the user. -- **Code Contributed** : [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Fureimi&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) +- **Code Contributed** : [RepoSense Link]([https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Fureimi&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=fureimi&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other)) - **Documentation**: - User Guide: From c54ae2c6062a95cb592a8c7d0f99f9cc4b8db069 Mon Sep 17 00:00:00 2001 From: Fureimi <111426591+Fureimi@users.noreply.github.com> Date: Mon, 15 Apr 2024 21:30:38 +0800 Subject: [PATCH 397/421] Update fureimi.md --- docs/team/fureimi.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/team/fureimi.md b/docs/team/fureimi.md index e319b81eed..03989d2079 100644 --- a/docs/team/fureimi.md +++ b/docs/team/fureimi.md @@ -33,7 +33,7 @@ only want to see their marked items. The mark feature is explained below. ensure that the parameters are edited accurately. In addition, this enhancement allows users to edit multiple parameters at once, which increases convenience for the user. -- **Code Contributed** : [RepoSense Link]([https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2024-02-23&tabOpen=true&tabType=authorship&tabAuthor=Fureimi&tabRepo=AY2324S2-CS2113-T15-4%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=fureimi&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2024-02-23&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other)) +- **Code Contributed** : [RepoSense Link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=fureimi&breakdown=true) - **Documentation**: - User Guide: From 084084045ec85b8e4a4c4e2e76ba7ada7d8ad2e7 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 15 Apr 2024 21:32:00 +0800 Subject: [PATCH 398/421] Catch ArrayIndexOutOfBoundsException --- src/main/java/storage/PromotionStorage.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/storage/PromotionStorage.java b/src/main/java/storage/PromotionStorage.java index fd5f44fc13..c12f0029e0 100644 --- a/src/main/java/storage/PromotionStorage.java +++ b/src/main/java/storage/PromotionStorage.java @@ -105,6 +105,9 @@ public static void readFromFile(String fileName) { } catch (InvalidDateException | CommandFormatException e) { LOGGER.log(Level.WARNING, "Other exception occurred.", e); System.out.println(e);; + } catch (ArrayIndexOutOfBoundsException e) { + System.out.println(fileName + " is not written in a correct format."); + LOGGER.warning("Incorrect documentation format."); } scanner.close(); } From 2b82ec256504e8976f0f27d59d0a20a0b3bab0d5 Mon Sep 17 00:00:00 2001 From: fxe025 Date: Mon, 15 Apr 2024 21:54:37 +0800 Subject: [PATCH 399/421] Add JunitTest --- src/test/java/ui/TextUiTest.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/test/java/ui/TextUiTest.java b/src/test/java/ui/TextUiTest.java index 3696b1a265..e7421297a5 100644 --- a/src/test/java/ui/TextUiTest.java +++ b/src/test/java/ui/TextUiTest.java @@ -9,15 +9,20 @@ import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertLinesMatch; -import static ui.TextUi.getUserInput; -import static ui.TextUi.showList; +import static ui.TextUi.*; public class TextUiTest { - + @Test + public void testReplyToUser() { + String message = "Message 1 to display"; + ByteArrayOutputStream outputStreamCaptor = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStreamCaptor)); + replyToUser(message); + assert outputStreamCaptor.toString().contains((message)); + } @Test public void testValidInput() { - provideInput("add Item"); assertEquals("add Item", getUserInput()); From d73f1f3af551962ae780e75feb751ebb06d9e7f2 Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 22:14:09 +0800 Subject: [PATCH 400/421] edit addcommand seq diagram --- .../Itemlist/AddCommand_SequenceDiagram.puml | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml b/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml index e03bf52445..bb09b1e541 100644 --- a/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml +++ b/docs/Diagrams/PUML files/Itemlist/AddCommand_SequenceDiagram.puml @@ -2,32 +2,31 @@ !include ../Style.puml actor User -participant "Parser" as Parser -participant "AddCommand" as AddCommand -participant "Itemlist" as Itemlist -participant "EditCommand" as EditCommand +participant ":Parser" as Parser +participant ":AddCommand" as AddCommand +participant ":Itemlist" as Itemlist +participant ":EditCommand" as EditCommand User -> Parser: add command activate Parser Parser -> AddCommand: prepareAdd(userInput) activate AddCommand -AddCommand -> Itemlist: itemIsExist(itemName) activate Itemlist alt Item exists - Itemlist -> AddCommand: true AddCommand -> EditCommand: edit Item activate EditCommand EditCommand -> Itemlist: editQuantity(index, newQuantity) deactivate EditCommand + Itemlist --> AddCommand AddCommand -> User: Output success message else Item does not exist -Itemlist -> AddCommand: false AddCommand -> Itemlist: addItem(item) - deactivate Itemlist + Itemlist --> AddCommand AddCommand -> User: Output success message deactivate AddCommand -deactivate Parser end +deactivate Itemlist +deactivate Parser @enduml From 47185474b307f92743e777b060cf110207fcdcaf Mon Sep 17 00:00:00 2001 From: Joellimjr Date: Mon, 15 Apr 2024 22:16:54 +0800 Subject: [PATCH 401/421] edit addcommand seq diagram --- .../Itemlist/AddCommand_SequenceDiagram.png | Bin 25422 -> 22169 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png b/docs/Diagrams/Images/Itemlist/AddCommand_SequenceDiagram.png index 63eab435b12bd20472474d6e71c565fd403402ed..970784ed45aaba46a6d16434dbc4c5affc979090 100644 GIT binary patch literal 22169 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 literal 25422 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 From 2d7211504bb2cbb798d66cb3961d3cb9d7c92af3 Mon Sep 17 00:00:00 2001 From: Shu Date: Mon, 15 Apr 2024 22:17:55 +0800 Subject: [PATCH 402/421] Update DG and PPP --- .../Images/Promotion/AddPromotion.png | Bin 34388 -> 33272 bytes .../Promotion/AddPromotion_ClassDiagram.png | Bin 41956 -> 41638 bytes .../Images/Promotion/DeletePromotion.png | Bin 19352 -> 18876 bytes .../ListPromotion_SequenceDigram.png | Bin 17478 -> 16760 bytes .../Promotion/Promotion_SequenceDigram.png | Bin 17893 -> 16592 bytes .../PUML files/Promotion/AddPromotion.puml | 6 ++-- .../Promotion/AddPromotion_ClassDiagram.puml | 8 +++--- .../PUML files/Promotion/DeletePromotion.puml | 4 +-- .../Promotion/Promotion_SequenceDigram.puml | 8 +++--- docs/team/hengshuhong.md | 27 ++++++++---------- 10 files changed, 25 insertions(+), 28 deletions(-) diff --git a/docs/Diagrams/Images/Promotion/AddPromotion.png b/docs/Diagrams/Images/Promotion/AddPromotion.png index a2b0c523669f500556088515a50ab7c4cfeb198a..8848725e26d693eebeeee1ad45f6b42e7ab3f6bd 100644 GIT binary patch literal 33272 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 literal 34388 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 diff --git a/docs/Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png b/docs/Diagrams/Images/Promotion/AddPromotion_ClassDiagram.png index a21382bbea863aeae46956d26617bc3334473cfa..f371d4c3d52bbbf31b9c926ce0413ba9d89b5487 100644 GIT binary patch literal 41638 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 literal 41956 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 ^%(*sIcA9qa8ufpX>F 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 S+y`et#GlAK&VBUk_5T8(R~T6U diff --git a/docs/Diagrams/Images/Promotion/ListPromotion_SequenceDigram.png b/docs/Diagrams/Images/Promotion/ListPromotion_SequenceDigram.png index bac03a57e93916c998b4d016ab7d8b41a2c15009..c079699e7214c990253d48713f61a419a49f02a0 100644 GIT binary patch literal 16760 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 R0G1p{Oz7FuFHfGo{y*DpQNjQK literal 17478 zcmc({bzD_j)HVu8mo!RuNJ%4Il2VFvN_R+iY(g5Oa}x@RN(xGsAR;M9mr8dx+_^!| z(R0rGe)s#`KkokLoW1s9tvSb>;~8T-?RI&ZatqU!6OE()U{lGU5A4Q&+*7yQ&(~r6UV9VExGY5EC_Oh-f0|y!$$XzsfdaC z&R+S*HEq}WmGw7hX9wg@+uCIA?5Q&+vyN6cOm`f2not&Cc)pz7F+oiu&QgBqGGa<- zgP+2dzur-?)?pb7^L7mo5o_r3#%E$9kC-G%@8mMKZN{P z1v@8o*rfD^P(q;UBMmNU!x%nGcg$DZRWD!YKKss(@jB%r)23nq8C$}>%Q6+U(!~!b zK?X&twO3B^r&Ga)Y^?c%$3@H6%UyYYJn$vL!FsQh0;-%hrs2Ht&ZtXFlK-$1!{wy|8xdj9bs@{Y4dujA_5lgV?a@6kuIT)PCNjDh|YwH z+IFLoj_N}QIZ3!(|7qFb6LD?20iqXGs;?r{h>)0{Bq|}YQf1tK5mT_!liN9uyk-Y$b_Z96j6mZYWL7W!w^p&)86D z*45E&WEHXY20jw4Jj?Jr{6p#{`16;W1BxYnM`rT!oi_=BSq)Ct2c9WLZw=sP7+f1- z`1suKh<2zQf})6UAL-ru84gy0xPbv~j>gk+P6NS5Uu>Xbh@*oX{sm)K4}*)%JPiqv zH2svw-0ray?pp%y8ML~RB1RL7c0C!f0KG?#kLbhrklBM(Z>*2_riP8DxSsbsz+@ge z&X<=lO}$~ycr4D2O{H`tFvS>nOpA!L@C~(P0jMX$pJ_Rx~-n z%=fme5!J%v!s$ zMW%Tirtr?6pS2VqZjrsFw zLgeV^(3TGSuVoxB$Bh`Z!xpA$#fooE)mJRm@J&rQxR)b(M#^t5Ilj<)A+*S*TNPT% zJ*GdR^~hOwq49E=MtPxrz{FfTzzE)#MmS|dQ%pWRJ6bTz%Wf3)gDu;Kwl<%GN#8(YnFG5$){x%#>{tndh;@!JFz>m~{%C_m z_EGCI#gwQgrkk*rt#%Uc`d^%sHmANxYim0ea`#i(-CJ=lwR!Rph0->jKRs*MKfZ)r zmlehTzwLAQ5Rc)W$JWV)%Fa`9HI4oCNipwzTN9d_KDvD7G>%Z<%+e`)|%%_dgl`md;B{7j0hcdLHTHI%;<3 z@G%xsHdquoFe#^BlWJbT$%m*hsASvTqmx2)u5p<5_uf19R3Bt>pBlBFthu0%cImD= zS+5~t)A{=HAqLUF?ox%-$?_1TgktxK-i1eK0jCFzp*}ULK9sI>I6x2$%PeT{*Md7{ ze&oRY{6e}CEsHPahP37{co0zjk%Bs}PBR8kCY8m^EB@uOWQ^O2h>vgK+DR5h(<1i| z{X&Kq{3H6HJ4xYuxnJ6GgBO>70Z_-2Q@rL(1?h}FtMB0wF26t_=)1Jv6C-8%Jf+1- zr#7mZU)a;^MAImJyAZFR!DUR~5sv;ZJeU!PH>62@@Wc{d(2k5V{LK~YEb8HXeSMPZ zAPs&*pXW*ROw3V?@9Si=x{ELue!*SFuF*rt)Yw9!LAEOaTm{Wb-tpo6e3|Hx5nW2Z z!}xmd#<}hw>iBpy^+JD<#bBSU4+kp3TN$BP5A5I19UI;vB5L?BUc`XsKbI1&t-O{k zJEkUz;LUE}gF(*16UADWruPFrm+h4LmY<-cY;ssvo>rRUledqLmNcK7l{_|pz4ER+ z^jOm{X?~$`s!+v$iuDFwT*&%KJ?{k3U-m(GNt&Q7dp4-;&M7m0E{ zDTXxWciwtauwm2i@36T@#^=bf+Zy_jHG~k0k>?hcI=`|0@Qq62^XYDJ+xhSv4&b|p z&*@LMJC=9k&Q2QgJlXeGtFZclzC8Fs zx7z;O=d{N;zHX0vd?W$5flc}75!LGABcnoU9tPyN^TEM({z(^np~EjKv7|!#D$__JRo5HnUYF0u5Gq8Cln&7SZ!ZF6mZhy_U^bsoOgi9--)b+U^n1{zJv_ft^XkzC} zDjdqGx2>idE`mTp zl$kbawKK0j?eCvXUUxS#`R?7EKBw@$i_QC7={`L}B&oh?Iitck{-PJvjlM*yxyhv$ zJ2V{IifycgZoRZ?a!KiV4*ZF2uiJ+E&_cxefyXPS^I&C5AFQ9bZU0DvO3^|p^=o&7 zQB=g6jL%988(aHQD8mjC!Fu9mOA7cuqU{wDOTYet`dgtP{e-ryd)5xXG!;3;7EQx5 zlsd1|t=wHzr!77&0zSiIn_3ZX?1BQGJagUZ^NO||UstIA@seg}JU#i+j7C(a7x&08 zK!WE=<5)B|l|&b;v9ydEi+XLdOP%^Ia>%nyAm4F-%b4FWL#Z^O@VtAt7Mk!b>5xP) zcat$l=+S;8>C*5~OU&kKMQ`hC8eybu-yAKA!-|hfRvnGc0G3&J4;4lAfAaR zy76pZz=4vSyt|52`pUkEsXj0R=eji4)Ae8Mm28YSVFD=l?7aN4?YZX-g!2G{PaHr}{&4S(-j_Sh!+mx3)4vjJ~X7 z!lJUI8s4GIY%XyB7dta-1rUDxWdqmBN1x9<7P9QB?M^a95K}%HUI_LcTT1GWd|Wm+ z9JJt5siJGDc-*)@n8BwygFR zK$KY(M1IQgYX4?k;44cYFncdOd(mP@21`o(PffVboYuya?8c`)WZZ01k%i21Wi;OQ zebvLF{;DuEJjX9duJ@6E=^Q%2l>sk4Mu4;nJqhvM`Y18;Yn{o?3^dn@7*!*F+Yt!_ zo!4dB;f;siPRzUQFLrVaL$MBuOB4!Ka`bE6vK|(TR*I&p67!YUj1upqb>l|?G@`k8 zE!%3n;e;aiCd;LdCBS2a`NTZY?g;o1uL+s9|Ck*~JT1vcAe#M@K?&p~2*SZFqdA`D z!td7(cfXWSWo$y>5JVFUDJz~r3~t^$u%9?&*1H9q+SK&aWqDBByb$`Wkk-Yt_1@u8 zMZ39R$>9~g&|sxstwe?^=112aSTZTWjMgH)`AA@Q(!J1cC!^oVX=`f>&G%$JPLl_j zJJl;S>HCf>-R*f^TlagFDK{9jX2@$h|O`V(Z^eOO?_L@GyUPXCRDz+1H&km z%WQ`CEZXcRz3R{Q(I1sM&erPJ2&=a!Z67V{%pxPKQ)ckhV^J8>gIQ(JsxN+Ay$9K` zi0*bV*rMi@20=oagr}97MH8yZ4_`_Emqd6td%VFLGW)m$XAm`P16Zb z77#~y`KYN;DxijlyE`Az`L;(Uz3ag_o(J z^CJHrZ|Yy6if(3IB!)i|E)R;XYyYeKl)yoJ0jG!nO4R%C$%vp}EkIyJdt|#SDEH6z z^oO8btj6O z=Ci*#nwgn-czEb{cAO>T9>W7JJUv~W556wCI9^@Sw!ORbCt6tUBk&)!yij!%eyFn5n6+caadsfja ziqX9hW1A@X`Nt(t!g~0P(pqp>^!*~vRHQQ+XpXE#Y5eeWdg@!ZBF;4!xwsOlHl`aX zb+E|=>8hi`!{52Bk-ViYtrZ&@m6=uLwfRctiU5b?SFqpQD#JW@<8zQ7ZeK4g%g9HY zF9~r83C>5`W+uf8%()K=l~u&fc_^byPzkP@dm8m(&5pa^!!h=ZBGccTQwqBPG zi`iQqD)tg)8d-FWYd0d=jSTRk&~BD7$Vi5O39L=lR@c?lm6qP-=6=dE;ErZxWo77p z_O{LW$H#a|pG|n4^Ro?qhw&;lD~N1Z5{st6J4g7MJ_Wew3viuY>Mg*}FDhd6f=mY! zkFWRRB1*(HJ<`Eb&K6F~$|5Hv^*)$%_dl9TDTw#`w%B@IY;~wO<#N66+_}@2nw_m| zh+U#phJY@i_j=?q2xtCHo-1fNY2)lp|UUS-FoQ+eZ# zGu@dP0dP9WQdxPeYWqnkiin5^aD&B%2tq6om(>v`uq#`_kV)&Y2Y$D?cOoP}>ZPQD zf`W{UOoe&(A-KiY^4{;hO0I)9k@S$dQ)=bw>+wpfR#Bc2rVx@~?LH2KV^32gQqMIS zZyJO+^!~iNkSZq7ZU0?Jq`8A3_j3?$Ah1LBPe$y~QlS{2T0mSICLTDJ$C# zztR8lTq*22rM*XrQU0*RAFpXkfZGf3`4;ZW3ZuNpH1R%8({IKi0po>NC?K5gae@Cq zv`B)1jx<6tA}600dBN{{R12?dWKqiG_h&}aOGN!+C&TXga|-{%P5;<&CRapUToR;L z?82wOE{(@(zy>z9#DoMqxABxD#1Soh*!Kp&U1Uw}7jvNb9`B}^vV>yZMEF9%Ydz=! zTVDu3k)!)~Mo&e|Sf;!;L{j&kD`iBTdj$W1JcGN(Z-)(96O0J|SS{%DVJ*Bm@ooY^ ztY3arw8Wc?$f3#|qI~Tas9SrH_aw}08`)xEPbDLA@dqqJh4)8HUc7jrrlvMJI@*q{ zQ0}=i&#qr{L-(#$H70>*4rdg`lPvD~Td!IT)X#C+Q4!H#xSwuNd>?Ph|KdzJOYorx zg`5uyTBr;Ya-YZH=Ir*ib1OA3t`~J%jTv^;jG! zHEz8dNfb{MG;XSZ7;L7kJv!4IjE{#mqZhZ1LCmhI2zQIdCCq8;txdJ}f&Exk4VBB6 z+s3UoL-d*IDhRj`?%`zuWTaD$ml34Q6>3ASX)48eb9#C@F`-uq@4NNwLyJKHMqmt8 zWr6IdODR5sU=WiWlLCS*8QA+5udAof-AC=lDz)D`(_1li1>f53FcLp!p9R3oeQbh| z7A0Xp$}HLCwYMBtZZrHQFONo5&}9)WT1E7TZjsXebZdWYT%xnHGgtrXEA7X-i)!ZT z?!DO}PoF+5(XU1JZH9vA1Z|z)Zn}28No|B?xWv$ZrU_mEaUt*f=QM7Vc7C1&_>c#A zrOBnufel8@L11;?3zM?jpnVB#A1c;tZFHY>C0F1o}iP5K1Bz4#g>g3kH&1z)v4IH6P zQuC#->jz0Hx}cH|&HZyKKD+(0ePs`eHTn+bGaMMAO+7cgjJ9$q-YF4@jmuF-mu?%I zlhqwQg)j`qE%+a-C+H0-?RBoF-k#Y|yygH>e$m4QKnh&Zz4# zvmLv;F5BNhRx#6Yc<9j=85wEi{<74|)|Qp2BbG9Z{DA;Hy3HNSKB|<3T+{W5_t2=D z+@Wt*ryIq165P30IbwCKAhM6<5sXV0HAFfhbW zh@_JwCMTO)ShSwe+R~H~Z;X_+u6aHI&Z7EGJ}h8&ee&dEJgvD2-p4h@P9N2|O zfz1gxQZsvdc3^lZ*To^IL~wXG>PRUB<`9k%jM*MRbsXJYUBQKvU-8;KH=9xN^Ygz9 z42%qS4T>)^h#BukfyIzA+|TzeFl!6PHR=NplS*n=@cVR_$-Y2OqS7f1c2Ta7F)WXc z$9fR8=9SJ{Yfu!J%E!5BFuDf;2CSyPTkP}&iv81P#pdW)$cA{S!7uUS&{o{Zmw#Ep zc(x@3BsRg`OxvTFDMfU3NAnqu-_fdb_-l>=bM~6_-@E8P)GSG7b|KkkLu-lrgtA+U zy$2F~0PPV8IFC+CP|S;;udnG4ODNtw^d$vTA zdWb>@1sKWR+rdJ4fEV7v0K(CN)BNX~Zea&ym(3=UQqLW8@U4dKUOG?b+)=wiRnP8X z|1}aJ*JYj_`=(6e`Aul)O%TQ8<0kzpa_A*S;H%UvA>>~Vi+$$;@3ekqRL=ZZ6HJAg zC*sH-OWz!>NiWeoEb(_}GClx>3S5aoP&y^aW0GI_C2B1QYluejrR4wX6+RX;z_wcs z7OAPLs{?q9?m$3EMjZcTgpg8iyNU$y^Dj%F&L6TZU&zn=Ct4w*mSLvAOLjN#;Z5f=ls=C4wfA1wvd@j zI%3SaU+!X(*@^_vv>n6xdWeI!(00e2KN7F{>~!;QzJpT$jDl7L=_CTm*K1%!-YT>_ z!Dsv!8y_EE5TaUPuJmYew^2g231HnX$92evIaFi5L~2}7%l0e z_K%&n5OHML{L}6z^>js17kh9Zd1DOH!jq#V2z{b}aNY9opc7u(*WiPkqkjt3F>V{AI_95CEHK&9G}E&00@*(Rz(goHsdX{Ing71QpB(Z|L|d!QgHz8zF`1QyOI&}n$El>BqTaw$Q^DV z!OxoFNFzZ`svN^o^xImnfko(U=)H5ybz2()Nwcz?99$Mpwt&;OKopAb$jA(C3+%~| zkmywktVt6S6RQ&pj=H$)Z0zICr;I1NOV`Lx_Sd|Z2bryJ`=6gmU$^=Ciuu+p1!d(> z*=P{>aIZC_6yxP(q{ZihoZM!tl39o<2$AroWvQ0SZAZ%u>b(L7K&l2J*VFdqV3gj> zJ3AmrfcAB3j>si}NUoACeAIBVp1%fa3qjvwo<&;O7zj()1l$#B`7+IkBk;I%ML!oBUM&Uw8ZrS9QP6!=)yz^j+$S!`V%;t>)irKQPF(~EbNnRJ9JH^5D-z0X%sQsTX#_ud)F<+#zj zKfc>bnrJf3D8y;rCdmxVu+x4@qgT>g1~wO><=ZaKGW)DNKIYJUG89Z z>BbdRK+)j1m4sZa{;v@;OCx(h#n^Q!7t1;*uEF9HXj?9iR#?FHL$$hb{%B}d)pc?~ zm-Ex3h2ESTKD#jx06ngOFpSg-4~omzU+)P(ZyxK1{kEU$RwD@9aIjxf8mr{CzIRy~ zu&bWj|HM+#mkg`}o&SQr?ddmpSrcaQ;T zZPOG0-{0Rql#YhNBlSPe;dh{E@zs6TY9fz=zdtPTJAC|dQGf>Nv_IVv;6e9)-~l`U zk;j)y3nEuju96P-TlCnv!L^26=l`8Ii}1jz z<*!Wx$WWpfB!zmClT7s&$P_KTbqwoBppyBs+Pb>PueEP zU8^@Jd^fW7vP**UJ^`i1g9i`t^YY3oDqcMMWII*&UNMEe{p-uP>(Sa}KXT)7X~dSt zZ?<9xS-f|blp{9g;1#POR=A=`Kmm3{KDDMRZ*=d?gJKOfOJScwM^Df9vvKLD^|!_E zTYgB8o$AWTxBhmK*)5~`m^uXSitkbVV&fO)e)0e>yhpMdk_;svCblp&Z3CZ7g_zeiDuQ3&$cjyM8hp&(?2FD+sGspKD}8^Dq}$63h_nZjhk z9=BOoFpzI@K0;ihaZ>WwZ9lq)Il{f&bN?giZTVCcb8`l#2%dpBbddG;A%%uG&Mhn~ z%+Cj5ErK0Qv`?dt>VlX{FY@VmaMta9?Lj@cTPT z24-2=b+ogPMqRQq@wivwq$LESQ-Hnq`Lzo$J(8H@`kOfQP%9 z#QLXUi9f5c6DP|$k1d*dCpSg?;{BpD_z?GGNu5R08CW59xg`Hph&AQSE529FyJE1d zy}CCx1B}S;A7ZzdvFh~};A)84-W!D5PsbwV6W$wqz|73tH&EkhV+p~+*aao(_T(s0 z%l2HCezpkqdDflB3`4W#L^0;3rUBK77#GG+p~6n$f)<-|Kq9&9oJoZXw;<{(@m5p0hV&Zah1Px~oiH&1e&!Z<>| zi7LB{+HH;cckfc&3ek%@+S`MiPY<0&I4?`~U}P+3PYQ+ko-B+{pkmYNT3xkGS=b5@ zZjQt6)W@eV>t*7BZuZ=l!w}w$3u?YlK*yPVBr3U;OsdrAMQw``|8N-ew{Rk6HF5Y9c^uYR8naV|L-fQ?b?lo zuFs#NA|q)Vr5G6#Y8iw-Wvf|=&t^S~O9qiYKw_aMt66qT&JMC($_FAvWLCw*eSzl^ zvN&`+n?iNtISBzwk!u5{wP>{A$gm652{VwP;`tS-$PpIVgvd`{wNX*88W#XxPq8=l ztLWf18ZXYjyCG+C`8{|WKHC~bnh_Tltc@yxh-uhx!*=jgz`RuLi_I+dhO2yle$v!e zYSc&We41ww`$qZm^WX*;zMg2|fqMIAJ#*WCe&vOd+K-hAa%^+zB3vpAAMRwxOg;?J zr#ceggjShr;UBv_^z)T|dsT6vS|fr838AOv`8z^fmN+h3|W&=Q1%LBeZIKu9=LVWIN9tSJ!uomMHG z0NE^diL^Y`h3wQD{aS2FQCndmfx260)(zOsB&i`#87fwK>LLo}$aDh`zUUPsqe*y; z?wQz#k2d=IgR*~?6%g!ZlbllB*Q4)XeU?TIxJ^0DFZZ28K8>_g=;Sdo;iJO(8c{8;xfcGe#@$1k_)N(f;!als3tG=Wi#A#2^H`Nxm8K8u(>*;g z{kPHUhUuwUQ`8pKE;(P=t}|mp`Fqz%M8Rl-s~uu<=dT?CN}oZWOKw0ST3qX^v#Q8_ zB3@9MfLaNsEq6x8P2krq)$96um)eZNb}1`b`eRtz=E0$=H5cj|voPAL+UxrY6|t1G zblb~^#Zg2L;kixlrHVCPM=4>hJ^_SO!{IlK{JY}0Pvd*j@Y-3KF1O%YvR_-U&ejZF z2r|coE@FJzccWJSjaC_rprDQc;g9j+5BZK42CAxkAjN;#aV^S+OW62x5Dg+Pg0Xg& z#Gah?r5|@C7nMqBvFG>Uw-b=;D;1$TVyM6(!~BmQusmgDcmvcO1@U7$vieD=vE{yj zfCp}CZy(qvHt?Vp5h33NtmOXE7e;pWHxAPch00lZ$gqNDw-gBG^78V2{4m{53*Gpj z9GacNPb*ufl<~FF>I=|sY8zm`Wh@#t{?mwU5YCWQK0C|Kt8N~LLESsk&IB+4}O_2+jFXS7?d+nk!|<5 zR?JjCf0l_RL3%*KV~IoFmxj0}h}ors{ZjT*-X%W0J1Ir|X~KKC1$3uB7{%T@&!IDk zogbQjss_P15$B)f63zIpa;Yg5`sG41BD?1mC_uObOapZUpF$17{;=@Zj9(TWmN;dQ z(>40u(BSVK9uPfE6k2C7%@l{8gRfxJq!x&*1O;|gX??e3%g$8Zg* zrXb`k&NuI%w=%qQo>QpNd|ptnne)A1|D24ssj9WxTU+}kli2B|6bOm10%pUk|1*>} z5NWu)6=c=rdkm`qDQcz0{LP?vy(=p#^^i&oo0QKMpxE5pTu4YrT3Q;i_pBNdBdB_K zg{-S)%hy1QAxq5v94r7>KR}jHO^Fv_c=vaH?1o&Ufk*lC$xfV26bgWp+`%|lU0od+ z837^gq>H1mU_T-M8Zu@;-Xpg`+g7u2l}v$tP%);arh;yBa1SXg77N~dpXMk|H*@7k zms8#3lEe{ddb{cfxg;2V!-9Xf~2sX<-_PhSWrU!ZP6(}qo4P|BH;M` z;m4xMhys=JHh_$`x0RIq8O+EOB~d{(4+0`A>PTOg)WaL}=_k1ggx>miJ(+hZ0H3EH zK-kUh*mei_ddX#PKM(%*f(AeYqC{r6V^~Q8-RA&ovGYZq(c?}=A6kWQq@PWvh@z#v z-C@InXLN9&yR$r1hkx!GBWgD25VBU3PoY3wA|>KtwzIgMOJ|#X&amsAE{=XAlZb=y ztMXC%vZ7Q%{7Am^7A#Z*{p2<84(LJ zc&Ma=#FjRK1|H`3uMrVJ?X4Srs^|S0=daKs`Y>`4CkAx6Blnx1QYlf%wdO&gS}AZT zhM(ML(la$vt#``Xh~8WHrh{6%wOxX*`G zBs)T%>=B)9Aq`00&cGA0v(~P%@0yt!MJuarc`vhnF&C0|Va6!aUDOimWAg508CM2h z@eO4}`~YL_4O>Nqdn8uxAP?w4L8OeB`;k)c)cx;Gs~L3!cC zDutIrNo4s2j=I-556gS|Z*P?@P(Y*VjQq8D7}jE7?M7gJY1x|`zLlnLNsg#JcRSL! z_f>8;fY8IGw(uGgF0YMSBP0HP z%+n1!N6mGT#Ifr3e)fe(Q9jI*iKdId{g7S}m3AjjK88d0-PYKq{(-rR8!19Xb`|5W zmeY}}Zi)TrV4oZ^fpVw*kzn}SsK_Typ3e~x&^_66TduQ{rIE))j8=y17tB4{(r_le zUcFoyAF3$u@X_O?d^=U?C)mchHGhxpMrcxaI>($O^Hm}no^BA9OV_jxmqE-MaAw(B zsjV`HDJTC5h3$0)Pl(LOpt#scY`2elYbsS&POrP?zQm!s`4qQ$7^#6kdVe0_;>JCX zCvFxUxP0h^Ki+__X(O+Um|-+p!v>`rdeNmEMX4viB}7HoS?TFL;JhBpRzNrSq*hJh zMYQ9~SJA4~Q(ZOBZlfZbJSjTruUCz@Qf7cyLd}NexPTh1YtiF-66>FftZg?ISk8CB zyL}STj+Fp)G8)c?_TD%a94ogW3{5jQz=IkEV1YOjlrky)=GvW9ewVx zE`E4mKCrHCyf>oL4<$3y$E2KyGJFv8K)O?*s~ z%kCxEw(b)JkkUqre7=?!VYvA(MV_V5<@ogP5KEVHu zFC%t}%FCpG9=jSN7VLd*#L}o@MD6zUnrFRmrGx*w$f)~jkd29w|cg=l{xstqfeK{%|@lKx9L z11#5`FcShRWd3y@v&;Xh+W=klClo^@^#(2q1J7irH0goJAw2TQk?X+}<5!iaZ` z==J_*ZA=7oe*z?=4>CdY)Tb@U@U6bbAHKaVdz*K}4o@(hjag)SvQqboZ!LVPOli!G zJ|{#?Rh1Pz83GsHwX?@tEh9TU%zmadw_yx*8vDrUJ~R^*fqE<2gl9=%+ z5dyD~EW2)Xh~EQJp_$GDzTM6`4t9p;4qtr>ry95JChc5oTD)69(cT#t%X`OssF+3qt=j;l4{MWX<++Et})Kn>=WApo~ zA6DxxKn##|4Zd$j%dr}uh8wTR?}v_l$|6QvoUymvQ9j?zA3Q9L0;FMl5_ta}?K2#N z?HqS8xVf-{ulz5k1Nh33r}(y8D1wCC0nEBDZr*MNnbu1ED_w?m#(-gIv9kGmFSNHW zl;YZ0F?w*Xn9HBZfjKiIAPQLWF{N!9m+;1mO!&%p-Z-8XyF-6XqAg@(jG7Y_wlmzEt$zGK=cx2(-L=4UAG!dA48P?Ts}kAe<_3dnTb5w7eqzia&7wp zwqb?PdDQtM{da-rq$t9DyvND99@m0P!)E;IG{a&*O0evw!f>X`H#_r+eU)Cgw(q{c ze5&Dm(1tXM*(z4B%m-l`hZPMThcN{)u5vtm!{;&e$4NGwZCSOt zgxKfZ)`}wP(KxOKg;U2dud!BMj#NfzolCLOGn|~ZH9w4baBJDa6=N>H7-`x*4Ciu z?dHb!7E>sL-vJ!qj4T`C3MII2;Tsy8v021+`w*`#t@wSM&t=`)#++I z^b#o=^o!UzIQYrXX%C6VRXRAD6aN6$b-o=Omd7hmW9RcU*xTZw zBGg16U={!VR7Di+81yLXd{5j|ot>R6Q-Fe%OvEek=0kH~iyksd6r`S(Z1t%~aA<}f zojjUp_5Jxy&PBk$J0}x?u_86vK1D@EfFqRN;iBIAtM%RoK?r-juu)@e@no53EcI3dZN0;mZ8iYVRT-^S8Z}$-=AW&U;GZD!QdJoU_dve5jF+IsantG|1 zdZJ8PymnWGI+HZy#)A)zZ-mz0T}!+!c8UXhwC+x&_`@4l3M(vfZKU;g67KNb=quRK zhE8?uN!zMdF;wBvGwvSZRjEhVE%oB>n43gcd4Qqz)~ctUBWr7GLtp9FCZB!_IxRQ* zO%cW3+iuPGd_0JA2sF(l?)aSw*cuP*J3oGG1GqwwAAC;9%Pg92=mbk$mhQXHiMTpB zalV~R0<^p;kry;N5okuFx`2jv;pORve$Z>x%QhtI&JrR{1e)K{{IsPO8I6>CNkiS{ zUCZ#Y-6_t0bejIQ*?*Ar+B1Im`!*v%S7iOkC0U>GJ6T`DcH=>PX(>+C9!%jRRlGJg zKac$7dDsL)&;2tXLx&xmTLej101YA==y*b2^YQbiY{(@69)q2mo12|IrjCv(njp0o zXxDF$lV>F-%NTI9KIp+$5tcCESeTn@{!T2Ep7xuGDI5n+7Y&%Mf*=xa{rpdJOXy!H znJ7T4@bQkQqDpWvDs&L)wwyYk&Tzp&$u7#o#do5X}G4iM95^@~#CC z3*`Czgd7Tz;IKMOE-P(llw(ott9_}xB}4k_zyau_${_)jN72!6=-=w1t78znVzR4$ zNud7o%tOs_g5&Y-5)eb(Y^WCZ{)cWpISB%EJYqmG`&#Gi80g(>rLO-&G0et=q{Mpmuf1O}B#Fzb%+uWHW&|*mW0`AvxfTImi zI#uWmOfrGKw2d^oKaUP1Cm|vLy)_>DuYNi(BhWMVwEaWT|DPv6{`;RT01FGwjRf8J zr$GJk5xJbdA6#fpplbh*7yUWJ|KX;8okRKGM)UhAmY|F4d2GbVn25~b;2-pWlfSDh K{YKI#=>Gw8|3Tvb diff --git a/docs/Diagrams/Images/Promotion/Promotion_SequenceDigram.png b/docs/Diagrams/Images/Promotion/Promotion_SequenceDigram.png index c2b6b6090c832deb2b8f65c6798c97c955c9c969..1553fdaede67be253131d83e29b30d6867916ad4 100644 GIT binary patch literal 16592 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 diff --git a/docs/Diagrams/PUML files/Promotion/AddPromotion.puml b/docs/Diagrams/PUML files/Promotion/AddPromotion.puml index 04d88a446a..b7d63aa60b 100644 --- a/docs/Diagrams/PUML files/Promotion/AddPromotion.puml +++ b/docs/Diagrams/PUML files/Promotion/AddPromotion.puml @@ -6,10 +6,10 @@ mainframe sd AddPromotion autoactivate on participant ":PromotionCommand" as PromotionCommand -participant "<>\nPromotionlist" as Promotionlist +participant ":Promotionlist" as Promotionlist participant ":TextUi" as TextUi -participant "<>\nItemlist" as Itemlist -participant "<>\n Promotion" as Promotion +participant ":Itemlist" as Itemlist +participant ":Promotion" as Promotion PromotionCommand -> Promotionlist : addPromotion(promotion) Promotionlist -> Itemlist : isItemExist(itemName) diff --git a/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml b/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml index ab2d49744a..b1f71ab6f5 100644 --- a/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml +++ b/docs/Diagrams/PUML files/Promotion/AddPromotion_ClassDiagram.puml @@ -14,11 +14,11 @@ class Promotionlist #Honeydew { + getIndex(promotion : Promotions) + itemIsOnPromo(itemName: String) + isLeapYear(year: Int) - + addPromotion((promotion : Promotions) + + addPromotion(promotion : Promotions) + isValidDiscount(discount: Float) - + isVerifiedTime(startTime: Int, endTime: Int) + + isValidTime(startTime: Int, endTime: Int) + isValidDuration(...) - + isValidMonth( date: Int, month: Month, year: Int) + + isValidMonth(date: Int, month: Month, year: Int) + getAllPromotion() } @@ -61,7 +61,7 @@ enum Month #LightYellow { DEC(12) } -AddPromotionCommand --> Promotionlist : 1 +AddPromotionCommand --> Promotionlist : uses Promotionlist --> Promotion : 0..* diff --git a/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml b/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml index 73471ea824..ad0b27561e 100644 --- a/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml +++ b/docs/Diagrams/PUML files/Promotion/DeletePromotion.puml @@ -5,12 +5,12 @@ mainframe sd DeletePromotion participant ":PromotionCommand" as PromotionCommand -participant "<>\nPromotionlist" as Promotionlist +participant ":Promotionlist" as Promotionlist participant ":TextUi" as TextUi alt item has an ongoing promotion PromotionCommand -> Promotionlist : getPromotion(itemName) - Promotionlist -> PromotionCommand : promotion + Promotionlist --> PromotionCommand : promotion PromotionCommand -> Promotionlist : getIndex(promotion) Promotionlist --> PromotionCommand : index PromotionCommand -> Promotionlist : deletePromotion(index) diff --git a/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml b/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml index b01291e23a..cbe36a4108 100644 --- a/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml +++ b/docs/Diagrams/PUML files/Promotion/Promotion_SequenceDigram.puml @@ -3,10 +3,10 @@ 'https://plantuml.com/sequence-diagram participant ":PromotionCommand" as PromotionCommand -participant "<>\nPromotionlist" as PromotionList +participant ":Promotionlist" as PromotionList participant ":TextUi" as TextUi -participant "<>\nItemlist" as Itemlist -participant "<>\n Promotion" as Promotion +participant ":Itemlist" as Itemlist +participant ":Promotion" as Promotion -> PromotionCommand: execute() @@ -15,7 +15,7 @@ alt if user wants to create a promotion ref over PromotionCommand, PromotionList, Itemlist, Promotion, TextUi : AddPromotion else if user wants to delete a promotion ref over PromotionCommand, PromotionList, TextUi : DeletePromotion -else #Pink if user wants to list all promotions +else if user wants to list all promotions PromotionCommand -> TextUi: printPromotion() else if user enters invalid command end diff --git a/docs/team/hengshuhong.md b/docs/team/hengshuhong.md index 5f8ad5df2c..2132f2a653 100644 --- a/docs/team/hengshuhong.md +++ b/docs/team/hengshuhong.md @@ -9,7 +9,7 @@ manage and operate their business. ### Code Contribution -- New Feature: Added the capability to add/delete/list promotions +- **New Feature: Added the capability to add/delete/list promotions** - What it does: allows the user to add a Promotion for a certain ITEM by entering the discount, startDate, endDate, startTime and endTime. When a Promotion is added for an ITEM, and the store owner uses the sell feature in the application, the discount will be immediately applied to the sell price and the discounted price will @@ -21,7 +21,7 @@ manage and operate their business. Another difficulty is to check if the item is within the promotion period for the given date and time. -- New Feature: Enhanced the find command to allow the user to search based on the specified item information. +- **New Feature: Enhanced the find command to allow the user to search based on the specified item information.** - What it does: allows the user to look through a filtered list to find the ITEM information based on the KEYWORD For instance, the user can find all ITEMS that has a buy price or sell price of $`1` - Justification: This feature increases the capabilities of the search function, as it can allow the user to quickly @@ -30,29 +30,26 @@ manage and operate their business. enhancement is an extension of the previous find command, meaning that it must still be able to retain its original feature, but yet still able to provide more than 1 filter to narrow the scope. -- New Feature: Enhanced the add command to prevent duplicate entries +**- New Feature: Enhanced the add command to prevent duplicate entries** - What it does: it prevents the user from accidentally inputting duplicated items. Instead, when the user adds a duplicated item, the item information will be updated based on the latest input and the quantity will be increased. - Justification: This feature enables the user to not have duplicate entries of the same items to avoid the overflowing of the inventory list with duplicated item. -- Code Contributed: [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) +- **Code Contributed:** [RepoSense link](https://nus-cs2113-ay2324s2.github.io/tp-dashboard/?search=hengshuhong&breakdown=true) - **Documentation** - User Guide: - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` - - Added the Quick Start + - Add documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions` + - Add the Quick Start - Update the Command Summary - - Added documentation for the features `add`, `find`, `promotion`, `del_promo` and `list_promotions`. [#86](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/86) - - Added the Quick Start. - - Update the Command Summary. + - Developer Guide: - - Added implementation details of the `promotion` feature. [#176](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/176) + - Add implementation details of the `promotion` feature. [#176](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/176) - Update Product Scope [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) - - Added non-functional requirements. [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) - + - Add non-functional requirements. [#181](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/181/files) - **Review Contributions** - - Fixed bug for team members that caused the application to crash. [#184](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/184) - - Fixed test case that failed [#187](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/187) - No newline at end of file \ No newline at end of file + - Fix bug for team members that caused the application to crash. [#184](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/184) + - Fix test case that failed [#187](https://github.com/AY2324S2-CS2113-T15-4/tp/pull/187) + - Review team's UML Diagrams \ No newline at end of file From 584447811c7677f21c26c11c47f2d07f805bbc22 Mon Sep 17 00:00:00 2001 From: LowTL Date: Mon, 15 Apr 2024 22:25:30 +0800 Subject: [PATCH 403/421] Fix ListCommand bug --- StockMasterData.txt | 0 .../Images/Cashier/CashierSequenceDiagram.png | Bin 39690 -> 39680 bytes .../TotalProfitCommand_SequenceDiagram.png | Bin 20806 -> 22216 bytes .../Cashier/CashierSequenceDiagram.puml | 2 +- .../TotalProfitCommand_SequenceDiagram.puml | 3 +- src/main/java/command/ListCommand.java | 60 +++-- src/main/java/command/TotalProfitCommand.java | 3 + src/main/java/common/Messages.java | 7 +- .../java/exceptions/EmptyListException.java | 9 + src/main/java/itemlist/Cashier.java | 6 +- src/main/java/seedu/duke/StockMaster.java | 2 +- src/main/java/ui/TextUi.java | 27 ++- .../java/command/BestsellerCommandTest.java | 2 +- src/test/java/command/ListCommandTest.java | 215 ++++++------------ .../java/command/TotalProfitCommandTest.java | 7 +- src/test/java/parser/ParserTest.java | 6 +- 16 files changed, 147 insertions(+), 202 deletions(-) delete mode 100644 StockMasterData.txt diff --git a/StockMasterData.txt b/StockMasterData.txt deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png b/docs/Diagrams/Images/Cashier/CashierSequenceDiagram.png index 8c8c83c5e254b5698d72e6b28b01bc352d53e1b4..cc31a04a148041294da81abbd1b972c0555dcc49 100644 GIT binary patch literal 39680 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