Overview
Sharkie is a desktop expense tracker application. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.
Summary of contributions
-
Major enhancements:
-
Added People’s command,
owe-
What it does: allows the user to keep track of what they owe to other people in the addressbook.
-
Justification: This is one of the main feature of Sharkie.
-
Highlights: The implementation was quite challenging as it required an in-depth analysis of design alternatives. For instance, how to store the Transactions, since a Transaction has association to Description, Amount, Date and Tag, and Date itself have different formats to consider. I have implemented the logic, model, storage and ui for this command.
-
-
Added People’s command,
returned-
What it does: allows the user to record that he/she has already returned the debt(s).
-
-
Modified People’s command,
find-
What it does: allows the user to find people based on their name, phone, email or tags. I have also added the the tags "Debt" and "Loan" to people whom the user owes and lends, so that the user can filter the people whom they lend or owe using the commands
people find t/debtandpeople find t/loanrespectively.
-
-
-
Minor enhancements:
-
Edit existing AB3 commands
-
Removed address field of AB3 as it is unnecessary for Sharkie.
-
-
-
Code contributed: [Functional codes & Test codes]
-
Other contributions:
-
Enhancements to existing features:
-
Documentation:
-
Update AboutUs page: (Pull request #53)
-
Updated User Guide: Summary of my contributions:
-
Updated Developer Guide: Summary of my contributions:
-
-
Community:
-
Contributions to the User Guide
Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. |
Features
Contact Management
If you would like to keep the contact details of a person so that you can use the debts and loans features, Sharkie can help you do so!
Sharkie notes down and remembers contacts that you have entered in a contact list, for easy reference later on! Should their contact details change, you can also edit them or delete them. If you need to find a particular person’s contact details, Sharkie will look through all your contacts and quickly help you find the contact that you are looking for!
| You may visit [people-commands] for more details on how you can manage your contacts with Sharkie. |
Commands
Sharkie is filled with a variety of commands that can aid in your financial tracking journey.
For ease of reference, we have segregated them into three parts: general commands, people commands and wallet commands.
Command Format
-
Words in angle brackets are the parameters to be supplied by the user e.g. in
add n/<name>,<name>is a parameter which can be used asadd n/John Doe. -
Items in square brackets are optional e.g.
$/<amount> [d/<date:dd/mm/yyyy>]can be used as$/5 d/21/02/2020or as$/5. -
People commands are used when you want to do things related to the people tab, e.g.
people add n/<name> p/<phone number> e/<email address> -
Wallet commands are used when you want to do things related to the wallet tab, e.g.
wallet expense n/<item> $/<price> [d/<date:dd/mm/yyyy>] [t/<tag>] -
Parameters can be in any order e.g. if the command specifies
n/<name> p/<phone number>,p/<phone number> n/<name>is also acceptable.
Editing a person : edit
Suppose a person has changed his contact details, and you want to update them, the command that you would enter
is the people edit command.
Format: people edit <person’s index> [n/<name>] [p/<phone number>] [e/<email>]
Command Format
The following are the restrictions of people edit command, which you would need to take note of:
-
The
<person’s index>you entered should be a positive integer, e.g. 1, 2, 3, … -
You should provide at least one of the optional fields.
| Existing values will be updated to the new values that you have inputted. |
The <person’s index> above refers to the index number shown in the displayed person list in Sharkie. It indicates a
specific person in the contact list.Still confused? Find out more about what is a person’s index. |
Example:
-
Suppose you want to update John’s email, and John is the first person in your contact list.
-
The command you would enter is
people edit 1 e/johndoe@example.com. -
This edits the email address of the first person, John, to be "johndoe@example.com".
-
Expected Outcome:
-
In the list of people shown, John’s email will be "johndoe@example.com".
Edited Person: John Doe Phone: 91234568 Email: johndoe@example.com You owe: $0.00 You lent: $0.00 Tags:
Deleting a person : delete
Suppose you would like to delete a person’s contact details, the
command that you would enter is the people delete command.
Format: people delete <person’s index>
Command Format
The following are the restrictions of people delete command, which you should take note of:
-
The
<person’s index>you entered should be a positive integer, e.g. 1, 2, 3, …
Remember to check and ensure that the <person’s index> that you have inputted corresponds to the correct person.
|
The <person’s index> above refers to the index number shown in the displayed person list in Sharkie. It indicates a
specific person in the contact list.Still confused? Find out more about what is a person’s index. |
Example:
-
Suppose you want to delete "Betsy" from your contact list, and "Betsy" is the first person in the list.
-
The command that you would enter is
people delete 1. -
Sharkie will delete "Betsy" from the contact list.
-
Expected Outcome:
-
"Betsy" will no longer be shown on the list of people.
Deleted Person: Betsy Phone: 91234567 Email: something@email.com You owe: $0.00 You lent: $0.00 Tags:
Recording the money you owe: owe
Suppose you owe a person money and you want to record the debt, the command you would enter is the people owe command.
Format: people owe <person’s index> n/<description> $/<amount> [d/<date: dd/mm/yyyy>]
Command Format
The following are the restrictions of people owe command, which you would need to take note of:
-
The
<person’s index>you entered should be a positive integer, e.g. 1, 2, 3, … -
The
<amount>should be a valid amount
The <person’s index> above refers to the index number shown in the displayed person list in Sharkie. It indicates a
specific person in the contact list whom you owe money to.Still confused? Find out more about what is a person’s index. The amount of money recorded will be added under your friend’s "debts" section. Debts represent the amount of money you owe your friends. Still confused? Find out more about the differences between debts and loans. |
The <date: dd/mm/yyyy> is optional. If <date: dd/mm/yyyy> is not specified, the date that you record the debt will be used.
|
Example:
-
Suppose you owe "Grace", who is the fourth person in the contact list, "$5" for "food" on "10 October 2020".
-
The command you would enter is
people owe 4 n/food $/5.00 d/10/10/2020 -
This records that you owe "Grace", the fourth person in the contact list, "$5.00" for "food" on "10/10/2020".
-
Expected Outcome:
-
Your debt to "Grace" will increase by "$5".
Increased debt to Grace by $5.00. You now owe Grace $10.00.
Recording the money you return: returned
Suppose you have returned a person a debt, and you want to remove the debt recorded, the command that you would enter is
the people returned command.
Format: people returned <person’s index> [i/<debt’s index>]
Command Format
The following are the restrictions of people returned command, which you would need to take note of:
-
The
<person’s index>and<debt’s index>you entered should be positive integers, e.g. 1, 2, 3, …
The <person’s index> above refers to the index number shown in the displayed person list in Sharkie. It indicates
a specific person in the contact list whom you returned the money to.Still confused? Find out more about what is a person’s index. The <debt’s index> above refers to the index number shown in the displayed debt list in Sharkie. It indicates a specific
debt under the person whom you returned the money to.Still confused? Find out more about what is a debt’s index. Debts represent the amount of money you owe your friends. Still confused? Find out more about the differences between debts and loans. |
The <debt’s index> is optional.
Sharkie will remove all debts for the person if the <debt’s index> is not specified.
|
Example:
-
Suppose that you have just returned "Grace", the fourth person in the contact list, the first debt in her debt list.
-
The command that you would enter is
people returned 4 i/1. -
This records that you have returned the money for the first debt of "Grace", the fourth person in the contact list.
-
Expected Outcome:
-
The first debt of "Grace" will be removed from her debt list and the unsettled debts to "Grace" will be shown.
Reduced debt to Grace by $5.00. You now owe Grace $5.00.
Recording the money you lend: lend
Suppose you lend a person money and you want to record the loan, the command you would enter is the people lend command.
Format: people lend <person’s index> n/<description> $/<amount> [d/<date: dd/mm/yyyy>]
Command Format
The following are the restrictions of people lend command, which you would need to take note of:
-
The
<person’s index>you entered should be a positive integer, e.g. 1, 2, 3, … -
The
<amount>should be a valid amount.
The <person’s index> above refers to the index number shown in the displayed person list in Sharkie. It indicates a
specific person in the contact list whom you lent money to.Still confused? Find out more about what is a person’s index. The amount of money recorded will be added under your friend’s "loans" section. Loans represent the amount of money you lend your friends. Still confused? Find out more about the differences between debts and loans. |
The <date: dd/mm/yyyy> is optional. If <date: dd/mm/yyyy> is not specified, the date that you record the loan will be used.
|
Example:
-
Suppose you lent "Syin Yi", who is the fifth person in the contact list, "$5" for "dinner" on "10 October 2020".
-
The command you would enter is
people lend 5 n/dinner $/5.00 d/10/10/2020 -
This records that you owe "Syin Yi", the fifth person in the contact list, "$5.00" for "dinner" on "10/10/2020".
-
Expected Outcome:
-
Your loan to "Syin Yi" will increase by "$5".
Increased loan to Syin Yi by $5.00. Syin Yi now owes you $8.00.
Listing all contacts: list
Suppose that you have just executed the people find command. And now, you would like to see the
entire list of people in your contact list. The command you would enter is our people list command.
Format: people list
Example:
-
Suppose you want to view the entire list of people in your contact list.
-
The command that you would enter is
people list. -
This will list out your entire contact list.
-
Expected Outcome:
-
The details of everyone in the contact list, including their name, phone, email address, debts and loans, will be listed.
Listed all persons.
Contributions to the Developer Guide
Given below are sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project. |
Architecture
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.
Implementation
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:
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.
|
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.
-
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 G: Instructions for Manual Testing
-
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. |
-
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
-
-