Shamus Neo Zhi Kai - Project Portfolio for OwlMoney

Hello there, I am Shamus. I am currently pursuing a degree in Information Security at the National University of Singapore (NUS).
I enjoy server and network administration as well as building and breaking applications.
This portfolio serves to document my extensive involvement and contribution in a team-based project CS2113T (Software Engineering & Object-Oriented Programming) module by NUS. This project spans over about eight weeks and was completed together with a team of five members (consisting of Mong Zheng Wei, Brian Tan Kian Ming, Terence Tan Wee Theng, Valerie Tan Yi Jia and myself).

About the project

My team and I were tasked with enhancing a basic Command Line Interface (CLI) based personal assistant, named Duke for our Software Engineering Project. We chose to morph it into a financial tracker and investment management application called OwlMoney. This enhanced application targets undergraduates and fresh graduates and aims to help them track and manage their finances.
Some features of OwlMoney include tracking of both expenses and expenditures as well as tracking credit cards and investments such as investment bonds.
My role as a team leader was to perform project management as well as to write the baseline code for the team to get started. On top of that, I was also in charge of writing codes for the investment, bonds, storage and some parts of the commands section.
Lastly, I played a major role while collaborating with my team to implement a custom string parser, which was instrumental in enabling users to be able to enter the parameters of complex commands in any order. The following sections illustrate these enhancements in more detail and shows the relevant sections I have contributed to the project as a whole, as well as the relevant sections I have added to the user and developer guides in relation to these enhancements.

Understanding this Project Portfolio

The following symbols are used through this project portfolio:

This symbol denotes information that you may want to take note of.

This symbol denotes a tip that you may find useful when using our application.

This symbol denotes a warning message which you need to be careful of when using our application.

Additionally, you may also encounter the following text styles:

  • Commands, parameters, and file paths will be in this format

  • Important messages will be bold

Summary of Contributions

This section shows a summary of my coding, documentation, and other helpful contributions to the team project.

Enhancement added: I added the ability to add investment accounts and bonds.

  • What it does: The investment account allows the user to create an account dedicated for investment purposes.

  • Justification: As we are targeting undergraduates and fresh graduates who usually do not have good financial literacy, I believe that OwlMoney can play a role in educating them on separating spending from investment. Therefore, no spending transactions can be made on the investment account and no investments can be bought in a savings account.

  • Highlights: This enhancement automatically credits interest for bonds added into the investment account every 6 months from the date of purchase, eliminating the need for the user to manually calculate and enter the interest in every half-yearly. This prevents errors caused by users forgetting to enter the interest since it only credits twice a year.

  • Credits: A portion of recording transactions and similar features across all bank accounts were inherited from a common parent class bank which was coded by both Brian Tan Kian Ming and I.

Other notable features I was in charge of implementing for the entire project were:
Storage: Responsible for saving data persistently and ensuring the program’s data is imported back smoothly.
Logging: Enable developers and tech-savvy users to debug and see errors that were logged in OwlMoney.
With these 2 features, my team was able to swiftly make use of my comprehensive functions to implement these features on their portion of code.

Code contributed:

Other contributions:

  • Project Management:

    • There were a total of 5 releases, from version 1.0 to version 1.4. I managed the team’s repository and was responsible for producing all of the releases on Github.

  • Enhancements to existing features:

    • Updated the persistent storage to use OpenCSV instead of writing into a conventional .txt file. This provides better clarity and organisation of stored data in secondary storage.

  • Documentation:

    • Responsible for writing and maintaining over 70% of content on both the User Guide and Developer Guide as well as making it presentable in the .adoc format which can be rendered and converted to various other formats since it is platform-independent.

  • Community:

  • Tools:

    • Integrated a third party library OpenCSV to the project for persistent storage.

    • Integrated Travis & AppVeyor Continuous Integration (CI) tools. (examples: PRs #119)

    • Integrated Coveralls & Codecov Code coverage tools. (examples: PRs #133)

    • Integrated Codacy Code analytics tool.

    • Integrated Netlify & GitHub Deployment Deployment preview tools to the team’s repository (examples: PRs #119, #101, #103)

    • Updated Gradle build configuration to automate and simplify the build process (examples: PRs #101)

    • Added a new Github plugin (project-bot) to automate triaging of issues in the team’s Project Board

Contributions to User Guide

The sections below showcases my ability in writing documentation targeting end-users to guide them in using the various features of OwlMoney in a clear and concise manner. It includes pictures that display the results when necessary

Investment Account Management

In this section, you’ll be introduced to commands and parameters that help you to manage your investment account and bonds that you can track in OwlMoney.

Below is a list of command parameters that you can expect to use for the commands in this section.

Parameter

Description

Acceptable Range of Values

ACCOUNT_NAME

Indicates the name of the investment bank account.

(e.g. DBB Vickers Account)

ACCOUNT_NAME should contain alphabetic characters, numeric characters, and spaces only.

ACCOUNT_NAME is case-sensitive.

Take note that there is a maximum of 30 character limit.

AMOUNT

Indicates the amount of money.

(e.g. 2113.30)

AMOUNT should contain only digits up to 2 decimal places and a maximum of 9 digits.

BOND_NAME

Indicates the name of the investment bond purchased.

(e.g. June SSB)

BOND_NAME should contain alphabetic characters, numeric characters, and spaces only.

BOND_NAME is case-sensitive.

Take note that there is a maximum of 30 character limit.

BOND_RATE

Indicates the coupon rate of the investment bond in percentage.

(e.g. 1.92)

BOND_RATE should contain only digits up to 2 decimal places with a maximum of 99.99.

DATE

Indicates the date the bond was purchased.

(e.g. 2/2/2019)

DATE should be in DD/MM/YYYY format and cannot be a newer date than the current date.

YEARS

Indicates the number of years the investment bond lasts.

YEARS should contain only digits from 1 to 9.

Adding investment bank account /add /investment

Want to start investing to grow your wealth? No problem! All you need to do is to add an investment account!
Here’s how you can use the /add /investment command.

Command Syntax

/add /investment /name ACCOUNT_NAME /amount AMOUNT

There can only be a maximum of 3 investment accounts.

Example

  • /add /investment /name DBB Vickers Account /amount 10000

Adds an investment account named DBB Vickers Account which has an initial amount of $10000 inside that you can start investing with.

InvestmentAdd
Figure 1. Successful addition of investment account after using /add /investment
Editing investment bank account /edit /investment

Changes made to your investment account? Here is how you can do it!

Command Syntax

/edit /investment /name ACCOUNT_NAME [/newname ACCOUNT_NAME] [/amount AMOUNT]

At least one of /newname, /amount must be used.

Example

  • /edit /investment /name DBB Vickers Account /newname OBOB Securities Account

Edits the name of the account from DBB Vickers Account to OBOB Securities Account.

InvestmentEdit
Figure 2. Successful edition of investment account after using /edit /investment
  • /edit /investment /name DBB Vickers Account /amount 50000

Edits the amount in DBB Vickers Account to $50000.

  • /edit /investment /name DBB Vickers Account /newname OBOB Securities Account /amount 50000

Edits the name of the account from DBB Vickers Account to OBOB Securities Account and the amount in the account to $50000.

Deleting investment bank Account /delete /investment

You can also close your investment bank account on OwlMoney as well!

Command Syntax

/delete /investment /name ACCOUNT_NAME

All transactions (e.g. bonds) related to the investment bank account will be deleted.

Example

  • /delete /investment /name DBB Vickers Account

Deletes an investment account named DBB Vickers Account.

InvestmentDelete
Figure 3. Successful deletion of investment account after using /delete /investment
Adding investment bonds /add /bonds

Signed up for a bond? Finding it difficult to keep up with the interest? No worries! OwlMoney allows efficient tracking of your semi-annual coupon interest!

Command Syntax

/add /bonds /from ACCOUNT_NAME /name BOND_NAME /amount AMOUNT /rate BOND_RATE /date DATE /year YEARS

An investment account needs to be created first to add bonds.

Bonds can only be added to investment accounts.

There can only be a maximum of 20 investment bonds per investment account.

Example

  • /add /bonds /from DBB Vickers Account /name June SSB /amount 1000 /rate 1.92 /date 1/1/2019 /year 1

Adds a bond named June SSB charged to DBB Vickers Account at $1000 with an interest rate of 1.92% bought on 1/1/2019 for 1 year(s).

BondAdd
Figure 4. Successful addition of investment bond after using /add /bonds
Editing Bond details /edit /bonds

Change in your investment details? Edit them here!

Command Syntax /edit /bonds /from ACCOUNT_NAME /name BOND_NAME [/rate BOND_RATE] [/year YEARS]

At least one of /rate or /year must be present when editing.

Only /rate and /year can be edited.

Editing /rate will only result in future bond coupon interest crediting to be modified, all past interest credited will not be edited.

/year can only be edited to a year higher than the original year.

Example

  • /edit /bonds /from DBB Vickers Account /name June SSB /rate 1.98

Edits the bond named June SSB charged to DBB Vickers Account with a new interest rate of 1.98%.

BondEdit
Figure 5. Successful edition of investment bond after using /edit /bonds
Deleting bonds /delete /bonds

Sold your bonds? Delete it from OwlMoney!

Command Syntax /delete /bonds /from ACCOUNT_NAME /name BOND_NAME

Example

  • /delete /bonds /from DBB Vickers Account /name June SSB

Deletes the bond named June SSB charged to DBB Vickers Account.

BondDelete
Figure 6. Successful deletion of investment bond after using /edit /bonds

Contributions to Developer Guide

A developer guide is important in allowing future developers to continue developing OwlMoney The following sections illustrate my ability in writing documentation to provide developers insights on the design of the application. It also showcases some notable technical design considerations and depth of my contributions to the project.

LogicCommandBondPackage
Figure 7. Bond Command Class Diagram

The logic.command.bond package consists of Bond classes with the following features:

  • Add

  • Edit

  • Delete

  • List

Main will call the specific Bond command class that will construct the required parameters before calling the Profile class in Model to execute.

Editing Bonds

The /edit /bonds feature aims to help users update the specific details of the investment bonds that they purchase. This is to enable them to not go through the trouble of deleting and re-adding the bond if they enter the details wrongly by mistake.

Current Implementation

The current implementation of editing bonds only allows for the edition of rate and year where the year parameter can only be changed to a higher integer than the original year currently stored. The reason behind only allowing these 2 parameters to be changed was because we wanted consistency across all records of crediting interest throughout the lifespan of the investment bond.

editBondCommand
Figure 8. Sequence Diagram of Editing Bonds
The sequence diagram presented above is assumed to be a valid command which will produce a successful result.

The sequence diagram presented above depicts the interaction between the Logic and Model component for running EditBondCommand.

The EditBondCommand requires a minimum of 3 and up to a maximum of 4 inputs:

  1. Investment Account’s name

  2. Bond’s name

  3. At least 1 of the 2 inputs:

    1. Rate

    2. Year of maturity

When the user executes the EditBondCommand, the following steps are taken by the application:

  1. When EditBondCommand is executed, it will invoke profileEditBond.

  2. Within the invocation of profileEditBond, a method named bankListEditBond will be invoked.

  3. Once invoked, bankListEditBond will perform the following checks based on the bank name specified:

    • Check for the existence of the investment account containing the bond.

bankListEditBond will throw an error if the above check fails.
  1. After passing the above checks, the method investmentEditBond will be invoked.

  2. Within investmentEditBond, the method named editBond will be invoked.

  3. Once invoked, editBond will perform the following checks:

    • Check for the existence of the bond within the investment account.

    • Check whether the newly specified year of maturity for the bond is more than or equal to the current year of maturity through the method editBondYear.

editBond will throw an error if the above check fails.
  1. After passing all of the above checks, editBond will update the bond details with the new details specified using:

    • editBondRate → edits bond’s interest or coupon rate.

    • editBondYear → edits year of maturity.

  2. Once the bond object has been edited, the updated details of that bond object will be displayed to inform the user of the successful editing of the bond.

Design Considerations

This section describes the various design considerations taken when implementing the /edit /bonds feature.

Aspect: Choice of whether to allow editing of the bond to tie to which investment account as well as its name

Approach Pros Cons

1. Allowing changing of the investment bank account that the bond ties to.

  • More room for customisability from the user’s perspective.

  • Difficult to implement, have to take care of issues such as whether there is enough space to store bonds in the other bank account.

  • All transaction records have to be migrated over to the other bank account and might cause issues such as transaction records not appearing in order.

2. Allowing the changing of bond’s name.

  • Allows the user to change the name of the bond if the user entered it wrongly the first time.

  • If interest has already been credited, it is not feasible to change the names of past records as it might confuse the end-user. This becomes more apparent when the names clash with the name of another investment bond which had expired prior to making this edit. This might confuse users as they might think that they earned much more interest from the same bond.

3. Disallowing the changing of both parameters.

  • Easier to implement in terms of code.

  • Users are less likely to get confused after editing records to become conflicting.

  • Less flexibility for the user.

After weighing the pros and cons, approach 3 was taken.

Firstly, doing so would reduce the coupling and dependencies between transactions and investment banks. Although it may seem restrictive to limit the type and number of parameters that can be changed, it is beneficial both to you, the developer and the user, when developing and using the program. Developing the alternative ideas mentioned would result in a high risk of logic and coding errors, leaving room for bugs to be exploited.