This project is based on the AddressBook-Level3 project created by the SE-EDU initiative.
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.{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
, 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
or House
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("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 AddressBookParser
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:
AddressBookParser
class creates an XYZCommandParser
(XYZ
is a placeholder for the specific command name e.g., AddSellerCommandParser
) which uses the other classes shown above to parse the user command and create a XYZCommand
object (e.g., AddSellerCommand
) which the AddressBookParser
returns back as a Command
object.XYZCommandParser
classes (e.g., AddSellerCommandParser
, DeleteCommandParser
, ...) inherit from the Parser
interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
The Model
component,
Person
objects and House
objects (which are contained in a UniquePersonList
object and UniqueHouseList
object respectively).Person
objects and House
objects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiable ObservableList<Person>
and ObservableList<House>
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)API : Storage.java
The Storage
component,
Buyer
, Seller
, and House
) and user preference data in JSON format, and read them back into corresponding objects.AddressBookStorage
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
)Warning: If the JSON file is malformed, the contents of EstateEase will not be loaded, and a log message will be printed to a log file instead of being displayed within the application itself.
No proactive measures are taken to rectify this issue, such as deleting the corrupted file immediately upon detection or automatically fixing the fields or values in the malformed JSON.
While we do not assume the intended action for encountering a malformed JSON file, it should be noted that the malformed JSON will eventually be overwritten with a correctly formatted JSON once a valid command is triggered.
Classes used by multiple components are in the seedu.addressbook.commons
package.
This section describes some noteworthy details on how certain features are implemented.
This addSeller
feature allows user to add a Seller
and a House
into EstateEase.
The following activity diagram summarizes what happens when a user executes the addSeller
command.
The following sequence diagram shows how an addSeller
operation goes through the Logic
component:
Take Note of the Parameters for Sequence Diagram:
argumentA
: addSeller n/John Doe p/98765432 e/johnd@example.com type/Hdb street/Clementi Ave 2 blk/311 level/02 unitNo/25 postal/578578 price/999999999argumentB
: n/John Doe p/98765432 e/johnd@example.com type/Hdb street/Clementi Ave 2 blk/311 level/02 unitNo/25 postal/578578 price/999999999argumentC
: type/Hdb street/Clementi Ave 2 blk/311 level/02 unitNo/25 postal/578578 price/999999999The proposed add seller mechanism is facilitated by Person
. It extends Person
with additional field House
.
Additionally, it implements the following operations:
Seller#addHouse()
— Add a house to the seller list of houses.Seller#removeHouse()
— Remove a house from the list of houses of the seller.Seller#getHouses()
— Get a list of houses from the seller.Seller#hasHouse()
— Check if a house is in the list of houses from the seller.Seller#copy()
— Values of the seller is copied to a new seller object.Details:
AddSellerCommand
class extends the Command
class and is responsible for executing the add seller process. It expects the full details of the Seller
and House
to be specified in the command input.execute()
in LogicManager
.parseCommand()
in AddressBookParser
.Seller
and a House
will then be parsed to parse()
in AddSellerCommandParser
.House
will then be checked at the checkValidity()
in AddHouseCommandParser
.Seller
and a House
is valid, it will then be parsed to the AddSellerCommand
, where a constructor will be created.AddSellerCommand
, it will check whether there is duplicate Seller
in Person
, Seller
and Buyer
cannot be the same Person
. The House
will also be checked to see whether it is a duplicate House
, since the same House
should not exist in the EstateEase data.CommandResult
will then be returned. The system will then construct a new Seller
object which contains the Seller
details and House
details. This object will then be used to update the Model
through addPerson()
method of model.Note:
Seller
has the same name as a Seller
or a Buyer
, it will return an error to the user that the Person
has existed. Each Buyer
and Seller
are unique, and Buyer
cannot be a Seller
, and vice versa.House
in the EstateEase, it will return an error to the user that the should House
has existed. Each House
is unique, and there should not be duplicates.Aspect: How addSeller
executes:
Alternative 1 (current choice): Use a new command to add Seller
.
Seller
and Buyer
.Alternative 2: Use a prefix to differentiate between Seller
and Buyer
.
Alternative 1 (current choice): Use the addSeller
command to add one Seller
and one House
.
Seller
to have at least one house, so that Seller
and Buyer
can match instantly (if the requirements matches).Seller
and House
.Alternative 2: Use the addSeller
command to add only Seller
.
House
validation.Seller
will not have a house, and if all the Seller
in the list does not have a house, matchBuyer
cannot happen.This addBuyer
feature allows user to add a Buyer
into the EstateEase
The following activity diagram summarizes what happens when a user executes the addBuyer
command
The following sequence diagram shows how an addBuyer
operation goes through the Logic
component:
The proposed add buyer mechanism is facilitated by Person
. It extends Person
with additional field Budget
and PreferredHousingType
.
Details:
AddBuyerCommand
class extends the Command
class and is responsible for executing the add buyer process. It expects the full name and full details of the Buyer
to be specified in the command input.execute()
in LogicManager
.parseCommand()
in AddressBookParser
.Buyer
will then be parsed to parse()
in AddBuyerCommandParser
.Buyer
are valid, it will then be parsed to the AddBuyerCommand
, where a constructor will be created.AddBuyerCommand
, it will check whether there is duplicate Seller
or Buyer
in Person
, Seller
and Buyer
cannot be the same Person
.CommandResult
will then be returned. The system will then construct a new Buyer
object which contains the Buyer
details. This object will then be used to update the Model
through addPerson()
method of model.Note:
Buyer
has the same name as a Seller
or a Buyer
, it will return an error to the user that the Person
has existed. Each Buyer
and Seller
are unique, and Buyer
cannot be a Seller
, and vice versa.Aspect: How addBuyer
executes:
Alternative 1 (current choice): Use a new command to add Buyer
.
Seller
and Buyer
.Alternative 2: Use a prefix to differentiate between Seller
and Buyer
.
This view
feature allows user to view the details of a Person
in EstateEase.
The following sequence diagram shows how an view
operation goes through the Logic
component:
Details:
ViewCommand
class extends the Command
class and is responsible for executing the view person details process. It expects the index of the person in the displayed list to be specified in the command input.execute()
in LogicManager
.parseCommand()
in AddressBookParser
.INDEX
will then be parsed to parse()
in ViewCommandParser
.INDEX
is valid, it will then be parsed to the ViewCommand
, where a constructor will be created.ViewCommand
, it will check whether INDEX
is within the range of the displayed list.CommandResult
will then be returned. The system will then construct a new Person
object which contains the Person
details. This object will then be used to update the Model
through showPerson()
method of model.Note:
INDEX
should be the index of the displayed person list.Aspect: How view
executes:
Alternative 1 (current choice): Use a new command to view for both Buyer
and Seller
and system will check which object to display.
Alternative 2: Use 2 commands to differentiate between Seller
and Buyer
.
Seller
or Buyer
.Alternative 1 (current choice): Use INDEX
in the command input to select the person to view details.
Person
added to EstateEase, it might not be easy to find the index of the person the user want to view details..Alternative 2: Use FULL_NAME
in the command input to select the person to view details.
The editBuyer
command allows users to edit the details an existing Buyer
in EstateEase.
editBuyer
command in the format editBuyer INDEX [n/NAME] [p/PHONE] [e/EMAIL] [type/HOUSING_TYPE] [budget/BUDGET]
(E.g. editBuyer 1 p/91234567 e/johndoe@example.com).AddressBookParser
which calls EditBuyerCommandParser.parse()
to parse the input.
If the input is invalid, this method will throw a ParseException
, prompting the user where the invalid input went
wrong.EditBuyerCommandParser.parse()
will create an EditBuyerDescriptor
object if the input is valid.
The EditBuyerDescriptor
object contains the edited values of the Buyer
.
EditBuyerCommandParser.parse()
will then return an EditBuyerCommand
object which contains the INDEX
of the
Buyer
and EditBuyerDescriptor
.execute()
of the EditBuyerCommand
object.execute()
, the system will check if the INDEX
is valid, check if the object being edited is of Buyer
type, and check if the edited NAME
value already exists in EstateEase. If any of these checks fail, a
CommandException
will be thrown.Buyer
object which contains the edited values. This
object will then be used to update the model through setPerson()
method of model
.It is important to ensure that the target of the editBuyer
command is in fact a Buyer
object as it has different
parameters that is not available to Seller
object. Hence, the reason why the edit command is also separated into two
commands, one for buyer and one for seller. The uniqueness of the NAME
value in the EstateEase is also
needed as some of the commands uses the NAME
to execute the command.
The editSeller
command allows user to edit the details of an existing Seller
in EstateEase.
The overall implementation of this command is very similar to editBuyer
command, except the command format is
editSeller [n/NAME] [p/PHONE] [e/EMAIL]
(E.g. editSeller 1 p/91234567 e/johndoe@example.com).
The real estate agent may want to obtain all houses from sellers that match the buyer's preferences. For example, the real estate agent may want to gather all houses from sellers that align with a specified buyer's budget and preferred housing type.
The following activity diagram summarises the execution of a matchBuyer
command:
Step 1: The user launches the application for the first time. EstateEase will be initialized with the initial app state (consisting of both Buyer
and Seller
details).
Step 2: The user executes the matchBuyer Alice Lim
command to find and display Seller
details with House
that match the preferences of the buyer named "Alice Lim" in EstateEase.
Note: If the matchBuyer
command is used without specifying FULL_NAME
of a Buyer
, it will return a message to the user indicating that the buyer does not exist.
The following sequence diagram shows how an matchBuyer
operation goes through the Logic
component:
The MatchBuyerCommand
class extends the Command
class and is responsible for executing the matching process. It expects the full name of the Buyer
to be specified in the command input. Upon execution, the command retrieves the Budget
and HousingType
of the specified buyer. It then matches these preferences with the listings of available sellers' houses.
The MatchBuyerCommandParser
class is used to parse the user input and create the MatchBuyerCommand
object. When executed by the LogicManager
, the MatchBuyerCommand#execute(Model model)
method is called. This method matches the buyer's preferences with available sellers' houses in the model and returns a CommandResult
object.
Alternative 1 (current choice): Use a new MatchBuyerCommand
to do matching.
Buyer
, enhancing clarity and readability in the codebase.Alternative 2: Use prefix in FindCommand
to do matching.
FindCommand
structure to accommodate various matching scenarios with different prefixes.FindCommand
class, potentially making it harder to maintain and understand.The addHouse
Command is necessary to allow Houses to be added to Sellers.
The following sequence diagram shows how an addHouse
operation goes through the Logic
component:
Step 1: The user launches the application. The AddressBook
is assumed to already have the Seller
John Doe.
Step 2: The user executes the addHouse n/John Doe type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578578 price/99999
command to add a House
with these details to AddressBook
.
Note: If the addHouse
command is used with a Person
who is not a Seller
, or with invalid house details, or to a nonexistent Seller
, or an already existing House
, an error message is displayed.
The AddHouseCommand
class extends the Command
class and is responsible for executing the adding of a house to a seller. It expects the full name of the seller to be specified in the command input, along with the full details of the house. Upon execution, the command fetches listings of available sellers' houses. It checks if the house already exists and if the seller is a valid seller. If it does not exist and the seller is valid, the house is added to the seller.
The AddHouseCommandParser
class is used to parse the user input and create the AddHouseCommand
object. When executed by the LogicManager
, the AddHouseCommand#execute(Model model)
method is called. This method checks if the seller exists and if the house already exists and if the house is valid and returns a CommandResult
object.
Houses
ArrayList within Sellers to track
The deleteHouse
Command is necessary to delete Houses from relevant Sellers.
The following sequence diagram shows how an deleteHouse
operation goes through the Logic
component:
Step 1: The user launches the application. The AddressBook
is assumed to already have the Seller
John Doe. John Doe is assumed to have a Condominium located at Clementi Ave 2, level 2 (with no block), unit number 25, postal code 578578 with price 99999.
Step 2: The user executes the deleteHouse n/John Doe type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578578 price/99999
command to delete a House
with these details from AddressBook
and John Doe's houses.
Note: If the deleteHouse
command is used with a Person
who is not a Seller
, or with invalid house details, or to a nonexistent Seller
, or an already existing House
not under the named Seller
, an error message is displayed.
The DeleteHouseCommand
class extends the Command
class and is responsible for executing the deletion of a house from a seller. It expects the full name of the seller to be specified in the command input, along with the full details of the house. Upon execution, the command fetches listings of available sellers' houses. It checks if the house already exists and if the seller is a valid seller. If it does exist and the seller is valid, the house is deleted from the seller.
The DeleteHouseCommandParser
class is used to parse the user input and create the DeleteHouseCommand
object. When executed by the LogicManager
, the DeleteHouseCommand#execute(Model model)
method is called. This method checks if the seller exists and if the house already exists and if the house is valid and returns a CommandResult
object.
Houses
ArrayList within Sellers to track
Target user profile:
Value proposition: EstateEase simplifies residential property management for real estate listing agents in Singapore. With intuitive tools for listing and client communication, the app is tailored for efficiency. Agents can quickly access contacts and prioritize them, ensuring swift connections with clients.
Priorities: Urgent (must-must have) - * * * *
, High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
* * * * | real estate agent | add seller | keep track of their contact details and the houses that they are selling |
* * * * | real estate agent | add buyer | keep track of their contact details and requirements |
* * * * | real estate agent | view the list of all persons | quickly find the contact I need |
* * * * | real estate agent | delete the buyer/seller that I want to remove | remove outdated or irrelevant contacts |
* * * * | real estate agent | be able to exit the program when I want to | close the application |
* * * * | real estate agent | be able to automatically save the data I added, changed, and deleted | load the data when I open the application, with the saved data, next time |
* * * | real estate agent | keep track of my buyer's budgets | efficiently match them with houses within their financial constraints |
* * * | real estate agent | keep track of the prices of the houses | better manage my buyers' requirements |
* * * | real estate agent | match buyers with sellers based on the buyers' requirements | quickly identify houses that align with their preferences. |
* * * | real estate agent | find for a specific contact | access their details without scrolling through a long list |
* * * | real estate agent | easily update or modify existing contact information | have accurate and up-to-date records |
* * * | real estate agent | add new houses to the sellers | keep track of the houses that the sellers have |
* * * | real estate agent | delete existing houses from the sellers house list | remove irrelevant or incorrect houses |
* * * | real estate agent | have whatever EstateEase data I add load to the laptop I am using | do not need to re-enter all the details whenever I open the app |
* * | busy real estate agent | be able to view specific buyer's requirements | understand what are their needs quickly |
* * | busy real estate agent | be able to view specific seller's properties | effectively assess their listings quickly |
* * | busy real estate agent | be able to tell at a glance whether the contact is a buyer or seller | do not need to remember their identity |
(For all use cases below, the System is the EstateEase
and the Actor is the user
, unless specified otherwise)
Use case: UC01 - Add a seller to person list
MSS:
Extensions
3a. User enters an invalid command.
3b. User enters a seller that already exists.
3c. User does not enter a required field.
3d. User enters an invalid value.
Use case: UC02 - Add a buyer to person list
MSS:
Extensions
3a. User enters an invalid command.
3b. User enters a buyer that already exists.
3c. User does not enter a required field.
3d. User enters an invalid value.
Use case: UC03 - Add house to seller
MSS:
Extensions
1a. The EstateEase list does not have any seller.
3a. User enters duplicate house data.
3b. User enters an invalid command.
3c. User does not enter the required field.
3d. User enters an invalid seller.
3e. User enters an invalid house.
Use case: UC04 - List all persons
MSS:
User requests to list all of his/her persons.
EstateEase displays a list of persons, each with their details and an indication of whether they are a buyer or seller.
Use case ends.
Extensions
2a1. EstateEase displays a message stating that the list is empty.
Use case ends.
Use case: UC05 - Delete a person
MSS:
User requests to list all person (UC04).
User requests to delete a specific person in the person list.
EstateEase deletes the person.
Use case ends.
Extensions
1a. The person list is empty.
Use case ends.
2a. The given index is invalid input type.
2a1. EstateEase shows an error message regarding the invalid input type.
Use case resumes at step 1.
2b. The given index is out of range.
2b1. EstateEase shows an error message regarding the out of range.
Use case resumes at step 1.
Use case: UC06 - Load EstateEase data from file
Actor: EstateEase
Preconditions:
MSS:
Extensions
1a. JSON file is missing or the "data" folder is missing:
1b. JSON file has an incorrect format or fields:
Use case: UC07 - Save to storage
Actor: EstateEase
Preconditions:
MSS:
EstateEase processes the command (UC01, UC02, UC03, UC05, UC011, UC012) and updates EstateEase accordingly.
EstateEase updates the JSON file with the new changes.
EstateEase successfully updates the JSON file.
Use case ends.
Extensions
2a. EstateEase is unable to write to the JSON file due to file permission issue.
2b. EstateEase is unable to write to the JSON file due to some IOException.
Use case: UC08 - Search a person
MSS:
User requests to search for a person.
EstateEase displays all the person that match the inputted person name.
Use case ends.
Extensions
1a1. EstateEase shows an error message indicating no matches found.
Use case ends.
Use case: UC09 - View a buyer's requirements
MSS:
Extensions
Use case: UC10 - View a seller's houses
MSS:
User requests to view a specific seller's houses.
EstateEase displays the seller's personal details with their houses details.
Use case ends.
Extensions
2a1. EstateEase shows an error message regarding an invalid entry.
Use case ends.
2b1. EstateEase shows an error message regarding an invalid command.
Use case ends.
Use case: UC11 - Edit buyer details
MSS:
User executes the command to edit a buyer in EstateEase.
EstateEase updates the details of the specific buyer selected by the user.
Use case ends.
Extensions
1a. The given index is invalid.
1a1. EstateEase shows an error message.
Use case ends.
1b. The new value for the field being updated is not valid.
1b1. EstateEase shows format error message.
Use case ends.
1c. The edited name field already exists in EstateEase.
1c1. EstateEase error message, indicating that the person already exists.
Use case ends.
Use case: UC12 - Edit seller details
This use case is similar to UC11 - Edit buyer details, except it takes in different field
(i.e. parameters for name, phone, and email).
Use case: UC13 - Match sellers with buyer's preferences
MSS:
User requests to match a buyer's preferences.
EstateEase retrieves the budget and preferred housing type of the specified buyer.
EstateEase matches the buyer's preferences with the listings of available sellers.
EstateEase displays the list of sellers who have houses matching the specified buyer's budget and housing type.
Use case ends.
Extensions
1a. The specified buyer does not exist
1a1. EstateEase shows a message the specified buyer does not exist.
Use case ends.
3a. There are no matching listings
3a1. EstateEase shows a message indicating there is no matching results.
Use case ends.
Use case: UC14 - Exit application
MSS:
User enters the 'exit' command.
EstateEase immediately closes the application.
Use case ends.
Extensions
ID | Requirement |
---|---|
1 | The application must operate on Windows, Linux, and MacOS platforms provided Java 11 is installed. |
2 | The system should support up to 1000 persons and 1000 houses without experiencing performance lags during typical usage. |
3 | Users with above-average typing speeds should be able to perform most tasks more efficiently using keyboard commands than with a mouse. |
4 | The application should function properly both online and offline. |
5 | All data should load and the application should respond within three seconds. |
6 | Actions such as adding, updating, or deleting person records must complete within three seconds. |
7 | The response time for adding or deleting a house must also be within three seconds. |
8 | The user interface should be intuitive enough for users unfamiliar with similar applications. |
9 | The software must maintain a reliability rate of 99% across various devices and operating systems. |
10 | The system is designed to support only one user at a time. |
11 | Data should be stored locally on the user's device. |
12 | The application should automatically recover from common errors without crashing or requiring user intervention. |
13 | The program must provide meaningful error messages either in the application or terminal to help users resolve issues. |
ID | Term | Definitions |
---|---|---|
1 | Index | Represents the position of a person within the displayed list. |
2 | Hdb | Hdb refers to Housing Development Board flats, which are public housing units in Singapore designed to be affordable and accessible to the general populace. |
3 | Condominium | A condominium is a type of private residence in a building or community complex with shared amenities such as pools, gyms, and security. |
4 | Landed | Landed property refers to residential real estate that includes both the house and the land on which it stands. |
5 | Buyer | An individual interested in purchasing a house. |
6 | Seller | An individual looking to sell a house, who may own anywhere from zero to multiple properties. |
7 | House | Refers to a property owned by a seller, defined by its price and type, which are used by EstateEase to match with a buyer's preferences. |
8 | Budget | Refers to the amount a buyer is willing to pay for a house. |
9 | Price | Refers to the amount a seller is willing to sell the house for. |
10 | Preferred Housing Type | The type of house a buyer is seeking. |
11 | Housing Type | The type of house being sold by the seller. |
12 | Person | A person can be classified as either a buyer or a seller. |
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
Double-click the jar file
Expected: Shows the GUI with a set of sample contacts. 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.
Dealing with Missing Data Folder
data
folder. Dealing with Missing Data File
addressbook.json
file. Dealing with Corrupted Data Files
Test case: Duplicate a buyer or seller's details (name
, phone
, and email
) and use them for the opposite role (e.g., use a buyer details for a seller or vice versa).
Expected: This action violates EstateEase's constraints against duplicate persons, resulting in a corrupted addressbook.json
. The application should detect this error and display an empty EstateEase.
Test case: Copy a house listed under one seller and duplicate it under another seller's list of houses.
Expected: This action violates EstateEase's constraints against duplicate houses, resulting in a corrupted addressbook.json
. The application should detect this error and display an empty EstateEase.
Test case: Make a data file to have the same name as addressbook.json
but with an incorrect format.
Expected: This action violates EstateEase's constraints against incorrect data formats, resulting in a corrupted addressbook.json
. The application should detect this error and display an empty EstateEase.
Prerequisites:
list
command.person
with the name "John Carl 1", "John Felix", "John Carl 2", "Carl Lim Jovi Rato", "Carl Lim". Add seller
Test case: addSeller n/John Carl 1 p/98765432 e/johncarl1@example.com type/Hdb street/Clementi Ave 2 blk/311 level/02 unitNo/25 postal/578578 price/999999999
Expected: A new seller is added, with name John Carl 1
, phone 98765432
, email johncarl@example.com
and Hdb
house details with street Clementi Ave 2
, with block 311
, with level 02
, with unit number 25
, with postal code 578578
and price 999999999
.
Test case: addSeller n/John Felix p/98765433 e/johnfelix@example.com type/Condominium street/Clementi Ave 3 blk/N/A level/03 unitNo/26 postal/578579 price/100000
Expected: A new seller is added, with name John Felix
, phone 98765433
, email johnfelix@example.com
and Condominium
house details with street Clementi Ave 3
, with block N/A
, with level 03
, with unit number 26
, with postal code 578579
and price 100000
.
Test case: addSeller n/John Carl 2 p/98765434 e/johncarl2@example.com type/Landed street/Clementi Ave 4 unitNo/26 postal/578580 price/1000000
Expected: A new seller is added, with name John Carl 2
, phone 98765434
, email johncarl2@example.com
and Landed
house details with street Clementi Ave 4
, with unit number 26
, with postal code 578580
and price 1000000
.
Invalid format
Test case: addSeller n/ p/98765432 e/johncarl1@example.com type/Hdb street/Clementi Ave 10 blk/302 level/12 unitNo/29 postal/578978 price/999999999
Expected: No seller is added. Error indicating name should not be blank.
Test case: addSeller n/Carl Lim Jovi Rato p/9876-9999 e/carllimjovirato@example.com type/Hdb street/Toa Payoh Ave 10 blk/312 level/22 unitNo/39 postal/528978 price/9999999
Expected: No seller is added. Error indicating that phone should only contain numbers.
Test case: addSeller n/Carl Lim Jovi Rato p/98769999 e/carllimjovirato-example.com type/Hdb street/Toa Payoh Ave 10 blk/312 level/22 unitNo/39 postal/528978 price/9999999
Expected: No seller is added. Error indicating that email should be in the format of local-part@domain.
Invalid (Duplicate)
Test case: addSeller n/John Carl 1 p/98765432 e/johncarl1@example.com type/Landed street/Clementi Ave 2 unitNo/25 postal/578578 price/10000
Expected: No seller is added. Error indicating that the person already existed in the data.
Test case: addSeller n/Carl Lim p/98765432 e/johncarl@example.com type/Hdb street/Clementi Ave 2 blk/311 level/02 unitNo/25 postal/578578 price/999999999
Expected: No seller is added. Error indicating that the house already existed in the data.
Prerequisites:
list
command.person
with the name "James Cook", "Kris Hua", "Grace Tan" and "Chris Ong".Add buyer
addBuyer n/James Cook p/98753432 e/jamescook@example.com budget/550000 type/Hdb
James Cook
, phone 98753432
, email jamescook@example.com
, budget 550000
, preferred housing type Hdb
Invalid format
addBuyer n/Kris Hua p/98765432 e/krishua@example.com budget/99999900
Invalid (Duplicate Person)
addBuyer n/John Carl 1 p/98765432 e/johncarl1@example.com budget/550000 type/Hdb
Expected: No buyer is added. Error indicating that the person already existed in the data. Invalid Value
Test case: addBuyer n/Grace Tan p/98765432 e/gracetan@examaple.com budget/-99999900 type/Hdb
Expected: No buyer is added. Error indicating budget should be a positive number.
Test case: addBuyer n/Chris Ong p/98765432 e/chrisong@examaple.com budget/aa type/Hdb
Expected: No buyer is added. Error indicating budget should be a positive number.
Prerequisites:
Adding the house to the seller
addHouse n/John Felix type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578568 price/99999
Invalid house format
Test case: addHouse n/John Felix type/Condominium Ave 2 blk/N/A level/02 unitNo/25 postal/578568 price/99999
Expected: Invalid command format!
Test case: addHouse n/John Felix type/Condominium street/Clementi Ave 2 blk/N/A unitNo/25 postal/578568 price/99999
Expected: Invalid command format!
Invalid seller
addHouse n/Lim Carl type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578558 price/99999
House already exists
addHouse n/John Felix type/Condominium street/Clementi Ave 3 blk/N/A level/03 unitNo/26 postal/578579 price/100000
Prerequisites:
Deleting the house from the seller
deleteHouse n/John Felix type/Condominium street/Clementi Ave 3 blk/N/A level/03 unitNo/26 postal/578579 price/100000
Deleting the house from the wrong seller
deleteHouse n/John Carl 1 type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578568 price/99999
House does not exist
deleteHouse n/John Felix type/Condominium street/Clementi Ave 2 blk/N/A level/05 unitNo/25 postal/578538 price/99999
Invalid seller
addHouse n/Lim Carl type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578578 price/99999
Prerequisites:
list
command. Make sure there are at least 1 person in the list. Valid index
view 1
Invalid index
view 18
Invalid format
view 0
view a
Prerequisites:
list
command. Multiple persons in the list.Matching suitable sellers to a buyer using buyer's full name
matchBuyer James Cook
Invalid name format
Test case: matchBuyer James
Expected: Message indicating invalid format. The specified buyer was not found.
Test case: matchBuyer Cook
Expected: Message indicating invalid format. The specified buyer was not found.
Invalid buyer
matchBuyer John Felix
Buyer does not exist
matchBuyer Ben Chan
Prerequisites:
editSeller
command execution in this manual testing, execute the command find Felix
to ensure that this person is displayed as the first person in the list.Successful edit
editSeller 1 p/87654321
Duplicate name
editSeller 1 n/John Carl 1
Invalid person type
editSeller 1 n/Jessi Yek
Note: Ensure that the first person in the list is a Buyer
. You can ensure this by executing the command find James Cook
.
Invalid INDEX
editSeller 0 p/87654321
INDEX
must be a positive number.Note: The test cases for invalid input for each parameter is similar the test cases found in Adding a seller.
Prerequisites:
list
to show all the person in EstateEase.Invalid budget value
Test case: editBuyer 1 budget/-1
Expected: An error message will be shown, indicating that the budget should be a positive number.
Test case: editBuyer 1 budget/0
Expected: An error message will be shown, indicating that the budget should be a positive number.
Invalid preferred housing type
editBuyer 1 type/bungalow
Note:
Editing Seller Details
.Adding a buyer.
Prerequisites:
list
command. Make sure there are at least 1 person in the list. Valid index
delete 1
Invalid index
delete 18
Invalid format
delete 0
delete a
Prerequisites:
Dealing with Missing Data Folder
data
folder. data
folder along with a new addressbook.json
file, saving the current state of data to this new file. Dealing with Missing Data File
addressbook.json
file. addressbook.json
file within the existing data
folder and saves the current state of data to this new file. Dealing with Corrupted Data Files
addressbook.json
is corrupted either by incorrect data or format issues. addressbook.json
with a correctly formatted addressbook.json
containing the current state of data. If no valid command is executed, the application maintains the corrupted addressbook.json
. Real estate agents often need to match sellers with potential buyers efficiently. Currently, our application lacks a feature to facilitate this process. Introducing a matchSeller
command would enhance the usability of the application for real estate agents by providing a convenient way to find potential buyers who match their property listings.
matchSeller
command to filter potential buyers based on seller preferences such as price range and housing type.In the current implementation, there is no limit on the price and budget fields, which can lead to unrealistic values being entered. Setting a limit of 1 trillion ensures that prices and budgets remain within a reasonable range, preventing errors and maintaining data integrity.
Price
and Budget
classes to enforce a maximum value of 1 trillion.This enhancement improves the usability and reliability of the application by ensuring that price and budget inputs are realistic and within acceptable bounds.
Allowing prices and budgets to have more than two decimal places can lead to confusion and inaccuracies. Limiting them to two decimal places ensures consistency and precision in financial calculations.
Price
and Budget
classes to round values to two decimal places during input validation.This enhancement promotes clarity and accuracy in price and budget management within the application.
In the current implementation, HDBs and Condominiums are allowed to share postal codes, similar to real world situations. However, following further research, landed properties have shown no need to share postal codes.
phone
field accepts more than three digits without specifically limiting the input to the standard eight digits customary for Singaporean phone numbers, despite the application being Singapore-focused.phone
numbers, such as Singaporeans residing overseas who wish to purchase property back home, or foreigners intending to relocate to Singapore who may not yet have a local phone
number.phone
numbers into the system due to the absence of strict validation criteria.phone
number formats. This could involve specifying a more complex regex pattern or implementing a logic that checks for a country code prefix to distinguish between local and international numbers.editHouse
command was not implemented as it could be broken down into deleteHouse
and addHouse
and was not seen as necessary.editHouse
can be implemented in future versions.addHouse
and deleteHouse
commands, editHouse
would require seller and the exact house details. The logic would be fundamentally the same.addHouse
, deleteHouse
, and matchBuyer
utilize name-based identifiers, whereas other operations are index-based.index
, similar to how editSeller
, editBuyer
and view
are currently structured. This will ensure consistency across the application, making it easier for users to interact with EstateEase.addSeller
, addBuyer
, editSeller
and editBuyer
currently validates whether a person
exist in the application by checking the uniqueness of the name
, which may lead to confusion when multiple person
could share the same name
.John Doe 1
, John Doe 2
) are allowed to identify different person
with the same name
, this method has proven to be inconvenient and potentially confusing for user managing multiple entries with similar or identical name
.name
can be non-unique, each person
in the Person
list will be uniquely identified by two mandatory fields: email
and phone
.seller
or buyer
is added with an email
or phone
that matches an existing entry, the system will reject the addition to prevent duplicates. Similarly, modifications to email
or phone
in commands like editSeller
or editBuyer
will be checked against existing entries, and duplicates will not be allowed.person
in EstateEase, as both email
and phone
are unique to each person
, thereby reducing confusion to the user.INDEX
, such as editBuyer
, editSeller
, delete
and view
,
show a wrong error message when the INDEX
exceeds the maximum int value. It would show an error message for negative
value instead of indicating that the INDEX
provided is invalid.INDEX
input.
When an integer overflow is detected, it should show the error message that indicates that
the INDEX
provided is invalid.