This project is based on the AddressBook-Level3 project created by the SE-EDU initiative.
Generative AI tools such as ChatGPT and Copilot were used for the purposes of creating and ideating Junit test cases and method names, writing detailed Javadocs and some code refactoring.
Refer to the guide Setting up and getting started.
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.
Main components of the architecture
Main
(consisting of classes Main
and MainApp
) is in charge of the app launch and shut down.
The bulk of the app's work is done by the following four components:
UI
: The UI of the App.Logic
: The command executor.Model
: Holds the data of the App in memory.Storage
: Reads data from, and writes data to, the hard disk.Commons
represents a collection of classes used by multiple other components.
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 contact delete 1
.
Each of the four main components (also shown in the diagram above),
interface
with the same name as the Component.{Component Name}Manager
class (which follows the corresponding API interface
mentioned in the previous point.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. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.
The sections below give more details of each component.
The API of this component is specified in Ui.java
The UI consists of a MainWindow
that is made up of parts e.g.CommandBox
, ResultDisplay
, PersonListPanel
,
LessonListPanel
, 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,
Logic
component.Model
data so that the UI can be updated with the modified data.Logic
component, because the UI
relies on the Logic
to execute commands.Model
component, as it displays Person
and Lesson
object residing in the Model
.API : Logic.java
Here's a (partial) class diagram of the Logic
component:
The sequence diagram below illustrates the interactions within the Logic
component, taking execute("contact delete 1")
API call as an example.
Note: The lifeline for DeleteContactCommandParser
and ContactCommandParser
should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the Logic
component works:
Logic
is called upon to execute a command, in this case execute("contact delete 1)
, it is passed to an TutorEaseParser
object which in turn creates a parser that matches the type of command. In this case, it is the ContactCommandParser
as we are executing a command related to contacts. Commands related to lessons will use LessonCommandParser
.ContactCommandParser
will create the specific contact command parser corresponding to the execution. In this case, a DeleteContactCommandParser
will be created to parse the command.Command
object, specifically a DeleteContactCommand
in this case, which is executed by theLogicManager
.DeleteContactCommand
is a subclass of ContactCommand
which is a subclass of Command
)Model
when it is executed, in this case, to delete a person.Model
) to achieve.CommandResult
object which is returned back from Logic
.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:
TutorEaseParser
class creates a ContactCommandParser
or LessonCommandParser
based on the first word that the tutor keys in, which creates XYZContactCommandParser
(e.g. AddContactCommandParser
, DeleteContactCommandParser
) and XYZLessonCommandParser
(e.g. AddLessonCommandParser
) respectively. XYZContactCommandParser
and XYZLessonCommandParser
use the other classes shown above to parse the user command and create a XYZContactCommand
or XYZLessonCommand
object (e.g., AddContactCommand
) which the TutorEaseParser
returns back as a Command
object.XYZContactCommandParser
and XYZLessonCommandParser
classes (e.g., AddContactCommandParser
, DeleteContactCommandParser
, ...) inherit from theParser
interface so that they can be treated similarly where possible e.g, during testing.Extra Pointers about parsing:
help
, exit
, and clear
, they are handled directly within the parseCommand
function in TutorEaseParser
without the need for a dedicated parser.
These simple commands are omitted in the Parser classes diagram to enhance clarity and reduce clutter.XYZContactCommandParser
and XYZLessonCommandParser
, respectively.
However, their behaviour varies slightly depending on the function. For example, ArgumentMultimap
is used exclusively in parsers for add, delete, and edit commands,
while ArgumentTokenizer
is only used in parsers for add and edit commands. Not specifying every parser reduces clutter and conveys the high-level message concisely.API : Model.java
The Model
component,
Person
objects (which are contained in a UniquePersonList
object).Person
objects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiable ObservableList<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 change.UserPref
object that represents the user’s preferences. This is exposed to the outside as a ReadOnlyUserPref
objects.Model
represents data entities of the domain, they should make sense on their own without depending on other components)Note: An alternative (arguably, a more OOP) model is given below. It has a Tag
list in the TutorEase
, which Person
references. This allows TutorEase
to only require one Tag
object per unique tag, instead of each Person
needing their own Tag
objects.
API : Storage.java
The Storage
component,
TutorEaseStorage
, LessonSchedule
and UserPrefStorage
, which means it can be treated as either one (if only the functionality of only one is needed).Model
component (because the Storage
component's job is to save/retrieve objects that belong to the Model
)Classes used by multiple components are in the tutorease.address.commons
package.
Target user profile:
Value proposition: Our software enhances tutoring efficiency by
It enables seamless tutor coordination with primary to junior college level students and guardians, improving communication and organization, ultimately leading to a more effective and stress-free educational experience.
Priorities: MVP (must have), 2 (nice to have), 3 (unlikely to have)
As a | I want to | So that I can | Priority |
---|---|---|---|
Potential user exploring app | Have a guided tour showing the functions upon first opening | Have a better idea and navigate easily when using the app | 3 |
Potential user exploring app | See the test data inside the app (i.e. address book release) | Easily see how the app functions when it is in use | 3 |
New user to the app | Purge all sample data | Start writing in my own data | MVP |
As a | I want to | So that I can | Priority |
---|---|---|---|
Tutor | Add and delete my students' contacts | Keep track of my students | MVP |
Tutor | Add and delete my students' guardians' contacts | Keep track of my students’ guardians | MVP |
Tutor | Keep track of the house address of a student for home tuition | Easily go to their house when their tuition starts | MVP |
Tutor | Keep track of Zoom meeting link of a student for online tuition | Easily go to the online meeting room when tuition starts | 2 |
Tutor | Store what was done in the lessons | Track what was done and plan for next lessons easier | 2 |
Tutor | Create and delete lesson slots in my schedule | Keep track of my lessons | MVP |
Tutor | List all my lesson slots in my schedule | Keep track of my lessons | MVP |
Tutor | List all my contacts | Keep track of my contacts | MVP |
Tutor | Categorize my students based on subjects or grade levels | Know what type of lesson it is | 2 |
Tutor | Keep track of my students' exam dates | Prepare my students adequately by then | 2 |
Tutor | Edit student details (name, phone number, email, address, tags, etc.) | Ensure my students' details are up to date | 2 |
Tutor | Edit guardian details (name, phone number, email, address, tags, etc.) | Ensure guardians' details are up to date | 2 |
As a | I want to | So that I can | Priority |
---|---|---|---|
Tutor | Mark a lesson as completed or cancelled | Maintain accurate records of attendance and lesson statuses | 2 |
Tutor | Be able to make my lesson slots repeat every week | Avoid creating the same lesson slot every week | 2 |
Tutor | Keep track of my students' homework (i.e., done status, deadline) | Track the progress of my students and keep them accountable | 2 |
Tutor | Change the lesson slot just for that week/all subsequent weeks | Easily reschedule lessons | 2 |
Tutor | Know if I have accidentally scheduled a class at a conflicting time slot | Avoid troubling students to reschedule after agreeing on a time slot | MVP |
Tutor | Keep track of when and how much each student/guardian needs to pay | Collect my fees timely and accurately | 2 |
Tutor | Tag students under their guardian | Track total fees to collect | 2 |
Tutor | Automatically update the amount of fee I collect after a lesson | Avoid manually update and track fees | 2 |
Tutor | Batch delete all scheduled lessons with a student | Remove all students' classes | 2 |
Tutor | Find a student's or guardian's contact details quickly | Contact them quickly | 2 |
Tutor | Find a student's lesson details quickly | Know the location for their tuition | 2 |
As a | I want to | So that I can | Priority |
---|---|---|---|
Tutor | Export student progress reports (compiled lesson descriptions) | Provide detailed updates to their guardians every term/semester | 3 |
Tutor | Set reminders for upcoming lessons | Prepare for a lesson and will not miss any | 3 |
Tutor | Set reminders to collect payment | Collect my fees on time | 3 |
Tutor | View a history of all my previous lessons with each student | Reference past lessons and track long-term progress | 3 |
Tutor | Autofill commands with what is expected next | Avoid re-typing long commands | 3 |
Tutor | Export previous years' data into a file | Manage each year separately and not overcrowd my data | 3 |
Tutor | Generate monthly or weekly reports of my hours worked/earnings | Track my productivity and workload | 3 |
Tutor | Know what I need to bring/prepare for all my lessons in the upcoming day | Adequately prepare for each lesson and ensure my students have necessary materials | 3 |
Tutor | Tag various students under the same lesson slot for group lessons | Cater to different lesson types and optimize time | 3 |
Tutor | Manage multiple locations for students | Adjust if students have multiple locations for tuition | 3 |
Use Case: UC01 - Add contact
MSS:
Extensions:
Use Case: UC02 - Delete contact
MSS:
Extensions:
Use Case: UC03 - List contacts
MSS:
Extensions:
Use Case: UC04 - Edit contacts
MSS:
Extensions:
Use Case: UC05 - Find contacts with a specific name keyword
MSS:
Extensions:
Use Case: UC06 - Add lesson for student
Precondition: Student exists in the system.
MSS:
Extensions:
Use Case: UC07 - Delete lesson for student
MSS:
Extensions:
Use Case: UC08 - List all lessons
MSS:
Extensions:
Use Case: UC09 - Find lessons by student names
MSS:
Extensions:
Use Case: UC10 - Clear all entries
MSS:
Extensions:
17
or above installed.Given below are instructions to test the app manually.
Note: These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing.
Initial launch
Download the jar file and copy into an empty folder.
Open a command terminal, cd
into the folder you put the jar file in, and use the command java -jar tutorease.jar
to run the application.
Expected: The app launches and shows the GUI with some sample data.
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 using the command java -jar tutorease.jar
in the command terminal.
Expected: The most recent window size and location is retained.
Exiting the app
exit
into the command box and press enter.Adding a contact for a Student.
Test case: contact add n/Norbeast p/99243312 e/Norbeast12@beast.com a/Kent Ridge MRT r/Student t/Master
Expected: A student is added to the contacts. Details of the added student are shown in the status message.
Test case: contact add n/NowBeast p/223 a/Kent Ridge MRT r/Student t/Master
Expected: No contact is added. Error details are shown in the status message.
Test case: contact add n/CookBeast p/44627732 e/Norbea4st12@beast.com r/Student
Expected: No contact is added. Error details are shown in the status message.
Adding a contact for a Guardian.
Test case: contact add n/ETAN p/2774213 e/etan@man.com a/Tampines MRT r/Guardian t/Father
Expected: A guardian is added to the contacts. Details of the added guardian are shown in the status message.
Test case: contact add n/Mac p/44421367 a/Chicken MRT r/Guardian t/Master
Expected: No contact is added. Error details are shown in the status message.
Test case: contact add n/Pizza p/556785 e/Cooking@beast.com r/Guardian
Expected: No contact is added. Error details are shown in the status message.
List all contacts in TutorEase.
Prerequisite: At least one contact exists in TutorEase.
Test case: contact list
Expected: All contacts are shown.
Test case: contact list 0
Expected: All contacts are shown.
Editing a contact when there are contacts shown on the contact list.
Prerequisites: There are multiple contacts shown on the contact list.
Test case: contact edit 1 n/Chicken
Expected: First contact's name is edited. Details of the edited contact shown in the status message.
Test case: contact edit 1 p/992
Expected: First contact's phone number is edited. Details of the edited contact is shown in the status message.
Test case: contact edit 1 r/Student
Expected: Contact is not edited. Error details are shown in the status message.
Editing a contact when there are contacts shown on the filtered contact list.
Prerequisites: At least one contact is shown on the contact list.
Test case: contact edit 1 n/Duck
Expected: First contact's name is edited. Details of the edited contact are shown in the status message.
Test case: contact edit 1 p/8842
Expected: First contact's phone number is edited. Details of the edited contact are shown in the status message.
Test case: contact edit 1 r/Student
Expected: Contact is not edited. Error details are shown in the status message.
Finding a contact by name.
Prerequisites: There are multiple contacts, with at least one contact whose name is Alice
and at least one contact whose name is Bob
. None of the
contacts whose name is Test
or contains the word Test
. These names are case-insensitive.
Test case: contact find Alice
Expected: Contacts whose name is Alice
or contains the word Alice
will be displayed. There should be at least one as per the prerequisites.
Test case: contact find Test
Expected: No contacts is found. Details are shown in the status message.
Other incorrect contact find commands to try: contact find
, contact find x
(where x is a name of a
contact, a name that does not belong to any of the contacts or a word that is not in the names of any contact)
Expected: Similar to previous.
Deleting a contact while all contact are being shown.
Prerequisites: List all contact using the contact list
command. Multiple contact in the list.
Test case: contact delete 1
Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.
Test case: contact delete 0
Expected: No contact is deleted. Error details shown in the status message. Status bar remains the same.
Other incorrect delete commands to try: contact delete
, contact delete x
, ...
(where x is larger than the list size)
Expected: Similar to previous.
Adding a lesson when all students are shown.
Prerequisite: At least one student exists in the contact list.
Test case: lesson add sid/1 f/10 d/11-11-2024 12:00 h/1
Expected: A lesson is added to the student with index 1. Details of the added lesson shown in the status message.
Test case: lesson add sid/0 f/10 d/11-11-2024 12:00 h/1
Expected: No lesson is added. Error details are shown in the status message.
Test case: lesson add sid/1 f/10 d/11-11-2024 12:00 h/1
Expected: No lesson is added. Error details are shown in the status message.
Adding a lesson on filtered contact list.
Prerequisite: At least one student exists in the contact list.
Test case: lesson add sid/1 f/10 d/12-11-2024 12:00 h/1
Expected: A lesson is added to the student with index 1 in the filtered contact list. Details of the added lesson is shown in the status message.
List all lessons in the schedule.
Prerequisite: At least one lesson exists in the lesson schedule.
Test case: lesson list
Expected: All lessons in the lesson schedule are shown.
Test case: lesson list 0
Expected: All lessons in the lesson schedule are shown.
Deleting a lesson when there are lessons shown in the lesson schedule.
Prerequisites: There are multiple lessons in the lesson schedule.
Test case: lesson delete 1
Expected: First lesson is deleted from the lesson schedule. Details of the deleted lesson is shown in the status message.
Test case: lesson delete 0
Expected: No lesson is deleted. Error details are shown in the status message.
Other incorrect delete commands to try: lesson delete
, lesson delete x
, ...
(where x is larger
than the list size)
Expected: Similar to previous.
Deleting a lesson when there are lessons shown in the filtered lesson schedule.
Prerequisites: Executed a lesson find command and there are multiple lessons in the filtered lesson schedule.
Test case: lesson delete 1
Expected: First lesson is deleted from the filtered lesson schedule. Details of the deleted lesson are
shown in the status message.
Test case: lesson delete 0
Expected: No lesson is deleted. Error details are shown in the status message.
Other incorrect delete commands to try: lesson delete
, lesson delete x
(where x is larger
than the filtered list size)
Expected: Similar to previous.
Finding a lesson when there are lessons shown in the lesson schedule.
Prerequisites: There are multiple lessons in the lesson schedule, with at least one lesson with a
student whose name is Alice
and at least one lesson with a student whose name is Bob
. None of the
lessons have a student whose name is Test
or contains the word Test
. These names are
case-insensitive.
Test case: lesson find Alice
Expected: Lessons with student whose name is Alice
or contains the word Alice
will be displayed
on the lesson panel. There should be at least one as per the prerequisites.
Test case: lesson find Test
Expected: No lesson is found. Details are shown in the status message.
Other incorrect lesson find commands to try: lesson find
, lesson find x
(where x is a name of a
student who does not have a lesson, a name that does not belong to any of the students that have
lessons or a word that is not in the names of the students that have lessons)
Expected: Similar to previous.
Clearing TutorEase when there are contacts and lessons.
Prerequisites: There are multiple contacts and lessons in the contact list and lesson schedule.
Test case: clear
Expected: All contacts and lessons are cleared.
Team Size: 4
Recognizing the importance of capturing more details about different types of contacts, we plan to incorporate additional attributes for students, such as grade levels, subjects and exam dates. To support clear organization, we’ll also implement a tagging system that links each student to their respective guardian, making it easier to manage relationships and access relevant information at a glance. In the event that a student does not have contact information, they will be required to be linked to a guardian, ensuring that there exist a way to contact the student.
We recognize the need for clarity around overlapping lesson scheduling. Options for managing overlaps will include:
To accommodate a more diverse range of names, such as names with commas, accented characters, hyphens, etc., we plan to update the application to allow names with these characters. In the future, the system will support a wider variety of name formats, making it more inclusive and user-friendly.
Additionally, if extra whitespace is accidentally added between names (e.g., double space between first and last name), the system will show a warning to alert you of potential duplicate entries due to spacing inconsistencies.
To enhance lesson organization, we plan to introduce features that clearly distinguish past lessons. This will include options to automatically hide completed lessons or display them in a different color for easy identification. You will also be able to toggle the visibility of past lessons, allowing them to focus on upcoming schedules while still being able to reference completed sessions if needed.
We have acknowledged that it might be possible to charge an odd number (ie $25) per lesson for an even number of hours (ie 2 hours), resulting in the fee per hour not being an integer. To provide more flexibility in fee management, we plan to introduce support for decimal places in fee amounts. This will allow you to input and manage fees with greater precision, catering to scenarios where fees are calculated to fractional values (e.g., for hourly rates or partial payments).
An example of this issue is when a Tutor creates a contact with a name, address, tag, and email that are longer than expected. Part of the UI will be cut off if the screen resolution is not big enough. To ensure that the application is accessible to users with a wide range of screen sizes, we plan to optimize the user interface for additional screen resolutions so that none of the elements are cut off or hidden from view, regardless of the screen size.
Although it is highly unlikely that an integer value would exceed 2,147,483,647 under normal usage, the system currently only supports integer values up to 2,147,483,647. To accommodate larger values, we plan to update the system to allow for integer values above this limit. This will ensure that you can input and manage larger values without encountering any issues related to the integer limit.