Some of the NFRs are inspired by Pawfection Some of the Sequence Diagrams inspired by PoochPlanner
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 delete 1
.
Each of the four main components (also shown in the diagram above),
interface
with the same name as the Component.LogicManager
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
, 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
object residing in the Model
.API : Logic.java
Here's a (partial) class diagram of the Logic
component:
Realodex has implemented a dynamic delete function that either deletes user by index or by their name. Here we illustrate deletion by index for brevity.
The sequence diagram below illustrates the interactions within the Logic
component, taking execute("delete 1")
API call as an example.
Note: The lifeline for DeleteCommandParser
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, it is passed to an RealodexParser
object which in turn creates a parser that matches the command (e.g., DeleteCommandParser
) and uses it to parse the command.Command
object (more precisely, an object of one of its subclasses e.g., DeleteCommand
) which is executed by the LogicManager
.Model
when it is executed (e.g. 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:
RealodexParser
class creates an XYZCommandParser
(XYZ
is a placeholder for the specific command name e.g., AddCommandParser
) which uses the other classes shown above to parse the user command and create a XYZCommand
object (e.g., AddCommand
) which the RealodexParser
returns back as a Command
object.XYZCommandParser
classes (e.g., AddCommandParser
, DeleteCommandParser
, ...) inherit from the Parser
interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
In the context of our developer guide, the provided class diagram illustrates the structure of the Person
class,
encompassing essential attributes that real-estate agents would require from their clients for official documents and for better understanding of their requirements.
This detailed depiction allows developers
to grasp the internal composition of the Person
entity
without needing to replicate Person
in higher-level model interactions without cluttering too much low-level info.
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 Realodex, which Person
references. This allows Realodex to only require one Tag
object per unique tag, instead of each Person
needing their own Tag
objects.
API : Storage.java
The Storage
component,
RealodexStorage
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 seedu.realodex.commons
package.
This section describes some noteworthy details on how certain features are implemented.
The add
feature, that was morphed from the original AddressBook3, allows users to add clients along with their critical personal information, as well as optional remarks and birthday information.
AddCommand
: Executes the addition operation based on the user's input.AddCommandParser
: Parses user input to create an AddCommand
object.Person
: Represents a person in Realodex, encapsulating their personal information.ModelManager
: Implements the Model
interface and contains the internal list of persons.LogicManager
: Invokes the AddCommand
to execute the addition operation.RealodexParser
: Creates an AddCommand
object based on the user input.AddCommand
Implementation Sequence DiagramThe sequence diagram below illustrates the process of adding a person into Realodex.
add n/John Doe p/98765432 i/20000 e/johnd@example.com a/311, Clementi Ave 2, #02-25 f/4 t/buyer t/seller h/HDB r/Has 3 cats b/01May2009
, intending to add a person with the specified details.AddCommandParser
interprets the input.AddCommand
object is created.LogicManager
invokes the execute method of AddCommand.AddCommand
invokes the addPerson
method in Model
property to create new contact with the new Person
object.AddCommand
returns a CommandResult
object which stores the data regarding the completion of the AddCommand
.Person
.add n/John Doe p/98765432 i/20000 e/johnd@example.com a/311, Clementi Ave 2, #02-25 f/4 t/buyer t/seller h/HDB r/Has 3 cats b/01May2009
, intending to add a person with the specified details.Compulsory fields include: Name, Phone Number, Income, Email, Address, Family Size, Buyer / Seller Tag, Housing Type.
Optional fields include: Remark, Birthday A real estate agent may not have any remark for a client yet, and wishes to leave Remark empty. A real estate agent may also only want to track birthdays of their esteemed clients, and wishes to not include Birthday for the rest.
Field Constraints Specific field constraints are described below. They are designed with the users in mind.
NAME
:
PHONE
:
INCOME
:
EMAIL
:
ADDRESS
:
FAMILY
:
TAG
:
HOUSINGTYPE
: housing type a buyer wants or housing type a seller is selling
REMARK
:
BIRTHDAY
:
The sort
feature, introduced in version 1.4, allows users to arrange clients based on their upcoming birthday proximity, which is determined by the number of days until their next birthday relative to the current date.
SortCommand
: Executes the sorting operation based on the upcoming birthdays of persons.SortCommandParser
: Parses user input to create a SortCommand
object.BirthdayComparator
: Compares two Person
objects based on their birthdays to facilitate sorting.LogicManager
: Invokes the SortCommand
to execute the sorting operation.RealodexParser
: Creates a SortCommand
object based on the user input.UniquePersonsList
: Stores the list of unique persons in Realodex.ModelManager
: Implements the Model
interface and contains the internal list of persons.SortCommand
ArchitectureSortCommand
extensively interacts with the Model
component to facilitate list sorting during execution. Consequently, SortCommand
depends on ModelManager
, which is an implementation of the Model
interface. This dependency arises because ModelManager
instances are passed as arguments in the public CommandResult execute(Model model) throws CommandException
method of SortCommand
. For brevity, interactions beyond the Model
layer are not detailed.
SortCommand
Initialization Sequence DiagramTo implement the sorting functionality, the LogicManager
component parses the user's input command. Subsequently, it forwards the parsed command text to the RealodexParser
. The RealodexParser is responsible for creating an instance of the SortCommand
, encapsulating the logic for sorting clients based on their upcoming birthdays.
The sequence diagram below illustrates the process of creating a sort operation through the Logic
component:
SortCommand
Implementation Sequence DiagramModel Retrieval: The method begins by retrieving the Realodex
component from the provided Model
object using the getRealodex
method.
List Copying: Next, the method obtains a duplicate of the internal list of unique persons stored within the Realodex
component. This is achieved by calling the getCopyOfInternalListOfUniquePersonsList
method.
Sorting: The method proceeds to sort the copied list of persons using a BirthdayComparator
object. This comparator compares the birthdays of two persons, ensuring that the list is arranged in ascending order based on upcoming birthdays.
List Update: After sorting the copied list, the method updates the internal list of persons within the Realodex
component with the sorted list. This is accomplished by calling the setPersons
method of the Realodex
component.
Command Result Creation: Finally, the method returns a CommandResult
object with a success message indicating the completion of the sorting operation. The success message is defined by the constant MESSAGE_SUCCESS
.
Exception Handling: The method declares a throws CommandException
, indicating that it may throw a CommandException
if an error occurs during execution. However, the method implementation does not contain explicit error handling logic.
BirthdayComparator
The provided comparator compares two Person
objects based on their birthdays.
If o1
has an unspecified birthday (i.e., its birthday is blank), it is considered to come after o2
.
If o2
has an unspecified birthday (i.e., its birthday is blank), it is considered to come before o1
.
If both o1
and o2
have specified birthdays, the comparator compares them based on the number of days until their next birthday.
o1
's birthday is closer (fewer days until the next birthday) than o2
's birthday, o1
is considered to come before o2
.o2
's birthday is closer (fewer days until the next birthday) than o1
's birthday, o2
is considered to come before o1
.o1
and o2
have the same number of days until their next birthday, their order remains unchanged. public int compare(Person o1, Person o2) {
if (o1.getBirthday().toString().isBlank()) {
return 1; // o1 has an unspecified birthday, so it comes after o2
}
if (o2.getBirthday().toString().isBlank()) {
return -1; // o2 has an unspecified birthday, so it comes before o1
}
return o1.getBirthday().getDaysUntilBirthday().compareTo(o2.getBirthday().getDaysUntilBirthday());
}
sort
, intending to sort the list of persons based on their upcoming birthdays.SortCommandParser
interprets the input.SortCommand
object is created.LogicManager
invokes the execute method of SortCommand
.SortCommand
sorts the list of persons based on their upcoming birthdays.sort
, intending to sort the list of persons based on their upcoming birthdays.Introducing the ability to sort clients based on criteria other than "Today" opens up a world of possibilities for users seeking more tailored and flexible search options.
Pros:
Enhanced Flexibility: By accommodating sorting based on various criteria such as birthdays relative to holidays like Christmas, users gain the ability to prioritize their interactions based on unique contexts or preferences.
Improved Relevance: Sorting by alternate criteria allows users to surface clients who are most relevant to specific events or occasions, ensuring that they can engage with individuals in a timely and contextually appropriate manner.
Personalization: This feature empowers users to personalize their client management experience, aligning it more closely with their individual needs and preferences. This can lead to greater user satisfaction and efficiency.
Cons:
Learning Curve: Introducing new command formats may require users to adapt to changes in the interface or workflow. While this can initially pose a challenge, clear documentation and intuitive design can help mitigate the learning curve.
Complexity: Adding additional sorting options may increase the complexity of the system, potentially leading to a more cluttered user interface or backend implementation. Careful design and prioritization are necessary to maintain usability.
Maintenance Overhead: Supporting multiple sorting criteria introduces additional maintenance overhead, requiring ongoing updates and adjustments to ensure continued functionality and relevance.
In summary, while introducing sorting by criteria other than "Today" may come with some initial challenges, the benefits of enhanced flexibility, relevance, and personalization can outweigh these concerns, ultimately leading to a more powerful and user-friendly client management system.
Sort
Features Beyond v1.4The sort
functionality is poised for exciting developments in the future. Although initially focused on sorting
clients based on their birthdays to bolster client relationships in a breadth-first development approach,
we have ambitious plans to extend this feature to other fields. With clients having diverse attributes
such as income and housing preferences, implementing sort
for these fields is definitely on our roadmap.
Sort
Command Initialisation Sequence DiagramTo enhance the sorting functionality, we're introducing the capability to sort based on various fields specified by the user.
The proposed command format is sort field
, where field
represents the attribute by which the sorting will be performed.
For instance, users can execute commands like sort birthday
, sort income
, or sort housepref
.
The following sequence diagram illustrates the process
of introducing this new sort
operation through the Logic
component,
with user-specified fields.
The ref frame sequence diagram is omitted here,
as it's similar to the sorting sequence illustrated earlier.
Instead of using the BirthdayComparator
,
we'll utilize different comparators based on the user's specified field, such as IncomeComparator
.
This feature enables users to filter and view persons in Realodex based on specified criteria such as name, remark, tag, birthday, and housing type.
There are five ways to filter:
FilterCommand
: Executes the filtering operation based on a provided predicate that encapsulates the filtering criteria.PrefixChecker
: Ensures the syntactic correctness of user inputs by verifying command prefixes.
Detects command format violations, and facilitates clear error messaging.FilterCommandParser
: Parses user input into a FilterCommand by identifying the filtering field and keyphrase.PredicateProducer
: Generates specific predicates based on the identified field and keyphrase.Predicates
: NameContainsKeyphrasePredicate
, RemarkContainsKeyphrasePredicate
, TagsMatchPredicate
, BirthdayIsInMonthPredicate
, and HousingTypeMatchPredicate
that determine if a person's attributes match the user-defined criteria.The sequence diagram below illustrates the process of creating a filter operation through the Logic
component:
The Filter by Name feature allows users to filter the list of persons in Realodex based on their names.
This is implemented using the NameContainsKeyphrasePredicate
that checks if a person's name contains the keyphrase provided by the user.
filter n/John
, intending to filter out persons whose names contain "John".NameContainsKeyphrasePredicate
.FilterCommand
applies the NameContainsKeyphrasePredicate
predicate, updating the filtered person list to only include those whose names contain "John".filter n/John
, intending to filter the list of persons to only include those whose names contain "John".Aspect: Handling of partial names
Alternative 1 (current choice): Allow partial matches of names.
For example,
filter n/Jo
returns persons with names "John", "Bonjovi", etc.
Pros: More flexible search.
Cons: May return too many results for very short keyphrases.
Alternative 2: Require exact matches.
For example,
filter n/Jo
only returns persons with names "Jo"
Pros: Precise filtering.
Cons: Less flexible; users must remember exact names.
The Filter by Remark feature allows users to filter the list of persons in Realodex based on the remarks associated with them.
This is implemented using the RemarkContainsKeyphrasePredicate
that checks if a person's remarks includes the keyphrase provided by the user.
filter r/Loves coding
, intending to filter out to filter out persons whose remarks include "Loves coding".FilterCommandParser
interprets the input, creating a FilterCommand with a RemarkContainsKeyphrasePredicate
.FilterCommand
applies the RemarkContainsKeyphrasePredicate
predicate, updating the filtered person list to only include those whose remarks contain "Loves coding".filter r/Loves coding
, intending to filter the list of persons to only include those whose remarks include "Loves coding".Aspect: Handling of partial names
Alternative 1 (current choice): Allow partial matches for remarks.
For example,
filter r/love
returns persons with remarks like "Loves coding" and "Has a lovely dog".
Pros: More flexible search.
Cons: May return too many results for common keyphrases.
Alternative 2: Require exact matches.
For example,
filter r/Loves Coding
only returns persons with the exact remark "Loves coding".
Pros: Ensures that only persons with specific remarks are listed, reducing clutter.
Cons: Extremely limiting. Users must remember exact remarks.
The Filter by Tag feature allows users to filter the list of persons in Realodex based on their tags.
This is implemented using the TagsMatchPredicate
that checks whether a person's tags match the tag(s) specified by the user.
filter t/Buyer
, intending to filter out to filter out persons who are tagged as "Buyer".FilterCommandParser
interprets the input, creating a FilterCommand with a TagsMatchPredicate
.FilterCommand
applies the TagsMatchPredicate
predicate, updating the filtered person list to only include those who are tagged as "Buyer".filter t/Buyer
, intending to filter the list of persons to only include those who are tagged as "Buyer".Alternative 1 (current choice): Allow inclusion of persons with matching tags, irrespective of other tags.
For example,
filter t/Buyer
returns persons tagged as "Buyer", including those tagged as "Buyer" and "Seller".
Pros: Inclusive Search that returns anyone with the "Buyer" tag, increasing breadth of search outcomes.
Cons: Reduced precision in cases where users want to find persons exclusively tagged with this specific tag.
Alternative 2: All tag inputs must strictly match without.
For example,
filter t/Buyer
only returns persons tagged solely as "Buyer" and excludes persons tagged as both "Buyer" and "Seller".
Pros: Increase precision of search results for targeted searches.
Cons: Excludes potentially relevant persons who carry the specified tag alongside others.
The Filter by Birthday feature allows users to filter the list of persons in Realodex based on their birthday month.
This is implemented using the BirthdayIsInMonthPredicate
that checks whether a person's birthday matches the month specified by the user.
filter b/Jan
, intending to filter out to filter out persons with birthdays in January.FilterCommandParser
interprets the input, creating a FilterCommand with a BirthdayIsInMonthPredicate
.FilterCommand
applies the BirthdayIsInMonthPredicate
predicate, updating the filtered person list to only include those with birthday in January.filter b/Jan
, intending to filter the list of persons to only include those with birthdays in January.Alternative 1 (current choice): Filter by birthday month.
For example,
filter b/Jan
returns all persons born in January, regardless of the day.
Pros: Simplifies the birthday search process, making it easier to remember and use.
Cons: Less precise, might include unwanted results from the entire month.
Alternative 2: Require exact birthday matches.
For example,
filter b/1Jan
only returns persons born on January 1st.
Pros: Increase precision of search results, finding persons with specific birth dates.
Cons: Requires exact date knowledge, which may not always be available or remembered by users.
The Filter by Housing Type feature allows users to filter the list of persons in Realodex based on their preferred housing type.
This is implemented using the HousingTypeMatchPredicate
that checks whether a person's preferred housing type matches the housing type specified by the user.
filter h/Condominium
, intending to filter out persons with a "Condominium" housing type preference.FilterCommandParser
interprets the input, creating a FilterCommand with a HousingTypeMatchPredicate
.FilterCommand
applies the HousingTypeMatchPredicate
predicate, updating the filtered person list to only include those with a "Condominium" housing type preference.filter h/Condominium
, intending to filter the list of persons to only include those with a "Condominium" housing type preference.The Help feature provides help to the user (depending on user input) by either giving details on how all commands are used in a new window, or a short description in the main window on how an individual, specified command is used.
There are two types of help features
Help
FeatureHelp
HelpCommand
: A command that, when executed, either shows a new window summarising help for all commands, or
prints the help message in the Main Window for the requested command, depending on user input.HelpCommandParser
: Processes the user input to instantiate the HelpCommand object appropriately to perform the
correct action (the type of help to give, in this case help for all commands).Help
Command ArchitectureHelp
Command Sequence DiagramHelp
FeatureThe help
feature provides help to the user by showing a new window with a summary of how to use all commands, with
the correct format and relevant examples. A link to the User Guide is also provided.
help
, wanting to get the help for all commands.LogicManager
instantiates a RealodexParser
, which parses the command into a HelpCommand
.HelpCommand
is executed, showing a new window with help for all the features in Realodex.help
, wanting to get the help for all commands.Aspect: Information to include in the Help Window
Alternative 1 (current choice): Includes summary of ways to use all commands.
Pros: User does not need to leave the app to get the appropriate help, and can visit the UG if he/she needs more information.
Cons: May be lengthy and hard to find when the set of commands added becomes larger in the future.
Alternative 2: Only include link to User Guide in the help window.
Pros: Help window does not have too much information.
Cons: User will need to leave the application and look at a website everytime they require help which can be inconvenient.
The Help by command feature provides help to the user for an individual command specified by the user,
printed on the main window. This has been implemented for the add
,clearRealodex
,delete
,edit
,filter
,list
and sort
commands only.
COMMAND help
, clear help
is the command to get the help for the
clearRealodex command instead of clearRealodex help
.clear
command to clearRealodex
to avoid confusion with the delete
command, as both involve the removal of entries, and clearRealodex
encapsulates the
functionality of clearing the entire app more clearly.clear help
as this syntax is more user-friendly when seeking help.COMMAND help
, wanting to get the help for only specified COMMAND
.COMMAND
in the GUI.add help
, wanting to get the help for the add
command.add
command.Aspect: Method to request for help
Alternative 1 (current choice): Format is COMMAND help
.
Pros: Intuitive syntax for the user, and is consistent with other CLI-based applications.
Cons: Harder to implement and maintain as a Developer as awareness of how other commands are currently being parsed is needed to preserve functionality.
Alternative 2: Format is help COMMAND
.
Pros: Easy to implement as all functionality can be contained within help-related classes only.
Cons: Syntax may not be as intuitive.
The delete
feature provides the user the ability to delete a client's profile based on their index in the list or their name.
There are two ways to delete:
Delete
by indexDelete
by nameDeleteCommand
: Executes the deletion operation based on the specified index or name.DeleteCommandParser
: Parses the user input to instantiate the DeleteCommand object appropriately to perform the correct deletion operation.DeleteCommandExecutor
: Creates DeleteCommand object based on user input and returns it.Delete
Command ArchitectureDelete
Command Sequence DiagramDelete
by index featureThe delete
by index feature provides the user the ability to delete a client's profile based on their index in the list.
delete INDEX
, wanting to delete the profile on the client at index INDEX
.INDEX
.delete 2
, wanting to delete the profile on the client at index 2.Aspect: Method to delete client at index INDEX
Alternative 1 (current choice): Format is delete INDEX
.
Pros: Easy to implement as name and index can be differentiated using the prefix.
Cons: Syntax may not be as intuitive.
Alternative 2: Format is delete i/INDEX
.
Pros: More intuitive as the user knows that the index is being deleted.
Cons: Prefix i/
is already used for the income field, and is more inconvenient to have to type in prefix.
The delete
by name feature provides the user the ability to delete a client's profile based on their name.
delete n/NAME
, wanting to delete the profile on the client with name NAME
.NAME
.John Doe
exists in the Realodex list.delete n/John Doe
, wanting to delete the profile on the client with name John Doe
.John Doe
is deleted.Aspect: Method to delete client with name NAME
Alternative 1 (current choice): Format is delete n/NAME
.
Pros: Easy to implement as name and index can be differentiated using the prefix.
Cons: Syntax may not be as intuitive.
Alternative 2: Format is delete NAME
.
Pros: More convenient for user to not have to put in the prefix n/
.
Cons: Harder to implement due to the other delete by index feature, there is no way to differentiate if the user is try to input an index or name.
The edit by field feature provides the user the ability to edit a client's profile based on a specified field. This has been implemented for all
user fields name
, phone
, email
, address
, income
, birthday
, housingType
, tags
, and remark
.
edit INDEX n/John Doe
, intending to edit the name of the client at index INDEX
to "John Doe".EditCommandParser
interprets the input.EditCommand
object is created.LogicManager
invokes the execute method of EditCommand.EditCommand
invokes the editPerson
method in Model
property to edit the client's profile with the new Person
object.EditCommand
returns a CommandResult
object which stores the data regarding the completion of the EditCommand
.edit 1 n/John Doe
, intending to edit the name of the client at index 1 to "John Doe".Target user profile:
Value proposition:
Priorities: High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
* * * | first-time user | receive a simple tutorial on app usage | easily navigate Realodex |
* * * | tech-savvy user | use a command-line interface | navigate the app more efficiently due to my fast typing speed |
* * * | fast typer | quickly input various commands in the text box | perform actions like adding new clients, editing profiles, finding clients, without using GUI |
* * * | real-estate agent user | easily log personal notes after client interactions | reference these in future conversations for more personalized communication |
* * * | user with inactive clients | delete inactive clients permanently | remove them from my database and free up space |
* * | real estate agent user | search for clients interested in specific property listings | quickly match selling and buying clients |
* * | real estate agent user | record and access clients' preferred house types | filter and match clients with relevant property listings |
* * | real estate agent user | analyze trends in housing preferences | understand market demands and tailor my services |
* * | efficient user | filter clients by tag | organize and access client information more efficiently |
* * | efficient user | filter clients by categories | better categorize and manage client information based on personal attributes |
* * | first-time user | be guided through setting up my user profile | save my details for future use |
* * | first-time user | learn how to create and edit client profiles | manage client information efficiently |
* * | first-time user | understand how to navigate the app and use CLI commands | effectively use Realodex's features |
* * | forgetful user | get instructions on how to set up profiles and navigate | refresh my memory on how to use Realodex when needed |
* * | user with inactive clients | archive inactive clients | hide them from my active list while keeping their information for future reference |
* | real estate agent user | be notified of upcoming client birthdays | send personalized greetings and strengthen my relationships |
* | real estate agent user | be notified of upcoming holidays | prepare gifts for my clients and enhance our relationship |
* | real estate agent user | be reminded of significant client milestones | acknowledge these events and further personalize our relationship |
* | tech-savvy user | use tab to autofill parts of my command | speed up my use of the command line |
(For all use cases below, the System is Realodex and the Actor is the user, unless specified otherwise)
Use case: UC01 — Adding a user profile
Actor: User
MSS
User enters add ...
Command.
System adds user profile to Realodex
.
System replies to user with a success message.
Use case ends.
Extensions:
1a. Name
does not contain fully alphanumeric characters.
1a1. Realodex throws an error and highlights the format to user.
1a2. User enters new data.
Steps 1a1 to 1a2 repeats until the name input is valid.
Use case resumes from step 2.
1b. Name
contains erroneous whitespace at front or back.
1b1. Realodex fixes this for user without errors.
Use case resumes from step 2.
1c. Name
is not capitalized.
1c1. Realodex fixes this for user without errors.
Use case resumes from step 2.
1d. Name
is blank.
1d1. Realodex throws an error and highlights the format to user.
1d2. User enters new data.
Steps 1d1 to 1d2 repeats until the Name
input is valid.
Use case resumes from step 2.
1e. Phone
contains non-integer characters.
1e1. Realodex throws an error and highlights the format to user.
1e2. User enters new data.
Steps 1e1 to 1e2 repeats until the Phone
input is valid.
Use case resumes from step 2.
1f. Phone
is less than three characters.
1f1. Realodex throws an error and highlights the format to user.
1f2. User enters new data.
Steps 1f1 to 1f2 repeats until the Phone
input is valid.
Use case resumes from step 2.
1g. Phone
is blank.
1g1. Realodex throws an error and highlights the format to user.
1g2. User enters new data.
Steps 1g1 to 1g2 repeats until the Phone
input is valid.
Use case resumes from step 2.
1h. Income
is negative
1h1. Realodex throws an error and highlights the format to user.
1h2. User enters new data.
Steps 1h1 to 1h2 repeats until the Income
input is valid.
Use case resumes from step 2.
1i. Income
contains non-integer characters.
1i1. Realodex throws an error and highlights the format to user.
1i2. User enters new data.
Steps 1i1 to 1i2 repeats until the Income
input is valid.
Use case resumes from step 2.
1j. Income
is blank.
1j1. Realodex throws an error and highlights the format to user.
1j2. User enters new data.
Steps 1j1 to 1j2 repeats until the Income
input is valid.
Use case resumes from step 2.
1k. Email
is not in the valid format.
1k1. Realodex throws an error and highlights the format to user.
1k2. User enters new data.
Steps 1k1 to 1k2 repeats until the Email
input is valid.
Use case resumes from step 2.
1l. Email
is blank.
1l1. Realodex throws an error and highlights the format to user.
1l2. User enters new data.
Steps 1l1 to 1l2 repeats until the Email
input is valid.
Use case resumes from step 2.
1m. Address
is blank.
1m1. Realodex throws an error and highlights the format to user.
1m2. User enters new data.
Steps 1m1 to 1m2 repeats until the Address
input is valid.
Use case resumes from step 2.
1n. Family
contains non-integer characters.
1n1. Realodex throws an error and highlights the format to user.
1n2. User enters new data.
Steps 1n1 to 1n2 repeats until the Family
input is valid.
Use case resumes from step 2.
1o. Family
is negative or zero.
1o1. Realodex throws an error and highlights the format to user.
1o2. User enters new data.
Steps 1o1 to 1o2 repeats until the Family
input is valid.
Use case resumes from step 2.
1p. Family
is blank.
1p1. Realodex throws an error and highlights the format to user.
1p2. User enters new data.
Steps 1p1 to 1p2 repeats until the Family
input is valid.
Use case resumes from step 2.
1q. Tag
is not buyer
or seller
.
1q1. Realodex throws an error and highlights the format to user.
1q2. User enters new data.
Steps 1q1 to 1q2 repeats until the Tag
input is valid.
Use case resumes from step 2.
1r. Tag
is blank.
1r1. Realodex throws an error and highlights the format to user.
1r2. User enters new data.
Steps 1r1 to 1r2 repeats until the Tag
input is valid.
Use case resumes from step 2.
1s. Housing Type
is not in any of 'HDB', 'CONDOMINIUM', 'LANDED PROPERTY' or 'GOOD CLASS BUNGALOW'.
1s1. Realodex throws an error and highlights the format to user.
1s2. User enters new data.
Steps 1s1 to 1s2 repeats until the Housing Type
input is valid.
Use case resumes from step 2.
1t. Housing Type
is blank.
1t1. Realodex throws an error and highlights the format to user.
1t2. User enters new data.
Steps 1t1 to 1t2 repeats until the Housing Type
input is valid.
Use case resumes from step 2.
1u. Birthday
is not in the valid format.
1u1. Realodex throws an error and highlights the format to user.
1u2. User enters new data.
Steps 1u1 to 1u2 repeats until the Birthday
input is valid.
Use case resumes from step 2.
1v. Birthday
is blank.
1v1. Realodex throws an error and highlights the format to user.
1v2. User enters new data.
Steps 1v1 to 1v2 repeats until the Birthday
input is valid.
Use case resumes from step 2.
1w. Some compulsory fields are missing.
1w1. Realodex throws an error and highlights the format to user.
1w2. User enters new data.
Steps 1w1 to 1w2 repeats until the user inputs all compulsory fields.
Use case resumes from step 2.
Use case: UC02 — Editing a user profile
Actor: User
MSS
User Executes edit ...
Command:
System edits user profile of Realodex
and replies to user with a success message.
Use case ends.
Extensions:
1a. Name
does not contain fully alphanumeric characters.
1a1. Realodex throws an error and highlights the format to user.
1a2. User enters new data.
Steps 1a1 to 1a2 repeats until the name input is valid.
Use case resumes from step 2.
1b. Name
contains erroneous whitespace at front or back.
1b1. Realodex fixes this for user without errors.
Use case resumes from step 2.
1c. Name
is not capitalized.
1c1. Realodex fixes this for user without errors.
Use case resumes from step 2.
1d. Name
is blank.
1d1. Realodex throws an error and highlights the format to user.
1d2. User enters new data.
Steps 1d1 to 1d2 repeats until the Name
input is valid.
Use case resumes from step 2.
1e. Phone
contains non-integer characters.
1e1. Realodex throws an error and highlights the format to user.
1e2. User enters new data.
Steps 1e1 to 1e2 repeats until the Phone
input is valid.
Use case resumes from step 2.
1f. Phone
is less than three characters.
1f1. Realodex throws an error and highlights the format to user.
1f2. User enters new data.
Steps 1f1 to 1f2 repeats until the Phone
input is valid.
Use case resumes from step 2.
1g. Phone
is blank.
1g1. Realodex throws an error and highlights the format to user.
1g2. User enters new data.
Steps 1g1 to 1g2 repeats until the Phone
input is valid.
Use case resumes from step 2.
1h. Income
is negative
1h1. Realodex throws an error and highlights the format to user.
1h2. User enters new data.
Steps 1h1 to 1h2 repeats until the Income
input is valid.
Use case resumes from step 2.
1i. Income
contains non-integer characters.
1i1. Realodex throws an error and highlights the format to user.
1i2. User enters new data.
Steps 1i1 to 1i2 repeats until the Income
input is valid.
Use case resumes from step 2.
1j. Income
is blank.
1j1. Realodex throws an error and highlights the format to user.
1j2. User enters new data.
Steps 1j1 to 1j2 repeats until the Income
input is valid.
Use case resumes from step 2.
1k. Email
is not in the valid format.
1k1. Realodex throws an error and highlights the format to user.
1k2. User enters new data.
Steps 1k1 to 1k2 repeats until the Email
input is valid.
Use case resumes from step 2.
1l. Email
is blank.
1l1. Realodex throws an error and highlights the format to user.
1l2. User enters new data.
Steps 1l1 to 1l2 repeats until the Email
input is valid.
Use case resumes from step 2.
1m. Address
is blank.
1m1. Realodex throws an error and highlights the format to user.
1m2. User enters new data.
Steps 1m1 to 1m2 repeats until the Address
input is valid.
Use case resumes from step 2.
1n. Family
contains non-integer characters.
1n1. Realodex throws an error and highlights the format to user.
1n2. User enters new data.
Steps 1n1 to 1n2 repeats until the Family
input is valid.
Use case resumes from step 2.
1o. Family
is negative or zero.
1o1. Realodex throws an error and highlights the format to user.
1o2. User enters new data.
Steps 1o1 to 1o2 repeats until the Family
input is valid.
Use case resumes from step 2.
1p. Family
is blank.
1p1. Realodex throws an error and highlights the format to user.
1p2. User enters new data.
Steps 1p1 to 1p2 repeats until the Family
input is valid.
Use case resumes from step 2.
1q. Tag
is not buyer
or seller
.
1q1. Realodex throws an error and highlights the format to user.
1q2. User enters new data.
Steps 1q1 to 1q2 repeats until the Tag
input is valid.
Use case resumes from step 2.
1r. Tag
is blank.
1r1. Realodex throws an error and highlights the format to user.
1r2. User enters new data.
Steps 1r1 to 1r2 repeats until the Tag
input is valid.
Use case resumes from step 2.
1s. Housing Type
is not in any of 'HDB', 'CONDOMINIUM', 'LANDED PROPERTY' or 'GOOD CLASS BUNGALOW'.
1s1. Realodex throws an error and highlights the format to user.
1s2. User enters new data.
Steps 1s1 to 1s2 repeats until the Housing Type
input is valid.
Use case resumes from step 2.
1t. Housing Type
is blank.
1t1. Realodex throws an error and highlights the format to user.
1t2. User enters new data.
Steps 1t1 to 1t2 repeats until the Housing Type
input is valid.
Use case resumes from step 2.
1u. Birthday
is not in the valid format.
1u1. Realodex throws an error and highlights the format to user.
1u2. User enters new data.
Steps 1u1 to 1u2 repeats until the Birthday
input is valid.
Use case resumes from step 2.
1v. Birthday
is blank.
1v1. Realodex throws an error and highlights the format to user.
1v2. User enters new data.
Steps 1v1 to 1v2 repeats until the Birthday
input is valid.
Use case resumes from step 2.
1w. No fields input.
1w1. Realodex throws an error and highlights the format to user.
1w2. User enters new data.
Use case resumes from step 1.
Use case: UC03 — Delete
a person by name
MSS
User requests to delete
user by name
Realodex deletes the person with a success message
Use case ends.
Extensions:
1a. The input Name
is not of valid format
1a1. Realodex shows an error message highlighting the correct format for Name
.
1a2. User inputs a new Name
.
1a3. Steps 1a1 to 1a2 repeats until the Name
input is valid.
Use case resumes from step 2.
1b. The input Name
is not found
1b1. Realodex shows an error message that Name
is invalid.
1b2. User inputs a new Name
.
1b3. Steps 1b1 to 1b2 repeats until the Name
input is valid.
Use case resumes from step 2.
Use case: UC04 — Delete
a person by index
MSS
User requests to delete
user by index
Realodex deletes the person with a success message
Use case ends.
Extensions:
1a. The index
is more than client list size
1a1. Realodex shows an error message indicating an invalid index
error.
1a2. User inputs a new index
.
1a3. Steps 1a1 to 1a2 repeats until the index
input is valid.
Use case resumes from step 2.
1b. The index
is negative
1b1. Realodex shows an error message indicating a negative index
error.
1b2. User inputs a new index
.
1b3. Steps 1b1 to 1b2 repeats until the index
input is valid.
Use case resumes from step 2.
Use case: UC05 — Sort
list by birthday
MSS
User requests to sort
the list by the nearest upcoming birthday.
Realodex sorts the list
and returns the sorted list to screen.
Use case ends.
Use case: UC06 — List
MSS
User requests to list
Realodex shows the list of all clients
Use case ends.
Extensions:
2a. The list is empty
2a1. Realodex shows an empty list.
Use case ends.
Use case: UC07 — Filter
by Name
MSS
User requests to filter
clients by providing a Name
substring.
Realodex filters and displays a list of all clients whose names include the input substring.
Use case ends.
Extensions:
1a. The input substring is empty.
1a1. Realodex shows an error message indicating that the filter criteria cannot be empty.
1a2. User inputs a new substring.
1a3. Steps 1a1 to 1a2 repeats until the input substring is valid.
Use case resumes from step 2.
1b. The name input is not of valid format.
1b1. Realodex shows an error message highlighting the correct format.
1b2. User inputs a new substring.
1b3. Steps 1b1 to 1b2 repeats until the input substring is valid.
Use case resumes from step 2.
Use case: UC08 — Filter by Remarks
MSS
User requests to filter clients by providing a remark reference.
Realodex filters and displays a list of all clients whose remarks match the reference input.
Use case ends.
Extensions:
1a. The remark input is empty.
1a1. Realodex shows an error message indicating that the filter criteria cannot be empty.
1a2. User inputs a remark.
1a3. Steps 1a1 to 1a2 repeats until the input remark is valid.
Use case resumes from step 2.
Use case: UC09 — Filter by Tag
MSS
User requests to filter clients by providing a tag.
Realodex filters and displays a list of all clients whose tag matches the input.
Use case ends.
Extensions:
1a. The tag input is empty.
1a1. Realodex shows an error message indicating that the filter criteria cannot be empty.
1a2. User inputs a new tag.
1a3. Steps 1a1 to 1a2 repeats until the input tag is non-empty and valid.
Use case resumes from step 2.
1b. The tag input is not of valid format.
1b1. Realodex shows an error message highlighting the correct format.
1b2. User inputs a new tag.
1b3. Steps 1b1 to 1b2 repeats until the tag input is valid.
Use case resumes from step 2.
Use case: UC10 — Filter by Housing Type
MSS
User requests to filter clients by providing a housing type.
Realodex filters and displays a list of all clients whose housing type matches the input.
Use case ends.
Extensions:
1a. The housing type input is empty.
1a1. Realodex shows an error message indicating that the filter criteria cannot be empty.
1a2. User inputs a housing type.
1a3. Steps 1a1 to 1a2 repeats until the housing type is valid
Use case resumes from step 2.
1b. The housing type input is not of valid format.
1b1. Realodex shows an error message highlighting the correct format.
1b2. User inputs a new housing type.
1b3. Steps 1b1 to 1b2 repeats until the housing type input is valid.
Use case resumes from step 2.
Use case: UC11 — Filter by Birthday
MSS
User requests to filter clients by providing a birthday month.
Realodex filters and displays a list of all clients whose birthday month matches the input.
Use case ends.
Extensions:
1a. The birthday month input is empty.
1a1. Realodex shows an error message indicating that the filter criteria cannot be empty.
1a2. User inputs a birthday month.
1a3. Steps 1a1 to 1a2 repeats until the birthday month is non-empty and valid.
Use case resumes from step 2.
1b. The birthday month is not of valid format.
1b1. Realodex shows an error message highlighting the correct format.
1b2. User inputs a new birthday month.
1b3. Steps 1b1 to 1b2 repeats until the birthday month input is valid.
Use case resumes from step 2.
Use case: UC12 — Getting help
MSS
User requests for help.
Realodex displays a new window showing a summary of how all features are used with examples.
Use case ends.
Use case: UC13 — Getting help for specific command
MSS
User requests for help for a specific command.
A string summarizing how that individual command is used with examples is displayed.
Extensions:
1a. The requested command does not exist.
1a1. Realodex shows an error message command does not exist.
1a2. User inputs a new command.
1a3. Steps 1a1 to 1a2 repeats until the command input is valid.
Use case resumes from step 2.
11
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 java -jar realodex.jar
command to run the application.
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.
Exiting the app
add n/John Doe p/98765432 i/20000 e/johnd@example.com a/311, Clementi Ave 2, #02-25 f/4 t/buyer t/seller h/HDB r/Has 3 cats b/01May2009
John Doe
will be added and shown on the GUI.
If list was already populated, ensure you scroll down to find John Doe
.add n/John Wick p/98765432 i/20000 e/johnd@example.com a/311, Clementi Ave 2, #02-25 f/4 t/buyer t/seller h/HDB
John Wick
will be added
and shown on the GUI with the optional parameters stating that it is blank.
If list was already populated, ensure you scroll down to find John Wick
.add n/Tom Hanks e/johnd@example.com a/311, Clementi Ave 2, #02-25 f/4 t/buyer t/seller h/HDB
Missing compulsory prefixes in the command! Prefixes That Are Missed Are: i/INCOME, p/PHONE
will be displayed.add n/John Doe p/9876@@5432 i/200@00 e/johnd@example.com a/311, Clementi Ave 2, #02-25 f/4 t/buyer t/seller h/HDB r/Has 3 cats b/01May2009
Error parsing phone: Phone numbers should only contain numbers, and it should be at least 3 digits long
Error parsing income: Income should be an integer and should be at least 0
will be displayedDeleting a person while all persons are being shown
Prerequisites: List all persons using the list
command. Multiple persons in the list.
Test case: delete 1
Expected: Assuming, there exists a person in the list, first contact is deleted from the list.
Details of the deleted contact shown in the status message.
Test case: delete 0
Expected: No person is deleted. Error details shown in the status message.
Other incorrect delete commands to try: delete
, delete x
(where x is larger than the list size)
Expected: No person is deleted.
Error details shown in the status message.
Editing a person while all persons are being shown
Prerequisites: List all persons using the list
command. Multiple persons in the list.
Test case: edit 1 n/John Doe
Expected: First contact is updated with the new name. Details of the updated contact shown in the status message. Timestamp in the status bar is updated.
Test case: edit 0 n/John Doe
Expected: No person is updated. Error details shown in the status message. Status bar remains the same.
Other incorrect edit commands to try: edit
, edit x
(where x is larger than the list size)
Expected: Similar to previous.
sort
list
will display a list of original clients, this is useful after using filter
commands which will display a subset of the original list.clearRealodex
will clear the list of clients from Realodex. Be careful as you are unable to undo.filter n/John
Expected: A list of clients whose names contain the string John
will be returned.filter t/buyer
Expected: A list of clients with BUYER
tag is returned.filter h/HDB
Expected: A list of clients with the HDB housing type is returned.filter r/FOOD
Expected: A list of clients whose remarks include the specified keyphrase of FOOD is returned.filter b/SEP
Expected: A list of clients whose birthdays are in the specified month of September are returned.help
should display a help window with summary of each feature provided by RealodexTest case: add help
Expected: A help message for AddCommand
will be displayed in the box
Test case: edit help
Expected: A help message for EditCommand
will be displayed in the box
Dealing with missing/corrupted data files
realodex.json
in the data
directory and restart the app.
A new JSON file with sample contacts will be generated and you may proceed from there.Data is auto-saved in the json
file in real time.
Open up the realodex.json
in the data
directory in a text editor.
If there is an existing user, try delete index
where index is of that user.
Expected: This user will no longer appear in the json
file after command is executed.
If there is no existing user, you may want to refer to above "Corrupted Data" section
to easily get a fresh json
file with sample data and repeat from step 1.
Team size is five.
Make index error messages more specific for out-of-bounds indexes
The client index provided is invalid
edit 123 n/Denzel
and delete 123
returns The client index provided is invalid
Client index provided is more than the actual number of clients in Realodex!
Make index error messages more specific for edit
negative indexes
edit
, Realodex returns Invalid command format!...
edit -1 n/Denzel
returns Invalid command format!...
Index is not a non-zero unsigned integer.
Reduce compulsory fields for the "add" command and streamline the process of adding new user profiles
add
requires eight compulsory fields.
This might be excessive for users to always put in eight fields
every time they add a new user profile.
While this was a design choice to prevent users from missing out on important
fields, we plan to make this more user-friendly in the future.
SELLER
, they may choose to omit the input for INCOME
which would otherwise be
compulsory!
The Rationale is that sellers may not see a need to disclose their income for real estate deals.EMAIL
is not as important for their day-to-day client management, we may remove the
compulsory need for it in future iterations.Make date error more specific for leap dates on non-leap years
edit
, Realodex will return a invalid
...Birthday should be in ddMMMyyyy format... Date should also not be in future years and no earlier than year 1000!
29Feb2023
,
this will expectedly return the error as its invalid date.
However, the error message is not entirely helpful as the format is technically correct as its DDMMMYYYY
.Date input is a leap date on a non-leap year
Improve duplicate user profile check
Make PHONE
input conditions less restrictive
PHONE
only allows numbers, and it should be at least three digits long+6590215365
or 1-800
numbers
which may commonly have -
.9021 5365
Allow symbols in NAME
input
NAME
does not accept symbols, hence common substrings such as s/o
,
d/o
or punctuation such as in "Tan Xin En, Betty"
are not allowed in the name input.Allow multiple field inputs and relax duplicate PREFIX
restrictions
TAG
to prevent duplicate fields being added.Allow symbols in INCOME
input
INCOME
only allows numbers100,000
which is common tooPersistent Filtered Client List
add
, edit
, or delete
) is executed.Modifying UI Components One of the significant challenges we encountered was modifying the UI to incorporate our desired background. The UI comprises numerous components, making it challenging to identify and modify the relevant code sections.
Achievements Despite the challenge, we successfully navigated the UI structure and implemented the necessary modifications to integrate our custom background, enhancing the visual appeal of the application.
Test Case Regressions Another challenge we encountered was that after significant feature changes or additions, many of our test cases failed. We spent considerable time tracing the test code or components to determine the source of the errors.
Achievements Despite the challenge, this turned out to be a positive experience as it indicated robust code. After addressing the failures, we gained confidence in the robustness of our bug-free features.