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.com
filterclient
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.com
addbuyer n/John Doe p/91112222 e/EXAMPLE@gmail.com
addbuyer n/John Doe p/92223333 e/example@gmail.com
Error: 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.LANDED
properties.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.