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/HdbJames Cook, phone 98753432, email jamescook@example.com, budget 550000, preferred housing type HdbInvalid 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/99999Invalid 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/99999House already exists
addHouse n/John Felix type/Condominium street/Clementi Ave 3 blk/N/A level/03 unitNo/26 postal/578579 price/100000Prerequisites:
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/100000Deleting 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/99999House does not exist
deleteHouse n/John Felix type/Condominium street/Clementi Ave 2 blk/N/A level/05 unitNo/25 postal/578538 price/99999Invalid seller
addHouse n/Lim Carl type/Condominium street/Clementi Ave 2 blk/N/A level/02 unitNo/25 postal/578578 price/99999Prerequisites:
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/87654321Duplicate name
editSeller 1 n/John Carl 1Invalid person type
editSeller 1 n/Jessi YekNote: 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/87654321INDEX 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/bungalowNote:
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.