Generative AI tools, including ChatGPT, were heavily used for creating detailed Javadocs, commit messages, test suite creation and occasional code refactoring throughout the development of ClientGrid.
Mockito has been used to mock unit tests.
Aspects of the original AB3 has been reused in our code.
JavaFx has been used to create the UI elements.
Jackson has been used for the Json formatted database.
JUnit5 has been used for unit testing.
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
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, ClientListPanel, 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:
The sequence diagram below illustrates the interactions within the Logic component, taking execute("deletebuyer p/91234567") API call as an example.
How the Logic component works:
Logic is called upon to execute a command, it is passed to an ClientGridParser object which in turn creates a parser that matches the command (e.g., DeleteBuyerCommandParser) and uses it to parse the command.Command object (more precisely, an object of one of its subclasses e.g., DeleteBuyerCommand) which is executed by the LogicManager.Model when it is executed (e.g. to delete a client).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:
ClientGridParser class creates an XYZCommandParser (XYZ is a placeholder for the specific command name e.g. AddProperty) which uses the other classes shown above to parse the user command and create a XYZCommand object (e.g., AddPropertyCommand) which the ClientGridParser returns back as a Command object.XYZCommandParser classes (e.g., AddBuyerCommandParser, AddMeetingCommandParser, ...) inherit from the Parser interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
The Model component,
Buyer and Seller objects (which are contained in a UniqueClientList object).Property objects (which are contained in a UniquePropertyList object).Meeting objects (which are contained in a UniqueMeetingList object).Client, Property, and Meeting objects (e.g., results of a list command) as separate filtered lists which are exposed to outsiders as unmodifiable ObservableList<Client>, ObservableList<Property>, and ObservableList<Meeting> respectively. These lists can be 'observed' e.g. the UI can be bound to these lists so that the UI automatically updates when the data in the lists 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,
ClientBookStorage, PropertyBookStorage, MeetingBookStorage and UserPrefStorage, which means Storage can be treated as either one (if 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.address.commons package.
This section describes some future noteworthy details on how certain features may be implemented.
The proposed note-taking mechanism is facilitated by NoteBook. It extends Meeting by allowing users to take notes during the meeting. It implements the following operation:
NoteBook#write() — Appends notes to the meeting.
These operations are exposed in the Model interface as Model#note().
Target user profile:
Value proposition:
ClientGrid is an all-in-one address book tailored for English-speaking real estate agents within Singapore to efficiently manage client contacts, including buyers and sellers. It provides a streamlined way to organize client data, monitor properties, and schedule meetings all within a single app, eliminating the need to juggle multiple apps. With offline access, agents can stay productive with ClientGrid anywhere. The default language of communication of ClientGrid is English.
Priorities: 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 a buyer to ClientGrid | keep track of the contacts of potential property buyers |
* * * | real estate agent | add a seller to ClientGrid | keep track of the contacts of clients interested in selling their property |
* * * | real estate agent | delete a buyer from ClientGrid | remove buyers who have already successfully bought a property or are no longer interested in buying a property |
* * * | real estate agent | delete a seller from ClientGrid | remove sellers who have already successfully sold their property or are no longer interested in selling their property |
* * * | real estate agent | add a property to ClientGrid | keep track of my client's property details |
* * * | real estate agent | delete a property entry from ClientGrid | remove entries that I no longer need |
* * * | real estate agent | add a meeting with my client(s) on ClientGrid | keep track of all my scheduled meetings in one place |
* * * | real estate agent | delete a meeting with my client(s) on ClientGrid | remove meetings that have already ended or have been cancelled |
* * * | real estate agent | list information about buyers | match buyers with suitable properties based on their preferences |
* * * | real estate agent | list information about sellers | manage relationships and property listings efficiently |
* * * | real estate agent | list information about all clients (buyers and sellers) | have a comprehensive view of all clients in one place and streamline client interactions |
* * * | real estate agent | list information about properties | quickly view properties sellers have listed for sale to match them with potential buyers |
* * * | real estate agent | list information about scheduled meetings | quickly view upcoming meetings and plan my schedule effectively |
* * | real estate agent | find specific property types in my properties list | keep track of the different property types |
* * | real estate agent | find specific properties in my properties list within a price range | keep track of the different price ranges of my properties |
(For all use cases below, the System is the ClientGrid and the Actor is the real estate agent, unless specified otherwise)
Use case: UC1 - List existing buyers, sellers, clients (i.e. buyers and sellers combined), properties, or meetings in ClientGrid
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects that there are no existing records for the specified key.
1a1. ClientGrid responds by indicating that there are no existing entries for that key yet.
Use case ends.
1b. ClientGrid detects an invalid key, multiple keys, or additional inputs beyond the valid command.
1b1. ClientGrid requests for the correct data.
Use case ends.
Use case: UC2 - Add Buyer/Seller
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the name/phone number/email format provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
2a. ClientGrid detects that the buyer/seller already exists in the client book.
2a1. ClientGrid informs the real estate agent that the buyer/seller already exists in the client book and does not add the duplicate buyer/seller.
Use case ends.
Use case: UC3 - Filter Client
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the name prefix provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
Use case: UC4 - Delete Buyer/Seller
Guarantees:
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the phone number format provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
Use case: UC5 - Add a property
MSS:
Use case ends.
Extensions
1a. ClientGrid detects an error in the postal code/unit/type/ask/bid format provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
2a. ClientGrid detects that the property already exists in the property book.
2a1. ClientGrid informs the real estate agent that the property already exists in the property book and does not add the duplicate property.
Use case ends.
Use case: UC6 - Filter Property
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the type/matching price format prefix provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
Use case: UC7 - Delete Property
Guarantees:
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the postal code or unit number format provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
1b. ClientGrid is unable to find a matching property listing entry in the database.
1b1. ClientGrid informs real estate agent that the property listing does not exist in the database.
Use case ends.
Use case: UC8 - Add Meeting
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the format of the meeting title, meeting date, buyer phone number, seller phone number, property type, or postal code provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
1b. ClientGrid detects there is a meeting of the same meeting title and meeting date in the meeting book.
1b1. ClientGrid notifies the user of an existing meeting with the same title and date in the meeting book and prompts the user to modify either the meeting title or date before resubmitting.
Use case ends.
1c. ClientGrid is unable to find a matching buyer, seller, or property entry in the client book or property book.
1c1. ClientGrid informs real estate agent that the buyer, seller, or property does not exist in the client book or property book.
Use case ends.
Use case: UC9 - Delete Meeting
Guarantees:
MSS:
Use case ends.
Extensions:
1a. ClientGrid detects an error in the meeting title or meeting date format provided by the real estate agent.
1a1. ClientGrid requests for the correct data.
Use case ends.
1b. ClientGrid is unable to find a matching meeting entry in the meeting book.
1b1. ClientGrid informs real estate agent that the meeting does not exist in the meeting book.
Use case ends.
17 or above installed.addbuyer n/Anna-Marie p/91234444 e/anna@example.com or addseller n/Ramesh d/o Kumar p/81234444 e/ramesh@example.comfilterclient command:
filterclient n/bob could only retrieve clients whose names started with "Bob" rather than finding "Bob" within any part of the name (e.g., "Jacobson").addbuyer n/testingALongEmail p/91234444 e/thisisaverylonggmailaddressasapsychopathwishestobreaktheirfingerhavingalongemailaddressnohumanshouldpossiblyhavesuchalongemailaddressbutidontknowwhytheydohavesuchalongemailaddressiamrunningoutofwordstosaysoiamjustgonnaputfillerwordstokeepextendingthisthinghmmidonotreallylikepeandtypingabunchofweirdstuff@gmail.comaddbuyer n/John Doe p/91112222 e/EXAMPLE@gmail.comaddbuyer n/John Doe p/92223333 e/example@gmail.comError: The email "example@gmail.com" is already in use.Ask and Bid prices optional in the filterproperty command:
Bid price. Likewise, the owner of the property may not have stated the selling price and hence, agent may not have Ask price.addproperty c/POSTAL_CODE u/UNIT_NUMBER t/TYPE [a/ASK] [b/BID]addproperty will make Ask and Bid parameters options (as denoted by []).Ask and Bid prices available to them.Ask and Bid:
Ask and Bid prices only takes numbers in increments of 1 thousand but a sizeable number of agents require pricing precision to be in the hundreds as well.Ask and Bid prices will include up to 3 decimal points.Ask and Bid prices better reflects their needs in price precision without overburdening them with too much details.LANDED properties such as the semi-detached types that share the same postal code but have their unit numbers with letters to distinguish them.LANDED properties to have different unit numbers with their maximum level number (digits on the left hand side of the - delimiter) limited to 01 because these properties expand horizontally.LANDED properties will not default to 00-00 and will only produce an error if the number on the left hand side of delimiter is not 01. Comparison of properties with LANDED will also include unit numbers as well.LANDEDproperties.addmeeting mt/Meeting 1 d/01-01-2025 bp/95352563 sp/87652533 t/HDB c/123456 will cause the list of meetings to be displayed.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.
.jar file and copy into an empty folder.cd into the folder you placed the jar file in.java -jar clientGrid.jar command to run the application..jar file.exit command to close the application.