From 0491ec0cf84fb627ba1e39c18aafe15405d49505 Mon Sep 17 00:00:00 2001 From: 1rbg Date: Mon, 15 Apr 2024 22:33:53 +0800 Subject: [PATCH 1/3] Fix links --- docs/DeveloperGuide.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 783f032de41..9bacc702ecd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -10,8 +10,7 @@ title: Developer Guide ## **Acknowledgements** -* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the - original source as well} +* Calendar for Schedule feature adapted from: https://gist.github.com/Da9el00/f4340927b8ba6941eb7562a3306e93b6 -------------------------------------------------------------------------------------------------------------------- @@ -41,8 +40,8 @@ Given below is a quick overview of main components and how they interact with ea **Main components of the architecture** **`Main`** (consisting of -classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) -and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is +classes [`Main`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/Main.java) +and [`MainApp`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down. * At app launch, it initializes the other components in the correct sequence, and connects them up with each other. @@ -82,7 +81,7 @@ The sections below give more details of each component. ### UI component The **API** of this component is specified -in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java) +in [`Ui.java`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/ui/Ui.java) ![Structure of the UI Component](images/UiClassDiagram.png) @@ -93,9 +92,9 @@ visible GUI. The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of -the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) +the [`MainWindow`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified -in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml) +in [`MainWindow.fxml`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/resources/view/MainWindow.fxml) The `UI` component, @@ -106,7 +105,7 @@ The `UI` component, ### Logic component -The **API** of this component is specified in [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java) +The **API** of this component is specified in [`Logic.java`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/logic/Logic.java) Here's a (partial) class diagram of the `Logic` component: @@ -147,7 +146,7 @@ How the parsing works: ### Model component **API -** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java) +** : [`Model.java`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/model/Model.java) @@ -173,7 +172,7 @@ The `Model` component, ### Storage component **API -** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java) +** : [`Storage.java`](https://github.com/AY2324S2-CS2103T-T17-4/tp/tree/master/src/main/java/seedu/address/storage/Storage.java) From f4d254e52be8cfd1d2f99f6690f1caebd6ce86f7 Mon Sep 17 00:00:00 2001 From: 1rbg Date: Mon, 15 Apr 2024 23:12:52 +0800 Subject: [PATCH 2/3] Add schedule implementation details --- docs/DeveloperGuide.md | 32 +++++++++ docs/diagrams/ScheduleSequenceDiagram.puml | 76 +++++++++++++++++++++ docs/images/ScheduleSequenceDiagram.png | Bin 0 -> 41268 bytes 3 files changed, 108 insertions(+) create mode 100644 docs/diagrams/ScheduleSequenceDiagram.puml create mode 100644 docs/images/ScheduleSequenceDiagram.png diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9bacc702ecd..0c008f05377 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -195,6 +195,38 @@ Classes used by multiple components are in the `seedu.addressbook.commons` packa This section describes some noteworthy details on how certain features are implemented. +### \[Implemented\] Schedule feature +#### Proposed Implementation + +The current implementation of the schedule feature is facilitated by the `Schedule` interface. It contains a +`Set`, which contains the `ScheduleDate` objects that represent the dates in the schedule and hold a +list of who is working on that particular date. + +Given below is an example usage scenario and how the schedule mechanism behaves at each step. + +Step 1. The user launches the application for the first time. A concrete class implementing `Schedule` will be +initialised with an empty set of `ScheduleDate` objects. The `ModelManager` is then initialised with the `Schedule`. + +Step 2. The user executes `schedule 98765432 2024-04-15` command to add a schedule entry for the person with phone +number `98765432` on the date `2024-04-15`. The old `Schedule` object is then updated in the `Model` through the calling +of `Model#addPersonToSchedule()`, which creates a new `ScheduleDate` object that corresponds to the date +`2024-04-15`, and adds the person with phone number `98765432` to the list of people working on that date. The UI +changes screen to show the updated schedule. + + + +Step 3. The user decides that he would like to add another person on the same date. The user executes `schedule +92345678 2024-04-15` command to add a schedule entry for the person with phone number `92345678` on the date +`2024-04-15`. The old `Schedule` object is then updated in the `Model` through the calling of +`Model#addPersonToSchedule()`, which uses the existing `ScheduleDate` object associated with `2024-04-15` that +corresponds to the date `2024-04-15`, and adds the person with phone number `98765432` to the list of people working +on that date. The UI changes screen to show the updated schedule. + +Step 4. The user decides that he would like to remove the schedule entry. The user executes `unschedule 98765432 +2024-04-15` command to remove the schedule entry for the person with phone number `98765432` on the date +`2024-04-15`. The `unschedule` command removes a person with phone number `98765432` from the existing +`ScheduleDate` with date `2024-04-15`. The UI changes screen to show the updated schedule. + ### \[Implemented\] Contact archiving #### Proposed Implementation diff --git a/docs/diagrams/ScheduleSequenceDiagram.puml b/docs/diagrams/ScheduleSequenceDiagram.puml new file mode 100644 index 00000000000..6ccedb8e374 --- /dev/null +++ b/docs/diagrams/ScheduleSequenceDiagram.puml @@ -0,0 +1,76 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":ScheduleCommandParser" as ScheduleCommandParser LOGIC_COLOR +participant "a:ScheduleCommand" as ScheduleCommand LOGIC_COLOR +participant "r:CommandResult" as CommandResult LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "m:Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("schedule 98765432 2024-04-15") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("schedule 98765432 2024-04-15") +activate AddressBookParser + +create ScheduleCommandParser +AddressBookParser -> ScheduleCommandParser +activate ScheduleCommandParser + +ScheduleCommandParser --> AddressBookParser +deactivate ScheduleCommandParser + +AddressBookParser -> ScheduleCommandParser : parse("98765432 2024-04-15") +activate ScheduleCommandParser + +create ScheduleCommand +ScheduleCommandParser -> ScheduleCommand +activate ScheduleCommand + +ScheduleCommand --> ScheduleCommandParser : +deactivate ScheduleCommand + +ScheduleCommandParser --> AddressBookParser : a +deactivate ScheduleCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +ScheduleCommandParser -[hidden]-> AddressBookParser +destroy ScheduleCommandParser + +AddressBookParser --> LogicManager : a +deactivate AddressBookParser + +LogicManager -> ScheduleCommand : execute(m) +activate ScheduleCommand + +ScheduleCommand -> Model : getPersonByPhoneNumber("98765432") +activate Model + +Model --> ScheduleCommand : p1 +deactivate Model + +ScheduleCommand -> Model : addPersonToSchedule(p1, "2024-04-15") +activate Model + +Model --> ScheduleCommand +deactivate Model + +create CommandResult +ScheduleCommand -> CommandResult +activate CommandResult + +CommandResult --> ScheduleCommand +deactivate CommandResult + +ScheduleCommand --> LogicManager : r +deactivate ScheduleCommand + +[<--LogicManager +deactivate LogicManager +@enduml diff --git a/docs/images/ScheduleSequenceDiagram.png b/docs/images/ScheduleSequenceDiagram.png new file mode 100644 index 0000000000000000000000000000000000000000..01692558abefc2eb3d838cf1a87c20f910483868 GIT binary patch literal 41268 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 Date: Mon, 15 Apr 2024 23:20:49 +0800 Subject: [PATCH 3/3] Add TOC and new user story --- docs/DeveloperGuide.md | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 0c008f05377..d00e029cbfb 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -4,7 +4,34 @@ title: Developer Guide --- * Table of Contents - {:toc} + * [**Acknowledgements**](#Acknowledgements) + * [**Setting up, getting started**](#Setting-up-getting-started) + * [**Design**](#Design) + * [Architecture](#Architecture) + * [UI component](#UI-component) + * [Logic component](#Logic-component) + * [Model component](#Model-component) + * [Storage component](#Storage-component) + * [Common classes](#Common-classes) + * [**Implementation**](#Implementation) + * [\[Implemented\] Schedule feature](#implemented-schedule-feature) + * [Proposed Implementation](#proposed-implementation) + * [\[Implemented\] Contact archiving](#implemented-contact-archiving) + * [Proposed Implementation](#proposed-implementation) + * [\[Proposed\] Undo/redo feature](#proposed-undoredo-feature) + * [Proposed Implementation](#proposed-implementation) + * [Design considerations:](#design-considerations) + * [**Documentation, logging, testing, configuration, dev-ops**](#documentation-logging-testing-configuration-dev-ops) + * [**Appendix: Requirements**](#appendix-requirements) + * [Product scope](#product-scope) + * [User stories](#user-stories) + * [Use cases](#use-cases) + * [Non-Functional Requirements](#non-functional-requirements) + * [Glossary](#glossary) + * [**Appendix: Instructions for manual testing**](#appendix-instructions-for-manual-testing) + * [Launch and shutdown](#launch-and-shutdown) + * [Deleting a person](#deleting-a-person) + * [Saving data](#saving-data) -------------------------------------------------------------------------------------------------------------------- @@ -390,7 +417,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | Priority | As a …​ | I want to …​ | So that I can…​ | |----------|----------------------------------------------------------------|----------------------------------------------------|-----------------------------------------------------------------------| -| `* *` | new user | see a tutorial and usage instructions | familiarise with FnBuddy' features | +| `* *` | new user | see a tutorial and usage instructions | familiarise with FnBuddy' features | | `* * *` | user | add an employee contact with banking details | quickly access the employee's banking details for salary disbursement | | `* * *` | user | delete an employee contact | remove entries that I no longer need | | `* * *` | user | view all employee contacts | | @@ -398,6 +425,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | `* *` | user handling employees with a variety of employment contracts | tag an employee contact with their employment type | retrieve the salary rate of the employee | | `* *` | user with human error tendencies | retrieve an employee's calculated pay | avoid paying out an incorrect salary amount | | `* *` | user | edit an employee contact details | keep the employee's details up to date | +| `* *` | user | schedule my employee shifts | plan workload more easily | | `*` | user with many employees | sort employees contacts by name | locate the employee contact easily | | `*` | user with potential returning employees | archive an employee contact | reopen the employee's details when they return easily | | `*` | user with forgetfulness | search for contacts by keyword | find contacts without needing to provide their full name |