Developer Guide
- 1. Introduction
- 2. Design
- 3. Implementation
- 4. Planned Enhancements
- 5. Documentation, logging, testing, configuration, dev-ops
-
6. Appendix: Requirements
- 6.1 Product scope
- 6.2 User stories
-
6.3 Use cases
- 6.3.1 Use case 1: Add a Person
- 6.3.2 Use case 2: Delete a Person
- 6.3.3 Use case 3: Delete a Task
- 6.3.4 Use case 4: Assign a Task to a Person
- 6.3.5 Use case 5: Remove assignment of Task from a Person
- 6.3.6 Use case 6: Consulting Help Window
- 6.3.7 Use case 7: Add a Task
- 6.3.8 Use case 8: List all Tasks
- 6.3.9 Use case 9: Mark a Task
- 6.3.10 Use case 10: Unmark a Task
- 6.3.11 Use case 11: Find Tasks assigned to an individual
- 6.3.12 Use case 12: Find the group of individuals assigned to a Task
- 6.3.13 Use case 13: Filter Persons based on tag
- 6.3.14 Use case 14: View all assigned Persons and Tasks
- 6.3.15 Use case 15: View assigned Persons
- 6.3.16 Use case 16: View assigned Tasks
- 6.3.17 Use case 17: View a Person’s details
- 6.3.18 Use case 18: View a Task’s details
- 6.3.19 Use case 19: View all unassigned Persons and Tasks
- 6.3.20 Use case 20: View unassigned Persons
- 6.3.21 Use case 21: View unassigned Tasks
- 6.3.22 Use case 22: Edit a Task
- 6.4 Non-Functional Requirements
- 6.5 Glossary
-
7. Appendix: Instructions for manual testing
- 7.1 Launch
- 7.2 Deleting a Person
- 7.3 Assigning a Task to a Person
- 7.4 Unassigning a Task from a Person
- 7.5 Marking a Task as Completed
- 7.6 Unmarking a Task as not Completed
- 7.7 Adding a Task
- 7.8 Deleting a Task
- 7.9 Listing all Tasks
- 7.10 Filtering Persons by Tag
- 7.11 Viewing Assigned and Unassigned Tasks and Persons
- 7.12 Viewing Task and Person details
- 7.13 Editing Task
- 7.14 Finding Persons by Name
- 7.15 Finding Tasks by Title
- 8. Appendix: Effort
1. Introduction
1.1 Product Overview
OfficeConnect is a task management tool designed specifically for managerial role personnels based within Singapore.
As managers in the current office environment, it is often not easy to grasp the workload of subordinates. This may result in:
- work overload among subordinates,
- difficulties in coordinating tasks with a large number of employees.
OfficeConnect offers a solution to these problems by providing better visibility into subordinates’ workloads, allowing managers to efficiently delegate tasks in an organised manner.
1.2 Setting up, getting started
Refer to the guide Setting up and getting started.
1.3 Acknowledgements
OfficeConnect is a brownfield Java project based on the AB3 project template by se-education.org.
1.4 Setting up, getting started
Refer to the guide Setting up and getting started.
2. Design
.puml
files used to create diagrams in this document can be found in the diagrams folder.
Refer to the PlantUML Tutorial at se-edu/guides
to learn how to create and edit diagrams.
2.1 Architecture
The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
2.1.1 Main components of the architecture
Main
has two classes called Main
and MainApp
.
It is responsible for
- At app launch: Initializes the components in the correct sequence, and connects them up with each other.
- At shut down: Shuts down the components and invokes cleanup methods where necessary.
Commons
represents a collection of classes used by multiple other components.
The rest of the App consists of four components.
-
UI
: The UI of the App. -
Logic
: The command executor. -
OfficeConnectModel
: Holds the data of the App in memory. -
Storage
: Reads data from, and writes data to, the hard disk.
2.1.2 How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues
the command deletet 1
to delete the task at index 1. The command deletet 1
is represented as commandText in the
diagram below.
OfficeConnectModel is a concrete class that contains two repository model managers and a person model manager.
Of the two repository model managers, one is used to keep track of tasks (i.e. Task
objects) and the other is used
to keep track of the assignment of tasks to persons (i.e AssignTask
objects). Meanwhile,
the person model manager implements the Model interface and is used to keep track of persons stored in OfficeConnect.
Each of the other three main components (excluding OfficeConnectModel), defines its API in an interface
with the
same name as the Component. The components implement their functionality using a concrete {Component Name}Manager
class.
For example, the Logic
component defines its API in the Logic.java
interface and implements its functionality
using the LogicManager.java
class which follows the Logic
interface. The components work together as illustrated
in the (partial) class diagram below.
2.2 UI component
The API of this component is specified in
Ui.java
.
The UI consists of a MainWindow
that is made up of Ui parts that will be encapsulated here as UiComponents
.
Examples of its members are visual elements that you will see on screen such as CommandBox
, ResultDisplay
, PersonListPanel
,
HelpWindow
, QuickstartWindow
, StatusBarFooter
etc. All these, including the MainWindow
, inherit from
the abstract UiPart
class which captures
the commonalities between classes that represent parts of the 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
is specified in MainWindow.fxml
The UI
component,
- executes user commands using the
Logic
component. - listens for changes to
OfficeConnectModel
data so that the UI can be updated with the modified data. - keeps a reference to the
Logic
component, because theUI
relies on theLogic
to execute commands. - depends on some classes in the
OfficeConnectModel
component, as it displaysPerson
andTask
objects residing in theOfficeConnectModel
.
2.3 Logic component
API : Logic.java
Here’s a (partial) class diagram of the Logic
component:
How the Logic
component works:
- When
Logic
is called upon to execute a command, it uses theAddressBookParser
class to parse the user command. - This results in a
Command
object (more precisely, an object of one of its subclasses e.g.,AddTaskCommand
) which is executed by theLogicManager
. - The command can communicate with
OfficeConnectModel
when it is executed (e.g. to add a person or a task). - The result of the command execution is encapsulated as a
CommandResult
object which is returned fromLogic
.
The Sequence Diagram below illustrates the interactions within the Logic
component for the execute("deletep 1")
API call, which deletes the person located at index 1. The command deletep 1
is represented by commandText in the
diagram below.
DeleteCommandParser
should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
Here are the other classes in Logic
(omitted from the class diagram above) that are used for parsing a user command:
How the parsing works:
- When called upon to parse a user command, the
AddressBookParser
class creates anXYZCommandParser
(XYZ
is a placeholder for the specific command name e.g.,AddTaskCommandParser
) which uses the other classes shown above to parse the user command and create aXYZCommand
object (e.g.,AddTaskCommand
) which theAddressBookParser
returns back as aCommand
object. - All
XYZCommandParser
classes (e.g.,AddTaskCommandParser
,DeleteTaskCommandParser
, …) inherit from theParser
interface so that they can be treated similarly where possible e.g, during testing.
2.4 OfficeConnectModel component
API : OfficeConnectModel.java
- Stores the task list data and task assignment data i.e., all
Task
andAssignTask
objects (which are contained in aUniqueItemList
object). - Stores the currently ‘selected’
Task
andAssignTask
objects (e.g., results of a search query) as separate filtered lists which is exposed to outsiders as an unmodifiableObservableList<Task>
andObservableList<AssignTask>
that can be ‘observed’ e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. - Stores data of all persons in OfficeConnect using a concrete implementation of the
Model
interface. Greater elaboration of theModel
component is provided below. - Does not depend on any of the other three components (as the
OfficeConnectModel
represents data entities of the domain, they should make sense on their own without depending on other components)
2.4.1 Model component
API : Model.java
The Model
component
- Is implemented by a person model manager in OfficeConnectModel.
- Stores the address book data for persons i.e., all
Person
objects (which are contained in aUniquePersonList
object). - Stores the currently ‘selected’
Person
objects (e.g., results of a search query) as a separate filtered list, which is exposed to outsiders as an unmodifiableObservableList<Person>
that can be ‘observed’ e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list changes. - Stores a
UserPref
object that represents the user’s preferences. This is exposed to the outside as aReadOnlyUserPref
object.
2.5 Storage component
API : Storage.java
OfficeConnect Storage Component
The initial storage component was specifically designed to accommodate the address book model. However, OfficeConnect necessitates the inclusion of two additional storage types, namely task storage and assignment storage.
To address this requirement, a new generic class called RepositoryStorage
has been introduced to the storage component.
This addition allows for increased extensibility and flexibility in the storage component’s functionality.
The enhanced design is extendable and also capable of supporting the integration of additional databases into the application in the future, if required.
The Storage
component saves address book data, task list data, task assignment data and user preference data in json format
and reads them back into corresponding objects. It inherits from both AddressBookStorage
and UserPrefStorage
, which
means it can be treated as either (if the functionality of only one is needed). It depends on some classes in the
OfficeConnectModel
component (because the Storage
component’s job is to save/retrieve objects that belong to OfficeConnectModel
).
2.6 Common classes
Classes used by multiple components are in the seedu.addressbook.commons
package.
3. Implementation
This section describes some noteworthy details on how certain features are implemented.
Notation: inputs placed in closed brackets [] are optional.
3.1 Adding a Task
Syntax: addt t/TITLE c/CONTENT st/STATUS [dl/DEADLINE]
Purpose: Allows users to add tasks into OfficeConnect.
3.1.1 Implementation
The implementation of this feature is supported by AddTaskCommand
and AddTaskCommandParser
.
Below is a sequence diagram that illustrates how a user adds new tasks into OfficeConnect.
3.1.2 Design Considerations
Aspect: Setting deadline as optional input
-
Alternative 1 (current choice): Deadline is optional.
- Pros: Increase convenience for users, as they will have to key in one less input. Not all tasks may have a set deadline.
- Cons: As it is optional, users may choose to prioritise convenience and not enter a deadline even if it will benefit the task description.
-
Alternative 2: Make deadline compulsory.
- Pros: Easier to implement.
- Cons: Inconveniences users, as they have to key in one more input to create a task, especially if there is no set deadline for the task. They will have to create a dummy deadline just to create a task without a deadline.
3.1.3 Constraints:
Title must be unique:
We felt that the title should be unique as it improves organisation and visual clarity for the user. By mandating unique
titles, we encourage users to be specific in the title (purpose) of the task (e.g. they will set title as
“Complete slides for Mr X” rather than “Complete Slides”), which will benefit them greatly, as they will be
able to clearly distinguish the purpose of each task just by looking at the title.
Suppose that the title was not unique. Users might have many tasks with the same title, which would impair their ability to distinguish between the tasks unless they read each of the task content individually. It would also reduce the visual clarity when searching for tasks, as tasks with similar titles might clutter up the GUI. Hence, our approach in mandating unique titles are geared towards improving organisation and visual clarity for users in both the short and long term.
3.2 Deleting a Task
Syntax: deletet INDEX
Purpose: Allows users to delete the task at the specified index in OfficeConnect.
3.2.1 Implementation
The implementation of this feature is supported by ListTaskCommand
, DeleteTaskCommand
and DeleteTaskCommandParser
.
Below are the steps required to delete a task in OfficeConnect.
Step 1: User keys in listt
, which will display the index of all tasks.
The user can thus obtain the index of the task that they want to delete.
Step 2: User keys in deletet INDEX
to delete the task at the specified index.
If the index is invalid, an error will be thrown.
Below is an activity diagram showcasing the 2 steps:
3.2.2 Design Considerations
Aspect: Implementation of Delete Task Command
-
Alternative 1 (current choice): Users have to call
listt
to find the index of the task they wish to delete.- Pros: Increase convenience for users, as they do not have to remember the index of each task while being easier to implement.
- Cons: Increases coupling within OfficeConnectModel, as any bug with
listt
could render users incapable of obtaining the index needed fordeletet
.
-
Alternative 2: Allow users to key in the index of each task when creating tasks, after which they can
use this index when deleting tasks.
- Pros: If the user remembers the index of each task, they will not need to call
listt
. Hence, it will be less troublesome for them to delete tasks as the number of steps required is reduced by one. Also reduces coupling, asdeletet
will not have to depend onlistt
to function properly. - Cons: The cons of this alternative lies in the difficulty of managing indexes when adding and deleting tasks.
If the user does not keep track of the indexes they have used for previous tasks, they may have to still calllistt
to find the index of the task they wish to delete or to find unused indexes to add tasks, which will not give it an advantage over the first alternative.
It would also be harder to keep track of invalid indexes. When tasks are deleted, their index should be invalid. Using this alternative, we would have to constantly update a list of invalid indexes when adding or deleting tasks, which would be troublesome and could lead to bugs. In alternative 1, all indexes are flushed to the front (i.e. first task has index 1, second task has index 2 etc.) and thus the invalid indexes can be easily obtained.
- Pros: If the user remembers the index of each task, they will not need to call
3.3 Finding a Person’s Assigned Tasks
Syntax: findp NAME
Purpose: Allow users to search and review the list of tasks assigned to the specified person in OfficeConnect.
3.3.1 Implementation
The implementation of this feature is supported by FindCommand
and FindCommandParser
.
Below is an activity diagram that illustrates the control flow for the Find feature.
3.3.2 Design Considerations
Aspect: Updating GUI
-
Alternative 1 (current choice): Displays empty list when no persons are found.
- Pros: It provides a consistent user experience, as users can expect the same behavior when searching for people throughout the application.
- Cons: An empty list can sometimes appear visually unappealing and may give the impression that the application is not functioning correctly.
-
Alternative 2: Displays most recent valid search result list when no persons are found.
- Pros: Saves time for users who may have previously searched for similar or related information and want to quickly access those results again.
- Cons: Could lead to frustration or confusion if users don’t understand why they’re seeing old results instead of new ones.
3.4 Finding a Task’s Assignees
Syntax: findt TITLE
Purpose: Allow users to search and review the group of individuals assigned to the specified task in OfficeConnect.
3.4.1 Implementation
The implementation of this feature is supported by FindTaskCommand
and FindTaskCommandParser
.
Below is an activity diagram that illustrates how a user finds who are assigned to a task.
3.4.2 Design Considerations
Aspect: Form of query
-
Alternative 1 (current choice): Query using
TASK_TITLE
- Pros: More intuitive as users do not have to keep track of the list index of the tasks. Able to query for tasks that are already logged in OfficeConnect using the title of the task.
- Cons: Length of commands are dependent on length of title. Users have to remember the name of the tasks.
-
Alternative 2: Query using
INDEX
- Pros: Shorter command to type out.
- Cons: Less intuitive and less user-friendly. Users would be forced to list all the tasks before being able to execute the findt command if the current display is empty.
3.5 Editing a Task
Syntax: editt INDEX [t/TITLE] [c/CONTENT] [st/TRUE] [dl/DEADLINE]
Purpose: Allow users to edit tasks that are currently listed in OfficeConnect.
3.5.1 Implementation
The implementation of this feature is supported by EditTaskCommand
and EditTaskCommandParser
.
3.5.2 Design Considerations
Aspect: Parameters required
-
Alternative 1 (current choice): Edit using at least one of the fields of the task.
- Pros: More intuitive and convenient for users as they do not have to retype every field.
- Cons: Users have to keep in mind which task the task index is referring to.
-
Alternative 2: Edit by retyping all the fields of the task to be edited.
- Pros: Forces users to be aware of the task to be edited instead of relying on subconscious mapping between index and tasks.
- Cons: Less intuitive and less user-friendly. Users would be forced to retype all the fields of the task before being able to edit a single field.
3.6 Assigning a Task
Syntax: assign pi/INDEX ti/INDEX
Purpose: Allows users to assign a person to a task in OfficeConnect.
3.6.1 Implementation
The implementation of this feature is supported by AssignCommand
, AssignCommandParser
, ListCommand
, ListAssignment
ListTaskCommand
, ListAllCommand
, FindCommand
and FindTaskCommand
.
Below are the steps required to assign a task to a person in OfficeConnect.
Step 1: User executes listall
to list all the people and tasks in OfficeConnect.
- Alternative steps to Step 1:
- User executes
findp David
to search for David in the contact list followed bylistt
to lists all the tasks. - User executes
findt slides
to search for a task containing the wordslides
in its title followed bylistp
to list all the persons. - User executes
viewunassignedall
to list all the persons that have not been assigned to any tasks and all tasks that have not been assigned to any persons. - User executes
findp David
to search for David in the contact list followed byviewunassignedt
to list all tasks that have not been assigned to any person. - User executes
findt slides
to search for a task containing the wordslides
in its title followed byviewunassignedp
to list all persons that have not been assigned to any tasks.
- User executes
- After this step, the target task to assign and the target person to be assigned to said task will appear in the list of persons and tasks displayed.
Step 2: User executes assign pi/1 ti/1
to assign the first task on the list of tasks to the first person on the list
of tasks.
The following activity diagram summarizes what happens when a user wants to execute an assign
command:
3.6.2 Design Considerations
Aspect: Steps Leading to Execution of Assign Command
-
Alternative 1 (current choice 1): Users execute
listp
orfindp
to display a list of persons andlistt
orfindt
to display a list of tasks on the application.- Pros: Users can search for a specific person or task before assigning.
- Cons: If
listp
andlistt
are used, users may have to scroll through a long list to search for the desired person or task. The results offindp
andfindt
cannot be displayed simultaneously. Thus, iffindp
was executed to search for a person, the user will then have to executelistt
to access the full list of tasks in order to identify the task that the user wants to be assigned to that person.
-
Alternative 2 (current choice 2): Users execute a command to display a list tasks that have not been
assigned to any person or to display a people that have not been assigned to that task.
- Pros: Users can easily view all the tasks that are currently unassigned at the same time, instead of having to execute
findt
to search for unassigned tasks one at a time. - Cons: None, because this is an additional feature proposed that will complement Alternative 1.
- Pros: Users can easily view all the tasks that are currently unassigned at the same time, instead of having to execute
-
Alternative 3: Users execute a command to generate recommendations of persons or tasks to be assigned.
- Pros: Additional convenience for user, as the recommendations generated will consist of persons who have completed all their assigned tasks or have not yet been assigned any tasks. Similarly, when generating a list of recommended tasks, we will display a list of tasks that have not yet been completed or assigned to anyone.
- Cons: From a manager’s perspective, the generated recommendations for persons or tasks may not be suitable for the given task or person. Thus, it may be better to give users full control over what they choose to display or search for before they choose to assign a task to a person.
3.7 Help Window
Syntax: help
Purpose: Provides users with a bird’s eye view of the various methods usable in OfficeConnect.
3.7.1 Implementation
This window was made by the HelpWindow
class, which ties in its respective fxml
and css
files to display the relevant UI to the user.
To provide the instructions to the user, a HelpStrings
class is maintained to give instructions stored in lengthy strings.
A Help Window will be opened either by entering the help
command, or by clicking on “Help” button in the toolbar.
The Activity Diagram below details the workflow of a user who wishes to access the HelpWindow. If the Help Window does not provide enough
information, the user can choose to view the comprehensive User Guide instead.
3.7.2 Design Considerations
Aspect: Contents of help window
-
Alternative 1 (Current choice): Display as a separate window, with concise details included in the sheet.
- Pros: Serves as a quick reference for the user, without having to go online to view the full comprehensive User Guide.
- Cons: Major updates in command implementations will have to be updated in the help sheet too, in addition to the online User Guide.
-
Alternative 2: Provide the user with the link to access the online User Guide.
- Pros: More comprehensive, able to give user the complete detailing of each command.
- Cons: Troublesome, requires user to go online to view the User Guide. User may also be overwhelmed by length of guide.
Aspect: Viewing of various command instructions
-
Alternative 1 (Current choice): Display all executable commands in a hierarchical tree, with description of method selected in a separate area.
- Pros: Providing a hierarchical structure to the list of commands available. This provides users with more ease of visualising the various methods as different groups of commands.
- Cons: More complex structures to be used when implementing the Ui of the help window. Restructuring of tree also may be necessary when big changes are made to structure of commands.
-
Alternative 2: Display all executable commands in a list.
- Pros: Adding/Restructuring of commands only involves deleting/modifying the line the command is on, no restructuring of the list needed
- Cons: Design not too intuitive, user may need to eyeball through all the commands in order to find what he/she is looking for.
3.8 Unassigning a Task from a Person
Syntax: unassign pi/INDEX ti/INDEX
Purpose: Allows users to unassign a task from a person in OfficeConnect.
The following activity diagram summarizes what happens when a user executes a new command:
Below is a sequence diagram that illustrates how a user unassign a tasks from a person in the OfficeConnectModel.
3.8.1 Implementation
The implementation of this feature is supported by UnassignTaskCommand
, UnassignTaskCommandParser
, ListCommand
, ListAssignment
ListTaskCommand
, ListAllCommand
, FindCommand
and FindTaskCommand
.
3.8.2 Design Considerations
Aspect: Unassigning a task from a person
-
Alternative 1 (current choice): Unassign tasks using the index of the person and the index of the task.
- Pros: Easier for users to locate the task and person they want to unassign, especially if the list of tasks or persons is long.
- Cons: Requires users to first obtain the index of the task and person by listing them, which might increase the steps required for the user.
-
Alternative 2: Unassign tasks using the task title and person name.
- Pros: No need to obtain the index of the task and person, which could reduce the steps required for the user.
- Cons: Task titles and person names might be long, making it more difficult for users to input the command. There could also be issues with names that are not unique.
3.9 Listing all Tasks
Syntax: listt
Purpose: Displays all tasks stored in OfficeConnect.
3.9.1 Implementation
The implementation of this feature is supported by OfficeConnectModel
.
Below is a sequence diagram that illustrates how a user can see all tasks stored in OfficeConnect.
3.10 Filtering Persons according to tag
Syntax: filterp tag/TAG
Purpose: Allows users to find all persons with the specified tag.
3.10.1 Implementation
The implementation of this feature is supported by FilterCommand
and FilterCommandParser
.
Below is an activity diagram that illustrates how a user finds all persons with the specified tag.
3.10.2 Design Considerations
Aspect: Number of tags that users can input
-
Alternative 1 (current choice): Only one tag is allowed.
- Pros: Encourage users to be specific in the tag they are searching for. Easier implementation.
- Cons: Users will have to use the command as many times as the number of tags they want to search.
-
Alternative 2: Allow multiple tags
- Pros: Allows users to search for more than one tag at once, which increases convenience and flexibility.
- Cons: Could produce many search results which may clutter up the GUI (as opposed to searching for only one task). More prone to bugs.
3.11 Quickstart Window
Syntax: quickstart
Purpose: Allows new users to better understand how OfficeConnect works.
3.11.1 Implementation
Similar to Help Window in section 3.7, this window is maintained by QuickstartWindow
class, which also maintains
similarly named fxml
and css
to display the relevant quickstart information.
4. Planned Enhancements
4.1 Support for overseas domains
4.1.1 Description
As we slowly improve OfficeConnect to provide support for managers and companies outside of Singapore, we plan to include additional support to allow for usage of OfficeConnect in other countries. This includes support for phone numbers with area codes, dashes, and the + sign which indicates which country the number is from.
4.2 Shortened or customisable keywords that maps to the same command
4.2.1 Description
The current chosen keywords can be considered lengthy or verbose for some users. While this does not pose any problems to our target users who are generally fast typists, we plan to include alternative shortened keywords or the ability to customise keywords to improve the user experience.
4.2.2 Consideration
The initial commands were very short and consisted of abbreviations like “lu”, “la”, “ap”, and “ap”. However, these abbreviations can be confusing for new users as they do not provide any information about what the command does which would result in a constant need to refer to the User Guide for assistance. Likewise, this requires the user to put in extra effort to learn and memorize the commands.
4.3 Improving data processing
4.3.1 Description
Our current data structure for storing input data in the application is Java’s observable filter list. While this structure has performed well for smaller volumes of data, we have observed that it is not suitable for larger datasets, particularly when updating the user interface. As a result, we are exploring the possibility of switching to a more efficient data structure that can better handle large volumes of data and process only the necessary portion of it on the screen using techniques such as data buffering and paging. This proposed change is expected to significantly improve the overall performance of our application, leading to a much-improved user experience.
5. Documentation, logging, testing, configuration, dev-ops
6. Appendix: Requirements
6.1 Product scope
Target user profile:
- Holds a managerial role
- Has a need to manage a significant number of subordinates
- Has a need to assign large number of tasks to subordinates
- Prefer desktop apps over other types
- Can type fast
- Prefers typing to mouse interactions
- Is reasonably comfortable using CLI apps
Value proposition:
- Manage tasks and contacts faster than a typical mouse/GUI driven app
- Able to view all upcoming tasks to be completed at one glance
- Allows efficient delegation of tasks to subordinates in an organised and centralised manner
6.2 User stories
Priorities: High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
* * |
new user | see a brief and simple guide | quick-start the application without reading long documentations |
* * * |
forgetful user | see usage instructions | refer to instructions when I forget how to use the App |
* * * |
manager | add tasks | |
* * * |
manager | edit tasks | keep the task updated with the most updated information |
* * * |
manager | delete tasks | remove tasks that I no longer need |
* * * |
manager | mark tasks as done and undone | keep track of tasks that are completed |
* * * |
manager | find tasks assigned to specific subordinate | better manage my subordinates workload |
* * * |
manager | check all ongoing tasks available | better delegate my tasks |
* * * |
manager | assign tasks to a subordinate | keep track of which subordinate is in charge of which task |
* * * |
manager | unassign tasks from a subordinate | assign this task to other subordinates |
* * * |
manager | add a subordinate | |
* * * |
manager | delete a subordinate | remove subordinates that I no longer need |
* * * |
manager | find a subordinate by name | locate details of a subordinate without having to go through the entire list |
* * * |
manager | filter subordinates based on their department (tag) | locate subordinates based on their department (tag) |
* * * |
manager | view assigned tasks and persons | have an overview of tasks and persons that are assigned |
* * * |
manager | view unassigned tasks and persons | have an overview of tasks and persons that are not assigned |
6.3 Use cases
OfficeConnect
and the
Actor is the user
, unless specified otherwise.
6.3.1 Use case 1: Add a Person
Main Success Scenario (MSS):
-
User requests to add a person.
-
OfficeConnect adds the person to the contact list.
-
OfficeConnect informs user has been successfully added.
Use case ends.
Extensions
-
1a. User enters incomplete or invalid data.
-
1a1. OfficeConnect shows an error message.
Use case ends.
-
6.3.2 Use case 2: Delete a Person
Main Success Scenario (MSS):
-
User requests to list persons.
-
OfficeConnect shows a list of persons.
-
User requests to delete a specific person in the list.
-
OfficeConnect deletes the person.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
6.3.3 Use case 3: Delete a Task
Main Success Scenario (MSS):
-
User requests to list tasks.
-
OfficeConnect shows a list of tasks.
-
User requests to delete a specific task in the list.
-
OfficeConnect deletes the task.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
6.3.4 Use case 4: Assign a Task to a Person
Main Success Scenario (MSS):
-
User requests to list all persons.
-
OfficeConnect shows a list of persons.
-
User requests to list all tasks.
-
OfficeConnect shows a list of tasks.
-
User requests to assign a specific task to a specific person.
-
OfficeConnect assigns the task to the person.
Use case ends.
Extensions
-
1a. User requests to find persons according to their name.
Use case resumes at step 2.
-
1b. User requests to list all persons and tasks at the same time.
-
1b1. OfficeConnect shows a list of tasks and persons.
Use case resumes at step 5.
-
-
2a. The list is empty.
Use case ends.
-
3a. User requests to find tasks according to their title.
User case resumes at step 4.
-
4a. The list is empty.
Use case ends.
-
5a. The given index is invalid.
-
5a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
6.3.5 Use case 5: Remove assignment of Task from a Person
Main Success Scenario (MSS):
-
User requests to list persons.
-
OfficeConnect shows a list of persons.
-
User requests to list tasks.
-
OfficeConnect shows a list of tasks.
-
User requests to unassign a specific task from a specific person.
-
OfficeConnect unassign the task from the person.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
-
4a. The list is empty.
Use case ends.
-
5a. The given index is invalid.
-
5a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
6.3.6 Use case 6: Consulting Help Window
Main Success Scenario (MSS):
-
User requests for help.
-
OfficeConnect opens help interface with dedicated help instructions.
-
User navigates to command he wishes to get help on.
-
OfficeConnect presents information on said command to user.
-
User reads closes window after retrieving required info.
Use case ends.
Extensions
-
4a. User requests for more info on command.
-
4a1. Help interface provides link to user guide.
-
4a2. User retrieves user guide providing more detail on command.
Use case resumes at step 5.
-
6.3.7 Use case 7: Add a Task
Main Success Scenario (MSS):
-
User requests to add a task.
-
OfficeConnect adds the task to the task list.
-
OfficeConnect informs user has been successfully added.
Use case ends.
Extensions
-
1a. User enters incomplete or invalid data.
- 1a1. OfficeConnect shows an error message.
Use case ends.
6.3.8 Use case 8: List all Tasks
Main Success Scenario (MSS):
-
User requests for a list of all tasks.
-
OfficeConnect displays all tasks stored.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
6.3.9 Use case 9: Mark a Task
Main Success Scenario (MSS):
-
User requests for a list of all tasks.
-
OfficeConnect displays all tasks stored.
-
User requests to mark a specific task.
-
OfficeConnect marks the task as completed.
Use case ends.
Extensions
-
1a. User requests to find tasks according to their titles.
Use case resumes at step 2.
-
2a. The list is empty.
Use case ends.
-
3a. The given index is invalid.
- 3a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
3b. The task at the given index is already marked as completed.
- 3b1. OfficeConnect shows an error message.
Use case ends.
6.3.10 Use case 10: Unmark a Task
Main Success Scenario (MSS):
-
User requests for a list of all tasks.
-
OfficeConnect displays all tasks stored.
-
User requests to unmark a specific task.
-
OfficeConnect unmarks the task as uncompleted.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
-
3b. The task at the given index is already marked as uncompleted.
-
3b1. OfficeConnect shows an error message.
Use case ends.
-
6.3.11 Use case 11: Find Tasks assigned to an individual
Main Success Scenario (MSS):
-
User requests for the list of tasks assigned to a specific person.
-
OfficeConnect displays all the tasks assigned to the person.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
6.3.12 Use case 12: Find the group of individuals assigned to a Task
Main Success Scenario (MSS):
-
User requests for the list of persons assigned to a specific task.
-
OfficeConnect displays all the individuals assigned to the task.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
6.3.13 Use case 13: Filter Persons based on tag
Main Success Scenario (MSS):
-
User requests to filter persons based on a specific tag
-
OfficeConnect displays all persons assigned to the tag
Use case ends.
Extensions
-
1a. The tag is invalid
-
1a1. OfficeConnect throws an error.
Use case ends.
-
6.3.14 Use case 14: View all assigned Persons and Tasks
Main Success Scenario (MSS):
-
User requests to view all assigned persons and tasks.
-
System displays a list of all assigned persons and tasks.
Use case ends.
6.3.15 Use case 15: View assigned Persons
Main Success Scenario (MSS):
-
User requests to view assigned persons.
-
System displays a list of assigned persons.
Use case ends.
6.3.16 Use case 16: View assigned Tasks
Main Success Scenario (MSS):
-
User requests to view assigned tasks.
-
System displays a list of assigned tasks.
Use case ends.
6.3.17 Use case 17: View a Person’s details
Main Success Scenario (MSS):
-
User requests to view a person’s details by specifying their index.
-
System displays the details of the specified person.
Use case ends.
6.3.18 Use case 18: View a Task’s details
Main Success Scenario (MSS):
-
User requests to view a task’s details by specifying its index.
-
System displays the details of the specified task.
Use case ends.
6.3.19 Use case 19: View all unassigned Persons and Tasks
Main Success Scenario (MSS):
-
User requests to view all unassigned persons and tasks.
-
System displays a list of all unassigned persons and tasks.
Use case ends.
6.3.20 Use case 20: View unassigned Persons
Main Success Scenario (MSS):
-
User requests to view unassigned persons.
-
System displays a list of unassigned persons.
Use case ends.
6.3.21 Use case 21: View unassigned Tasks
Main Success Scenario (MSS):
-
User requests to view unassigned tasks.
-
System displays a list of unassigned tasks.
Use case ends.
6.3.22 Use case 22: Edit a Task
Main Success Scenario (MSS):
-
User requests to list all tasks.
-
OfficeConnect displays all tasks stored.
-
User requests to edit a specific task.
-
OfficeConnect edits the task and display editted task.
Use case ends.
Extensions
-
1a. User requests to find tasks according to their titles.
Use case resumes at step 2.
-
2a. The list is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. OfficeConnect shows an error message.
Use case resumes at step 2.
-
-
3b. The deadline provided is after the date created.
-
3b1. OfficeConnect shows an error message.
Use case ends.
-
6.4 Non-Functional Requirements
- Performance: The system shall respond to user input within 0.1 seconds.
- Performance: The system should be able to hold up to 1000 entries/inputs, whichever is bigger, without a noticeable sluggishness in performance.
- Compatibility: The system shall be compatible to operating systems with java 11 runtime (e.g. Windows, MacOS, Linux). For MacOS users specifically, OpenJDK Runtime Environment Zulu11.60+19-CA (build 11.0.17+8-LTS) is required.
- Usability: The system shall have a user interface that is intuitive and easy to use, with a learning curve of no more than 2 hours for a new user.
- Accessibility: The system shall be operable even without an internet connection.
6.5 Glossary
A
- All
- All task and person.
- Assign
- Assign a task to a person.
M
- Mark - Mark a task as completed.
- Mainstream OS - Windows, Linux, Unix, OS-X
P
- P
- A person.
- PI
- View a person’s details.
Q
- Quickstart:
- Launch the application with sample data.
T
- T
- A Task.
- TI
- View a task’s details.
U
- Unassign
- Unassign a task from a person.
- Unmark
- Unmark a completed task.
V
- View
- A term used in the app to refer to the action of accessing and reviewing detailed information about records, such as person details or task details.
7. Appendix: Instructions for manual testing
Given below are instructions to test the app manually.
7.1 Launch
-
Initial launch
- Download the jar file and copy into an empty folder.
- Double-click the jar file
Expected: Shows the GUI with a set of sample contacts and sample tasks. The window size may not be optimum.
-
Saving window preferences
- Resize the window to an optimum size. Move the window to a different location. Close the window.
- Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
7.2 Deleting a Person
-
Deleting a person while all persons are being shown
- Prerequisites: List all persons using the
listp
command. Multiple persons in the list. - Test case:
deletep 1
Expected: First person is deleted from the list. Details of the deleted person shown in the feedback message. - Test case:
deletep 0
Expected: No person is deleted. Error details shown in the feedback message. - Other incorrect delete commands to try:
deletep
,deletep x
(where x is larger than the list size)
Expected: Similar to previous.
- Prerequisites: List all persons using the
7.3 Assigning a Task to a Person
-
Assigning a task to a person while all tasks and persons are being shown
- Prerequisites: List all persons and tasks using the
listall
command. Multiple tasks and persons in the list. - Test case:
assign pi/1 ti/1
Expected: Details of the assigned person and task shown in the feedback message. The task assigned will be shown when after usingfindp NAME
, whereNAME
is the full name of the first person in the list.
- Follow-up test case:
listall
, followed byassign pi/1 ti/1
Expected: Error details shown in feedback message indicating that the first person has already been assigned to the first task.
- Follow-up test case:
- Test case:
assign pi/1
Expected: No tasks or persons are assigned. Error details shown in feedback message. - Other incorrect assign commands to try:
assign
,assign 1 1
,assign pi/x ti/y
(where x or y is larger than the number of persons or tasks contained in the list displayed)
Expected: similar to previous.
- Prerequisites: List all persons and tasks using the
7.4 Unassigning a Task from a Person
-
Unassigning a task from a person while all tasks and persons are being shown
- Prerequisites: List all persons and tasks using the
listall
command. Multiple tasks and persons in the list. First person must already be assigned to the first task. - Test case:
unassign pi/1 ti/1
Expected: Details of the unassigned person and task shown in the feedback message. The task should no longer be assigned when using thefindp NAME
command, whereNAME
is the full name of the first person in the list.- Follow-up test case:
listall
, followed byunassign pi/1 ti/1
Expected: Error details shown in feedback message indicating that the first person has not been assigned to the first task.
- Follow-up test case:
- Test case:
unassign pi/1
Expected: No tasks or persons are unassigned. Error details shown in feedback message. - Other incorrect
unassign
commands to try:unassign
,unassign 1 1
,unassign pi/x ti/y
(wherex
ory
is larger than the number of persons or tasks contained in the list displayed).
Expected: Similar to previous.
- Prerequisites: List all persons and tasks using the
7.5 Marking a Task as Completed
-
Marking a task that has not been assigned to any persons as completed
- Prerequisites: List all tasks using the
listt
command. At least one task in the list. First task has not been assigned to any person, which can be verified by usingfindt TITLE
(whereTITLE
is the title of the first task) which should display an empty list. First task is currently not marked as completed (red cross appears below task). - Test case:
mark 1
Expected: Details of the task that is marked shown in the feedback message. A green tick will appear under the task. - Test case:
mark 0
Expected: No tasks are marked. Error details shown in feedback message. - Other incorrect mark commands to try:
mark
,mark x
(where x is larger than the list size). Expected: Similar to previous.
- Prerequisites: List all tasks using the
-
Marking a task that has been assigned to one or more persons as completed
- Prerequisites: Find persons assigned to a task using the
findt TITLE
(whereTITLE
is the title of a task). At least one person in the list. Task is not marked as completed (red cross appears below task). - Test case:
mark 1
Expected: Details of the task that is marked shown in the feedback message. A green tick will appear under the task. The progress indicator of the persons assigned to this task will be updated.
- Prerequisites: Find persons assigned to a task using the
7.6 Unmarking a Task as not Completed
-
Unmarking a task that has not been assigned to any persons as not completed yet
- Prerequisites: List all tasks using the
listt
command. At least one task in the list. First task has not been assigned to any person, which can be verified by usingfindt TITLE
(whereTITLE
is the title of the first task) which should display an empty list. First task is currently marked as completed (green tick appears below task). - Test case:
ummark 1
Expected: Details of the task that is unmarked shown in the feedback message. A red cross will appear under the task. - Test case:
unmark 0
Expected: No tasks are unmarked. Error details shown in feedback message. - Other incorrect unmark commands to try:
unmark
,unmark x
(where x is larger than the list size). Expected: Similar to previous.
- Prerequisites: List all tasks using the
-
Unmarking a task that has been assigned to one or more persons as not completed yet
- Prerequisites: Find persons assigned to a task using the
findt TITLE
(whereTITLE
is the title of a task). At least one person in the list. Task is marked as completed (red cross appears below task). - Test case:
unmark 1
Expected: Details of the task that is unmarked shown in the feedback message. A red cross will appear under the task. The progress indicator of the persons assigned to this task will be updated.
- Prerequisites: Find persons assigned to a task using the
7.7 Adding a Task
- Adding a task with no deadline
- Prerequisites: There are no tasks with the same title present.
- Test case:
addt t/Project X c/Complete slides for Mr X st/false
Expected: Details of the task that is added is shown in the feedback message. A new task will appear in the displayed task list. - Test case:
addt t/Project X c/Complete slides for Mr X st/hello
Expected: No tasks are added. Error details shown in feedback message. - Other incorrect add task commands to try:
addt t/Project X c/Complete slides for Mr X st/INPUT
, where INPUT is anything that is not true/false. Expected: Similar to previous.
- Adding a task with deadline
- Prerequisites: There are no tasks with the same title present.
- Test case:
addt t/Project X c/Complete slides for Mr X st/false dl/2024-01-01
Expected: Details of the task that is added is shown in the feedback message. A new task will appear in the taskbar of the GUI. - Test case:
addt t/Project X c/Complete slides for Mr X st/false dl/2024-01-01 02:05:00
Expected: Details of the task that is added is shown in the feedback message. A new task will appear in the taskbar of the GUI. - Test case:
addt t/Project X c/Complete slides for Mr X st/false dl/2024-01-01 02:05:0
Expected: No tasks are added. Error details shown in feedback message. - Other incorrect add task commands to try:
addt t/Project X c/Complete slides for Mr X st/false dl/2023-01-01 005:0
, or any input with incorrect datetime format (datetime format should be YYYY-MM-DD HH-MM-SS, where HH-MM-SS is optional). Deadlines that are set in the past (before the current date and time) will also throw an error.
Expected: Similar to previous
7.8 Deleting a Task
- Deleting a task while all tasks are being shown.
- Prerequisites: List all tasks using the
listt
command. At least 1 task in the list. - Test case:
deletet 1
Expected: First task is deleted from the list. Details of the deleted task shown in the feedback message. - Test case:
deletet 0
Expected: No task is deleted. Error details shown in the feedback message. - Other incorrect delete task commands to try:
deletet
,deletet x
(where x is larger than the largest index in displayed task list).
Expected: Similar to previous.
- Prerequisites: List all tasks using the
7.9 Listing all Tasks
- Listing all tasks.
- Prerequisites: None
- Test case:
listt
Expected: All tasks stored in OfficeConnect are listed. “Listed all tasks” shown in feedback message.
7.10 Filtering Persons by Tag
- There are persons in OfficeConnect with the specified tag.
- Prerequisites: Only one tag can be specified.
- Test case:
filterp tag/Logistics
Expected: All persons with the tag are displayed. “Filtered all persons with the tag: [tag]” shown in feedback message. - Test case:
filterp
Expected: No changes in displayed person list. Error details shown in feedback message. - Other incorrect filter persons commands to try:
filterp tag/
).
Expected: Similar to previous.
- There are no persons in OfficeConnect with the specified tag.
- Prerequisites: Only one tag can be specified.
- Test case:
filterp tag/Logistics
Expected: No persons are displayed. “There are no persons with the tag: [tag]” shown in feedback message. - Test case:
filterp
Expected: No changes in displayed person list. Error details shown in feedback message. - Other incorrect filter persons commands to try:
filterp tag/
).
Expected: Similar to previous.
7.11 Viewing Assigned and Unassigned Tasks and Persons
- There are assigned tasks and persons in OfficeConnect.
- Prerequisites: There are tasks and persons with assignments.
- Test case:
viewassignedall
Expected: All assigned tasks and persons are displayed. “Listed all assigned person(s) and task(s)” shown in feedback message. - Test case:
viewassignedp
Expected: All assigned persons are displayed. “Listed all assigned person(s)” shown in feedback message. - Test case:
viewassignedt
Expected: All assigned tasks are displayed. “Listed all assigned task(s)” shown in feedback message.
- There are unassigned tasks and persons in OfficeConnect.
- Prerequisites: There are tasks and persons without assignments.
- Test case:
viewunassignedall
Expected: All unassigned tasks and persons are displayed. “Listed all unassigned person(s) and task(s)” shown in feedback message. - Test case:
viewunassignedp
Expected: All unassigned persons are displayed. “Listed all unassigned person(s)” shown in feedback message. - Test case:
viewunassignedt
Expected: All unassigned tasks are displayed. “Listed all unassigned task(s)” shown in feedback message.
7.12 Viewing Task and Person details
- Task and person details are available in OfficeConnect.
- Prerequisites: The specified task and person indices are valid.
- Test case:
ti 2
Expected: Task details are displayed. - Test case:
pi 2
Expected: Person details are displayed.
- Task or person details are not available in OfficeConnect.
- Prerequisites: The specified task or person indices are invalid.
- Test case:
ti 7
Expected: No task details are displayed, error message is displayed instead. - Test case:
pi 7
Expected: No person details are displayed, error message is displayed instead.
7.13 Editing Task
- Task to be edited is available in OfficeConnect
- Prerequisites: There is at least 1 task in the list.
- Test case:
editt 1 t/Project X c/Complete slides st/true dl/2024-12-19
Expected: Task details are displayed. - Test case:
editt 0
Expected: “The task index provided is invalid” shown in feedback message.
7.14 Finding Persons by Name
- There are persons in OfficeConnect with the specified name.
- Prerequisites: Only one person can be specified.
- Test case:
findp NAME
Expected: All persons whose name contains given input are displayed. “[number] person found” shown in feedback message. - Test case:
findp
Expected: All persons and tasks in OfficeConnect are displayed. “Listed all persons and tasks” shown in feedback message. - Other incorrect find persons commands to try:
findp !@#
)
Expected: No persons are displayed. “No such person found” shown in feedback message.
- There are no persons in OfficeConnect with the specified name.
- Prerequisites: Only one person can be specified.
- Test case:
findp NAME
Expected: No persons are displayed. “No such person found” shown in feedback message. - Test case:
findp
Expected: All persons and tasks in OfficeConnect are displayed. “Listed all persons and tasks” shown in feedback message. - Other incorrect find persons commands to try:
findp !@#
)
Expected: No persons are displayed. “No such person found” shown in feedback message.
7.15 Finding Tasks by Title
- There are tasks in OfficeConnect with the specified title.
- Prerequisites: Only one title can be specified.
- Test case:
findt TITLE
Expected: All tasks in which title contains given input are displayed. “[number] task/s found” shown in feedback message. - Test case:
findt
Expected: All persons and tasks in OfficeConnect are displayed. “Listed all persons and tasks” shown in feedback message. - Other incorrect find tasks commands to try:
findt !@#
)
Expected: No tasks are displayed. “No such task found” shown in feedback message.
- There are no tasks in OfficeConnect with the specified title.
- Prerequisites: Only one title can be specified.
- Test case:
findt TITLE
Expected: No tasks are displayed. “No such task found” shown in feedback message. - Test case:
findt
Expected: All persons and tasks in OfficeConnect are displayed. “Listed all persons and tasks” shown in feedback message. - Other incorrect find tasks commands to try:
findt !@#
)
Expected: No tasks are displayed. “No such task found” shown in feedback message.
8. Appendix: Effort
OfficeConnect is a project built upon AB3, which was built out of the SE-EDU initiative. Our group has been actively working on OfficeConnect for the past 9 weeks, holding meetings to stay on task ever since the group has been formed, meeting all weekly checkpoints punctually.
Having written more than 12,000 of LOC cumulatively, coupled with appropriate, concise documentation, we also have endeavored to abide by the code quality and design patterns that were taught throughout the span of CS2103, and shown in AB3. We have also strived to maintain good code coverage, applying what was taught in the later weeks, resulting in a code coverage of near 70% in Codecov.
In the section, we will detail some of the hurdles that we faced through the iterations of our tP, both design and technical wise.
8.1 Design Challenges
Although OfficeConnect is a brownfield project building on the AB3, it was necessary to go over the AB3, identify weak points within AB3’s interface, and reflect on which aspects of the interface needed a re-implementation. Some big design changes includes:
- Inclusion of a quickstart guide: After going through our user stories and reflecting on how the user may experience OfficeConnect, we felt it may be more appropriate to include a guide that gives users a brief rundown on the basics of the app, something that was not considered in AB3.
- Modifications for the help guide. Instead of just a URL link to the online UserGuide, we felt there was a need for a more “immediate” and quick reference guide that should be available, especially in settings where internet connection may not be available (which is also one of our NFRs.) By including a more detailed but sufficiently concise guide, we aim to ease the user into OfficeConnect more smoothly.
- Integrating OfficeConnectModel with Model. We wanted to change AB3 to include tasks, but we did not want to modify the old Model component as it was specialised for persons. Hence, we decided to create a new OfficeConnectModel that helps us store tasks. Initially, they existed as two separate entities, which was easier to implement, but was of considerably poorer design as we realised that Model could be contained in OfficeConnectModel. Hence, we decided to include Model into OfficeConenctModel. However, this required changing a lot of test cases, which was very tedious and time consuming.
8.2 Technical Challenges
- As AB3 is quite a big project, it was quite difficult for us to understand the structure and details behind the code initially. To overcome this, we decided to start project meetings on our project early to allow us more time to understand AB3’s implementation, and also help each other clarify our doubts regarding AB3. This understanding helped reduce the learning curve when trying to implement OfficeConnect’s new features, as some of the features had a similar concept and understanding how it was implemented in AB3 significantly lowered the difficulty level when implementing those methods.