From 9953ded0fb110abdefb124997a73162bdf575e84 Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 13 Nov 2023 15:20:29 +0800 Subject: [PATCH 1/9] Add linebreaks for last contacted time --- docs/DeveloperGuide.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f64bd0bed38..57f47db326a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -358,7 +358,7 @@ The following sequence diagram shows how the remove attendee operation works:
-### Keeping track of last meeting with contact +### Last Contacted Time feature Keeping track of the user's last meeting with their contact is facilitated by the addition of a `LastContactedTime` object to `Person`. Thus, each instance of `Person` will contain an immutable `LastContactedTime` object that stores the user's last meeting with that contact. @@ -370,16 +370,22 @@ The following diagram summarizes steps 2 to 6: Step 2. Entering a correct command with the `Enter` key then calls `execute` on `LogicManager`. + Step 3. `LogicManager` then calls `AddressBookParser#parseCommand(commandText)` on the `commandText` String, which recognizes that it is an `addc` command. + Step 4. `AddressBookParser` then calls `AddCommandParser#parse()` on the command arguments. + Step 5. `AddCommandParser` then calls `ParserUtil#parseContactTime()` which parses the last contacted time and returns a `LocalDateTime` object called `lastContactedTime`. + Step 6. The `lastContactedTime` object is then passed to the `Person` constructor, which creates a new `Person` that calls the `LastContactedTime` constructor with it. The following diagram summarizes steps 7 and 8: Step 7. The completed `Person` is passed to an `AddCommand` constructor which return a new `AddCommand` that can be executed. + Step 8. `LogicManager` then executes the `AddCommand` on the application model. + Step 9. Further execution is carried out, which like before adds the `Person` object to the list of `Person`s in the `Model`, and updates the `Storage` with this new `Person`. #### Design Consideration: Updating last meeting with contact From 2bbd81bb051fd3a8da6bd9c2bf9d98e6d35edcae Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 13 Nov 2023 15:46:44 +0800 Subject: [PATCH 2/9] Edit and move saving data section --- docs/DeveloperGuide.md | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 57f47db326a..d9bc35291f4 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -411,6 +411,18 @@ The list of valid statuses is stored as an `Enumeration` object for the followin `Status` is implemented and utilized in a similar manner to [`LastContactedTime`](#keeping-track-of-last-meeting-with-contact). +### Saving data + +- The address book is saved in a JSON file after every command execution. The default path for this file is `/data/outbook.json`, found in the same directly as the application JAR file. + +- The JSON file should not be directly edited. Incorrectly editing the file will result in OutBook not being able to load the address book and data will be lost. If directly editing the file is deemed necessary, create a backup before doing so. + +- Under normal operation through the application, the JSON file will not become corrupted. If for any reason the file does become corrupted, OutBook will not be able to load the data and will display a blank address book. + + - If data recovery is to be attempted, do not execute any commands. Exit the application. Try to edit the JSON file such that it adheres to the parameters for each field. If data recovery is successful, OutBook will load the address book on boot. + + - If not, the data will be lost. The address book has can only be restored by executing commands through the application. +
## **Planned Enhancements** @@ -871,18 +883,3 @@ Repeat the contact test cases with meeting commands 1. Use `mark 1` to mark the first meeting as completed
Expected: Meeting will be shown as completed and the attendees that are in the meeting will have their last contacted updated to the end time of the meeting. -### Saving data - -1. Dealing with missing/corrupted data files - - 1. If you have added, edited or deleted anything, there should be a new folder that appears in the folder that you placed OutBook.jar in. - 2. Open file and open the `outbook.json` file. In the persons section, delete any line that has name, phone, email, etc... - 3. Run the program again with `java -jar OutBook.jar`
- Expected: You will open up to a blank OutBook. At this point if you were to add, edit or delete anything, the data you had previously will be deleted and saved over with the new data you just added, losing all you data. - -2. Recovering from missing/corrupted data files - - 1. After completed the test above, add back the field that was deleted in step 2. If you do not know what was deleted, place a placeholder for that specific field. - 1. All persons will have a name, phone, email, lastContactedTime, status, remark and tags. - 2. Meetings have a similar structure with title, location, start, end, attendees, tags, status. - 2. Run the program again, and you will see the rest of the data with the placeholder that you put. From e6cb26cbb0a0b24555c08a7853db7bccaa3ab61e Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 13 Nov 2023 16:09:20 +0800 Subject: [PATCH 3/9] Add manual testing guide for data storage, fix formatting --- docs/DeveloperGuide.md | 219 ++++++++++++++++++++++++----------------- 1 file changed, 131 insertions(+), 88 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d9bc35291f4..3c414993466 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -32,7 +32,7 @@ title: OutBook Developer Guide - [Non-Functional Requirements](#non-functional-requirements) - [Glossary](#glossary) - [Appendix: Instructions for manual testing](#appendix-instructions-for-manual-testing) - - [Launch and shutdown](#launch-and-shutdown) + - [Launch and shutdown](#launch-and-shutdown) - [Adding a person](#adding-a-person) - [Editing a person](#editing-a-person) - [Deleting a person](#deleting-a-person) @@ -65,6 +65,7 @@ Refer to the guide [_Setting up and getting started_](SettingUp.md).
:bulb: **Tip:** The `.puml` & `.uxf` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides (for `.puml`)](https://se-education.org/guides/tutorials/plantUml.html) or [_UMLet_ (for `.uxf`)](https://www.umlet.com) to learn how to create and edit diagrams. +
@@ -330,7 +331,7 @@ User can specify a Person to add as an Attendee to a specified Meeting. To avoid storing an entire `JsonAdaptedPerson` object within the `JsonAdaptedMeeting` every time a `Person` is added to a `Meeting`, an `Attendee` class is created to store a unique identifier for the `Person` added. -As every `Person` has a unique name in the current iteration of OutBook, it is used as the unique identifier. +As every `Person` has a unique name in the current iteration of OutBook, it is used as the unique identifier. `Attendee` is implemented in the following way: - `Attendee(attendeeName)` -- Initialized with a String obtained from `Person.getName().toString()` @@ -396,9 +397,11 @@ This is facilitated by the addition of the `MarkDoneCommand`. When a meeting is
### Keeping track of the status of a contact + Each instance of `Person` contains an immutable `Status` object that allows the user to specify which stage of the insurance sales process a contact is at, if applicable. At the current iteration of OutBook, a status must be one of `NIL`, `Prospective`, `Active`, `Inactive`, `Renewal`, `Claimant` (case-insensitive). This is tailored according to the responsibilities of an insurance agent, which include: + - Promoting relevant insurance policies to prospective clients - Keeping active clients updated on their policies - Finding out why inactive clients did not renew their policies @@ -406,6 +409,7 @@ This is tailored according to the responsibilities of an insurance agent, which - Filing and following up on claims on behalf of their clients The list of valid statuses is stored as an `Enumeration` object for the following benefits: + - Readability: e.g. `StatusList.NIL` is self-explanatory and easier to understand than something like `StatusList[0]` if an index data structure were to be used. - Maintainability: If the list of valid statuses changes or expands in the future, it's much easier to update an enumeration. This centralizes the changes in one place, making the code more maintainable compared to scattered string constants. @@ -417,11 +421,11 @@ The list of valid statuses is stored as an `Enumeration` object for the followin - The JSON file should not be directly edited. Incorrectly editing the file will result in OutBook not being able to load the address book and data will be lost. If directly editing the file is deemed necessary, create a backup before doing so. -- Under normal operation through the application, the JSON file will not become corrupted. If for any reason the file does become corrupted, OutBook will not be able to load the data and will display a blank address book. +- Under normal operation through the application, the JSON file will not become corrupted. If for any reason the file does become corrupted, OutBook will not be able to load the data and will display a blank address book. - - If data recovery is to be attempted, do not execute any commands. Exit the application. Try to edit the JSON file such that it adheres to the parameters for each field. If data recovery is successful, OutBook will load the address book on boot. + - If data recovery is to be attempted, do not execute any commands. Exit the application. Try to edit the JSON file such that it adheres to the parameters for each field. If data recovery is successful, OutBook will load the address book on boot. - - If not, the data will be lost. The address book has can only be restored by executing commands through the application. + - If not, the data will be lost. The address book has can only be restored by executing commands through the application.
@@ -511,6 +515,7 @@ The following activity diagram summarizes what happens when a user executes a ne As described in the implementation notes for `viewc` and `viewm` above, the currently displayed `Person` and `Meeting` objects will be cleared when certain commands such as `deletec` and `deletem` are used on a separate object, which is necessary due to the way the view commands are currently implemented. Additional details are in the implementation section referenced above. We plan to remove the need to handle such edge cases by modifying the way both view commands are implemented. One potential method is as follows: + - Revert the implementation of `viewc` and `viewm` to the original method of storing a copy of the viewed object, rather than the viewed index. - Modify the behaviour of `editc`, `editm`, `deletec` and `deletem` such that when they are used on the original object currently being viewed, the stored copy will be edited/deleted accordingly. - This allows the currently viewed `Person` or `Meeting` object to persist regardless of command usage, and only be cleared when the object is deleted, or everything is cleared via the `clear` command. @@ -522,15 +527,19 @@ We plan to remove the need to handle such edge cases by modifying the way both v ## **Effort** ### Effort in Model and Storage + Compared to AB3, which only deals with 1 entity type, Person. OutBook deals with 2 entity types and allows significant interaction between them. This means that the model had to be extended and storage had to follow along with it. jackson does not allow storage of pointers, thus it became necessary to work around that using the unique fields on both Person and Meeting. ### Effort in reducing coupling + Compared to AB3, where there were no interaction between entities. OutBook was designed for professionals to manage both their contacts and their meetings, this inherently means that there needs to be interaction between both entities. This interaction increases coupling and decreases cohesion. In order to combat this, many instances of facade, command and observer design patterns were used. ### Effort in implementing many features + OutBook needed to make managing contacts and meetings an efficient process, this meant that there needed to be many quality of life features to make the professional's life easier. Therefore, much effort was dedicated to making data easily retrievable by making almost every field searchable. ### Effort in managing interactions between entities + OutBook required one meeting to interact with many other contacts and for one contact to interact with many other meetings. Because of the interactions between both classes, a change in 1 object must be reflected in everything that references the object while still being immutable. This required thorough testing and analysis to keep track of the interactions and account for them while we were adding more features. ## **Documentation, logging, testing, configuration, dev-ops** @@ -562,7 +571,7 @@ OutBook required one meeting to interact with many other contacts and for one co Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` -| Priority | As a …​ | I want to …​ | So that I can…​ | +| Priority | As a …​ | I want to …​ | So that I can…​ | | -------- | ----------------------------------------- | ------------------------------- | ------------------------------------- | | `[EPIC]` | agent who has meetings | have a meeting schedule | keep track of them | | `* * *` | agent | create new meetings | | @@ -726,7 +735,6 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli 1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed. -
### Glossary @@ -739,6 +747,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli - **Private contact detail**: A contact detail that is not meant to be shared with others --- +
## **Appendix: Instructions for manual testing** @@ -749,137 +758,171 @@ Given below are instructions to test the app manually. :information_source: **Note:** These instructions only provide a starting point for testers to work on; testers are expected to do more *exploratory* testing. +### Launch and shutdown +Initial launch -### Launch and shutdown +1. Download the jar file and copy into an empty folder -1. Initial launch +2. In your terminal, navigate to the folder. - 1. Download the jar file and copy into an empty folder +3. Run the file with `java -jar OutBook.jar`. - 2. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. - 1. If this fails, open command prompt and navigate to the empty folder you just created. - 2. use command `java -jar OutBook.jar` to see if it runs. If it runs continue as per normal. +Saving window preferences -2. Saving window preferences +1. Resize the window and/or move the window. - 1. Resize the window to an optimum size. Move the window to a different location. Close the window. +2. Close the window. - 2. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained. +3. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained. -3. Exiting - 1. input command `exit`.
Expected: OutBook closes and shutdown. +Exiting + +1. Input command `exit`.
+ Expected: OutBook closes and shutdown. ### Adding a person -1. Adding a person while all persons are being shown +Adding a person while all persons are being shown - 1. Prerequisites: List all persons using the `listc` command. Multiple persons in the list. +1. Prerequisites: List all persons using the `listc` command. Multiple persons in the list. - 2. Test case: `addc n/John Doe p/12345678 e/JohnDoe@gmail.com`
- Expected: Contact John Doe is created wth phone number 12345678 and email JohnDoe@gmail.com. The contact should be the first in the list as it does not have a last contacted date. Details of the added contact shown in the status message. +2. Test case: `addc n/John Doe p/12345678 e/JohnDoe@gmail.com`
+ Expected: Contact John Doe is created wth phone number 12345678 and email JohnDoe@gmail.com. The contact should be the first in the list as it does not have a last contacted date. Details of the added contact shown in the status message. - 3. Test case: `addc n/John Not Doe p/87654321 e/JohnNotDoe@gmail.com lc/10.10.2023 1000 s/Active t/tagOne`
Expected: Contact John Not Doe is created wth phone number 87654321, email JohnNotDoe@gmail.com, last contacted at 10.10.2023 1000, status as Active and is tagged with tagOne. Details of the added contact shown in the status message. +3. Test case: `addc n/John Not Doe p/87654321 e/JohnNotDoe@gmail.com lc/10.10.2023 1000 s/Active t/tagOne`
Expected: Details of the added contact shown in the status message. - 4. If you were to repeat any of the test cases above, you will encounter a duplicate error +4. If you were to repeat 2 or 3 above, an error while be shown due to duplicate entries. - 5. Test case: `addc n/John Doe`
- Expected: No person is added. Error details shown in the status message. +5. Test case: `addc n/John Doe`
+ Expected: No person is added. Error details shown in the status message. - 6. Test case: `addc p/12345678`
Expected: Similar to previous. +6. Test case: `addc p/12345678`
Expected: Similar to 5. - 7. Test case: `addc e/JohnDoe@gmail.com`
Expected: Similar to previous. +7. Test case: `addc e/JohnDoe@gmail.com`
Expected: Similar to 5. - 8. Other incorrect delete commands to try: `addc`, `addc 1` and any `addc` command that does not have `n/NAME`, `p/PHONE_NUMBER` & `e/EMAIL`
- Expected: Similar to previous. +8. Other incorrect delete commands to try: `addc`, `addc 1` and any `addc` command that does not have `n/NAME`, `p/PHONE_NUMBER` & `e/EMAIL`
+ Expected: Similar to 5. -2. Adding a person while not all persons are being shown. - 1. Prerequisites: Filter the contact list by using the `findc` command. If you are using the default data given, input `findc n/Yu`.
Expected: Only Bernice Yu is shown in the contact list. +Adding a person while not all persons are being shown. - 2. Repeat Test case from `Adding a person 1.2`.
- Expected: similar to 1.2. +1. Prerequisites: Filter the contact list by using the `findc` command. If you are using the default data given, input `findc n/Yu`.
Expected: Only Bernice Yu is shown in the contact list. - 3. Adding a contact automatically list all contact after it is done. +2. Add a person using the `addc` command with correct parameters. -### Editing a person +3. Adding a contact automatically shows all contacts. -1. Editing a person +### Editing a person - 1. Test case: `editc 1 n/John Doe p/12345678 e/JohnDoe@gmail.com`
- Expected: The first person in the contact list is has its details replaced with the given arguments. Details of the added contact shown in the status message. +1. Test case: `editc 1 n/John Doe p/12345678 e/JohnDoe@gmail.com`
+ Expected: The first person in the contact list is has its details replaced with the given arguments. Details of the added contact shown in the status message. - 2. If you were to edit a contact so that it has the same name or phone number or email to any other contact, you will encounter a duplicate error +2. If you were to edit a contact so that it has the same name or phone number or email to any other contact, you will encounter a duplicate error - 3. Other incorrect delete commands to try: `editc` and `editc 1`, you will receive a required index error and a required field error. +3. Other incorrect delete commands to try: `editc` and `editc 1`, you will receive a required index error and a required field error. ### Deleting a person -1. Deleting a person while all persons are being shown +Deleting a person while all persons are being shown + +1. Prerequisites: List all persons using the `listc` command. Multiple persons in the list. - 1. Prerequisites: List all persons using the `listc` command. Multiple persons in the list. +2. Test case: `delete 1`
+ Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. - 2. Test case: `delete 1`
- Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. +3. Test case: `delete 0`
+ Expected: No person is deleted. Error details shown in the status message. - 3. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. +4. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ Expected: Similar to 3. - 4. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous. +Deleting a person while the list of persons is filtered. -2. Deleting a person while not all persons are being shown. - 1. Prerequisites: Filter the contact list by using the `findc` command. If you are using the default data given, input `findc n/Yu`.
Expected: Only Bernice Yu is shown in the contact list. +1. Prerequisites: Filter the contact list by using the `findc` command. If you are using the default data given, input `findc n/Yu`.
Expected: Only Bernice Yu is shown in the contact list. - 2. Test case: `delete 1`
- Expected: Bernice Yu is deleted from the list. Nothing should be shown in the list. Details of the deleted contact shown in the status message. +2. Test case: `delete 1`
+ Expected: Bernice Yu is deleted from the list. Nothing should be shown in the list. Details of the deleted contact shown in the status message. - 3. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. +3. Test case: `delete 0`
+ Expected: No person is deleted. Error details shown in the status message. - 4. Other incorrect delete commands to try: `delete`, `deletec` `delete x` (where x is larger than the list size)
- Expected: Similar to previous. +4. Other incorrect delete commands to try: `delete`, `deletec X` (where X is larger than the list size)
+ Expected: Similar to 3. ### View Contact -1. View contact without list changing - 1. use `viewc 1` to view the first contact
- Expected: the first contact will have its details shown on the details panel. -2. View contact with list changing - 1. Do the same test as before - 2. Edit the first contact to have a later last contacted date than the second contact.
- Expected: The second contact will now take first place in the list and the details panel will change to show the new first place contact. +View contact + +1. Use `viewc 1` to view the first contact
+ Expected: the first contact will have its details shown on the details panel. + +View contact while contact is being edited + +1. Use `viewc 1` to view the first contact
+2. Edit the first contact to have a later last contacted date than the second contact.
+ Expected: The second contact will be sorted to the top of the list, and the details of this contact will be displayed instead. ### Meeting Tests Repeat the contact test cases with meeting commands -1. Add Meeting commands - - `adddm m/Test Meeting 1 a/Test Location 1 s/02.10.2023 1000 e/02.10.2023 1200` -2. Find Meeting commands - - `findm m/Meeting` -3. Edit Meeting commands - - `editm m/Changed Meeting Name` -4. Delete Meeting commands - - `deletem 1` -5. View Meeting commands - - `viewm 1` + +1. Add Meeting commands
+ `addm m/Test Meeting 1 a/Test Location 1 s/02.10.2023 1000 e/02.10.2023 1200` +2. Find Meeting commands
+ `findm m/Meeting` +3. Edit Meeting commands
+ `editm m/Changed Meeting Name` +4. Delete Meeting commands
+ `deletem 1` +5. View Meeting commands
+ `viewm 1` ### Meeting Attendees -1. Add Meeting Attendee - 1. Use `addmc 1 2`
- Expected: The second person in the current person list will be added to the first meeting in the current meeting list. - 2. Instead of using 1 or 2, use indexes that are more than the amount of meetings or persons.
- Expected: An error will be shown which indicated the index which is out of bounds. - 3. Repeat 1 and 2 with filtered lists using `findc` and `findm` -2. Remove Meeting Attendee - 1. Prerequisite: There must be an attendee in the meeting you are looking at. To look at the attendees for a meeting, use `viewm` on the meeting. In this case we will look at the first meeting. - 2. The attendees will be listed with an index in the meeting. Use `rmmc 1 1`.
- Expected: The meeting will have its first attendee removed. +Add Meeting Attendee + +1. Use `addmc 1 2`
+ Expected: The second person in the current person list will be added to the first meeting in the current meeting list. +2. Instead of using 1 or 2, use indexes that are more than the amount of meetings or persons.
+ Expected: An error will be shown which indicated the index which is out of bounds. +3. Repeat 1 and 2 with filtered lists using `findc` and `findm` + +Remove Meeting Attendee + +1. Prerequisite: There must be an attendee in the meeting you are looking at. To look at the attendees for a meeting, use `viewm` on the meeting. In this case we will look at the first meeting. +2. The attendees will be listed with an index in the meeting. Use `rmmc 1 1`.
+ Expected: The meeting will have its first attendee removed. ### Mark Meetings -1. Mark a Meeting as completed - 1. Use `mark 1` to mark the first meeting as completed
- Expected: Meeting will be shown as completed and the attendees that are in the meeting will have their last contacted updated to the end time of the meeting. +Mark a Meeting as completed + +1. Use `mark 1` to mark the first meeting as completed
+ Expected: Meeting will be shown as completed and the attendees that are in the meeting will have their last contacted updated to the end time of the meeting. + +### Data Storage + +No save file + +1. Launch OutBook
+ Expected: The default address book is loaded. + +2. Execute a command
+ Expected: A JSON file is created at the save location, by default `/data/outbook.json` + +Save file present + +1. Launch OutBook
+ Expected: The saved address book is loaded. + +2. Execute a command
+ Expected: The JSON is updated according to the command. + +Save file present but corrupted + +1. Launch OutBook
+ Expected: A blank address book is loaded. +2. Execute a command
+ Expected: The save file is overridden with the new address book. \ No newline at end of file From 72d040943ec05e82b14ab56a52a03945c0b21206 Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 13 Nov 2023 16:12:01 +0800 Subject: [PATCH 4/9] Fix alert box closing tag --- docs/DeveloperGuide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3c414993466..32ec86703d2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -754,9 +754,10 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Given below are instructions to test the app manually. -
+
:information_source: **Note:** These instructions only provide a starting point for testers to work on; testers are expected to do more *exploratory* testing. +
### Launch and shutdown From 9baa12dd750b34c8f158a27a1b93bca32477d0c5 Mon Sep 17 00:00:00 2001 From: justin soong <91204066+juzzztinsoong@users.noreply.github.com> Date: Mon, 13 Nov 2023 16:58:28 +0800 Subject: [PATCH 5/9] Update DeveloperGuide.md fix small div box formatting error --- docs/DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f64bd0bed38..2c9c3e5357a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -727,9 +727,9 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Given below are instructions to test the app manually. -
+
:information_source: **Note:** These instructions only provide a starting point for testers to work on; -testers are expected to do more *exploratory* testing. +testers are expected to do more *exploratory* testing.
From 7948dad7f883cda567af48fbcce20a22899ae6b2 Mon Sep 17 00:00:00 2001 From: justin soong <91204066+juzzztinsoong@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:01:10 +0800 Subject: [PATCH 6/9] Update DeveloperGuide.md update use case to use cases --- docs/DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f64bd0bed38..faf00026c7e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -28,7 +28,7 @@ title: OutBook Developer Guide - [Appendix: Requirements](#appendix-requirements) - [Product scope](#product-scope) - [User stories](#user-stories) - - [Use case](#use-case) + - [Use cases](#use-cases) - [Non-Functional Requirements](#non-functional-requirements) - [Glossary](#glossary) - [Appendix: Instructions for manual testing](#appendix-instructions-for-manual-testing) @@ -571,7 +571,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli
-### Use case +### Use cases **Use case: Add a contact to a meeting** From 04368d536af8efe04841099c43ce207d4863e35d Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 13 Nov 2023 17:33:26 +0800 Subject: [PATCH 7/9] Add DG section for mark meeting --- docs/DeveloperGuide.md | 23 +++++++-- ...eateMarkMeetingCommandSequenceDiagram.puml | 41 ++++++++++++++++ .../MarkMeetingCommandSequenceDiagram.puml | 40 ++++++++++++++++ .../mark/MarkMeetingSequenceDiagram.puml | 34 ++++++++++++++ .../mark/UpdateAttendeeSequenceDiagram.puml | 44 ++++++++++++++++++ docs/images/mark/CreateMarkMeetingCommand.png | Bin 0 -> 22352 bytes .../mark/Execute MarkMeetingCommand.png | Bin 0 -> 28674 bytes docs/images/mark/MarkMeeting.png | Bin 0 -> 22489 bytes .../Update Attendee LastContactedTime.png | Bin 0 -> 26722 bytes 9 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml create mode 100644 docs/diagrams/mark/MarkMeetingCommandSequenceDiagram.puml create mode 100644 docs/diagrams/mark/MarkMeetingSequenceDiagram.puml create mode 100644 docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml create mode 100644 docs/images/mark/CreateMarkMeetingCommand.png create mode 100644 docs/images/mark/Execute MarkMeetingCommand.png create mode 100644 docs/images/mark/MarkMeeting.png create mode 100644 docs/images/mark/Update Attendee LastContactedTime.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 32ec86703d2..fa02e5718bc 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -389,10 +389,27 @@ Step 8. `LogicManager` then executes the `AddCommand` on the application model. Step 9. Further execution is carried out, which like before adds the `Person` object to the list of `Person`s in the `Model`, and updates the `Storage` with this new `Person`. -#### Design Consideration: Updating last meeting with contact +### Mark meeting as complete feature -Solution: -This is facilitated by the addition of the `MarkDoneCommand`. When a meeting is marked as done, the attendees of the meeting will be updated with their LastContactedTime field updated to the end time of the meeting. +A meeting can be marked as complete using the `mark` command. The command also updates the last contacted time of its attendees to the ending time of the meeting, if the meeting end time is after the attendees current last contacted time. + +This is the overall sequence diagram of marking a meeting as complete. + + + +When a mark command is entered, it is first parsed by the respective `Parser`s to create a `MarkMeetingCommand` object. + + + +When the command is executed, the meeting is marked as complete by creating a new `Meeting` with the same fields except for status, and this meeting is updated to the `Model`. + + + +Following this, the last contacted time of all the attendees of the meeting are updated to the end time of the meeting. + + + +Finally, a `CommandResult` is produced and returned to the `LogicManager`.
diff --git a/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml b/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml new file mode 100644 index 00000000000..7fdedadf81f --- /dev/null +++ b/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml @@ -0,0 +1,41 @@ +@startuml CreateMarkMeetingCommand +!include ../style.puml + +title Create MarkMeetingCommand + +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":MarkMeetingCommandParser" as MarkMeetingCommandParser LOGIC_COLOR +participant "command:MarkMeetingCommand" as MarkMeetingCommand LOGIC_COLOR + +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("mark 1") +activate AddressBookParser + +create MarkMeetingCommandParser +AddressBookParser -> MarkMeetingCommandParser +activate MarkMeetingCommandParser + +MarkMeetingCommandParser --> AddressBookParser +deactivate MarkMeetingCommandParser + +AddressBookParser -> MarkMeetingCommandParser : parse("1") +activate MarkMeetingCommandParser + +create MarkMeetingCommand +MarkMeetingCommandParser -> MarkMeetingCommand +activate MarkMeetingCommand + +MarkMeetingCommand --> MarkMeetingCommandParser : command +deactivate MarkMeetingCommand + +MarkMeetingCommandParser --> AddressBookParser : command +deactivate MarkMeetingCommandParser + +'Hidden arrow to position the destroy marker below the end of the activation bar. +MarkMeetingCommandParser -[hidden]-> AddressBookParser +destroy MarkMeetingCommandParser + +AddressBookParser --> LogicManager : command +deactivate AddressBookParser \ No newline at end of file diff --git a/docs/diagrams/mark/MarkMeetingCommandSequenceDiagram.puml b/docs/diagrams/mark/MarkMeetingCommandSequenceDiagram.puml new file mode 100644 index 00000000000..f83e53a5d84 --- /dev/null +++ b/docs/diagrams/mark/MarkMeetingCommandSequenceDiagram.puml @@ -0,0 +1,40 @@ +@startuml Execute MarkMeetingCommand +!include ../style.puml + +title Execute MarkMeetingCommand + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant "command:MarkMeetingCommand" as MarkMeetingCommand LOGIC_COLOR +participant "result:CommandResult" as CommandResult LOGIC_COLOR +endbox + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("mark 1") +activate LogicManager + +ref over LogicManager, MarkMeetingCommand : Create MarkMeetingCommand + +LogicManager -> MarkMeetingCommand : execute(model) +activate MarkMeetingCommand + +ref over MarkMeetingCommand, Model : Mark Meeting + +ref over MarkMeetingCommand, Model : Update Attendee LastContactedTime + +create CommandResult +MarkMeetingCommand -> CommandResult +activate CommandResult + +CommandResult --> MarkMeetingCommand +deactivate CommandResult + +MarkMeetingCommand --> LogicManager : result +deactivate MarkMeetingCommand + +[<--LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml b/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml new file mode 100644 index 00000000000..56e7adea74d --- /dev/null +++ b/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml @@ -0,0 +1,34 @@ +@startuml MarkMeeting +!include ../style.puml + +title Mark Meeting + +box Logic LOGIC_COLOR_T1 +participant "command:MarkMeetingCommand" as MarkMeetingCommand LOGIC_COLOR +endbox + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant "markedMeeting:Meeting" as Meeting MODEL_COLOR +end box + +activate MarkMeetingCommand + +MarkMeetingCommand -> MarkMeetingCommand : markMeeting(meeting) +activate MarkMeetingCommand + +create Meeting +MarkMeetingCommand -> Meeting +activate Meeting + +Meeting --> MarkMeetingCommand : markedMeeting +deactivate Meeting + +MarkMeetingCommand --> MarkMeetingCommand : markedMeeting +deactivate MarkMeetingCommand + +MarkMeetingCommand -> Model : setMeeting(meeting, markedMeeting) +activate Model + +Model --> MarkMeetingCommand +deactivate Model \ No newline at end of file diff --git a/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml b/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml new file mode 100644 index 00000000000..6bb92cb3c10 --- /dev/null +++ b/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml @@ -0,0 +1,44 @@ +@startuml Update Attendee LastContactedTime +!include ../style.puml + +title Update Attendee LastContactedTime + +box Logic LOGIC_COLOR_T1 +participant "command:MarkMeetingCommand" as MarkMeetingCommand LOGIC_COLOR +endbox + +box Model MODEL_COLOR_T1 +participant "updatedPerson:Person" as Person MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +end box + +activate MarkMeetingCommand + +loop for each attendee + +MarkMeetingCommand -> Model : getPerson(attendee) +activate Model + +Model --> MarkMeetingCommand : person +deactivate Model + +MarkMeetingCommand -> MarkMeetingCommand : updateLastContactedTime(person, time) +activate MarkMeetingCommand + +create Person +MarkMeetingCommand -> Person +activate Person + +Person -> MarkMeetingCommand : updatedPerson +deactivate Person + +MarkMeetingCommand --> MarkMeetingCommand : updatedPerson +deactivate MarkMeetingCommand + +MarkMeetingCommand -> Model : setPerson(person, updatedPerson) +activate Model + +Model --> MarkMeetingCommand +deactivate Model + +end \ No newline at end of file diff --git a/docs/images/mark/CreateMarkMeetingCommand.png b/docs/images/mark/CreateMarkMeetingCommand.png new file mode 100644 index 0000000000000000000000000000000000000000..6e629138dc100aff2dd1e8012e5be23f4b397328 GIT binary patch literal 22352 zcmdqJcT`hb*zSu36)bE(M5IZt66qk#21pY@5krd#0qGE$bVU&>9YRM1M5Tw`f*=B+ zDoF1Tf(QgiBq6k%8Oz?f&%Wb3FDSV z>RdQ)Oh>oNi;ivweBVy+$$O!zAHWYWPt9wd)~;^8PHN;Z zP|hM*bos@bC{8C2H5Y+nd|?J`yDj_<`SWGYYxA7VB8bb$@=CBWx+T1SdQ$yWR3zKi zLWcVNrur3fm)@3tzEt5XMfuB%;r70qT_3-u1Um(}dYh%Th270g%a%UCsr#(jBFz3< z(=Fyk+aQSxzD+w%E3UM?>o{Z4j5zA^tfI6v@A376jxS@!ZDXNfj{`snS5I+IsY zzO#ziCTg_iO;WX!F>^3_Bjm*RhZ~hc@x=}v31JZ-qvE}lH>JjYnF;1C@D&tsUzmY!agzJo;jky%(PV-^J;4z!!)aR==L?V>V^KLg3MV9dU z(ploeA05GS@A)S8#pAV!VC^eH+=JBOHJxX={;xL#Cc}khc9z<#>Fe~cYA`!AAKEBA zH2zIlc?`lWdmXu=9jc0P+jF|>xfa}(Rr2~;`z~Xn{diYF->=6WS9D!}(`0zF<>>k@ z7pCCzqNAY|&f*VB)K@=T3VG5!0M%E@=HS<_9wFX3@}de?8W=bl_e8)|+&EKtCdliu zQ1$yMxy2I)cFp+b;L0LbY=W87IO>h$MeZt}aqf7bIF(jaJgqpw zNsH4}CmPMG45GbKu-=dIClOyV^6ro%8=e{4K7Tc5dZ(VwD_zW<@yF9t9#UW4TWikW$Tw6Wza0%RKUMG4W1O>KN+wGb_-rtL z(Dd}?JzaV=n|g-LZ#J+Hr&i`a=6vQgzX3T)MAS?Ap;J$Bv((y&u(k`wn6Go6VvS{A zQt#M1QCq`i_Mus-y21s*9nREt@Wz+uo>&Hpa;Ts2<@-4c9I&vQZ7AiS<0m67qdc## zRo7zt_Gj36DY+JoqcY0c&?m;7=;$uz>YP7w<+j!0=>FS>X9lS&ui5f$8Qsb|6Ln7F z_>2i`Cjuu=Fgw39#Q6MS@#FjWH#H?pl+8Y}(|_Hex%&+B%ZL0SFYmBjxuEngM6{K1 z{K4)E`*il*kF=rs5bobd!Hg}uyWcUnQJL1}NUF5+wzXUG4sPdRVFrtnZj*H~h4!

#405QM-lo9EHH>FDmHw;;hU%dG#Ge<(1<+8YySr zoq6-aW7oQ^vf@hzHW+OiA2O3ieP9+ADa8|(3<0ed-=hOJ#E)Fi)kXBt#WG;^o~yQY zcJe4Au%YZ$M^_v#XJ7Qn_cKEv5G*V#(J?Wpp_eQ1RrBpp`e~|zNh!)6uMz{M9*H>3 zKWH3zabDW)#ZeNxg0~uR;DrP}d%-FCn*E`mrLo%1V|Qfk1~9~GXJ|c(HuYhUm~MKu zF@uD4cXy-LzvdvV{OmiDujID-^cW~YV{l{q7bS>dgPr6+ z4tz6sU=nZ8+T_O<=gLY|zuyK70Gx-yBI<+f-P$B}Ax+6q0@|k>>G3th&h^##=BB1G zuYSuoag*rVu~AVg6Ze>|7Fcch)NQ0@7NrNRV{$3qdJL&c)a|9EVCu#b2zo7C1wT;c zoUE_Du~5t=aW!_MZj;b96C}uhu_^R-JDIo?vR_JxJmSI1!m^WoDQg?2Sm$no<|lKC zer;K#5WpoOzee(%Q(cr8h+w+&{4DXj;CBm@hRBkUnuN*!m@1RN=u*M0- zK<=U*gJDof43yo=NX|)<8E_}++wzYkwzo&Zd-s1T~+^1TC(}TBt6Mg5h zkT!!Bhf8E&Q5&TS<-C<~5c1MEtn`lL?IF`b0SE%!(u}Wo;NYU$9o=%P;TD({`Z_xk zM`E82r0ki2i$ zzp+(KDZ#QUNnUSzxWe5!F^W2Nd-~a~JqI2Z!qL|^ytpdmiC`#N_%J&Le2%rEL%4kl zDR<_J%)uD8fe~03EViQ%W|-*@@u*hVb{s3NxxI1|YQPgxDaNNC+&VQi)t-cKMR?SQ z(Bp7T&p3C9c(b#y#l^>i$CSH#Od}}3$|}vKao_NZ2k2Kp+oMd*TkET~l#B@V=w9r* zc7wlL3YsEafEN=J>onUD!}7{7-Nof%ijt8FZH_*YaswT9KIMX*dASR>+^vrWild$# z^8M!zTgb>IE6Kzom=4+YN4vIbRtV|EgHJ6yv28yZXT9y;rAEF+ys9$}MvzH?*G1<+e?kX0T*v^^G^6?-?t5J>3<#TpHqfU7N>AeZp^{ zFPw|gJyH@KFPTt~-*zS`;TF@4^~=JEN-rk@7i(%%D}6!iWn>d?dAhsr-J{V!0!HL6 z>zkFYIRy%wNyW1*$ZQMQMxtx*Ef6=KiC%bzdnp6L60rq&x>8^z>tgCD!q=e1(ta~u zt;2*N*C2-OsIYBfIyFJ=dZ6k1+qgtK8x*wI7FFX*#61jgve8`}Dve2wP$MN&g653m zw%g_3)=XJLl&cZNHV(!^#=#8i%QJ5~3%(~SBeU>(Q+D(l(eJ;pL0XJ?cg*N7eh&nK z$L|Z@<>J^-$;LxKc`A1g_SuED-_pwFPe!Nq^pmP z2!hDU2AU8d$dg!piMrOTp-yNK01;^M^P9^vt#R5BJlt+Gd<@dKX`edk))Kg%io@sE zAQW76AFK8Mvcc$$t;g-kZ+6kx)67R7#NB|ky>cbC68gqC zYkUjuV+%#toepdjd^+a#{vb2`9A(fhU0$aI-WHET*gpK(vhXlcw#Js&%L&d4isJ#r zt3rXl7K{VPJkhr8^u-TD$Wok&E~>6$s$!PGTdOj}K66*7gov=P_gwdf$MhySS5xI3 zuX=lX50^O$eM|8f^JUW5bOV7h^GbnL?dkgT#LAg?^Y&Em%c%jiYh+jHYK1ls5G&7f z5Lq>FH^*WO)j32fwvRd0;RVXOuBG1u3DoxC2IFoG!gV6P8LuS1VW7Ql17wI~1!wUt z&77-wxlaQ6=uKzDhHL$Oz=!&DaXpA;Zl7zPIu`Ifh8l4*aT2Djh}EyX25;=T(h$VC z>~vCz?Zesem5;ctbXS&QK?KpeGScG~p7%7zIrQ#Ud5qL}&_>>>vt#P+C(grVgVdy( z&nFZGI*!{GI7JntR)}SZnXls2bXyL`$N;7W}c_nqj5fS%Vbqg5tvuSlD&Sp{!- z&Fa!!ngX@a^USp`84-I99{UWY26erF8l7vuh2fF(z7U!dYE z?XaUhOm-=g6|-r~_x46up#v(3lE@QJ*n{220|iEy(v1k(1y&hN;i<=|IX>!d=;&V8 z%(Pk6YAN0-R1$Zfe_ycD6^vfRS1+A1^n|XEhL_53t%PhC$?CRMESAB$)HhsbiHvl2 zTFucllMm|grpKESpDH-_ZH`m7(uwDhY_65k6^OP*eEouxegNhUYVNKk!RMM2(cv>?-(RF)RD znl*wDUGrHiN@@Ns8^o?9&n{%i_Y2Gfqb=&xor$>jcuLPv3DZ~k=15#x`GW-sMa7fW zO%M`hdn-5+vp6g}I*)8WgO-~n4fo@4IOieH$2etgNpfC!kbBp>5bVL6B1dAPa$CF* zd4ZDZpZc-+Yww%!KqNk`oW##$*Pkx{srd_cK$rH^;HI(2_B`_~jQ8d2?S+=`aK4S` z4BZP#4(Tb15FKG3yy}!yoy{Ra7RTjRn@(j_^ZBl$CXS+f#$pti%yAahVqyJ(q5#Sn z<<8jHg$D;y=kKeB%;*&(v(tu71qXG%IM)o<29@$X|I%Uw+Jq|T^hT@3^jpg=kgpT6 zD#&B2wy)f$D@sZ>kv7`s*t}Rvc4)Vv7~)IvZiy&J2IIx>O_j-(D6YY`Ex}i=*>!RA z$3SkwpQ0vJyO!IYq!pb#8xH;YLk%}aMAedtO?3cgsLs9)%}+JIU? z^O&+Qn2suSX*KxG9b(53)h75%0T2s`VtKc@#R8wPZkXuDzV?(SQ60{Q`@@jk^73#Y@!8=px_U_JRzx|ue^g2VlTUS~`c?+C< zJRqjb2D3u~)|r~ThOhRY>12nfA18mzx16LGsU)_ybNS}QeGT4@k<6;2)-F$b)+-nt zG7+AM^WR+K22(L5nGL7GOd#%_ns&G5aJii>Ol|e^5lVr&z47yrM=z?i~}*a*7gAq}rfJH{)j#c8N%J?RC^63!ETK+*1o6yjcqLMep1dkLn+b$gO;5M~z33*x?(*!%PNVzn8#SX34$ z#%E`jCzEH}2di&tZu`gx2A;yJifc&bM|L|Fum!c|wHU;nlMnNmcqi>U7|&;fS#OOB zgw*e$AO;FM?uHO0F**-YFap|y0=O6Xy9>hRnq@*|=Ve1Uop8lH|j3eR4XiGN1V@D6z2nT;fU9 zDKa`U)IAcB(LA!ZK=tpj_fjCt+}WYgQkJ33j@}Zno^E=2|9jTQ?W z4jGcvZQHNP3ZASavp7XUO!IWTTsZa};7tn-#Mkd7b}c?+4(EPgx7I=8%w^w;9sOwSSClF z#!ENXOEA^7bS!?)T3?;8dcKRX&g_z+0nNplPvVr7eObg_GKP%S-y3|w&U-RTByHfZ z=vN}Le5^_s0+|Toddz-^`Si^>5$>Fj^KIkrl+u>(v6{~)k{{$Wb*+&FdFThoyltc1*Ist z2<1gxu~si!+-%DM-yjW&P2GaxDL<1!9e+YKb^9QJZalyvqI*nN>}w;l_hOZlfPnT; z?~rR0Mdq5h8F~7e#@Bu@UYpmG&A+#=H9bK2*2gCM9>%));{_%R4A8ChK-Xt=+g=?Y z(Dn30XlyKy{Ff|U(W%Q{GD3sxG_3+>z&4MAP*v^Ydi5O%?zSP3USq7QQ?}S+ch9C; zn+HSf3yFhR-$chF4d)F^Bw*f4X~Cb|@nEestgUT6u~|Z!AJqnF56(JsNn>4|?^)U`? z)4z-zu|v1azP|CE%>%a(xHieF;(1NN&_`FdtmINuj1m1-nO)bXFrM`@Wus`d%VwPc zL@ltMZMY|QF$F-*_-?J2yfPqaNJDMVSBAP*F5Ke|h+-PAt@Qt1h)`l6cI|6I5)%EA z!FC&m?n@)E@#Zd2Zm`0g%Nt1E}aKsQrsiUTj zi`4o#M@9-NGVyj&`s>Pu#&?_Q;$>l24?%l?gD;$r2vIxe+caEG zU2o!iqEw{&ro{;B@fn2X%By~@I&jg&yjay|m&>x`Ludm4;{{0aj;WnI?1=KKi(9^* zUT&uQfQ^-_gM;_kvsb5^c&s)%aiXuz3H@C`G6ti$6r6}tANDG^s&8(Q=a%Zy2VNO4 zvs>!6{QHYG|1LG3Myq}=wpx&r;Lch)Jl}7RZChp{2xSO@|IxjZaHSB29I5FWGhyz+ z8TLJEGO3Vsx9h^etq6X=cc3X;FrIRl% zk#g|Z$CFuz^O|Zy*9bHA-U;u_4;&$ZY&tCxfy;Df5#Q#l$|NLTV zfbR!3Q>ARDZ{lu#Yk~aWo-N3Ca{}NGf835nh!qJ!ZtJw}tN{F~r|;Jc_oz)3bv z1ywGgH?W=L#o<}W!z%oAgCIZHQg zFVF4km}nuuX6Gv0r>*?vgl7GO;sjtp;IHbo7F|`mz6!R{AZF}MYikkxgyZ`;6`a<3 znZIfu_*01>tXdwT$N_1^@8EWoLdd#z{+aB6kWFCW2XZCEktDGM8$7ubOBX6$}& z|LCA8U?8p)lY5GX03~#(UQ|eoTHyEb!nQEW`gSVMUO+(snuT__fX7Ky@rhrRFnRkq z7YY*Kkwo9(X8Qd{T2@-PNnd*%$I*c-X*SBj!ot$hpL!hDr_CzdZU9arxJ|;3s;H<8 z#|nnYyN+#6J%PlB0lM$#kB*J&(x7evP~1Wwj|am5^_*!#wqc?|KYzY5@6xsWdckhE z73u5iJ6i37q-16a7Ng!j<&fo~pjrfCA4=vNJbH2h8=u{<#QJ@jOWHI%Zak)=8V!N_ zetdrBl_1mu+Y&{S4zQewu$tRNfidHoI7NeGg*d_3m>2>7s6+tE$9u936_c~GvP|;K zRsnA3l(p3d5GZTCUAAjCqk4^Ko4mtkr6OufcTZ0Ndfnj-U@4k-(#t1O(SqVSqHZ@M zkQNA?YVSppD|iUd*-)l{#wE62Fox=xfp%0g$6Mf+oAA zU>mE*#iydTwUt2i_wCCkzbS^pHPvcBUTBSz(6j&g`3-J8%SLzJ<9-v!QtkeYC{&=8 zezJlA&ap4o-UWd3Yc5Gk9rsy2owYd8*bMJNf&lSG(lqC4N3QpHAeq*E{$zX{4eKTw zM+K;gZ?prdDEwxtVL!y8+B?q#u}>PtqvG8@zcC$9x0e=V;e4!DUCK!O=BdsWov_M`o>sO_uPX6iRyt>gPXJ=A-&cv`O9?w ziu)iDe)a0r50BYqZ1wf^!7vIiUK?MsA1ZkxXgkxI9-$4dJD2FYxza4ac(x|fILDy{ zKQ%qwk?}A*Jbnf&Y?Zzu5Ko#;fsElc)PfAvzg9W-D!IMC3IKlR23-dS2OzZxFsl0~ z1+2Mwd~yd-)mR3mU&IoT3k7%)L_R~|EFc6NCytS6-6m&$6JK^Vlrj2!`#K06J+BNl zrg^DH-9rS$iBXLJf%X=_#`Sgk_l-pB)R@?Z36^9zB3#NYj*{J6e#nH3r z!RYo80A*R8!0Q8gwc67)U@q$4KAyw9O8(I><)F=q6ceaR&#Px9@@SBt9>O-7HMS?O zHDA!z&owX4UvLLc(0L5VrXc~)ma3z|%pyWUAB^IbZ;VZJwzroAmA}3Kg+f6bEcQ_N zE7GDAjDJcBmmS|Sj)>Zd%9p7Q)sY;SMhsX#x$O<`HqS`w-?K>MyGafTr?bH z0s#Sm`Q9AR`4#*SJAg0T$T=$an8)~>=N7KejREfLN^9@T3W_18v zMp?=(8h}$b5Vm08-;b|7dz8Q;RUmqNKdCJd)Uym+SiN`b;2&o#Qa|$SNiceG)NM*v zuvL|(7@)N~0j*u8|JAxNT7_c@3oO-%_X2|fs|x}`L9WKaMZj*~0lpIe{?&Z)*C~jX z5Vp7q@(`Fqr4GG*%k_J?g9lOp@4X9lmTMsa47W2tzn{<$w6OB(HDQsWjaoxAB>iuY zn-AE`rln6HCo9nlz&*SJhIgr^n9NIE!>GYn0CM~1p)Mwj*LlJUJwX`Eho#3Sb0$bn zvv1f?w>4U@q{T%1>S~dn*H@qMtm@gVQN1YZnbyx<^W7uFw5Cy?f{m5tr!_SV9tklq z<^E)5vV%|nmrDFbpLtyZ+ye)1!RA|PTixbspG*J!xtY#VH`MrWdXMg*5N8{VHn26m zIx>|W*|WFUBw_2-?6O+nBQnlIJoC8EZ!}a0IsKmiw^~@JX>U(4$|x&wB$wJ4=vZrP zMowB4-)90Q|rTak7scJgL-7UqS;h9qI^F&FSr@Hh7W2#Svm{Ni(~K-@76 zAy1z6x)P_OjUK6?6hcATs8)SPW4z;;E!C*EzcF6)ueo|78{0OUK2GT|3`Nce1}7|& zn>a)JckVqjl7M87)RCY(J60+rg}<()bx~KB1PW`X(Js&(=>aI}pk29$5InJCk%Ay# zN28rid0yk3vPx2T2GaR?hSa&aW@~HK+%EMa${O(2E&$pG2Yp$j*`-EYxu0&mqY*D< zy1|b@mc`KG+izO2_4g5um-Gjy1 z%N_F(>O&&#c9`g0R|&}~iYuc&WOc9wXL*248wS9pUGG?1YpcOUbzz+b3sNy*<{`7W zjlrPN7ym>J4Gq3$ymjY7OkG?i679;wh-&^p<@P<3fI$J+8h_@V!jO-1yikeGx2X5q zUBS`2D8bLRR4#*J8s_4XHj=HHQtHU0gE=n^JrfTLsywMt*}Ruma0ZLT+@Q|G%xCUi zIJ)>LW7#ZsFqOeU!W0+mdFE=Qwxat~{`)YG+|Qg-4y}WSNYAkYf|t=`tEuS-*P%i_ zjb`>l$c)k6ixy|ElBRB7oZ%7ti-~75BgKJI;AM&z$!h7~{(UWnrba^+-wSGBOi()I zF7sfJyINX&*XNu`Si5H`_%*GoF)24(bQ6^P`9AwTd=&vmcspFp>T4 zkl?NPV~@me-AMr03f|^6#${M6MW_(6Z0hgsB6`f`mFGvLChd219>R_fgKb2@@9Ur}wRQeJgGfXNNSeyMD&Aa=o~Ve<%h@9cm-m8+&k-ZM7|(`X z#$sE7GCqrZsI9dAJ!2FSVZ4 zkblymZ*1JRz118Y6H)34TZ?xT^`9Hp&=|vPCPqoA}SR!P$lD9xfn z+=Su+tZI%8@2)*q-li{~LS4z)Y^ss>@5itUpJNDrk$YrnuuMZV=Bf5mCEpqO0kVHC z^ORLCU$dCc&9sN2t2$x`j|~u~{)tty@-Xyr!^L7?q@qCUb%XBhrHaM~XycmMiDkK4 z@4fK>VzMl0GBOAo;+HQbeE2MbWO-lTyEAS3HP{@UT_?(@Q&k7I?`gll>Os|SpY&gu z+V#q2j8)M{Ul+^=92Pt3JF6JZjfu>abdxVg^x62lp z-oo4BKqxD=TawQzbM9{`nxn`x)((U%ti%|SW^p)-$6HmgdWG`e(-@&iT4U7MZ`iaREK{TJnBCDJIbfJp4b(J2SMH0S1fpcp-e zaDt#Kh;OpXgaxr0qH3@Q70A~i<42QZ?Z7^bI`HDX8B|tCXjs*~KJBoNp3=YD+?lYV zclByMRO&*Ijx7|Gw3-TgbVTVgnAbkwWA9MurX z7y9WkDLVE_Y^A@b0zT^!OpU8`erD&DeE$(dhvYE)Ca_Ue3 zr&=TPx)t^SO#veZ6pCna{1K@(JCJZ&{nT~hOHGOfow`41?DOXZAiy*|Q)?7x;y45{ z+&@_k+s5Bqcq19)&q80~NZE}F&W|f3n?=#TS9%TM|E}snx&K`^GO7Spy8B-@ z__Ou|)eXLKR_8})`zfROf?f8`o;+(u>g-181)o3csp#;_w!q?a(|gd@r;&FuR2)4o?!rhQM=@Su1LT6(kID^{>~I2 zq2CMEok5>e3<`Fhb_Y1}$3CF$OX@4r9nS%&{82gIfqlE!lS6k2V9g)9gLe?WY_LZV z1?ZGkJ%1CQV6W`~Tav?oa{kyeEI%2u_hX}b3@GdO-2vm8=8{}3Bi)B*KO6Rc@fiH_ z@?L$pP_R?)+&K~Y$Mv(S{8qmPZLM4SFO~v$*?DXts@wkVWs|=ffiS&%`Es^?VmH|J zwY0PVGa#$fh#wDrC2xN` zizq;y!mO@U0@ow+jI+=kjTy=t8ZB+(SRc{{yh{KFbnq7H(n^c~9$}4&X*njk+ zZ#p?G+-G35xdDitOeJtTNdYhK!hn%2_*Na1v&vN6@7ovHHUSBy5!jeRbK=y1E+TaB z*GBPJDZmI|3ko*P7XeucB3F->0uvq|Uw!O4FwGX;pgq48@P3~QJER79Ngyl6*T~4o zXT)9m`NXaemfbVhEBO|b2b?Y^b3pgZl?}VZaA1NFrrP0L(!>*HB}&vyA`_R=@wV|` zYG5cMTRa3NMHb%w=FJ;hZeY1QppBM9z;$v^Lw9!U%I$6C`Mtp>o(XR1sK@*@SY)k@ zL84RvD7qY-3+&-7z>8_#o!Jhtsu@6IT!V{D?A;q zvHnE>ns1U59~jE5;tk-Tz{`ny5hR0G`iVDPbkTCMz!g4P<6E2vEX;~<93VgAKsf-W zTX?1Wbkki{B}_7Ypd2CPTUPTkW@cty zaHyefZy1yU5QY!1r%sUoa$XD5*sOON&eB7+x3?Q*XeB1krd+D^^MZQNY`sB$W6udm zU`PMHGV}!euhBFWIE9A0XCASNv=W@lN8?jcRKb+kCl7o4?b|n<7-5rq3#cw|jLP>z zgf5$<56J=KFF{e6m?z~@RHJ5J!mm_OyIXp)7P~JGDBr$ zrA!?N#KHzi3DtR*UW7F27H@A-h;ZDCFdiAj(chq;#hcT>0xfu5xeRC!%8u}T<4ZgK zS?F0&Ued-lZ|dqk&PYl~xbErWKYuA-@RY}Y*Is` z#l^(zLDnFp-(aK%RPLWZrr3|zq33#)?Hllm7>HDBN62oCn=m>PCc#XunXJ-G5kKZJrXAi;Q{ z?=u8IsU3fhy7*tG{2S%OWCv#SfqwPtxoom_yn{tU%u5}F_Jbq@Sk#;1g()WkI;AJS zvhQ(E0j;Meb&3FCB9HmI0uChzyO=2R!J_W-pNahLUpf^}pFRcgXa=~*p+J?{v1?DR zRqYTuq*$5z|OJdpHuf|39`w?%L@bf1-R^ikE^*e$$*R(uz+9=Xbp07Pm&&p{88gf zst}u}KtiQ{%hpf>Mre>f-13?CjnGJ=p3FTX+XtQ%wUd}Xs-DApiSM(bAv0LLk2L_z zb0K9h$fqbZp!jmo@ZXPW>SaR0LumHJREdj)uuegkOe+awaJ%yWlYTFRB*u@|==as& zk{m(e(**=^5!98P4{5OVN8$9r=F>|}fOX?i0w}H^p8sjJvWgY2@~M z$7s5roTO!&Jo9oixZFtanKV$84ue#m!u(HR7C;6bYOr4O9D3i9_QxNBE5Xpj&avRl zX%TWw-E`$_86fT#$pLf6I+B~mLE$eg4O4VDJewcC`9ifHQ0S-M`SAC;a1uf+nlbR!r_GB3k^BJ->HerVmyNyz*JX3jU?brj zD@*v0$ZUsRG$vI=O*`j0rF*aVvl}Xcx|&0_SB?`2Ojc2L9N9!NM0F!UHx@Ch(5S`NA=po%6{Fq1O`u z(fJKIHt)*EvbT<{2KWm5yLUk>lek(-yZD##T2?-=iy>44*8`TM2E&5FvIAH~v-nLt zG_15u5)Y6pw1M0&oB7XpT@$6CbYd#NLj!r_)5u6o;70f}j^bW@+HTO;7}(Lr3^m}Y zYZFX;>qH!|wPUt{l}eD~Lda(TRLgG_A;88Q@IqjX1dhN{hB^OckP8EC0uh@PzQh}Y zBSAX~?0Wz|%pAn7t*AeHY=9IbltC0922cMqV&sliZLADDDHAW%3fC}r)?g6 z+Kjxu6e={DDx->IT|#JW_6VUs`AIA1)b1clUVIGiLSpF9D82=`stvWwTXL~ zDJeC8C6Wt*o#RXc8AR3m4qK(iWb#+m*NhcdBvSioa*s>joNBZTW179DBih)D>of=; zkJf?{6)}y>&}=Z?i^+P+(Z3v_fD}es$E2)``9F%#K-<56u<2w6Kg7@s$dp`L^fIn% zTtsD*MlcOCnu)bSlgbSo*vm0G0s;H ztklcxvcs{IG_|_nlDTC7e$xCL+Mb``Tm%OM>MuS~y+?rTt~B&ja_r|pU3`*z90abK zwp<)f*0)M;V1sni`e%;sdvcvZCg$RX@>Ok!PQ$=w<`o-M|{nON-%Yb^J0#lzhLcs zryd!ghL$HonL4Cfn>@HRK`4v-CzRb_mV~J>$JAq0eowgMN`jn1u*Tkz8P8)ncs#St1}p-mM{bw z&^s|;N6;r!Z;?t-+rKQL5-iXKicD;+xh$gn&6`2TJ}wlsqDzc?vvZjS8qc);4jQ3Y z`?-DybqpBjt4rg&%yeO$ON9=Kb(n0O27f(Y;3 zWcD0rN#|0lT0U`|gHzE~P%x$D8k=syK6vRbI5=ec0}kH(OD0T5Pe3cB<`}!AM*^1J z#BG@+;mC<0YOkpnqDMD~4?miuquV-EN4>p#(zhLDINeF z{y#jYYps`omDP6k%tB0bx=jrIenwUupa*y$2v_sOH$yIn-r#TS-2>d0IN-iy0*9=O z=8GTI%V+~zU2!qdwrk8$*LgTU%34Ck;~Hiul-)Zi=A`GXpgYCUu!sKTT`jvXEiF+U zfHQ|yAQhYmUCV@-&~(O9twLW8+RUZaXIvs=N%E>D)ZSj%aam^RQF0G|mh-U8jN}i3 zs2LacA7S_!I(7vkvH_=mBpkTz6lnpnu|_NQUl{J$3Jt?43dNpeo^lwio`rbJ@_!9>lTR)`m!_aS}NF;B`i7poSth`|d8M&~@cQTFNJW=ZG37 z`b>xR9#}gQzWDLQH0lXyvELiN*#XEe+~D$w|Bikrlbkq~2jDKIDt>bP0i{#%=2x3P zaJNgWc|bsLCw09W?0E+?KnaNh9L7hr1y2eIv90vIMGZBCZh(QbX-_OBw?T-(uiO^~ zHVql8WSg;=(8LVWf`ejWgEAg#Zk@n=-@BbQ_mrc~20oKC6M{wB#0%v>>$XL~S@-Y; zS}yA-?7F~+l(j~)vbI_Y3b&p@u~$;3n+>hF4=6y4yn0@}m#M6p&<_0;V4r#fQwjnC zr$T1i+~TPJJ=GU6!ff#`8E>xON3{v*ou^M93fdsGlgAC^vW(X)Xa@t71ZX<)4^nhL zG#b(o>1n)d_a<0gY)6aQ+{P^+WK~}3FT4>{B2Hj0<34xjP2fgBhhl7(TT0WIp({|g zd^Q#xXX^Mm%blxV`4TtvGP9*092%80T%V3$w>n?a)S+1L^^N(c^M#S1A~r>7g`)f)($7;N*?@I9NtfWC-T03;A~a1_72w(R!3Fe z+9I!lU+}3Kq@rR7Tcs^%&gs_Alh}qa?f`9k@RH zj8kJN$i((!>pReYgVe3@-Tv=m{-AXGkfHmLqaIy_2?-)cKS(?DEli{xC~8%T`Bb~n zlAX?z9v^SJy~*;dzs_UnKG;uxk~pU0f9p(EbIFepLGK z=rNKX8~RUzcvnWp)xVZ;{7;N{Ix(}n)++Ru)cP*5lX2ng)n5Jy_o{-aZ0UI8Y^Yv<25f@6krlCl2(F&dh0w9p5% z{-cxs0(-r$pg!ycjsQt+XAlLKsRW1s7&f)Fw64Cr@&+7DrJWp=DE|Sh_8*bF z1&pA;0qMW`wG^CC3g=d7MF1Dm&6_W?djY$GNLBfBVaeFyPs> zF`jy*PjeLBOviS5bSl$MSfkK_7ZdBS(R#q*;Zsk~-h#r`efjbQoHJ}CG(KYO7=2J- z227rSj!{U%u6jwaln+nXhZT_r;h}9()%x*5Z(BFP>jU&@AkBYmGHm8u%YQ$TZD)!Y zbDnXQZXf;G6>wA(lPRd|QEZs5F6_AHqM$|$>E_LwHZ&_GisssEMF7mvF3gv23vdoF z>+;CZ-g2;k1HPg78F2Qzl>kVejW2$r5)}Zz2{>ZcYJfolZQ;LWG}zBaKJ0sCz`211 zeA)&DxFYTqR<&{vT;ts%EHW)ks*UFQoBaX0?xQ-mzE*~N>UTjX)qzFa_ARAAsn zvTjr7;)P-1yc$;Vz@6LS5U?$C^gkxnO<);f`6N}nAhWTmCktkQfrke;u7)TE%E=&x`^JugA(w+R`x($a4>i&1F#|9Km#yQ zP(x@uxBINI8g zkdOe-oz~&wu&V#)E|bhxuQ~z!6%)fiMHK;l@&Z~_Vy^dOD0^p`+OU4#-64fYI+GP4Zc`p9z`Vy4D6dQe{3cv}i2b zK93$f!r48Nk(C7wh=iL zJWBHZS5&nvNZKDy(-;7#60)GVm4q!`>N9QyA6DA`ix1Iqu1;^&btoXRV9~T4m}G$u zi&3>FQ_i~oVwpR@US7D@tkeM$4ERTZ(j++Zo(5hovbHh}hi-FS%YUE*2ZN?ZQDD_)u2CEOVoVTAmCV?Q>UA8r!tXMWeofa^}C=J&3i zGoe}N{%ln(W9;65I+1^U?>E7$f&aJguPgg6_3VbU(?H?FhYx}Az8fmq@h|o5J}{-x zb;|sF)Y2=%rH-ZmdF2Bwy!FkSEUc_*d3|6ZLtlV%06?3efcLUQ@M^e>2TV4E z0`=iFxEOc?OmT6s0oYI<1dF#0ytX0Z1}lHRRK@9dA*!af zHh7;~Ik8MRG=WSA2tOYYq|Z`Ubzg!Flt; z65zLg&B?5OU>p^ES!&< z$?_6cUQcu)RebOVQr04~Fi1ibe;c6qw({!146*0HS)5<9SPzh%S32jb7f@{r{g4hD zFyI{>_4oF+(d>})XZMHmkTL- z%%x?9PGXk^%+{r1@&S0SP-_F2yasQaKK_ZtchTF^6aku!d{&IFxz4VOhgi#@r>olv zUQe+oi`LWEm($RTO-xLTjGT~Up8>LD7Fjht`VVHFb&Qj982J5xAzeXTeGIxw)%es2 zx3~Xj;CP3#XU_tn0oE7KkNDOg6flXGQ~6B=ucck2#J)#@5jfP}0@>uJ+T1Gg&nn7v zuq>3r7y}71%8em76~&Z#`Ly!;CDzcNVe}1XN{?>*1Dg&YJz=PW7;yAWH6E%?gj>>y zj<-{<{U!BdIc6p$C7pt|0t*#q|C`Ir79VJ`g+qUS$EqHklH=cj4r66m>$kd#N%azt zEkNr?VAut3?tBM5hd%H#JmTMaDFYil3TW=<_34!MuLT+YobSeOL38orbsBZSk9s^j z$LlNV)S^nM&x@aaoL>2*GVjWwE|HI02nu(GSFH5Zd3uF?xW2SYw<2~Go>L(O z|LR(>OO)~}%1)H%sj;J{X33J{%Yzw?W+|jz8_A^X{4@g3Nf>uW&mpZ&-7Ci zY`!_3(bV#EgL8)N*Qf&T#r|ePX6Sf~(9NAk{+Tx5EE;a4&ci;K8+^W}&hYTBpe*k8 zU}UoU*+YiiV95XWfY|ZJy4n9Fz2mpY_0E33n#Hm6`mr9r1%*rcbc zROfPcz`4hl82-+iO3o}tgoKZ9NX7LV!6oQK)qmydOI){k|N6%Wu=9T~9RRt+rFAyi z{YWIloz&RWrA`#=%803eT*`H=-#E#tI9R9KDs@=R9RfLr~oKi+J#5wZqLqt_FV!W1eKTT z&30nPa+U9;0ZMMkZ7c~VcU(49Uin`$BX~Z8&+p%EpLwi#!oi5ah}S=Y@H)RD1H{?r zfI&s$@%Hz79Y6b2n9hY;CboT&Zd#_@Dsn9EfomK3xR2QiP>Lt$&EP!j-Fu$);G}~& z?O-O;$;P*2M2G7gGNKoIn31H&$p7?BtDSZ{)q$FZj?A+V3~SI@sA%K|)i<;?NFL`a z+zUBwYI|01g$Z8vOqcrv3bD|HlJB)t z2A$xqHJW06)>HjaP$%WH5L9Ay!7Lm%K>E@K1cvQo2AP$QUF_DlCz1$a?}v!HuGFU5 z_>E$^v7!Z*e@XRw(@zAJJd7f|w$By&(!tjNN93QmK5ubpOp1O+nexT~uAOrE;v_%= zCkupzPvt&RVYOOIq6HoKW5dvqoI*bK@U-1uKbg>a$dgL2Q?N?sFpxEj`ZI+EvO0Cf zych|DYwWN+lg-CDy5RNG@!N*SwB=vOJ*iXO`w8)H!zSJW6wi%lbAuI;l893SB+I{s zQ326X&hvj(k_pf5M2o{wqW?Mm<$h#pLM(W5XP_h?q@AIV1iZ*K6Jg-UN$O;_8fHf> zlKFI$`m1G)W6jVUKGZvQ;L_eDCh4P#6Wpyifm=FtjlXZzSOxb7V+d zz`)F}{!NPUs)729wJnUfl48}rS&Ar|hIdf?q9G0sogmD%S4j`V(bCPHNNmTqm|Tv} YsoGFZI&}qq;6h^ER}xXp>Mce80p`mAA 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 literal 0 HcmV?d00001 diff --git a/docs/images/mark/Update Attendee LastContactedTime.png b/docs/images/mark/Update Attendee LastContactedTime.png new file mode 100644 index 0000000000000000000000000000000000000000..0998c741d6593868551594f3b1ea4f2ce0db9441 GIT binary patch literal 26722 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 Date: Mon, 13 Nov 2023 17:37:33 +0800 Subject: [PATCH 8/9] Update PPP --- docs/team/jason-raiin.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/team/jason-raiin.md b/docs/team/jason-raiin.md index 1b3dd8a1343..6cd586e33c8 100644 --- a/docs/team/jason-raiin.md +++ b/docs/team/jason-raiin.md @@ -13,6 +13,10 @@ My contributions to the project are listed below. - **New Feature**: Remove contact from meeting command - Added command and parser +- **New Feature**: Add `Tag`s to meetings + +- **New Features**: Add `Status` field to meetings + - **New Feature**: Mark meeting command - Added command and parser - Updates last contacted time for contacts @@ -24,9 +28,7 @@ My contributions to the project are listed below. - Reviewed PRs - **Enhancements to existing features**: - - Add tags to meetings - Convert `Tag` to factory class with no duplicates - - Added `Status` field to meetings - Duplicate contacts: added checks for duplicate emails and phones - Email format: Improved Regex for email field - `ParseException`: Improved throwing, handling, and display of parsing exceptions @@ -34,21 +36,18 @@ My contributions to the project are listed below. - **Documentation**: - User Guide - - `rmmc` command - - `mark` command - - Minor edits + - `rmmc` command guide + - `mark` command guide + - Proofreading and copywriting - Developer Guide - - `rmmc` command - - `mark` command + - `rmmc` documentation and diagrams + - `mark` documentation and diagrams - User profile - Value proposition - User stories - Use cases -- **Community**: - - to be added soon - - **Tools**: - Added util method `parseIndexes` - Improved methods for `typicalMeetings` and `typicalAddressBook` From f7bfbcb250c0a532acda158b6401898e298482e2 Mon Sep 17 00:00:00 2001 From: Jason Date: Mon, 13 Nov 2023 18:10:16 +0800 Subject: [PATCH 9/9] Fix checkstyle and update PPP --- docs/DeveloperGuide.md | 6 +-- ...eateMarkMeetingCommandSequenceDiagram.puml | 2 +- .../mark/MarkMeetingSequenceDiagram.puml | 2 +- .../mark/UpdateAttendeeSequenceDiagram.puml | 10 ++-- docs/team/jason-raiin.md | 49 ++++++++++++------- docs/team/lomaply.md | 2 +- 6 files changed, 43 insertions(+), 28 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index fa02e5718bc..9addd32b58c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -407,7 +407,7 @@ When the command is executed, the meeting is marked as complete by creating a ne Following this, the last contacted time of all the attendees of the meeting are updated to the end time of the meeting. - + Finally, a `CommandResult` is produced and returned to the `LogicManager`. @@ -921,7 +921,7 @@ Mark a Meeting as completed ### Data Storage -No save file +No save file 1. Launch OutBook
Expected: The default address book is loaded. @@ -943,4 +943,4 @@ Save file present but corrupted Expected: A blank address book is loaded. 2. Execute a command
- Expected: The save file is overridden with the new address book. \ No newline at end of file + Expected: The save file is overridden with the new address book. diff --git a/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml b/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml index 7fdedadf81f..8be6ea8a904 100644 --- a/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml +++ b/docs/diagrams/mark/CreateMarkMeetingCommandSequenceDiagram.puml @@ -38,4 +38,4 @@ MarkMeetingCommandParser -[hidden]-> AddressBookParser destroy MarkMeetingCommandParser AddressBookParser --> LogicManager : command -deactivate AddressBookParser \ No newline at end of file +deactivate AddressBookParser diff --git a/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml b/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml index 56e7adea74d..2416d766854 100644 --- a/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml +++ b/docs/diagrams/mark/MarkMeetingSequenceDiagram.puml @@ -31,4 +31,4 @@ MarkMeetingCommand -> Model : setMeeting(meeting, markedMeeting) activate Model Model --> MarkMeetingCommand -deactivate Model \ No newline at end of file +deactivate Model diff --git a/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml b/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml index 6bb92cb3c10..c6ff6141a21 100644 --- a/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml +++ b/docs/diagrams/mark/UpdateAttendeeSequenceDiagram.puml @@ -1,7 +1,7 @@ -@startuml Update Attendee LastContactedTime +@startuml Update Attendee LastContactedTime !include ../style.puml -title Update Attendee LastContactedTime +title Update Attendee LastContactedTime box Logic LOGIC_COLOR_T1 participant "command:MarkMeetingCommand" as MarkMeetingCommand LOGIC_COLOR @@ -16,7 +16,7 @@ activate MarkMeetingCommand loop for each attendee -MarkMeetingCommand -> Model : getPerson(attendee) +MarkMeetingCommand -> Model : getPerson(attendee) activate Model Model --> MarkMeetingCommand : person @@ -38,7 +38,7 @@ deactivate MarkMeetingCommand MarkMeetingCommand -> Model : setPerson(person, updatedPerson) activate Model -Model --> MarkMeetingCommand +Model --> MarkMeetingCommand deactivate Model -end \ No newline at end of file +end diff --git a/docs/team/jason-raiin.md b/docs/team/jason-raiin.md index 6cd586e33c8..8f9aeddf596 100644 --- a/docs/team/jason-raiin.md +++ b/docs/team/jason-raiin.md @@ -5,21 +5,25 @@ title: Jason's Project Portfolio Page ### Project: OutBook -OutBook is a desktop personal secretary application used for saving contacts and scheduling meetings. Users can link their contacts to their meetings, to keep track of the personnel attending these meetings. +OutBook is a desktop data management application for freelance insurance agents to manage their numerous contacts and meeting schedule. Users can link their contacts to their meetings, to keep track of the personnel attending these meetings. My contributions to the project are listed below. +- **New Feature**: Remove contact from meeting command (Pull Request [#51](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/51)) + - What it does: Allows the user to remove an Attendee from the meeting. + - Justification: Basic functionality for meetings -- **New Feature**: Remove contact from meeting command - - Added command and parser +- **New Feature**: Add `Tag`s to meetings (Pull Request [#63](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/63)) + - What it does: Meetings can have tags associated to them + - Justification: Enables searching and filtering, similar to Persons -- **New Feature**: Add `Tag`s to meetings +- **New Features**: Add `Status` field to meetings (Pull Request [#105](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/105)) + - What it does: Meetings can be marked as complete + - Justification: Users want to see which meetings have already been done -- **New Features**: Add `Status` field to meetings - -- **New Feature**: Mark meeting command - - Added command and parser - - Updates last contacted time for contacts +- **New Feature**: Mark meeting command (Pull Request [#105](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/105)) + - What it does: Allows the user to mark a meeting as complete, and updates the last contacted time of all attendees + - Justification: Automates the updating of last contacted time for attendees - **Code contributed**: [RepoSense link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=jason-raiin&breakdown=true) @@ -28,17 +32,24 @@ My contributions to the project are listed below. - Reviewed PRs - **Enhancements to existing features**: - - Convert `Tag` to factory class with no duplicates - - Duplicate contacts: added checks for duplicate emails and phones - - Email format: Improved Regex for email field - - `ParseException`: Improved throwing, handling, and display of parsing exceptions + - Used `LinkedHashSet` for attendees instead of `HashSet` (Pull Request [#51](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/51)) + - Justification: Some commands require indexing of the Attendee set, so a `LinkedHashSet` is more appropriate to ensure that the indexing is consistent + - Convert `Tag` to factory class (Pull Request [#64](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/64)) + - Justification: Eliminate duplicate objects to reduce memory usage + - `ParseException`: Improved throwing, handling, and display of parsing exceptions (Pull Request [#155](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/155)) + - Justification: Allows the user to see the root cause when an error is encountered. + - Duplicate contacts: added checks for duplicate emails and phones (Pull Request [#161](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/161)) + - Justification: Prevent duplicate entries + - Email format: Improved Regex for email field (Pull Request [#161](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/161)) + - Justification: Narrowed the check to only accept common email formats. + - **Documentation**: - User Guide - `rmmc` command guide - `mark` command guide - - Proofreading and copywriting + - Proofreading and copywriting - Developer Guide - `rmmc` documentation and diagrams @@ -49,6 +60,10 @@ My contributions to the project are listed below. - Use cases - **Tools**: - - Added util method `parseIndexes` - - Improved methods for `typicalMeetings` and `typicalAddressBook` - - Added `DateTimeUtil` for parsing and formatting dates + - Added util method `parseIndexes` (Pull Request [#51](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/51)) + - What it does: Parses multiple indexes in a command and checks that the correct number of index arguments are provided + - Justification: `addmc` and `rmmc` commands take in multiple index arguments + - Improved methods for `typicalMeetings` and `typicalAddressBook` (Pull Request [#105](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/105)) + - Justification: Increase ease of testing + - Added `DateTimeUtil` for parsing and formatting dates (Pull Request [#161](https://github.com/AY2324S1-CS2103T-F12-4/tp/pull/161)) + - Justification: Abstract frequeuntly used parse and format methods into a common util diff --git a/docs/team/lomaply.md b/docs/team/lomaply.md index 637c0d0345a..0d3c0f5c8df 100644 --- a/docs/team/lomaply.md +++ b/docs/team/lomaply.md @@ -5,7 +5,7 @@ title: Linus' Project Portfolio Page ### Project: OutBook -OutBook is a desktop personal secretary application used for saving contacts and scheduling meetings. Users can link their contacts to their meetings, to keep track of the personnel attending these meetings. +OutBook is a desktop data management application for freelance insurance agents to manage their numerous contacts and meeting schedule. Users can link their contacts to their meetings, to keep track of the personnel attending these meetings. My contributions to the project are listed below.