Developer Guide
Table of Contents
- Order Class
- Storing an Order
- Adding an Order Feature
- Deleting an Order Feature
- Editing an Order Feature
Documentation, logging, testing, configuration, dev-ops
Appendix: Instructions for manual testing
Appendix: Planned Enhancements
About BookKeeper
As the florist industry continues to evolve, aspiring florists like you might feel increasingly challenged with managing complex business tasks while managing your florist business and crafting bouquets. This often leads to a need for efficient and straightforward methods to handle sales, client interactions, and order fulfillment.
BookKeeper is a desktop application designed to support florists who are venturing into this bustling market. We focus on alleviating the burden of many cumbersome responsibilities, from tracking client orders to optimising your inventory management. This ensures that you can focus more on your floral designs and customer service.
Setting up, getting started
Refer to the guide Setting up and getting started.
Design
Architecture

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.
- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.
- At shut down, it shuts down the other components and invokes cleanup methods where necessary.
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),
- defines its API in an
interfacewith the same name as the Component. - implements its functionality using a concrete
{Component Name}Managerclass (which follows the corresponding APIinterfacementioned 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.
UI 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,
- executes user commands using the
Logiccomponent. - listens for changes to
Modeldata so that the UI can be updated with the modified data. - keeps a reference to the
Logiccomponent, because theUIrelies on theLogicto execute commands. - depends on some classes in the
Modelcomponent, as it displaysClientobject residing in theModel.
Logic component
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.

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:
- When
Logicis invoked to execute a command, it delegates the command to anBookKeeperParserobject. This object then creates a parser corresponding to the command type (e.g.,DeleteCommandParser) and utilizes it to interpret the command. - This process generates a
Commandobject (to be more specific, an instance of one of its subclasses, e.g.,DeleteCommand) which is then executed by theLogicManager. - During execution, the command can interact with the
Model(e.g., to delete aClientor manageOrderdetails).
While this interaction is depicted as a singular step in the above diagram for the sake of simplicity, the actual implementation may involve multiple interactions (between the command object and theModel) to accomplish the intended task. - The outcome of the command’s execution is encapsulated within a
CommandResultobject, which is then returned fromLogic. Additional classes inLogic(not shown in the class diagram above) that are utilized for parsing a user command:

Model component
API : Model.java

The Model component,
- stores bookkeeper data i.e., all
Clientobjects (which are contained in aUniqueClientListobject). - stores the currently ‘selected’
Clientobjects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiableObservableList<Client>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. - stores the currently ‘selected’
Orderobjects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiableObservableList<Order>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. - stores a
UserPrefobject that represents the user’s preferences. This is exposed to the outside as aReadOnlyUserPrefobjects. - does not depend on any of the other three components (as the
Modelrepresents data entities of the domain, they should make sense on their own without depending on other components)
Tag list in the BookKeeper, which Client references. This allows BookKeeper to only require one Tag object per unique tag, instead of each Client needing their own Tag objects.
Storage component
API : Storage.java
Below is an updated UML class diagram illustrating the relationships and interactions among the various storage-related classes:

The Storage component of our application is responsible for handling the reading and writing of data to and from
external storage sources.
This includes functionalities such as saving and retrieving bookkeeper data and user preferences.
In this section, we will delve into the recent enhancements made to the Storage component, focusing on the
implementation of storing clients and order details.
In this enhancement, the Storage component has been extended to support the storage and retrieval of both client and
order details.
Previously, the Storage component was primarily designed to handle bookkeeper data and user preferences. However,
with the growing requirements of our application, it becomes necessary to accommodate the storage of clients and orders.
Common classes
Classes used by multiple components are in the seedu.address.commons package.
Implementation
This section describes some noteworthy details on how certain features are implemented.
Order class

Order is a new class added to encapsulate the logic of an Order. It is related to Client
class, and contains the following attributes:
- OrderDate
- Deadline
- Price
- Description
- Status
Each of these attributes form its own class, and they serve the following purposes:
The OrderDate is the time in which the order is created.
The Deadline is the time in which the order is due, which is specified by the user.
The Price is backed by a Double type where it represents the price for the order, and follows a numerical format of
2 decimal
places.
The Description is backed by a String type which holds the description of the Order.

The Status is the current status of the respective Order. This class is backed by an enum, StatusEnum consisting of 3
values PENDING, COMPLETED, CANCELED.
Storing an Order
To implement this feature, several modifications were made across different classes within the Storage package. The
key changes include:
-
New Classes: The introduction of
JsonAdaptedClientandJsonAdaptedOrderclasses to facilitate the conversion between JSON format and the corresponding model objects (ClientandOrder). -
Updated Interfaces: The
BookKeeperStorageinterface was extended to included methods for reading and writing orders. Similarly, theStorageinterface, which serves as an umbrella for all storage-related functionalities, was update to incorporate these changes. -
Storage Manager: The
StorageManagerclass, which orchestrates the storage operations, was modified to delegate the handling of client and order data to the appropriate storage classes. -
Unit Tests: Unit tests were added or updated to ensure the correctness and robustness of the new functionalities.
Why it is implemented this way:
With the implementation of storing clients and orders details, the Storage component of our application has been
enhanced to better meet the evolving needs of our users. These changes not only improve the functionality of our
application but also lay the groundwork for future enhancements and features.
Future plans may involve further optimizing the storage mechanisms, exploring alternative storage formats, or
integrating additional data validation checks to ensure data integrity. Overall, the recent enhancements to
the Storage component
mark a significant step forward in enhancing the robustness and flexibility of our application.
Adding an Order Feature
This feature allows users to add orders to our application for viewing and storage.
The sequence diagram below showcases the interactions within the application

An ObservableList has been added to the ModelManager for the sole purpose of displaying our Order objects.
Additionally, the following classes and methods have been added to support the implementation of this feature:
-
AddOrderCommand
Created aAddOrderCommandclass to cater to order creation inputs by the user. This will get the referencedClientby their index in theObservableListand check if theClientindex is valid. Afterwards, it will override the#executemethod & append theOrderobject into theClientobject’s respective orders list via the model interface. Upon execution of this command, it will return theCommandResulton for the output box to indicate if it was a successful command or not. -
AddOrderCommandParser
Creating aAddOrderCommandParserclass to create the respectiveCommandobject by parsing the user input. This flow is as intended, and will allow us to get index of theClientobject in theObservableListand get the required parameters typed by the user by parsing it with thePrefixobjects inCliSyntaxclass. For this command, the prefixes used would bed/for description,c/for price andby/for the deadline. The respectiveAddOrderCommandwill then be created to be executed by theLogicManager.
Why it is implemented this way
- Separation of Concerns:
By delegating specific responsibilities to specialized classes (likeBookKeeperParser,AddOrderCommandParser, etc.), the design adheres to the principle of separation of concerns. This means each part of the system has a clear responsibility, reducing complexity and making the codebase easier to understand and maintain.
Deleting an Order Feature
This feature allows users to delete Orders from our application permanently.
The sequence diagram below showcases the interactions within the application:

This will delete both the Order in the ObservableList for orders and from the Client object as well.
The following classes and methods have been added to support the implementation of this feature:
-
DeleteOrderCommand
Created aDeleteOrderCommandclass to cater to delete orders by their index in theirObservableListclass. This will allow the users to delete by index instead of the UUID. TheDeleteOrderCommandfirst checks theObservableListby index to determine if theOrderindex is valid, then checks whichClienttheOrderobject belongs to. This allows the modification of bothClients andOrders at the same time. Upon execution of this command, it will return theCommandResulton for the output box to indicate if it was a successful command or not. -
DeleteOrderCommandParser
Creating aDeleteOrderCommandParserclass to create the respectiveCommandobject by parsing the user input. This flow is as intended, and will allow us to get index of the Order object in theObservableList. This will create the respectiveDeleteOrderCommandto be executed by theLogicManager.
Why it is implemented this way
- Separation of Concerns:
Again, by simply delegating specific responsibilities to specialized classes (likeDeleteOrderCommandParserandDeleteOrderCommand), the design adheres to the principle of separation of concerns. This means each part of the system has a clear responsibility, reducing complexity and making the codebase easier to understand and maintain.
Editing an Order Feature
This feature allows users to edit Orders objects in our application.
The following sequence diagram describes the flow:

The following classes and methods have been added to support the implementation of this feature:
-
EditOrderCommand
Created aEditOrderCommandclass to cater to allow editing Orders by the user. It will first search theOrderobjects in theObservableListto ensure that the index is valid, before finding theClientobject that theOrderobject belongs to. Afterwards, theOrderobject is edited, and will be replaced in theClientobject’s orders list to update the details. This will be encapsulated and returned in aCommandobject that will be executed in the main logic. -
EditOrderCommandParser
Creating aEditOrderCommandParserclass to create the respectiveCommandobject by parsing the user input. This flow is as intended, and will allow us to get index of the Order object in theObservableListand get the required parameters typed by the user by parsing it with thePrefixobjects inCliSyntaxclass. For this command, the prefixes used would bed/for description,c/for price andby/for the deadline. These prefixes are optional, and not including them will use the currentOrderobject details. -
EditOrderCommandParser#EditOrderDescriptor
This is a nested static class within theEditOrderCommandclass that manages theOrderinformation. Its role is to temporarily hold the values ofOrderinformation that may or may not be updated. It acts as a data transfer object that contains the details to be edited by the user. Additionally, it helps to validate the fields to ensure that there are only valid values will be accepted, and to parse and apply the edits.
Why is it implemented this way:
It was done in this manner to adhere to the following design principles:
- Provide Extensibility: With a modular structure, adding new functionality (like future order implementations) involves creating new classes and modifying existing ones minimally. This approach makes the system more extensible, as seen with the introduction of new parser and command classes for handling orders.
- Enhances Frontend Integration: By redefining how the
ObservableListis managed within theModelManagerfor Orders, we enhance our capability to directly manipulate theOrderListview in JavaFX. This adjustment in the ModelManager class creates a seamless and responsive interaction between the backend data structures and the frontend user interface.
Documentation, logging, testing, configuration, dev-ops
Appendix: Requirements
Product scope
Target user profile: Klara is a florist and owner of Royal Bloom, a thriving floral shop in Singapore. As her business grows, managing the increasing volume of orders and client information becomes more complex and time-consuming.
Recently, the demand for personalised and expedited flower arrangements has risen, leading to challenges in keeping up with client requests and order specifics. This has resulted in Klara needing a more efficient way to manage her shop’s operations to maintain customer satisfaction and business growth. In response, Klara’s florist mentor, Jenna, suggests implementing a more convenient system to streamline these processes.
Therefore, Jenna has recommended BookKeeper, a desktop application designed to assist florists like Klara. BookKeeper will help Klara manage her growing list of clients and orders.
Klara is tech-savvy and prefers tools that enhance productivity while streamlining her workflow. She values desktop applications for their reliability and performance and is accustomed to managing digital tools that save time and reduce manual efforts.
Klara is a small business owner of a florist shop, specifically a freelance hobbyist in the floral industry. She has the requirements of:
- Prefers efficient ways to manage their clients and their information.
- Prefers an efficient way to keep track of client’s orders.
- Values productivity and time-saving solutions.
(Note: Klara and Jenna are fictional characters, created based on research of the needs of real florist business owners)
Value proposition:
- Manage contacts faster than a typical mouse/GUI driven app.
User stories
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… |
|---|---|---|---|
* * * |
Florist | be abe to easily add new clients to my client tracker | keep track of all my clients’ information in one place. |
* * * |
Florist | have a client management system that has a find function | quickly find specific customers when I need to reference their details. |
* * * |
Florist | be able to easily key in commands via a command-line interface | efficiently manage my customer list without navigating through complex menus. |
* * * |
Florist | have an application that is cost-effective and easy to use | maximize productivity without investing in expensive CRM systems. |
* * * |
Florist | be able to add a new order to my existing clients | record all of my clients’ orders and take note of their respective deadlines. |
* * * |
Florist | record the received date of each order | track order history and prioritize tasks effectively. |
* * * |
Florist | edit client information | keep client details up-to-date. |
* * * |
Florist | automatically sort orders by deadline | prioritize and manage them efficiently without manual sorting. |
* * * |
Florist | edit existing orders | accommodate changes requested by clients or correct any inaccuracies, ensuring order accuracy and satisfaction. |
* * * |
Florist | delete orders from the system in case of duplicate entries or cancellations | maintain accurate records and clutter the order list. |
* * * |
Florist | delete client from the client list | keep my client list updated. |
* * * |
Florist | link each order to its corresponding client | easily access client information associated with each other, facilitating personalized services. |
* * |
Florist | offer customizable tags or labels for customers | segment my audience and target specific groups with tailored marketing campaigns. |
* * |
Florist | track the status of each order | provide updates to clients and manage expectations. |
* * |
Florist | assign a price to each order | have accurate record-keeping and financial management. |
* * |
Florist | view a list of all clients along with their contact information and assigned tag in one place | access and reference to client details quickly. |
* |
Florist | have a good out of the box experience | immediately use the application without needing to configure it for my own needs. |
Use cases
(For all use cases below, the System is the BookKeeper application and the Actor is the user, unless
specified otherwise)
Use case: Delete a client
MSS
- User requests to list clients.
- BookKeeper shows a list of clients.
- User requests to delete a specific client in the list.
-
BookKeeper deletes the client.
Use case ends.
Extensions
-
2a. The list is empty.
Use case ends.
-
3a. The given index is invalid.
-
3a1. BookKeeper shows an error message.
Use case resumes at step 2.
-
Use case: Add a client
MSS
- User requests to add a client.
- BookKeeper adds a client.
-
BookKeeper shows the added client.
Use case ends.
Extensions
-
2a. The client already exists.
-
2a1. BookKeeper shows an error message.
Use case resumes at step 1.
-
-
2b. The client details are invalid.
-
2b1. Bookkeeper shows an error message.
Use case resumes at step 1.
-
Use case: Edit a client
MSS
- User requests to edit a client.
- BookKeeper shows the client to be edited.
- User edits the client.
-
BookKeeper shows the edited client.
Use case ends.
Extensions
-
2a. The client does not exist.
- 2a1. BookKeeper shows an error message.
-
2a2. BookKeeper shows a list of clients with similar names.
Use case resumes at step 1.
-
3a. The client details are invalid.
-
3a1. BookKeeper shows an error message.
Use case resumes at step 2.
-
-
3b. The client details are unchanged.
-
3b1. BookKeeper shows a message indicating no changes are made.
Use case resumes at step 2.
-
Use case: Find a client
MSS
- User requests to find a client by name.
-
BookKeeper shows a list of clients whose names contain the given keyword.
Use case ends.
Extensions
-
2a. No client is found.
- 2a1. BookKeeper shows a message indicating no client is found.
- 2a2. BookKeeper shows the list of clients with similar names.
Use case ends.
Use case: Show help
MSS
- User requests to show help.
-
BookKeeper shows a help page.
Use case ends.
Use case: Clear all entries
MSS
- User requests to clear all entries.
-
BookKeeper clears all entries.
Use case ends.
Use case: Add order
MSS
- User requests to add an order.
-
BookKeeper adds an order.
Use case ends.
Extensions
-
2a. The order details are invalid.
-
2a1. BookKeeper shows an error message.
Use case resumes at step 1.
-
Use case: Edit order
MSS
- User requests to edit an order.
- BookKeeper shows the order to be edited.
- User edits the order.
-
BookKeeper shows the edited order.
Use case ends.
Extensions
-
2a. The order does not exist.
-
2a1. BookKeeper shows an error message.
Use case resumes at step 1.
-
-
3a. The order details are invalid.
-
3a1. BookKeeper shows an error message.
Use case resumes at step 2.
-
Use case: Delete order
MSS
- User requests to delete an order.
-
BookKeeper deletes the order.
Use case ends.
Extensions
-
2a. The order does not exist.
-
2a1. BookKeeper shows an error message.
Use case resumes at step 1.
-
Use case: Exit the program
MSS
- User requests to exit the program.
-
BookKeeper exits.
Use case ends.
Non-Functional Requirements
- Should work on any mainstream OS as long as it has Java
11or above installed. - Should be able to hold up to 1000 clients’ information without a noticeable sluggishness in performance for typical usage.
- A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.
- Should provide clear and informative error messages to users in case of unexpected errors. Additionally, detailed logs should be maintained for system administrators to troubleshoot issues effectively.
- Application architecture should be scalable to accommodate future growth in terms of users and data volume, without compromising performance.
- Automated backups of critical data should be performed, and there should be a documented and tested procedure for data recovery in case of system failures or data loss.
Glossary
- Application architecture: Describes the patterns and techniques used to design and build an application
- Detailed logs: Records that track events, operations, errors, and other significant activities that occur within a software system or application.
- Mainstream OS: Windows, Linux, Unix, MacOS
- System administrators: Professionals responsible for managing, configuring, and ensuring the proper operation of computer systems and servers
Appendix: Instructions for manual testing
Given below are instructions to test the app manually.
Launch and shutdown
- Ensure you have Java
11and above installed in your system.- You may check if you have Java installed by opening your command prompt or terminal, and typing:
java --version- If Java is installed, you should ensure that it is currently running on version “11.x.xx”.

- If you encounter an error, or if your version does not match our specified requirements, you may visit the Official Oracle website to download the Java JDK required to run this project.
- You may check if you have Java installed by opening your command prompt or terminal, and typing:
-
Initial launch
- Download the latest
bookkeeper.jarrelease from here - Copy the file to the folder you want to use as the home folder for your BookKeeper.
- Open your terminal or command prompt in your system.
-
cdinto the folder you put the jar file in, and use thejava -jar bookkeeper.jarcommand to run the application.
Expected: A GUI similar to the below should appear in a few seconds.Note how the app contains some sample data.

- Download the latest
Viewing Help
Pre-requisite:
- None
Command: help
Expected Output:
- A help window should open up with instructions to
Refer to the user guide: https://ay2324s2-cs2103t-t09-2.github.io/tp/UserGuide.html#5-main-features
Expected Output in the Command Output Box:
Opened help window.
Clearing BookKeeper
Pre-requisite:
- There is at least one (“1”) client and/or order stored in the BookKeeper application.
Command: clear
Expected Output:
- All clients and orders will be cleared.
Expected Output in the Command Output Box:
BookKeeper has been cleared!
Exiting the Program
Pre-requisite:
- There is at least one (“1”) client and/or order stored in the BookKeeper application.
Command: clear
Expected Output:
- Exits the program.
Expected Output in the Command Output Box:
BookKeeper has been cleared!
Adding a client
Pre-requisite:
- There should not exist another client with the exact same name (names are case-sensitive) and spacing, i.e. the names “Betsy Crowe” and “Betsy crowe” are considered as different names.
Command: add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…
- Example:
add n/Betsy Crowe e/betsycrowe@example.com a/Beauty World p/1234567 t/VIP - Note:
- Name must be unique, clients with exact same name is not allowed.
- A client can have any number of tags (including 0).
- Tags do not accept whitespaces (e.g. “VIP 2” is not accepted, “VIP2” is accepted).
- Tags only accept 0-9 and a-z.
- Names only accept 0-9 and a-z and are case-sensitive.
- Two persons with the same name are not allowed, but two persons with the same name but different cases are allowed.
- Phone number must be numeric and at least 3 numbers. It must not contain spaces “ “, brackets
()or hyphens-, plus+, or other symbols.- Emails must not have consecutive special characters. E.g. “john..doe@example.com” is not accepted.
Expected Output:
- All the client information with their respective fields will be displayed on the left side column.
Expected Output in the Command Output Box:
New client added: Betsy Crowe; Phone: 1234567; Email: betsycrowe@example.com; Address: Beauty World; Tags: [VIP]- The message should echo and show correctly the information that you have entered for your client.
Editing a client
Pre-requisite:
- You must know the index of the client you want to edit.
- A client must exist at the index you want to edit at i.e. you cannot edit a client at index 3 if you only have two clients in the application.
- There must at least be one client in the application.
Command: edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…
- Example:
edit 1 n/Betsy Crower t/ - This edits the name of the 1st client to be
Betsy Crowerand clears all existing tags.
Expected Output:
- The application will be updated with the edited client information.
Expected Output in the Command Output Box:
Edited Client: Betsy Crower; Phone: 1234567; Email: betsycrowe@example.com; Address: Beauty World; Tags:
Deleting a client
Pre-requisite:
- You must know the index of the client you want to delete.
- A client must exist at the index you want to delete i.e. you cannot delete a client at index 3 if you only have two clients in the application.
- There must at least be one client in the application.
Command: delete INDEX
- Examples:
-
delete 1deletes the 1st client listed in your application. -
find Betsyfollowed bydelete 1deletes the 1st client in the results of the find command.
-
- Note:
- This deletes the client at the specified INDEX.
- The index refers to the index number shown for the respective client in the displayed client list.
- The index must be a positive integer 1, 2, 3, …
Expected Output:
- Client is removed from the application.
Expected Output in the Command Output Box:
Deleted Client: Betsy Crower; Phone: 1234567; Email: betsycrowe@example.com; Address: Beauty World; Tags:- Note: The details of the client should correspond to the client that you have just deleted.
Listing all clients
Pre-requisite:
- There must at least be one client in the application.
Command: list
Expected Output:
- Shows a list of all clients in BookKeeper.
Expected Output in the Command Output Box:
Listed all clients
Locating clients by name: find
Pre-requisite:
- There must at least be one client in the application.
Command: find KEYWORD [MORE_KEYWORDS]…
- Examples:
-
find alex davidreturnsAlex Yeoh,David Li -
find JohnreturnsjohnandJohn Doe
-
Expected Output:
- Finds clients whose names contain any of the given keywords.
Expected Output in the Command Output Box:
2 clients listed!- Note: the number of clients listed depends on the number of matching clients found by the application.
Adding an order
Pre-requisite:
- There must at least be one client in the application.
- You must know the index of the client you want to add an order to.
Command: order INDEX by/DEADLINE c/PRICE d/DESCRIPTION
- Examples:
order 1 d/1xRoses c/40 by/23-07-2024 00:00order 3 by/07-07-2024 00:00 c/88.88 d/99xRosesorder 1 by/23-05-2024 16:00 c/58.90 d/1xLily
- Note:
- Adds an order to the client at the specified
INDEX. The index must be a positive integer 1, 2, 3, …, and the index must exist in the Client list. - All fields must be provided.
- The order of the fields does not matter (e.g. both
order INDEX by/DEADLINE c/PRICE d/DESCRIPTIONandorder INDEX d/DESCRIPTION c/PRICE by/DEADLINEare acceptable) - The status of new orders are automatically set to “PENDING”.
- Please specify
by/DEADLINEfield inDD-MM-YYYY HH:MM.- Deadlines can be set to a date before a date before today to mean that an order is overdue. E.g. if your order was due yesterday, but you have not completed the order, you can put yesterday’s date. This lets you track if you have orders that are overdue.
- For the
c/PRICEfield, do note that any decimal places after 2 will be rounded.- E.g.
2.999will be rounded up to3.00.
- E.g.
- The order list will be sorted according to their deadline.
Meaning, if there are two orders, one due on
10-10-2025 10:00and another due on10-10-2025 10:30, the order with the deadline of10-10-2025 10:00will have an index of1, and the other order will have an index of2.
- Adds an order to the client at the specified
Expected Output:
- Adds an order into BookKeeper.
Expected Output in the Command Output Box:
New Order added! John Doe- Note: The name of the client that you added the order to will appear after
New Order added!
Deleting an order
Pre-requisite:
- There must at least be one client and one order in the application.
- You must know the index of the order you want to delete.
Command: deleteOrder INDEX
- Example:
deleteOrder 2deletes the 2nd order in the order list. - Note:
- Deletes the order at the specified
INDEX. - The index refers to the index number shown in the displayed order list.
- The index must be a positive integer 1, 2, 3, …, and the index must exist in the Client list.
- Deletes the order at the specified
Expected Output:
- Deletes the specified order from BookKeeper.
Expected Output in the Command Output Box:
Deleted Order: Deadline: 23-07-2024 00:00; Date Received: 15-04-2024 12:52; Details: 1xRoses- Note: The details of the deleted order in the command output box will correspond to the details of the order deleted at the index.
Editing an order
Pre-requisite:
- There must at least be one client and one order in the application.
- You must know the index of the order you want to edit.
Command: editOrder INDEX [by/DEADLINE] [c/PRICE] [d/DESCRIPTION] [s/STATUS]
- Examples:
-
editOrder 1 by/05-05-2024 16:00 c/58.90 d/1xRoses s/PENDINGedits the Deadline and Description of the 1st Order list. -
editOrder 1 s/COMPLETEDedits 1st order status to “COMPLETED”.
-
- Note:
- Edits the order at the specified
INDEX. The index must be a positive integer 1, 2, 3, … and the index must exist in the Order list. - Command can work without any optional fields provided.
- Existing values will be updated to the input values.
- There are 3 possible statuses (they are all case-insensitive):
- PENDING: All orders are automatically set to PENDING
- COMPLETED: When the order is delivered successfully
- CANCELED: When the order is canceled
- Edits the order at the specified
Expected Output:
- Edits an existing order in BookKeeper.
Expected Output in the Command Output Box:
Edited Order: Deadline: 23-07-2024 00:33; Date Received: 15-04-2024 12:52; Details: 1xRoses- Note: The details of the edited order will correspond to the details specified in the command.
Appendix: Planned Future Enhancements (Beyond v1.4)
Team size: 4
-
Enhanced Error Messaging
Current: Our edit command function’s error messages for both client and order are too general, not specifying the exact issue with the input command causing the error. They address potential errors rather than pinpointing the specific one the user is facing.
Future: We plan to implement more specific error messages tailored to the respective errors encountered. This will offer clearer guidance to users, helping them identify and resolve issues promptly.
-
Enhanced Error Messaging for Wrong Indices with Missing Fields
Current: Currently our error messages for wrong indices and missing fields in the edit command lack specificity. We provide a generic message like “at least one field to edit must be provided,” without indicating which field is missing or if there is an issue with the index.
Future: We plan to refine these error messages to explicitly highlight the missing field or incorrect index, enabling users to identify the problem immediately and take appropriate action.
-
Extended Tag Length and Error Refinement
Current: Our application now imposes limitations on tag length, restricting users from inputting longer tags, which may hinder organization and labeling efforts.
Future: To address this, we aim to increase the maximum length of tags supported within the system, enabling users to provide more descriptive labels and organize content effectively.
-
Resolution Support
Current: Our application is currently only optimised for the recommended screen resolution and screen scale for your device. This may limit compatibility with different user preferences. It is usable but not optimal for a small margin of error from your recommended screen resolutions and scale.
Future: We plan to expand our support for various screen resolutions and screen scales by including custom scaling, which will enhance accessibility and improve the user experience.
-
Allow filtering of orders based on displayed customers.
Current: Our application now lacks the functionality to filter orders based on displayed clients, which may lead to inefficiencies for users managing multiple clients.
Future: We plan to enable users to filter orders based on the displayed client, streamlining the experience and improving efficiency for users managing multiple clients simultaneously.
-
Allow adding of multiple users with the same name.
Current: Currently, our application rejects the addition of multiple clients with the same name unless they differ in case sensitivity (e.g., Jane Low and Jane low are acceptable).
Future: We intend to enhance our system to allow the addition of multiple clients with identical names, recognizing that it is common for clients to share the same name. This improvement will enable users to manage multiple clients with similar names more effectively.
-
Relax constraints on field data types
Current: Our application lacks constraints on the data types of input fields, allowing excessively long names and unrealistically large values for certain fields like order price.
Future: We plan to implement constraints on field data types to prevent issues such as overly long fields not displaying correctly and unrealistic values being entered. For example, we will limit the length of names and constrain the size of numerical values like order prices to ensure data integrity and usability.
- E.g. do not input a name that is too long, as it may not be displayed correctly.
- E.g. do not input an Order Price that is unrealistically large for flower orders e.g. 9 billion ( 9,000,000,000).
-
Supporting names with special characters.
Current: Our application does not support names with special characters, such as acute accents, (e.g. Amélie) or names with dashes (e.g. Cadence-Jett) and other special characters.
Future: We plan to implement lesser constraints and accept more character values outside of A-Z and 0-9.
Appendix: Effort
Our project aims to develop a comprehensive solution tailored for florists to manage both client information and order delivery tracking seamlessly. Unlike AB3, which focuses only on the person or client entity, our project extended its scope to include orders, thus introducing complexity by requiring the seamless linking between client and order functionalities.
Challenges Faced
- Bidirectional Navigation - Implementing bidirectional navigation between orders and clients posed a significant challenge. Ensuring that modifications to one entity reflected accurately in the other required meticulous attention to detail.
- Linking Orders to Clients - Establishing a robust linkage between orders and clients presented difficulties, especially during operations like delete or edit. Coordinating changes on both client and order sides to maintain data correctness demanded careful planning and execution.
- Collaborative Development - Each team member had to work on features and functions independently, necessitating close collaboration to ensure seamless integration. Communication was important to minimize merging conflicts and ensure that individual components linked are successfully done.
Effort Required
The project demanded a considerable effort due to its expanded scope and the complexities associated with managing multiple entity types. Coordinating development efforts, addressing integration challenges, and ensuring feature completeness required dedicated time and resources.
Achievements:
Despite the challenges, we successfully delivered a robust product that allow florists to manage client information seamlessly while effectively tracking order deliveries.
Key achievements include:
- Implementing bidirectional navigation between client and order entities.
- Establishing robust linkages between orders and clients, ensuring data consistency throughout.
- Facilitating collaborative development and integration efforts to deliver a cohesive solution.
Acknowledgements
- Used AB3 developer guide for the initial template and structure of this document.