By: AY1920S2-CS2103T-W12-3 Since: Feb 2020 Licence: MIT
- 1. About us
- 2. Setting up
- 3. Design
- 4. Implementation
- 5. Documentation
- 6. Testing
- 7. Dev Ops
- Appendix A: Product Scope
- Appendix B: User Stories
- Appendix C: Use Cases
- Appendix D: Non Functional Requirements
- Appendix E: Glossary
- Appendix F: Product Survey
- Appendix G: Instructions for Manual Testing
- Appendix H: Effort
1. About us
1.1. About Sharkie
Sharkie is an all-in-one desktop application for personal finance tracking designed for university students who would like to monitor their spending. It manages your incomes and expenses, organises your contacts and keeps track of debts your friends owe you, so that your loans always come with a money-back guarantee!
Sharkie is adapted from the AddressBook-Level3 project created by SE-EDU and is further developed into a finance tracking application by our awesome developer team!
1.2. About This Guide
This developer guide is written for anyone who wish to build on our application, Sharkie, or wish to know find out more about how Sharkie is implemented.
If you need help setting up your device to build on Sharkie, you find out more at the Setting Up guide below.
Note the following symbols and formatting used in this document:
Symbol/ |
Meaning |
|
A grey highlight (called a mark-up) indicates that this is a command that can be typed into the command line and executed by the application. |
Enter |
This symbol indicates the enter button on the keyboard. |
|
This symbol indicates information. |
|
This symbol indicates tips. |
2. Setting up
Refer to the guide here.
3. Design
3.1. Architecture
The Architecture Diagram given above explains the high-level design of Sharkie. Given below is a quick overview of each component. Sharkie uses the same architecture design as Address Book 3 (AB3).
The .puml files used to create diagrams in this document can be found in the diagrams folder.
Refer to the Using PlantUML guide to learn how to create and edit diagrams.
|
-
At app launch: Initializes the components in the correct sequence, and connects them up with each other.
-
At shut down: Shuts down the components and invokes cleanup method where necessary.
Commons represents a collection of classes used by multiple other components.
The following class plays an important role at the architecture level:
-
LogsCenter: Used by many classes to write log messages to the App’s log file.
The rest of the App consists of four components.
Each of the four components
-
Defines its API in an
interfacewith the same name as the Component. -
Exposes its functionality using a
{Component Name}Managerclass.
For example, the Logic component (see the class diagram given below) defines it’s API in the Logic.java interface and exposes its functionality using the LogicManager.java class.
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 people delete 1.
people delete 1 commandThe sections below give more details of each component.
3.2. UI component
API : Ui.java
The UI consists of a MainWindow that is made up of parts e.g.CommandBox, ResultDisplay, PersonListPanel, StatusBarFooter, WalletTransactionPanel, WalletStatisticsPanel etc. All these, including the MainWindow, inherit from the abstract UiPart class.
The Ui component uses 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.
3.3. Logic component
API :
Logic.java
-
Logicuses theSharkieParserclass to parse the user command.-
SharkieParserwill check the command entered against a pattern defined inSharkieParser. -
It refers to
CliPrefixto determine whether the command entered is apeoplerelated command, awalletrelated command or aglobalcommand. -
If the command entered passes these checks, it then parses the command using the respective
XYZCommandParserto retrieve the command to be executed.
-
-
This results in a
Commandobject which is executed by theLogicManager.-
Each command has its own
XYZCommandthat inherits fromCommand, implementing different actions to be executed.
-
-
The command execution can affect the
Model(e.g. adding a person, adding a transaction, filtering a list of transactions, reminders etc.). -
The result of the command execution is encapsulated as a
CommandResultobject which is passed back to theUi.-
The
Uiprocesses theCommandResultand outputs the information to theResultDisplayclass.
-
-
In addition, the
CommandResultobject can also instruct theUito perform certain actions, such as displaying help to the user.-
Other
Uicomponents are also updated on the successful obtaining of aCommandResultbyUi.
-
Given below is the Sequence Diagram for interactions within the Logic component for the execute("people delete 1") API call.
delete 1 Command
The lifeline for PeopleDeleteCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
|
3.4. Model component
The ModelManager class diagram is drawn separately as it is too complicated to include all the details in the
Model component diagram.
|
API : Model.java
The Model,
-
stores a
UserPrefobject that represents the user’s preferences. -
stores the Wallet data.
-
stores the Address Book data.
-
stores the User data.
-
exposes an unmodifiable
ObservableList<Person>and an unmodifiableObservableList<Transaction>that can be 'observed' e.g. the UI can be bound to these lists so that the UI automatically updates when the data in the respective lists change. -
does not depend on any of the other three components.
The Wallet,
-
consists of a
BudgetList. -
consists of a
TransactionList, which containsIncome(s) and aTransactionListwhich containsExpense(s).
The AddressBook,
-
consists of a
UniquePersonList.
The UserData,
-
consists of a
User.
The Model package consists of four main packages: Person, Transaction, Reminder and Tag.
The diagram above shows how the Person package is implemented:
-
PeoplePredicate:PeopleNamePredicate,PeoplePhonePredicate,PeopleTagPredicate,PeopleEmailPredicateare implemented for the execution ofpeople findcommand. -
A
Userconsists of aName, aPhoneand anEmail. -
A
Personconsists of aName, aPhone, anEmail, aTransactionListofDebt(s), aTransactionListofLoan(s) and a set ofTag(s).
The association between Transaction and Amount is not shown in Figure 10, “In-depth structure of Transaction package in the Model Component” to keep the diagram less messy.
However, the association is shown in Figure 11, “Transaction class diagram”.
|
The diagram above shows how the Transaction package is implemented:
-
WalletPredicate:DateContainsKeywordsPredicate,DescriptionContainsKeywordsPredicate,TagContainsKeywordsPredicate,AmountContainsKeywordsPredicateare implemented for the execution ofwallet findcommand. -
The abstract class
Transactionis extended byIncome,Expense,DebtandLoan. ATransactionconsists of aDescription, anAmount, aDateand aTag. -
A
Budgetconsists of aYear, aMonthand anAmount.
The Reminder package is implemented for Sharkie's reminder feature. The diagram above shows how the Reminder package is implemented:
-
The
Reminderconsists of aUser(the sender) and aPerson(the receiver).-
A
Reminderobject is created whenever thepeople remindorpeople remindallcommand is executed.
-
-
The
ConfirmationEmailconsists of aUser.-
The
ConfirmationEmailis implemented to validate the user’s email address during user’s first login to Sharkie.
-
The Tag package only consist of a class, Tag and it does not depend on other components in the Model.
3.5. Storage component
API : Storage.java
The Storage converts Model objects to saveable data and vice versa. It comprises four main parts: UserPrefsStorage, UserDataStorage, AddressBookStorage and WalletStorage. Each of these interfaces have a JSON-based implementation that convert their specific data to and from JSON.
The Storage component,
-
can save
UserPrefobjects in JSON format and read it back. -
can save UserData in JSON format and read it back.
-
can save the Address Book data in JSON format and read it back.
-
can save the Wallet data in JSON format and read it back.
3.6. Common classes
Classes used by multiple components are in the seedu.addressbook.commons package.
4. Implementation
This section describes some noteworthy details on how certain features are implemented.
4.1. People Owe Command
The people owe command is implemented in the class PeopleOweCommand.
This command can be accessed from Logic#execute(). It records a debt of an indicated Amount to the
Person specified by the index.
The following activity diagram illustrates what happens when the user enters a people owe command:
4.1.1. Implementation of people owe command
-
When entering the debt command, the user will specify the
Personusing the index of thePersonin the list shown in the GUI. -
The user should also specify the debt
Description,Amountand optionally, theDate. -
The
PeopleOweCommandParserwill create aDebtobject based on the details provided, and return the resultingPeopleOweCommand. -
When the
LogicManageris executing thePeopleOweCommand, it will extract the indicated person from the list ofPersonsobtained from theModelviaModel#getFilteredPersonList() -
A new
Personwith the addedDebtis created. -
This new
Personreplace the initialPersonat the indicated index viaModel#setPerson()for immutability. -
The
filteredPersonsin theModelis then updated. -
CommandResultis returned.
The following sequence diagram summarizes what happens during the execution of a people owe command:
people owe command
The lifeline for PeopleOweCommand and PeopleOweCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML,
the lifeline reaches the end of diagram.
|
4.1.2. Design Considerations
Aspect: Keeping track of Debt of a Person.
-
Alternative 1 (current choice): Each
Personhas a list ofDebtobjects, eachDebtobject hasDescription,AmountandDate.-
Pros: Able to record more information about a
Debt. -
Cons:
Sharkieonly allows the return of aDebtall at once, i.e., the user cannot return aDebtpartially.
-
-
Alternative 2: Each
Personhas oneDebtobject.-
Pros: Easier to store the
Debtobject, only have to keep track of the total debtAmountand theDateof the debt. The user can return anyAmountto thePerson, andSharkiewill just deduct the totalAmountof debt accordingly. -
Cons: Storing the
Dateis problematic, as it questions whether theDateof the first borrowing or latest borrowing should be stored. Furthermore, there is no breakdown ofDebtdetails if the user wants to recall why he owed aPersonmoney.
-
4.2. People Received Command
The people received command is implemented in the class, PeopleReceivedCommand.
This command can be accessed from Logic#execute(). It deletes the Loan(s) of the indicated Person
(the Person with the specified index in the Address Book).
The following activity diagram illustrates what happens when the user executes a people received command:
4.2.1. Implementation of people received command
-
In
PeopleReceivedCommandclass, the list ofPersonsis obtained from theModelviaModel#getFilteredPersonList()and the indicated person is extracted from the list. -
The list of
Loansof thePersonis extracted and modified based on the command entered by the user. -
A new
Personwith the modified list ofLoansis created. -
This new
Personreplace the initialPersonat the indicated index viaModel#setPerson()and thefilteredPersonsin theModelis updated.
The following sequence diagram summarizes what happens during the execution of a people received command:
people received command
The lifeline for PeopleReceivedCommand and PeopleReceivedCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML,
the lifeline reaches the end of diagram.
|
4.2.2. Design Considerations
Aspect: Deletion of Loan from the indicated person.
-
Alternative 1 (current choice): Creates a new
Personwith the modified list ofLoansand useModel#setPerson()to replace the indicatedPersonwith the newPersoncreated.-
Pros: Preserve the immutable property of
Person. -
Cons: Have to copy over all the attribute values, such as
Name,Phoneand more.
-
-
Alternative 2: Modify the list of
Loansin the indicatedPersondirectly.-
Pros: Easier and can save time from copying the information from one
Personto another. -
Cons:
Personloses the immutable property.
-
4.3. Transactions
The Transaction forms the basis for Sharkie’s monetary-related features. It contains a Description, Amount, Date and Tag.
There are currently four classes that inherit from this abstract class, namely Expense, Income, Debt and Loan.
Expense and Income can be created using the WalletExpenseCommand and the WalletIncomeCommand.
These commands can be accessed from Logic#execute(). It records an expense of an indicated Description, Amount, Date and Tag.
As the two commands are similar, it is sufficient to trace the WalletExpenseCommand. The following activity diagram illustrates what happens when the user enters a wallet expense command:
4.3.1. Implementation of wallet expense command
-
When entering the expense command, the user will specify the
Description,Amountand optionally, theDateandTag. -
The
WalletExpenseCommandParserwill create anExpenseobject based on the details provided, and return the resultingWalletExpenseCommandthat has a reference to theExpensecreated. -
The
LogicManagerthen executes the command and adds the previously createdExpenseobject to the Wallet model. -
CommandResultis returned.
The following sequence diagram summarizes what happens during the execution of a wallet expense command:
wallet expense command
The lifeline for WalletExpenseCommandParser and WalletExpenseCommand should end at the destroy marker (X) but due to a limitation of PlantUML,
the lifeline reaches the end of diagram.
|
4.3.2. Design Considerations
Aspect: Representing the Amount of a Transaction.
-
Alternative 1 (previous implementation): Amounts are stored in dollars as
double.-
Pros: Easier to implement.
-
Cons: Floats are inexact. Floating point errors may cause rounding errors or unexpected bugs(e.g. checking if an amount is equal to zero).
-
-
Alternative 2 (current implementation): Amounts are stored in cents as
long.-
Pros: Arithmetic involving amounts will be exact.
-
Cons: Conversion is needed between cents and dollars. All Sharkie programmers have to be aware of the necessary conversion else bugs may occur.
-
-
Alternative 3: Amounts are stored as the inbuilt
BigDecimalclass.-
Pros: Arithmetic involving amounts will be exact.
-
Cons:
BigDecimalis slower in performance and if many calculations are performed, runtime is considerably slower.
-
4.4. Wallet Edit Command
The edit command is implemented in the class, WalletEditCommand.
This command can be accessed from Logic#execute(). It edits the transaction, indicated by the index specified, with the new details supplied by the command.
The following activity diagram illustrates what happens when the user executes a wallet edit command:
4.4.1. Implementation of wallet edit command
-
When entering the wallet edit command, the user have to specify at least one of
Description,Amount,DateorTag. Multiples can be inputted as well. -
WalletEditCommandParseris executed to create anEditTransactorDescriptorto hold the values to edit the transaction with. -
WalletEditCommandParserthen passes theeditTransactorDescriptorto create aWalletEditCommand. -
In
WalletEditCommandclass, the list oftransactionsis obtained from theModelviaModel#getFilteredTransactionsList()and the indicated transaction is extracted from the list. -
The
transactionselected is modified based on the field to edit and the new details entered by the user, which are stored ineditTransactorDescriptor -
A new
transactionmodified from thetransactionselected is created withcreateEditedTransactionmethod inWalletEditCommand -
This new
transactionreplace the initialtransactionat the indicated index viaModel#setTransaction()and thefilteredTransactionsin theModelis updated.
The following sequence diagram summarizes what happens during the execution of a wallet edit command:
wallet edit command
The lifeline for WalletEditCommand, WalletEditCommandParser and EditTransactionDescriptor should end at the destroy marker (X) but due to a limitation of PlantUML,
the lifeline reaches the end of diagram.
|
4.4.2. Design Considerations
Aspect: Choosing which transaction to edit from the list of transactions.
-
Alternative 1 (current choice): Get the index from the list of transactions currently displayed, and not original index in the full transactions list, which can be displayed by
wallet list command.-
Pros: Easy to see which
transactionis to be edited. -
Cons: Filtered list needs to be constantly updated.
-
-
Alternative 2: Always edit based on the index from original list, which can be displayed by
wallet list command.-
Pros: Index is always consistent.
-
Cons: Harder to remember which index represents which transaction.
-
4.5. Wallet Budget Command
The budget command is implemented in the class, WalletBudgetCommand.
This command can be accessed from Logic#execute(). It adds a budget using the parameters as specified by the user.
The following activity diagram illustrates what happens when a user executes the wallet budget command:
wallet budget command4.5.1. Implementation of wallet budget command
-
In
WalletBudgetCommandclass, theBudgetproduced byWalletBudgetCommandParseris examined to determine if it is a default budget, or if it is a normal budget.-
If the
Budgetis a default budget, theBudgetListis updated in theModelviaModel#setDefaultBudget(). This sets the default budget as the one given. -
If the
Budgetis not a default budget, theBudgetListis updated in theModelviaModel#setBudget(). This adds the budget given to a list of budgets with theirMonthandYearspecified.
-
-
The list of
Budgetin theWalletis modified based the arguments input by the user. -
If a
Budgetwith the same arguments given already exists, it will be overwritten by the one given. -
A
CommandResultis returned at the end of the execution.
The following sequence diagram summarizes what happens during the execution of a wallet budget command:
wallet budget command
The lifeline for WalletBudgetCommandParser and WalletBudgetCommand should end at the destroy marker (X) but due to a limitation of PlantUML,
the lifeline reaches the end of diagram.
|
4.5.2. Design Considerations
Aspect: Selection of Budget to set: default or specific month / year
-
Alternative 1 (current choice): If the month and year of the budget is specified, the specific
Budgetwill be set. Otherwise, the defaultBudgetwill be set.-
Pros: Easy to differentiate during command processing whether we want a default
Budgetor a specific one. -
Cons: All
Budgetexcept defaultBudgetall contain a redundantisDefaultboolean
-
-
Alternative 2: Allow the user to specify if they want a default
Budgetset, or a specificBudgetinstead.-
Pros: Clearer way to distinguish between default
Budgetand specificBudget -
Cons: Requires more prefixes / suffixes to be added to
Parserin order to parse extra arguments.
-
4.6. Logging
We are using java.util.logging package for logging. The LogsCenter class is used to manage the logging levels and logging destinations.
-
The logging level can be controlled using the
logLevelsetting in the configuration file (See Section 4.7, “Configuration”) -
The
Loggerfor a class can be obtained usingLogsCenter.getLogger(Class)which will log messages according to the specified logging level -
Currently log messages are output through:
Consoleand to a.logfile.
Logging Levels
-
SEVERE: Critical problem detected which may possibly cause the termination of the application -
WARNING: Can continue, but with caution -
INFO: Information showing the noteworthy actions by the App -
FINE: Details that is not usually noteworthy but may be useful in debugging e.g. print the actual list instead of just its size
4.7. Configuration
Certain properties of the application can be controlled (e.g user prefs file location, logging level) through the configuration file (default: config.json).
5. Documentation
Refer to the guide here.
6. Testing
Refer to the guide here.
7. Dev Ops
Refer to the guide here.
Appendix A: Product Scope
Target user profile:
-
has a need to record expenses and income
-
has a need to keep to a certain budget every month
-
wants to view statistic of spending
-
has a need to record debts and loans
-
want to be reminded of his/her own debts
-
wants to remind his/her friends to pay back their debts
-
has a lot of friends to keep track of in contact book
-
prefer desktop apps over other types
-
can type fast
-
prefers typing over mouse input
-
is reasonably comfortable using CLI apps
Value proposition:
-
records expenses/debts faster than a typical mouse/GUI driven app
-
visual display of data with diagrams instead of just text
Appendix B: User Stories
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a/an … | I want to … | So that … |
|---|---|---|---|
|
university student that buys a lot of stuff |
keep track of my spending |
I do not overspend |
|
student with fixed monthly allowance |
track my spendings in a month |
I will make sure I save money every month |
|
person with bad mental calculation |
auto deduct money I owe from money the person owes me |
I don’t need to do the math myself |
|
user |
find a person by name |
locate details of persons without having to go through the entire list |
|
computer science student |
type instead of click |
it is more convenient |
|
student that always goes out with friends |
split shared spendings |
I make sure everyone pays back |
|
poor university person who borrows money from many people |
know who I owe money to |
I can pay them back when I have money |
|
person with a lot of friend’s |
keep track of who owes me what on which day |
I can ask them to pay me back |
|
calculative person |
keep track of how much exactly my friends owe me |
I can get all my money back |
|
student who needs to pay bills |
get reminded of when to pay them |
I don’t get my utilities cut/chased out of house etc. |
|
student with tight budget |
set a budget and be notified when nearing it |
I won’t overspend |
|
thrifty student |
set savings goals |
I can have achievable, trackable savings |
|
unmotivated person |
get motivation to spend less/save more |
I have the willpower to manage my finances |
|
user |
hide private contact details by default |
minimize chance of someone else seeing them by accident |
|
a student who lives far from school |
keep track of how much i spend on transport |
I know whether to get concession |
|
friend |
have my friend track how much I owe them |
do not have to keep track of it myself |
|
student who travel with friends |
keep track of how much each person spent in the trip |
there won’t be any money issue during the trip |
|
student that always forget to pay my friend back |
set a deadline and reminder |
I will pay my friend back |
|
forgetful student |
send people automated reminders when they owe me money |
I won’t lose any money |
|
a lazy person |
I can ask for my money back from a few friends in a click |
I can save time asking them one by one |
|
student who does not dare to request money from friends |
send notifications to my friends |
I can get my money back |
|
student with no control |
know if I hit my budget |
I will be guilty and thus try and control myself |
|
student who does part time job |
track how much I earn in a month |
I’m proud of myself |
|
student who prefers visual data |
visualise my income/spendings in a graph/chart |
it is easier to keep track of my expenditures |
|
student that needs to explain their spendings to their parents |
show them the chart of my everyday spendings |
It is convenient and more visual |
|
organised student |
categorise my spendings |
I know the proportions of my spendings |
|
student with a huge wardrobe |
keep track of my expenditure on clothing |
I can control my shopaholic tendencies |
|
student on diet |
track how much I spend on food |
I would control myself from spending too much on food |
|
rich student |
keep track of what I bought |
I can show off to my friends |
|
rich student who always lends people money |
take note of who owes me money |
I can track them and ask them for it back |
|
someone with few friends |
keep track of who I paid for or who paid for me first |
I know who are my friends, and the frequency I go out with them |
|
tech-savvy loan shark |
I want to conveniently record who owes me money |
I can remind them to pay back through email |
|
tech-savvy loan shark |
I want a convenient way to calculate interest rate |
I don’t have to do it manually |
Appendix C: Use Cases
C.1. Wallet Tab
(For all use cases below, the System is the Wallet and the Actor is the User, unless specified otherwise)
Use case: UC1 - Recording an expense
-
User requests to add an expense into the wallet.
-
Wallet adds the expense and displays the expense in the list of expenses.
Use case ends.
-
1a. The amount keyed in by the user is invalid.
-
1a1. Wallet shows an error message.
-
1a2. User re-enters the expense.
Steps 1a1-1a2 are repeated until the amount keyed in by the user is correct.
Use case resumes at step 2.
-
Use case: UC2 - Recording an income
MSS
-
User requests to add an income into the wallet.
-
Wallet adds the income and displays the income in the list of incomes.
Use case ends.
Extensions
-
1a. The amount keyed in by the user is invalid.
Steps 1a1-1a2 of recording an expense (UC1) are repeated until the amount keyed in by the user is valid.
Use case resumes at step 2.
Use case: UC3 - Setting budget
MSS
-
User requests to set a budget.
-
Wallet sets the amount keyed in as the budget of the month indicated.
Use case ends.
Extensions
-
1a. The amount keyed in by the user is invalid.
Steps 1a1-1a2 of recording an expense (UC1) are repeated until the amount keyed in by the user is valid.
Use case resumes at step 2.
-
1b. The amount keyed in by the user has no date attached to it.
-
1b1. Wallet automatically assigns the budget entered as the default budget of each month.
Use case ends.
-
Use case: UC4 - Deleting a transaction
Preconditions: The transaction that the user wants to delete exists in the wallet.
MSS
-
User requests to delete a specific transaction in the wallet.
-
Wallet deletes the transaction and displays the list of remaining transactions.
Use case ends.
Extensions
-
1a. The transaction’s index keyed in by the user is invalid.
-
1a1. Wallet shows an error message.
-
1a2. User re-enters the index.
Steps 1a1-1a2 are repeated until the index keyed in is valid.
Use case resumes at step 2.
-
Use case: UC5 - Editing a transaction
Preconditions: The transaction that the user wants to edit exists in the wallet.
MSS
-
User requests to edit a specific transaction in the wallet.
-
Wallet edits the transaction and shows the list with the edited transaction.
Use case ends.
Extensions
-
1a. The transaction’s index keyed in by the is invalid.
Steps 1a1-1a2 of deleting an transaction (UC4) are repeated until the index keyed in by the user is valid.
Use case resumes at step 2.
-
1b. The user did not indicate the field to edit.
-
1b1. Wallet shows an error message.
-
1b2. User re-enters the edit command.
Steps 1b1-1b2 are repeated until the edit command keyed in is valid.
Use case resumes at step 2.
-
Use case: UC6 - Finding a transaction
MSS
-
User keys in a keyword.
-
Wallet lists out the transactions that contain the keyword.
Use case ends.
Extensions
-
1a. The keyword entered by the user does not exist in the wallet.
-
1a1. Wallet shows an empty list.
Use case ends.
-
Use case: UC7 - Listing all transactions
MSS
-
User enters the list command.
-
Wallet lists out all the transactions.
Use case ends.
C.2. People Tab
(For all use cases below, the System is the Address Book and the Actor is the User, unless specified otherwise)
Use case: UC8 - Adding a person
MSS
-
User requests to add a person into the address book.
-
Address book adds the person and displays the person in the list of people.
Use case ends.
Extensions
-
1a. The person’s details keyed in by the user is invalid.
-
1a1. Address book shows an error message.
-
1a2. User re-enters the person’s details.
Steps 1a1-1a2 are repeated until the details keyed in is correct.
Use case resumes at step 2.
-
Use case: UC9 - Sending reminder to a friend
MSS
-
User requests to send a reminder to a friend.
-
Address book sends a reminder to the friend.
Use case ends.
Extensions
-
1a. The person’s index keyed in by the user is invalid.
-
1a1. Address book shows an error message.
-
1a2. User re-enters the index.
Steps 1a1-1a2 are repeated until the index keyed in is valid.
Use case resumes at step 2.
-
-
1b. Address book shows that the friend does not owe the user money.
Use case ends.
Use case: UC10 - Recording the money the user owes
Preconditions: The friend, who user owes exists in the address book.
MSS
-
User enters the amount borrowed from a friend.
-
Address book records the amount, which the user owes the friend.
Use case ends.
Extensions
-
1a. The person’s index keyed in by the user is invalid.
Steps 1a1-1a2 of sending reminder to a friend (UC9) are repeated until index keyed in by the user is valid.
Use case resumes at step 2.
-
1b. The amount keyed in by the user is invalid.
-
1b1. Address book shows an error message.
-
1b2. User re-enters the amount.
Steps 1b1-1b2 are repeated until the amount keyed in is correct.
Use case resumes at step 2.
-
Use case: UC11 - Recording the money the user lends
Preconditions: The friend, who user lends exists in the address book.
MSS
-
User enters the amount lent to a friend.
-
Address book records the amount, which the user lends to the friend.
Use case ends.
Extensions
-
1a. The person’s index keyed in by the user is invalid.
Steps 1a1-1a2 of sending reminder to a friend (UC9) are repeated until the index keyed in by the user is valid.
Use case resumes at step 2.
-
1b. The amount keyed in by the user is invalid.
Steps 1b1-1b2 of recording the money the user owes (UC10) are repeated until the amount keyed in by the user is valid.
Use case resumes at step 2.
Use case: UC12 - Deleting a person
Preconditions: The person, who user wants to delete exists in the address book.
MSS
-
User requests to delete a specific person in the address book.
-
Address book deletes the person and shows the list of the remaining people.
Use case ends.
Extensions
-
1a. The person’s index keyed in by the user is invalid.
Steps 1a1-1a2 of sending reminder to a friend (UC9) are repeated until the index keyed in by the user is valid.
Use case resumes at step 2.
Use case: UC13 - Editing a person
Preconditions: The person, who user wants to edit exists in the address book.
MSS
-
User requests to edit a specific person in the address book.
-
Address book updates the indicated person’s detail and show the list of people with the edited person.
Use case ends.
Extensions
-
1a. The person’s index keyed in by the user is invalid.
Steps 1a1-1a2 of sending reminder to a friend (UC9) are repeated until the index keyed in by the user is valid.
Use case resumes at step 2.
-
1b. The person’s new details keyed in by the user is invalid.
Steps 1a1-1a2 of adding a person (UC8) are repeated until the details keyed in by the user is valid.
Use case resumes at step 2.
Use case: UC14 - Finding a person
MSS
-
User keys in a keyword.
-
Address book lists out the people, who contain the keyword in their names.
Use case ends.
Extensions
-
1a. The keyword entered by the user does not exist in the address book.
-
1a1. Address book shows an empty list.
Use case ends.
-
Appendix D: Non Functional Requirements
-
Sharkie should work on any mainstream OS as long as it has Java
11or above installed. -
Sharkie should be able to hold up to 100 persons and 100 transactions without a noticeable sluggishness in performance for typical usage.
-
University students 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.
-
Sharkie should be for a single user.
-
Sharkie needs to be developed incrementally with high cohesion and utilising CS2103T coding standards for maintainability.
-
The data used by Sharkie should be stored locally and should be in a human editable file.
-
The Sharkie JAR file size should be less than 100Mb.
Appendix E: Glossary
- Address book
-
Sharkie’s address book that holds information pertaining to friends / peers / acquaintances of the user that the user has entered
- CLI
-
Command line interface
- Cohesion
-
A measure of how strongly-related and focused the responsibilities of a component are
- Debt
-
The amount of money which the user owes a person in the address book.
- Extensions
-
"Add-on"s to MSS that describe exceptional/alternative flow of events.
- GUI
-
Graphical User Interface
- Loan
-
The amount of money which the user lends to a person in the address book.
- Mainstream OS
-
Windows, Linux, Unix, OS-X
- MSS
-
Main Success Scenario, the most straightforward interaction for a given use case
- Private contact detail
-
A contact detail that is not meant to be shared with others
- Transaction
-
Income and expense
- Wallet
-
Sharkie’s wallet, that holds information pertaining to the user’s expenditure and income
Appendix F: Product Survey
F.1. Money Lover
Pros / Good Features
-
Wallet
-
Multiple wallets to further organise spending/income
-
-
Transaction
-
Attach images to transactions
-
Add location data to transactions
-
Add recurring transactions (monthly, weekly, etc)
-
Option to exclude certain expenses/incomes from statistics
-
Search for transactions by amount, date, description, category, location
-
-
Debt
-
Set reminders to self on when to pay back debts
-
-
Budget
-
Set custom date range for budget
-
Set budget for specific categories (e.g. food, clothes)
-
Calculate recommended daily spending
-
-
Statistics
-
View statistics for custom date ranges
-
-
NFR
-
Cross-platform (syncs between devices)
-
Appealing, clean UI
-
Cons / Bad Features
-
Transaction
-
Unable to create custom tags/categories for transactions
-
-
Debt
-
Unable to tag debts to a specific contact (no underlying address book)
-
-
NFR
-
Requires network
-
GUI-reliant (slow input)
-
Certain features locked behind paywall, advertisements
-
Link to Product: https://web.moneylover.me
F.2. Spendee
Pros / Good Features
-
Wallet
-
Can import .csv files to add data more quickly
-
-
Transaction
-
Attach images to transactions
-
Create custom tags for transactions
-
Add recurring transactions (monthly, weekly, etc)
-
Search for transactions by amount, date, description, category
-
Can also filter by multiple categories at once
-
-
Budget
-
Calculate recommended daily spending
-
-
Statistics
-
View statistics for custom date ranges
-
-
NFR
-
Cross-platform (syncs between devices)
-
Appealing, clean UI
-
Cons / Bad Features
-
Debt
-
Unable to tag debts to a specific contact (no underlying address book)
-
-
NFR
-
Requires network
-
GUI-reliant (slow input)
-
Certain features locked behind paywall, advertisements
-
Link to Product: https://app.spendee.com
Appendix G: Instructions for Manual Testing
Given below are instructions to test the app manually.
|
These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing. For commands that require <index> input, if an index of 0 is provided, an error message will be returned indicating
that the command is invalid as it was stated in the User Guide that index should be positive. If the index
provided is larger than the number of people or transactions on the list, the error returned will state that the index provided
is invalid because there person or transaction does not exist in the list. Thus, different error messages will be
returned even though both errors pertains to the wrong index provided.
|
G.1. Manual Testing on Global Features
G.1.1. Launch and Shutdown
-
Initial launch
-
Download the jar file and put the jar file in an empty folder.
-
Open a command window. Run the java -version command to ensure you are using Java 11.
-
Launch the jar file using the java -jar command (do not use double-clicking).
Expected: Shows an "Enter User Data" window. The window size may not be optimum.
-
-
Entering user data
-
Enter a dummy name, phone and a valid email. If you do not wish to use your own email, you can get a temporary email from temp-mail.org.
-
Retrieve and enter the PIN number sent to the email. If it is not in the inbox, please check the junk mail.
Expected: Your user data is saved.
-
-
Saving window preferences
-
Resize the window to an optimum size. Move the window to a different location. Close the window.
-
Re-launch the app using the java -jar command (do not use double-clicking).
Expected: The most recent window size and location is retained.
-
-
Exiting the application
-
Click on the close button at the top right corner on the window.
Expected: All windows of the application is closed. -
Enter
exitcommand in the command box and press Enter.
Expected: Same as previous.
-
G.2. Manual Testing on Wallet Tab
-
Recording an expense
-
Prerequisites: None.
-
Test case:
wallet expense n/Meal $/3.50
Expected: An expense named Meal with $3.50 with default tag Misc recorded under the current date is added to the transaction list. The statistics panel will also update with the expense entered. -
Test case:
wallet expense n/Meal $/3.50 d/02/02/2020
Expected: An expense named Meal with $3.50 with default tag Misc recorded under the date 02 FEB 2020 is added to the transaction list. The statistics panel will not update with this expense. -
Test case:
wallet expense n/Meal $/3.50 t/Food
Expected: An expense named Meal with $3.50 with tag Food recorded under the current date is added to the transaction list. The statistic panel will also update with the expense entered, under the custom tag given. -
Test case:
wallet expense n/Meal $/asdf
Expected: The expense is not recorded. Error details shown in result display. -
Other incorrect expense commands to try:
-
wallet expense, -
wallet expense 1, -
wallet expense $/x, -
wallet expense n/Meal
Expected: Similar to previous.
-
-
-
Recording an income
-
Prerequisites: None.
-
Test case:
wallet income n/Teaching Assistant Job $/100
Expected: An expense named Teaching Assistant Job with $100.00 with default tag Misc recorded under the current date is added to the transaction list. -
Test case:
wallet income n/Teaching Assistant Job $/100 d/02/02/2020
Expected: An expense named Teaching Assistant Job with $100.00 with default tag Misc recorded under the date 02 FEB 2020 is added to the transaction list. -
Test case:
wallet income n/Teaching Assistant Job $/100 t/Job
Expected: An expense named Teaching Assistant Job with $100.00 with tag Job recorded under the current date is added to the transaction list. -
Test case:
wallet income n/Teaching Assistant Job $/asdfExpected: The income is not recorded. Error details shown in result display. -
Other incorrect expense commands to try:
-
wallet income, -
wallet income 1, -
wallet income $/x, -
wallet income n/Teaching Assistant Job
Expected: Similar to previous.
-
-
-
Setting a budget
-
Prerequisites: None.
-
Test case:
wallet budget $/800
Expected: A budget of $800 is set as the default budget for Sharkie. The UI should update to display your total expenditure over the set budget, assuming you have no budget set for the current month. -
Test case:
wallet budget $/800 m/02 y/2020
Expected: A budget of $800 is set as the budget for FEB 2020. The UI should update to display the total expenditure over the set budget if the current date is within the month you have selected. It will override the default budget set. -
Test case:
wallet budget $/0
Expected: A budget of $0 is set as the default budget. Sharkie will assume that there is no budget set as default, and the UI will reflect this. -
Test case:
wallet budget $/asdf
Expected: The budget will not be set. Error details will show in the result display. -
Other incorrect budget commands to try:
-
wallet budget, -
wallet budget 1, -
wallet budget $/800 m/02, -
wallet budget $/800 y/2020, -
wallet budget $/800 m/a y/b, -
wallet budget $/-800
Expected: Similar to previous.
-
-
G.2.1. Listing all transactions
-
Listing all the transactions in the wallet.
-
Prerequisites: The transactions list must not be empty.
-
Test case:
wallet list
Expected: All transactions in wallet listed out.
-
G.2.2. Editing a transaction
-
Editing a specific transaction.
-
Prerequisites: The transaction to be edited exist in the wallet. At least 1 field to be edited must be inputted. The new details provided to edit the transaction with must be different from the corresponding details in the old transaction.
-
Test case:
wallet edit 1 n/Chicken Rice
Expected: The first transaction is now updated with new description Chicken Rice. A success message shown in the result display. -
Test case:
wallet edit 1 n/Dinner $/12.00 d/02/02/2020 t/food
Expected: The first transaction is now updated with new description Dinner with amount $12.00, recorded under the date 02/02/2020 with tag Food. A success message shown in the result display. -
Test case:
wallet edit 0 n/Chicken Rice
Expected: The transaction is not edited. Error details shown in the result display. -
Other incorrect edit commands to try:
-
wallet edit, -
wallet edit 1, -
wallet edit 1 n/, -
wallet edit 1 $/, -
wallet edit 1 d/, -
wallet edit 1 t/, -
wallet edit 1 d/yyyy/mm/dd, (where the order of day month and year is not correct) -
wallet edit 1 d/x, (where x is not a date) -
wallet edit x n/Dinner $/12.00 d/02/01/2020(where x is larger than the transaction list size), -
wallet edit x $/12.00(where x is a negative number), -
wallet edit x $/12.00(where x is a non-integer), -
wallet edit 1 n/Dinner $/x(where x is greater 92233720368547758.07), -
wallet edit 1 n/Dinner $/x(where x has more than 2 decimal places) or -
wallet edit 1 n/Dinner $/x(where x is not a number).
Expected: Similar to previous
-
-
G.2.3. Finding transactions
-
Finding transactions containing the <keyword> provided.
-
Prerequisites: The transaction list must not be empty. The keyword can only be either of type [n/<description>], [d/<date>], [$/<amount>], or [t/<tag>]. At least 1 keyword to search with must be inputted.
-
Test case:
wallet find n/chicken duck
Expected: All transactions with description containing either chicken or duck are displayed. A success message shown in the result display. -
Test case:
wallet find $/3 12
Expected: All transactions with amount in the range of $3.00 to $3.99 or $12.00 to $12.999 are displayed. A success message shown in the result display. -
Test case:
wallet find d/20/12/2020 30/12/2020
Expected: All transactions with date falling on 20/12/2020 or 30/12/2020 are displayed. A success message shown in the result display. -
Test case:
wallet find t/food shopping
Expected: All transactions with tag containing either food or shopping are displayed. A success message shown in the result display. -
Test case:
wallet find n/Chicken d/20/12/2020
Expected: Find command do not run. Error details shown in the result display. -
Other incorrect find commands to try:
-
wallet find, -
wallet find n/, -
wallet find $/, -
wallet find d/, -
wallet find t/, -
wallet find n/Dinner $/12.00 d/02/01/2020 t/food -
wallet find $/x(where x is a negative number), -
wallet find $/x(where x is a non-integer), -
wallet find $/x(where x is greater 92233720368547758.07), -
wallet find d/x(where x is not a date), -
wallet find d/yyyy/mm/dd(where date is in the wrong format)
Expected: Similar to previous
-
-
G.2.4. Deleting a transaction
-
Deleting a transaction.
-
Prerequisites: The transaction which you want to delete exists in the transactions list.
-
Test case:
wallet delete 1
Expected: First transaction is deleted from the list. Details of the deleted contact shown in the result display. -
Test case:
wallet delete 0
Expected: No transaction is deleted. Error details shown in the result display. -
Other incorrect delete commands to try:
-
wallet delete, -
wallet delete x(where x is not a number), -
wallet delete x(where x is larger than the person list size), -
wallet delete x(where x is a negative number) or -
wallet delete x(where x is a non-integer value)
Expected: Similar to previous.
-
-
G.2.5. Clearing all transactions
-
Clear all the data in the wallet, including income, expense and budget.
-
Prerequisites: There must be transactions or budget data in the wallet.
-
Test case:
wallet clear
Expected: All transactions and budget data in wallet is deleted.
-
G.3. Manual Testing on People Tab
G.3.1. Managing contacts
-
Adding a person
-
Test case:
people add n/John Doe p/91234567 e/John@example.com
Expected: A person named John Doe with phone number 91234567 and email John@example.com is added to the contact. -
Test case:
people add n/John Doe p/91234567
Expected: No person is added. Error details shown in the result display. -
Other invalid
people addcommands to try:-
people add, -
people add n/Invalid! p/99999999 e/John@example.com, -
people add n/John Doe p/123 e/John@example.com, -
people add n/John Doe p/123 e/invalid, -
people add n/John Doe e/John@example.com, -
people add p/91234567 e/John@example.com, -
people add n/John Doe, -
people add p/91234567or -
people add e/John@example.com
Expected: Similar to previous.
-
-
-
Editing the details of a person
-
Prerequisites: The person whom you want to edit exists in the person list.
-
Test case:
people edit 1 n/April Tan p/91234567 e/April@example.com
Expected: The first person name, phone number and email will be changed to April Tan, 91234567 and April@example.com respectively. -
Test case:
people edit 0 n/John Doe p/91234567 e/John@example.com
Expected: No person is edited. Error details shown in the result display. -
Other valid
people editcommands to try:-
people edit 1 n/Bob p/88888888, -
people edit 1 n/Cate e/cate@example.com, -
people edit 1 p/66666666 e/cate@example.com, -
people edit 1 n/Alice, -
people edit 1 p/99999999or -
people edit 1 e/email@example.com,
Expected: Similar to (b).
-
-
Other invalid
people editcommands to try:-
people edit, -
people edit 1, -
people edit 1 n/Invalid!, -
people edit 1 p/123, -
people edit 1 e/invalid, -
people edit x n/Something(where x is larger than the person list size), -
people edit x n/Somthing(where x is a negative number) or -
people edit x n/Something(where x is a non-integer value)
Expected: Similar to (c).
-
-
-
Finding a person
-
Prerequisites: The person whom you want to find exists in the person list.
-
Test case:
people find n/Alex Bernice
Expected: People who `are have Alex or Bernice in their name (case insensitve) will be listed. -
Test case:
people find t/debt
Expected: People whom you owe money to will be listed. -
Test case:
people find t/loan
Expected: People whom you lend money to will be listed. -
Test case:
people find n/Alex p/91234567
Expected: No person found. Error details shown in the result display. -
Other valid
people findcommands to try:-
people find p/93210283, -
people find p/9321 9927, -
people find e/@example, -
people find e/irfan@example.com, -
people find p/phoneor -
people find t/debt loan
Expected: Similar to (b).people find p/phoneis a valid command even though phone is not a valid phone number. However, no person will be listed since no one has phone as their phone number.
-
-
Other invalid
people findcommands to try:-
people find d/invalidTag
Expected: Similar to (d).
-
-
-
Listing everyone
-
Test case:
people list
Expected: Everyone in the contacts will be listed.
-
-
Deleting a person while all persons are listed
-
Prerequisites: List all persons using the
people listcommand. The person who you want to delete exists in the person list. -
Test case:
people delete 1
Expected: First contact is deleted from the list. Details of the deleted contact shown in the result display. -
Test case:
people delete 0
Expected: No person is deleted. Error details shown in the result display. -
Other invalid
people deletecommands to try:-
people delete, -
people delete x(where x is larger than the person list size), -
people delete x(where x is a negative number) or -
people delete x(where x is a non-integer value)
Expected: Similar to previous.
-
-
-
Deleting everyone
-
Test case:
people clear
Expected: The list of people will be empty.
-
| If you have deleted everyone in the addressbook, and would like to retrieve some sample data to test Sharkie, simply delete data/addressbook.json. |
G.3.2. Recording the flow of money
-
Recording the money you owe a person
-
Prerequisites: The person whom you owe exists in the person list.
-
Test case:
people owe 1 n/Breakfast $/5.00
Expected: A debt named Breakfast with $5.00 is added into the debt list of the first person. -
Test case:
people owe 1 n/Breakfast $/5.00 d/02/02/2020
Expected: A loan named Breakfast with $5.00, recorded under the date 02/02/2020 is added into the debt list of the first person. Total amount of money, which you lent to the first person is shown in the result display. -
Test case:
people owe 0 n/Breakfast $/5.00
Expected: The loan is not recorded. Error details shown in the result display. -
Other invalid
people owecommands to try:-
people owe, -
people owe 1, -
people owe 1 n/Laksa, -
people owe 1 $/5.00, -
people owe n/Laksa $/5.00, -
people owe x n/Breakfast $/12.00(where x is larger than the person list size), -
people owe x n/Breakfast $/12.00(where x is a negative number), -
people owe x n/Breakfast $/12.00(where x is a non-integer), -
people owe 1 n/Breakfast $/x(where x is a negative number), -
people owe 1 n/Breakfast $/x(where x is greater 92233720368547758.07), -
people owe 1 n/Breakfast $/x(where x has more than 2 decimal places) or -
people owe 1 n/Breakfast $/x(where x is not a number).
Expected: Similar to previous
-
-
-
Recording the money you returned to a person
-
Prerequisites: The person whom you returned to exists in the person list.
-
Test case:
people returned 1 i/1
Expected: The first debt of the first person is deleted from the debt list. Remaining amount of debt, which have yet settled by the first person is shown in the result display. -
Test case:
people returned 0 i/1
Expected: No debt is deleted. Error details shown in the result display. -
Other invalid
people returnedcommands to try:-
people returned, -
people returned 1, -
people returned i/1, -
people returned x i/1(where x is larger than the person list size), -
people returned x i/1(where x is a negative number), -
people returned x i/1(where x is a non-integer value), -
people returned 1 i/x(where x is larger than the debt list size), -
people returned 1 i/x(where x is a negative number or zero) or -
people returned 1 i/x(where x is a non-integer value)
Expected: Similar to previous
-
-
-
Recording the money you lend to a person
-
Prerequisites: The person whom you lend to exists in the person list.
-
Test case:
people lend 1 n/Dinner $/12.00
Expected: A loan named Dinner with $12.00 is added into the loan list of the first person. -
Test case:
people lend 1 n/Dinner $/12.00 d/02/02/2020
Expected: A loan named Dinner with $12.00, recorded under the date 02/02/2020 is added into the loan list of the first person. Total amount of money, which you lent to the first person is shown in the result display. -
Test case:
people lend 0 n/Dinner $/12.00
Expected: The loan is not recorded. Error details shown in the result display. -
Other invalid
people lendcommands to try:-
people lend, -
people lend 1, -
people lend 1 n/Chicken Rice, -
people lend 1 $/12.00, -
people lend n/Chicken Rice $/12.00, -
people lend x n/Dinner $/12.00(where x is larger than the person list size), -
people lend x n/Dinner $/12.00(where x is a negative number), -
people lend x n/Dinner $/12.00(where x is a non-integer), -
people lend 1 n/Dinner $/x(where x is a negative number), -
people lend 1 n/Dinner $/x(where x is greater 92233720368547758.07), -
people lend 1 n/Dinner $/x(where x has more than 2 decimal places) or -
people lend 1 n/Dinner $/x(where x is not a number).
Expected: Similar to previous
-
-
-
Recording the money you received from a person
-
Prerequisites: The person whom you received from exists in the person list.
-
Test case:
people received 1 i/1
Expected: The first loan of the first person is deleted from the loan list. Remaining amount of loan, which have yet settled by the first person is shown in the result display. -
Test case:
people received 0 i/1
Expected: No loan is deleted. Error details shown in the result display. -
Other invalid
people receivedcommands to try:-
people received, -
people received 1, -
people received i/1, -
people received x i/1(where x is larger than the person list size), -
people received x i/1(where x is a negative number), -
people received x i/1(where x is a non-integer value), -
people received 1 i/x(where x is larger than the loan list size), -
people received 1 i/x(where x is a negative number or zero) or -
people received 1 i/x(where x is a non-integer value)
Expected: Similar to previous
-
-
G.3.3. Sending reminders
-
Reminding a specific person about the unsettled loan(s).
-
Prerequisites: Connected to the Internet. Your firewall or antivirus programme (if any) allows the connection to STMP port 587. The person who you want to remind exists in the person list. The person has at least one loan in the loan list. The email of the person to be reminded is a valid email (You can generate an email from temp-mail.org).
-
Test case:
people remind 1
Expected: A reminder is sent to the first person’s email. A carbon copy (CC) of the reminder is sent to you. A success message shown in the result display. -
Test case:
people remind 0
Expected: No reminder is sent. Error details shown in the result display. -
Other invalid
people remindcommands to try:-
people remind, -
people remind x(where x is larger than the person list size), -
people remind x(where x is a negative number) or -
people remind x(where x is a non-integer value)
Expected: Similar to previous
-
-
-
Reminding all people about the unsettled loan(s).
-
Prerequisites: Connected to the Internet. Your firewall or antivirus programme (if any) allows the connection to STMP port 587. At least one person in the list has at least one loan. The email(s) of the people to be reminded are valid email(s) (You can generate an email from temp-mail.org).
-
Test case:
people remindall
Expected: A reminder is sent everyone, who has unsettled loan. A carbon copy (CC) of each of the reminder is sent to you. A list of people reminded is shown in the result display, along with the success message.
-
Appendix H: Effort
Overview
Our application, Sharkie, is considerably different from what AB3 has implemented. We incorporated the address book features that were previously available in AB3, but we wanted to add expense tracking features as the main part of our project. As such, we had to expand a lot on the features that AB3 implemented and also had to create our own models and implementations.
These are based off the foundations that AB3 had already put in place, but the entire team needed to work together to expand on these features to create Sharkie.
Challenges
The team encountered a few issues during the development process of Sharkie. The more notable ones are:
-
Initial brainstorming and filtering of ideas
At the start of the project, ideation and brainstorming came up with a bunch of features that we wanted to implement in Sharkie. We came up with many different ideas and ways to implement our commands and features, however, it was messy as we were unsure and unclear of how each of us wanted to implement our features. We sat down for a few meetings to discuss our implementation and our thought processes, ensuring that everyone was on the same page before starting the development process. -
Wallet model
Since we wanted an expense tracker for Sharkie, we required some proper way of storing our data. We decided to adapt from AB3’s address book system, following their saving of data and storing of user details, implementing it in ourWalletmodel. -
Commands
We also adapted AB3’s command system using theirXYZParserandXYZCommandimplementations, making our application easier to develop since we were using the same implementation as theirLogic. -
Reminder feature
One of the more prominent features that we added that was completely not part of AB3 was our reminder feature. This feature had nothing similar to it in AB3, and had to be implemented from scratch in order to make it work with our program. -
User interface
We decided early on that we wanted to redo the user interface from AB3, as it would not only be more asthetically pleasing, but also tie in well to the features that we wanted to be implemented. Daniel did the main UI implementation using JavaFX and CSS, and along the way the entire team chipped in to fix the many different bugs that arose due to the UI. Threading errors, wrong values being displayed etc. were all fixed after careful testing and fixing by the team.
Conclusion
The team believes that we have put in a lot of equal effort on all parts of the project, from the documentation to the coding of the project itself. We believe that our product is significantly different from AB3 and we are happy with what we have achieved across the semester with CS2103T.