From c83387ac79705a01a5464008aecddde1a3dc6654 Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 22:38:37 +0800 Subject: [PATCH 1/8] Update AboutUs.md --- docs/AboutUs.md | 26 ++++++++++++++++---------- docs/DeveloperGuide.md | 1 - 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 10f5aefb6d7..9537a4dc4a8 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -16,8 +16,9 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` [[github](https://github.com/kjw142857)] [[portfolio](https://github.com/kjw142857)] -* Role: Developer -* Responsibilities: TBC +* Role: Developer for basic loan implementation + debugging and testing. +* Responsibilities: Implementing the `linkloan` and `editloan` commands; +finding bugs and pushing fixes; writing test code. ### Kyal Sin Min Thet @@ -26,8 +27,9 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` [[github](http://github.com/marcus-ny)] [[portfolio](http://github.com/marcus-ny)] -* Role: Developer -* Responsibilities: TBC +* Role: Team Lead + Frontend. +* Responsibilities: setting up repo + CI workflow; +Implementing view options for different panels - loans, contacts, analytics dashboards. ### Teoh Tze Tzun @@ -35,8 +37,10 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` [[github](https://github.com/Joseph31416)] [[portfolio](https://github.com/Joseph31416)] -* Role: Developer -* Responsibilities: Data +* Role: Developer for data classes and UG documentation. +* Responsibilities: +Implementing the `Loan`, `LoanRecords` (now refactored as `UniqueLoanList`) and `Analytics` classes from scratch; +writing the user guide. ### Wang Junwu @@ -45,8 +49,10 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` [[github](http://github.com/narwhalsilent)] [[portfolio](http://github.com/narwhalsilent)] -* Role: Developer -* Responsibilities: TBC +* Role: Developer for loan architecture and UI integration + DG documentation. +* Responsibilities: Implementing loan architecture as `UniqueLoanList` in the `Model`; +implementing the `viewloan` command; +writing the developer guide. ### Zhang Xiaorui @@ -55,5 +61,5 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` [[github](https://github.com/xiaorui-ui)] [[portfolio](https://github.com/xiaorui-ui)] -* Role: Developer -* Responsibilities: TBC +* Role: Developer for basic loan management and DG documentation. +* Responsibilities: Implementing `deleteloan`, `markloan`, and `unmarkloan` commands; writing the developer guide. \ No newline at end of file diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b6f07c629f1..6d3674f420a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -532,7 +532,6 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | `* *` | User who loans cash out regularly | View my past loans | know how much cash to expect in the near future | | `* * *` | User who loans cash out regularly | View my past loans | decide whether to loan to a client again | | `* *` | User who loans cash out regularly | See the overdue loans easily | chase after people more easily | -| `* * *` | User who values relationships | Send automated reminders to contacts with overdue loans | I can maintain good relations while ensuring the return of items | | `* * *` | Busy user | Keep track of all my loanees(view) | save time and use it for more meaningful activities | | `* * *` | Busy user | Quickly view a summary of all outstanding loans(view) | have an overview without going through each contact individually | | `* * *` | User who loans cash | Track partial repayments | maintain accurate records of the outstanding balance | From 17fc5df1354c17595209f840c736ff1dbf19544e Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 22:45:42 +0800 Subject: [PATCH 2/8] Fix description of analytics in DG --- docs/DeveloperGuide.md | 13 +++++-------- docs/diagrams/AnalyticsSequenceDiagram.puml | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6d3674f420a..04115299b9f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -154,8 +154,7 @@ as it displays `Person`, `Loan` and `Analytics` object residing in the `Model`. ### Logic component -**API -** : [`Logic.java`](https://github.com/AY2324S2-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/logic/Logic.java) +**API** : [`Logic.java`](https://github.com/AY2324S2-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/logic/Logic.java) Here's a (partial) class diagram of the `Logic` component: @@ -195,8 +194,7 @@ How the parsing works: ### Model component -**API -** : [`Model.java`](https://github.com/AY2324S2-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/model/Model.java) +**API** : [`Model.java`](https://github.com/AY2324S2-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/model/Model.java) @@ -225,8 +223,7 @@ The `Model` component, ### Storage component -**API -** : [`Storage.java`](https://github.com/AY2324S2-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/storage/Storage.java) +**API** : [`Storage.java`](https://github.com/AY2324S2-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/storage/Storage.java) @@ -251,8 +248,8 @@ Classes used by multiple components are in the `seedu.addressbook.commons` packa #### Implementation -The `Analytics` class handles the analysis of a `UniqueLoanList` object. This class can only be instantiated by calling the -static method `getAnalytics(UniqueLoanList uniqueLoanList)`. +The `Analytics` class handles the analysis of a `ObservableList` object. +This class can only be instantiated by calling the static method `getAnalytics(ObservableList loanList)`. It contains the following fields that can prove to be useful for the user: diff --git a/docs/diagrams/AnalyticsSequenceDiagram.puml b/docs/diagrams/AnalyticsSequenceDiagram.puml index a094f51e3e9..5d350b1360c 100644 --- a/docs/diagrams/AnalyticsSequenceDiagram.puml +++ b/docs/diagrams/AnalyticsSequenceDiagram.puml @@ -14,7 +14,7 @@ end box [-> AnalyticsCommand : execute(model) activate AnalyticsCommand -AnalyticsCommand -> Analytics : getAnalytics(LoanRecords) +AnalyticsCommand -> Analytics : getAnalytics(ObservableList) activate Analytics loop LoanRecords.size() times From ae6d8d2becc166817d20c58b85e2ef17c687f592 Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 22:48:49 +0800 Subject: [PATCH 3/8] Fix punctuation and grammar --- docs/DeveloperGuide.md | 16 ++++++++-------- docs/images/AnalyticsSequenceDiagram.png | Bin 25351 -> 28731 bytes 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 04115299b9f..33697b6b7ca 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -489,16 +489,16 @@ separately in the `LinkLoanCommand`. **Target user profile**: -The target user is businessman who satisfies the following criteria +The target user is a business person who satisfies the following criteria: -* has a need to manage a significant number of contacts -* prefer desktop apps over other types -* can type fast -* prefers typing to mouse interactions -* is reasonably comfortable using CLI apps +* has a need to manage a significant number of contacts; +* prefers desktop apps over other types of apps; +* can type fast; +* prefers typing to mouse interactions; +* is reasonably comfortable using CLI apps; +* wants to manage contacts faster than a typical mouse/GUI driven app. -and wants to manage contacts faster than a typical mouse/GUI driven app. Typically, -they want to answer the following questions quickly: +Typically, they want to answer the following questions quickly: * How much cash was loaned? * To whom it was loaned to? diff --git a/docs/images/AnalyticsSequenceDiagram.png b/docs/images/AnalyticsSequenceDiagram.png index 84009a0c751460134bdc50d81bdd00f97507dd57..e78b30f740fc844a21c2478c0e450acf7ef049cb 100644 GIT binary patch literal 28731 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 literal 25351 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 MI(XRpp(!@ Date: Sun, 14 Apr 2024 22:50:19 +0800 Subject: [PATCH 4/8] Update value proposition --- docs/DeveloperGuide.md | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 33697b6b7ca..49e973400e4 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -507,13 +507,7 @@ Typically, they want to answer the following questions quickly: **Value proposition**: Manage contacts faster than a typical mouse/GUI driven app -Our address book is tailored for business owners whose job might involve loaning items on a -regular basis. It simplifies loan categorization and tracks product quality post-return, -ensuring efficient decision-making. Some boundaries include no detailed client reviews or -personal loan management, as we focus solely on business loans and contact management for -a select client group. - -Our software streamlines loanee management, preventing profit loss and enhancing partner relations. +Our software streamlines loanee management, preventing profit loss and enhancing loanee engagement. It simplifies loan categorization and tracks product quality post-return, ensuring efficient decision-making. Some boundaries include no detailed client reviews or personal loan management, as we focus solely on business loans and contact management for a select client group. From 1be19316067b52ea40e2954034b89f5a414e1942 Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:42:10 +0800 Subject: [PATCH 5/8] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 88 ++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 50 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 49e973400e4..737515cbca0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -525,7 +525,6 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | `* *` | User who loans cash out regularly | See the overdue loans easily | chase after people more easily | | `* * *` | Busy user | Keep track of all my loanees(view) | save time and use it for more meaningful activities | | `* * *` | Busy user | Quickly view a summary of all outstanding loans(view) | have an overview without going through each contact individually | -| `* * *` | User who loans cash | Track partial repayments | maintain accurate records of the outstanding balance | | `* * *` | User with a dynamic network | Delete loan | my records always reflect the current status of each loan | | `* *` | User with a dynamic network | Update loan entries as situations change | my records always reflect the current status of each loan | | `* *` | First time user | See the available commands/usage manual | familiarize with the command structure | @@ -559,57 +558,52 @@ Precondition: `list` command shows a numbered list of contacts. 1. User requests to delete a contact, specifying the index. 2. System deletes the contact from the address book. 3. System shows the contact that was deleted in the status message. - Use case ends. - -#### Extensions -1a. Index is invalid (e.g. negative, zero, or larger than the list size) -1a1. System shows an error message in the status message. Use case ends. +#### Extensions +- 1a. Index is invalid (e.g. negative, zero, or larger than the list size) + - 1a1. System shows an error message in the status message. + - Use case ends. + #### Use case: UC2 - Find a person by name #### MSS 1. User searches for a contact with desired prompt. 2. System shows the list of contacts that match the prompt. - Use case ends. + +Use case ends. #### Extensions -1a. User searches for a contact using an empty prompt. -1a1. System shows an error message in the status message. -Use case ends. +- 1a. User searches for a contact using an empty prompt. + - 1a1. System shows an error message in the status message. + - Use case ends. -1a. No contact matches the prompt. -1a1. System shows a message in the status message that no contact matches the prompt. -Use case ends. +- 1b. No contact matches the prompt. + - 1b1. System shows a message in the status message that no contact matches the prompt. + - Use case ends. #### Use case: UC3 - Link a loan to contact #### MSS -1. User links a contact with a loan, specifying the contact name and loan details. +1. User links a contact with a loan, specifying the contact index and loan details. 2. System links the loan to the contact. 3. System shows the contact and the loan that was linked successfully in the status message. - Use case ends. -#### Extensions - -1a. Contact does not exist in the address book. -1a1. System shows an error message that no contact with the name exists. Use case ends. -1a. Loan details are invalid (e.g. empty, incomplete, wrong format). -1a1. System shows an error message that the loan details are invalid. -Use case ends. +#### Extensions -1a. Multiple contacts with the same name exist. -1a1. System shows list of contacts with the same name and asks user to choose one by index. -1a2. User chooses a contact by index. -1a3. System links the loan to the chosen contact. -1a4. System shows the contact and the loan that was linked successfully in the status message. -Use case ends. +- 1a. Person index is invalid (e.g. negative, zero, or larger than the list size) + - 1a1. System shows an error message in the status message. + - Use case ends. + +- 1b. Loan details are invalid (e.g. empty, incomplete, wrong format). + - 1b1. System shows an error message that the loan details are invalid. + - Use case ends. #### Use case: UC4 - View all loans linked to particular contact @@ -621,47 +615,41 @@ Use case ends. #### Extensions -1a. Contact name does not exist in the address book. -1a1. System shows an error message that no contact with the name exists. -Use case ends. - -1a. Multiple contacts with the same name exist. -1a1. System shows list of contacts with the same name and asks user to choose one by index. -1a2. User chooses a contact by index. -1a3. System shows the list of loans linked to the chosen contact. -Use case ends. +- 1a. Index is invalid (e.g. negative, zero, or larger than the list size) + - 1a1. System shows an error message in the status message. + - Use case ends. -#### Use case: UC5 - Clear a loan from contact +#### Use case: UC5 - Delete a loan from contact #### MSS 1. User views all loans linked to the contact (UC4). -2. User issues `clear` command with the name of contact and the index of loan to be cleared. +2. User issues `deleteloan` command with the index of loan to be cleared. 3. System clears the loan from the contact. 4. System shows the contact and the loan that was cleared successfully in the status message. Use case ends. #### Extensions -1a. Index is invalid (e.g. negative, zero, or larger than the list size) -1a1. System shows an error message that the index is invalid. -Use case ends. +- 1a. Index is invalid (e.g. negative, zero, or larger than the list size) + - 1a1. System shows an error message in the status message. + - Use case ends. #### Use case: UC6 - Mark a loan as returned #### MSS 1. User views all loans linked to the contact (UC4). -2. User marks a loan as returned specifying contact name and loan index. +2. User marks a loan as returned specifying the loan index. 3. System marks the loan as returned. 4. System shows the contact and the loan that was marked as returned successfully in the status message. Use case ends. #### Extensions -1a. Index is invalid (e.g. negative, zero, or larger than the list size) -1a1. System shows an error message that the index is invalid. -Use case ends. +- 1a. Index is invalid (e.g. negative, zero, or larger than the list size) + - 1a1. System shows an error message that the index is invalid. + - Use case ends. ### Non-Functional Requirements @@ -852,19 +840,19 @@ In particular, we are proud of the analytics feature, which we believe is a uniq Team size: 5 -1. After executing viewloan, if we call `viewloan 1`, the error message provided states "The person index is invalid". +1. After executing `viewloan`, if we call `viewloan 1`, the error message provided states "The person index is invalid". A better error message would be something like "Please run the list command before running this command again". 2. When entering an email for a new person in the form of `name@domain`(e.g. `jameshoexample@com`), an error message should be displayed and the new person shouldn't be added, as opposed to the current behaviour. This is because emails are typically in the form of `local-part@mail-server.domain`(`jameshoexample@gmail.com`) -3. Detect duplicate names, including case insensitive ones. For example, if we have a person named "John Doe", +3. Detect duplicate names, including case-insensitive ones. For example, if we have a person named "John Doe", we should not be able to add another person named "john doe". 4. Do not allow the `/` character inside any field when adding a new person, since it is a special character for prefixes. 5. Error message for the `linkloan` command should be more specific to the error, e.g. different error messages for incorrect date format and a start date before end date. -6. All fields should have a minimum length of 1 character and maximum length of 100 characters. +6. All fields should have a minimum length of 1 character and maximum length of 500 characters. Otherwise, an error message should be displayed, e.g. for name, "Name cannot be empty" or -"Name is cannot exceed 100 characters". Similar for other fields. +"Name is cannot exceed 500 characters". Similar for other fields. 7. Error messages related to indices should be more specific to the error. For example, if the user enters `viewloan 0`, the error message should be something like "INDEX must be a positive integer". If the user enters `viewloan 8` when there are only 7 contacts, the error message should be something like "INDEX must be between 1 and 7". From 211b34883ce38d019219738c7120bb3f7a855c92 Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:44:06 +0800 Subject: [PATCH 6/8] Fix grammar --- docs/DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 737515cbca0..e290170872d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -625,8 +625,8 @@ Use case ends. 1. User views all loans linked to the contact (UC4). 2. User issues `deleteloan` command with the index of loan to be cleared. -3. System clears the loan from the contact. -4. System shows the contact and the loan that was cleared successfully in the status message. +3. System deletes the loan from the contact. +4. System shows the contact and the loan that was deleted successfully in the status message. Use case ends. #### Extensions From 7c0c7ba7c0ec596bb896189c1f9a111fb54f0455 Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:51:37 +0800 Subject: [PATCH 7/8] Fix trailing white spaces --- docs/DeveloperGuide.md | 68 +++++++++++++++++++++--------------------- docs/UserGuide.md | 52 ++++++++++++++++---------------- 2 files changed, 60 insertions(+), 60 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index e290170872d..031b78269e5 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -52,7 +52,7 @@ title: Developer Guide ## **Acknowledgements** -This project is modified upon the [AddressBook-Level3 project](https://github.com/se-edu/addressbook-level3) project created by the SE-EDU initiative, +This project is modified upon the [AddressBook-Level3 project](https://github.com/se-edu/addressbook-level3) project created by the SE-EDU initiative, as well as the [tutorials](https://nus-cs2103-ay2021s1.github.io/tp/tutorials/AddRemark.html) and guides provided. -------------------------------------------------------------------------------------------------------------------- @@ -269,7 +269,7 @@ It contains the following fields that can prove to be useful for the user: * `latestLoanDate`: latest loan date of all loans * `latestReturnDate`: latest return date of active loans -The `AnalyticsCommand` class handles the viewing of analytics of any one person within the current contact list in view. +The `AnalyticsCommand` class handles the viewing of analytics of any one person within the current contact list in view. The following shows how the analytics class is used in the execution of a command to view the analytics of a person: ![AnalyticsSequenceDiagram](images/AnalyticsSequenceDiagram.png) @@ -299,7 +299,7 @@ The following shows how the analytics class is used in the execution of a comman #### Implementation -The `DeleteLoanCommand` class handles the deletion of a loan from the current contact in view, and executes the command +The `DeleteLoanCommand` class handles the deletion of a loan from the current contact in view, and executes the command after the input is parsed and transformed into an appropriate format. The parsing of the command is done by the `DeleteLoanCommandParser` class, which is responsible for parsing the user input. @@ -433,7 +433,7 @@ The `LinkLoanCommand` class is instantiated in the `LinkLoanCommandParser` class `LinkLoanCommandParser` is instantiated in the `AddressBookParser` class. Both classes are instantiated when the user enters a `linkloan` command, which needs to be of the format `linkloan INDEX v/VALUE s/START_DATE r/RETURN_DATE` where INDEX (a positive whole number) is the index of the person, VALUE (a positive decimal number) is the value of the loan, -and START_DATE and RETURN_DATE (both dates in the format yyyy-mm-dd) are the start and return dates of the loan respectively. +and START_DATE and RETURN_DATE (both dates in the format yyyy-mm-dd) are the start and return dates of the loan respectively. The `LinkLoanCommand` class contains the following fields which can prove to be useful for the user: @@ -459,7 +459,7 @@ Sequence diagram for the linking of loans: ##### Aspect: How the command parameters (i.e. loan details) are stored: -* **Alternative 1 (current choice):** The parameters are stored in a temporary `LinkLoanDescriptor`, +* **Alternative 1 (current choice):** The parameters are stored in a temporary `LinkLoanDescriptor`, which is then passed into the `LinkLoanCommand`. * Pros: As it follows the style of the `EditCommand`, it is simpler to debug. In addition, it follows the Single Responsibility Principle as then the `LinkLoanDescriptor` will be in charge of handling the loan details. @@ -496,7 +496,7 @@ The target user is a business person who satisfies the following criteria: * can type fast; * prefers typing to mouse interactions; * is reasonably comfortable using CLI apps; -* wants to manage contacts faster than a typical mouse/GUI driven app. +* wants to manage contacts faster than a typical mouse/GUI driven app. Typically, they want to answer the following questions quickly: @@ -563,7 +563,7 @@ Use case ends. #### Extensions - 1a. Index is invalid (e.g. negative, zero, or larger than the list size) - - 1a1. System shows an error message in the status message. + - 1a1. System shows an error message in the status message. - Use case ends. #### Use case: UC2 - Find a person by name @@ -578,11 +578,11 @@ Use case ends. #### Extensions - 1a. User searches for a contact using an empty prompt. - - 1a1. System shows an error message in the status message. + - 1a1. System shows an error message in the status message. - Use case ends. - 1b. No contact matches the prompt. - - 1b1. System shows a message in the status message that no contact matches the prompt. + - 1b1. System shows a message in the status message that no contact matches the prompt. - Use case ends. #### Use case: UC3 - Link a loan to contact @@ -602,7 +602,7 @@ Use case ends. - Use case ends. - 1b. Loan details are invalid (e.g. empty, incomplete, wrong format). - - 1b1. System shows an error message that the loan details are invalid. + - 1b1. System shows an error message that the loan details are invalid. - Use case ends. #### Use case: UC4 - View all loans linked to particular contact @@ -726,10 +726,10 @@ testers are expected to do more *exploratory* testing. ### Viewing loans 1. Viewing loans of a contact - 1. Prerequisites: At least one contact in the list. + 1. Prerequisites: At least one contact in the list. 1. Test case: `viewloan 1`
- Expected: All unreturned loans linked to the first contact in the current view are shown. + Expected: All unreturned loans linked to the first contact in the current view are shown. Note that if there are no contacts in view this command will not work. Perform `list` command if necessary. 1. Test case: `viewloan -a 1`
Expected: All loans linked to the first contact in the current view are shown. @@ -775,7 +775,7 @@ testers are expected to do more *exploratory* testing. 1. Prerequisites: At least one contact in the list. 1. Test case: `analytics 1`
- Expected: The analytics of the first contact in the current view are shown. + Expected: The analytics of the first contact in the current view are shown. Note that if there are no contacts in view this command will not work. Perform `list` command if necessary. ### Saving data @@ -783,13 +783,13 @@ testers are expected to do more *exploratory* testing. 1. Dealing with missing/corrupted data files 1. Close the app. Choose either to simulate a missing data file or corrupted data file, but not both. - 1. _To simulate a missing file, go to ./data and delete the JSON file inside, where . refers to + 1. _To simulate a missing file, go to ./data and delete the JSON file inside, where . refers to th directory containing the jar file._ 2. _To simulate a corrupted file, open the JSON file and delete a few characters from the middle of the file._ 1. Launch the app.
Expected: The app should launch successfully. A new JSON file should be created in the - ./data folder. For a missing file, the address book should show the sample data. + ./data folder. For a missing file, the address book should show the sample data. For a corrupted file, a blank address book should be shown. 2. After populating the address book with some data, repeat steps i to iv for the other of missing/corrupted. @@ -809,29 +809,29 @@ In either case, the app should close. ## **Appendix: Effort** -The main effort for this project was spent on creating the loan management features, which were not present in AB3. +The main effort for this project was spent on creating the loan management features, which were not present in AB3. These include: * linking a loan * viewing loans -* marking and unmarking a loan +* marking and unmarking a loan * deleting loans * editing loans * viewing analytics of a contact Much inspiration was drawn from the existing commands in AB3, as well as the tutorial to add a new command. -While the first five features looked similar, some required more effort than the others. +While the first five features looked similar, some required more effort than the others. The main difficulty we faced include how to implement the deletion and editing of loans. -We had to ensure deletion can only happen if that loan is currently within view, else there could -easily be mistakes. Likewise for editing a loan. The solution we came up with was to alter the -person and loan lists in view, based on the commands given. Based on the lists in view, we decide -if each operation can be done. +We had to ensure deletion can only happen if that loan is currently within view, else there could +easily be mistakes. Likewise for editing a loan. The solution we came up with was to alter the +person and loan lists in view, based on the commands given. Based on the lists in view, we decide +if each operation can be done. The analytics feature was the most challenging feature to implement. This is because we needed to define -the analytics that we wanted to show, and then implement the logic to calculate these analytics. The GUI, +the analytics that we wanted to show, and then implement the logic to calculate these analytics. The GUI, in particular the pie chart, was also challenging to implement. -Nonetheless, we managed to implement all the features we set out to do, and we are proud of the final product. +Nonetheless, we managed to implement all the features we set out to do, and we are proud of the final product. In particular, we are proud of the analytics feature, which we believe is a unique feature that sets our app apart. -------------------------------------------------------------------------------------------------------------------- @@ -840,23 +840,23 @@ In particular, we are proud of the analytics feature, which we believe is a uniq Team size: 5 -1. After executing `viewloan`, if we call `viewloan 1`, the error message provided states "The person index is invalid". +1. After executing `viewloan`, if we call `viewloan 1`, the error message provided states "The person index is invalid". A better error message would be something like "Please run the list command before running this command again". -2. When entering an email for a new person in the form of `name@domain`(e.g. `jameshoexample@com`), an error message should be displayed and - the new person shouldn't be added, as opposed to the current behaviour. This is because emails are typically +2. When entering an email for a new person in the form of `name@domain`(e.g. `jameshoexample@com`), an error message should be displayed and + the new person shouldn't be added, as opposed to the current behaviour. This is because emails are typically in the form of `local-part@mail-server.domain`(`jameshoexample@gmail.com`) -3. Detect duplicate names, including case-insensitive ones. For example, if we have a person named "John Doe", - we should not be able to add another person named "john doe". +3. Detect duplicate names, including case-insensitive ones. For example, if we have a person named "John Doe", + we should not be able to add another person named "john doe". 4. Do not allow the `/` character inside any field when adding a new person, since it is a special character for prefixes. -5. Error message for the `linkloan` command should be more specific to the error, e.g. different error messages for +5. Error message for the `linkloan` command should be more specific to the error, e.g. different error messages for incorrect date format and a start date before end date. -6. All fields should have a minimum length of 1 character and maximum length of 500 characters. -Otherwise, an error message should be displayed, e.g. for name, "Name cannot be empty" or +6. All fields should have a minimum length of 1 character and maximum length of 500 characters. +Otherwise, an error message should be displayed, e.g. for name, "Name cannot be empty" or "Name is cannot exceed 500 characters". Similar for other fields. -7. Error messages related to indices should be more specific to the error. +7. Error messages related to indices should be more specific to the error. For example, if the user enters `viewloan 0`, the error message should be something like "INDEX must be a positive integer". If the user enters `viewloan 8` when there are only 7 contacts, the error message should be something like "INDEX must be between 1 and 7". -8. Reject loans that are > 2 decimal places as invalid. +8. Reject loans that are > 2 decimal places as invalid. For those loans that are < 2 decimal places, change them to 2 decimal places format when displaying them instead of showing their exact value. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b1bc3e0d082..52ba940a5e1 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -39,7 +39,7 @@ title: User Guide ## Introduction LoanGuardPro is a desktop app for managing contacts, optimized for use via a Command Line Interface (CLI) while still -having the benefits of a Graphical User Interface (GUI). +having the benefits of a Graphical User Interface (GUI). If you are a moneylender looking to **keep track of your clients' contacts and loans**, LoanGuardPro is the right tool for you. It is in the form of an address book and supports basic contact and loan handling features like adding, editing, deleting, and viewing contacts and loans. @@ -120,40 +120,40 @@ There are three main categories of commands: Contact Management, Basic Loan Mana ### Contact Management - Action | Format, Examples -------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------- - **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` - **Clear** | `clear` - **Delete** | `delete INDEX`
e.g., `delete 3` - **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`
e.g.,`edit 2 n/James Lee e/jameslee@example.com` - **Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake` - **List** | `list` +| Action | Format, Examples | +|------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` | +| **Clear** | `clear` | +| **Delete** | `delete INDEX`
e.g., `delete 3` | +| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`
e.g.,`edit 2 n/James Lee e/jameslee@example.com` | +| **Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake` | +| **List** | `list` | ### Basic Loan Management - Action | Format, Examples ------------------|--------------------------------------------------------------------------------------------------------------- - **Link Loan** | `linkloan INDEX v/VALUE s/START_DATE r/RETURN_DATE`
e.g., `linkloan 1 v/500.00 s/2024-02-15 r/2025-02-15` - **View Loan** | `viewloan [FLAG] [INDEX]`
e.g., `viewloan 1`, `viewloan -a 1` - **Mark Loan** | `markloan INDEX`
e.g., `markloan 1` - **Unmark Loan** | `unmarkloan INDEX`
e.g., `unmarkloan 1` - **Edit Loan** | `editloan INDEX [v/VALUE] [s/START_DATE] [r/RETURN_DATE]`
e.g., `editloan 1 v/600.00 s/2024-02-15 r/2025-02-15` - **Delete Loan** | `deleteloan INDEX`
e.g., `deleteloan 1` +| Action | Format, Examples | +|-----------------|---------------------------------------------------------------------------------------------------------------------| +| **Link Loan** | `linkloan INDEX v/VALUE s/START_DATE r/RETURN_DATE`
e.g., `linkloan 1 v/500.00 s/2024-02-15 r/2025-02-15` | +| **View Loan** | `viewloan [FLAG] [INDEX]`
e.g., `viewloan 1`, `viewloan -a 1` | +| **Mark Loan** | `markloan INDEX`
e.g., `markloan 1` | +| **Unmark Loan** | `unmarkloan INDEX`
e.g., `unmarkloan 1` | +| **Edit Loan** | `editloan INDEX [v/VALUE] [s/START_DATE] [r/RETURN_DATE]`
e.g., `editloan 1 v/600.00 s/2024-02-15 r/2025-02-15` | +| **Delete Loan** | `deleteloan INDEX`
e.g., `deleteloan 1` | ### Advanced Loan Management - Action | Format, Examples ----------------|------------------------------------------- - **Analytics** | `analytics INDEX`
e.g., `analytics 1` +| Action | Format, Examples | +|---------------|-------------------------------------------| +| **Analytics** | `analytics INDEX`
e.g., `analytics 1` | ### Miscellaneous - Action | Format ---------|----------------- - **Exit** | `exit` - **Help** | `help` +| Action | Format | +|----------|--------| +| **Exit** | `exit` | +| **Help** | `help` | -------------------------------------------------------------------------------------------------------------------- @@ -396,7 +396,7 @@ Expected Behaviour: * A success message in the form of "Loan edited: [loan details]" will be shown. * The loan will be updated in the loan list. -Examples: +Examples: * `editloan 1 v/600.00 s/2024-02-15 r/2025-02-15` * Edits the loan at the 1st position in the loan list to have a value of $600.00, a start date of 15th Feb 2024, and a @@ -412,7 +412,7 @@ Format: `deleteloan INDEX` Parameters Restrictions: -* The index refers to the index number shown in the displayed loan list. +* The index refers to the index number shown in the displayed loan list. The index **must be a positive integer** 1, 2, 3, …​, and it must not exceed the number of loans shown in the list. Expected Behaviour: From 036eec4d94dcefe883bf5549f7d6ed9c550bdb57 Mon Sep 17 00:00:00 2001 From: narwhalsilent <110954060+narwhalsilent@users.noreply.github.com> Date: Sun, 14 Apr 2024 23:52:41 +0800 Subject: [PATCH 8/8] New line at the end of file Thanks checkstyle --- docs/AboutUs.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 9537a4dc4a8..41ed704fe65 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -62,4 +62,4 @@ writing the developer guide. [[portfolio](https://github.com/xiaorui-ui)] * Role: Developer for basic loan management and DG documentation. -* Responsibilities: Implementing `deleteloan`, `markloan`, and `unmarkloan` commands; writing the developer guide. \ No newline at end of file +* Responsibilities: Implementing `deleteloan`, `markloan`, and `unmarkloan` commands; writing the developer guide.