PROJECT: MoneyGoWhere


Introduction

The aim of this portfolio is to demonstrate my programming skills and abilities to implement features and integrate codes into a team project. This portfolio also highlights my documentation strategy to showcase usage and design of the product. The project was done for Software Engineering Module (CS2103T) from National University of Singapore (NUS), and is based on morphing given Address book application into personal finance application.

Overview

MoneyGoWhere is a desktop application mainly targeted to students at National University of Singapore (NUS), who often have troubles managing their finance. This application help users by allowing them to record their daily expenses, set budget goal as well as reminders for payment and bills. With the integrated pie chart and graph display, students are able to have clear view of their total weekly, monthly or yearly spending. Moreover, since the user interaction is mainly through command line interface (CLI), this application also brings convenience to users who prefers fast typing.

Contribution Summary

  • Role : Developer

  • Responsibility : Development, Integration and Testing

  • Major enhancements:

    • Add reminder

      • Functionality: With this enhancement, students are able to set reminders of future tasks such as bills and payment to be made by specifying deadline and notification message.

      • Justification: Students would need to be reminded of the important tasks because high number of deadlines usually causes students to have difficulties remembering all of them.

      • Highlights : On Graphical User Interface (GUI), the reminders with the earlier deadline are place on top of the list, therefore, users are able to notice the tasks with higher priority.

    • Delete reminder

      • Functionality: This allows user to remove unwanted reminders from application.

      • Justification: When a task is completed, reminders related to it becomes outdated. Accumulation of unnecessary reminders may lead to confusion and waste of storage space.

      • Highlights : Since each reminder is displayed with an index on GUI, user can easily delete a reminder using it without needing to specify any additional information.

    • Responsive reminder display

      • Functionality: This enhancement allow reminder list to adapt varying screen sizes with text wrapping, therefore, each reminder is displayed without overflow.

      • Justification: Students would need to enter high amount of information into the reminder message because they can easily fetch all the necessary information from one place as the deadlines becomes closer.

      • Highlights : The deadlines displayed by reminders are translated and colored in response to their urgency, therefore, user can easily notice them and quickly interpret them.

  • Minor enhancement:

    • View help

      • This feature allows user to view not only all available commands in MoneyGoWhere but also their purposes. This feature can also be quickly assessed through F1 key.

  • Code contribution: Functional and Test codes

  • Other contributions:

    • Project Management

      • Ensured that the team members are always aware of weekly deadlines and deliverables.

    • Documentation

      • Created use cases and updated them into Developer Guide. (Pull Requests: #40)

      • Updated the existing Developer Guide of Address book for MoneyGoWhere application. (Pull Requests: #95, #269)

    • Testing

      • Handled unit and integration testing of reminder feature. (Pull Requests: #83, #113, #139)

    • Debugging

      • Contributed in implementing solutions for flaws and bugs found in the application. (Pull Requests: #203, #219 , #251)

    • Community

      • Reviewed Pull Requests from teammates (with non-trivial review comments). (Pull Requests: #28, #82, #84, #96, #97, #112, #134, #136, #137, #138)

      • Performed manual testing, reported bugs, feature flaws and gave suggestions to teammates.

      • Performed manual testing, reported bugs, feature flaws and gave suggestions to other teams in the class.

Contributions to the User Guide

Below is a icon which highlights the important information in this document.

Represents important information to be noted.

Followings are the sections in the User Guide that I have contributed, which also demonstrates my documentation skills to target end-users effectively.

Adding a reminder: reminder add

Adds a reminder to the reminder list when you enters a new reminder. Key information such as deadline and message are recorded.

Format: reminder add d/DATE m/MESSAGE

  • Your reminders are sorted based on how close they are to their respective deadline.

  • The closer it is to the deadline, the higher position it takes in the reminder list.

Please ensure that the date of the deadline must be in the future before the end of next year. In other words, MoneyGoWhere will accept dates starting from today until the end of next year as deadlines.

Examples:

  • reminder add d/30/08/2020 m/Pay school fees

  • reminder add d/3 days from now m/Pay phone bill

Expected Output:

A new reminder is added according to the information provided.

Deleting a reminder: reminder delete

Deletes a reminder at the specified INDEX.

Format: reminder delete INDEX

  • Deletes the reminder at the specified INDEX.

  • The index refers to the index number shown in the displayed reminder list.

  • The index must be a positive integer 1, 2, 3, …​

Example:

  • reminder delete 2
    Deletes the second reminder in the list based on the current results shown.

Expected Output:

The specified reminder is deleted.

Clear all data : clear

You can clear all your saved data from this application using this command.
Format: clear

This command clears all stored reminders and spending from the application, and sets the budget to a default value of $1000.

Expected Output:

All data stored in MoneyGoWhere is cleared and the budget is set to $1000.

Contributions to the Developer Guide

The following sections in thee Developer Guide are contributed by me and they highlights my documentation skills in technical aspect.

Reminder feature

This feature allows users to set reminders for their tasks with a specified deadline and delete them when respective tasks are completed.

Implementation for Reminder

In this feature, a reminder is constructed with following two key information as attributes.

  • deadline (Deadline of a task)

  • reminderMessage (Message to inform user)

With the given deadline from users, the following two attributes are created further in the reminder constructor.

  • type (Type of reminder e.g. Overdue)

  • remainingDays (Remaining days before deadline)

The purpose of the above two attributes are for sorting reminders based on the number of days between current date and their deadline in ascending order. These two attributes are also utilized in formatting how a reminder should be displayed on the UI components.

The following class diagram illustrates the summary of the reminder class.

ReminderClassDiagram
Figure 1. Class diagram for reminder
As indicated in the above diagram, a reminder uses the Date class from spending package as deadline attribute, therefore, it is also supported with Natural Language Processing (NLP). Since the remainingDays attribute is of long data type, it is not included in the above diagram.

Implementation for Adding Reminder

First of all, for the user to add reminders into MoneyGoWhere, the following command is made available.

  • Adding a reminder reminder add d/DATE m/MESSAGE
    e.g. reminder add d/30/08/2020 m/Pay school fee - set reminder to pay school fee by 30th of August 2020

In this command, the parameter values lead by the prefixes are String values and parser will convert these values into acutual Date and ReminderMessage objects later on.

Below is the activity diagram describing the steps take by MoneyGoWhere when it receives AddReminderCommand.

AddReminderActivityDiagram
Figure 2. Activity diagram for adding a reminder
In the above diagram, it can be seen that a reminder input from user will only be recorded after it passes all the validation checks.

To illustrate how a reminder is added to the Model component when the user enters AddReminderCommand, the sequence diagram is shown below.

AddReminderSequenceDiagram
Figure 3. Sequence diagram when a new reminder is added to the model component.
The above sequence diagram only demonstrates how an AddReminderCommand is constructed from valid user input and how it is executed. It does not show how a reminder is added into the Storage component and how the UI components are updated.
  1. The user enters reminder add d/today m/Pay bill.

  2. SpendingBookParser#parseCommand() is called by LogicManager

  3. This creates ReminderCommandParser and it checks if the given user input is to add a reminder, to delete a reminder or invalid.

  4. Next, AddReminderCommandParser is created and it validates the parameters provided by ReminderCommandParser.

  5. After successful validation, AddReminderCommand is created and passed back to callers until it reaches to LogicManager.

  6. LogicManager then executes the command, adding the new reminder to the model through Model#addReminder().

Implementation for Removing Reminder

In order for users to delete unwanted reminders, the following command is implemented in MoneyGoWhere application.

  • Deleting a reminder reminder delete INDEX
    e.g. reminder delete 1 - delete the first reminder in the reminder list shown in UI.

Following is the activity diagram which indicates the series of actions performed by MoneyGoWhere when it receives DeleteReminderCommand.

DeleteReminderActivityDiagram
Figure 4. Activity diagram for removing a reminder
The negative index from user input will leads to invalid command format error as shown in the above diagram.

Moreover, the following sequence diagram summarizes the interactions between different components when the user enter DeleteReminderCommand.

DeleteReminderSequenceDiagram
Figure 5. Sequence diagram while user attempt to remove a reminder
  1. The user enters reminder delete 1

  2. SpendingBookParser#parseCommand() called by LogicManager.

  3. This creates ReminderCommandParser and it checks if the given user input is to add a reminder or to delete a reminder or is invalid.

  4. Next, DeleteReminderCommandParser is created and it validates the parameters provided by ReminderCommandParser.

  5. After successful validation, DeleteReminderCommand is created and passed back to callers until it reaches to Logic Manager.

  6. LogicManager then executes the command, removing the specified reminder from the model through Model#deleteReminder().

The above sequence diagram only shows how a DeleteReminderCommand is created and executed. It does not include how a reminder is removed from the storage component and how the UI component is updated.

Limitations

  1. The date value of the deadline attribute is limited to before the end of next year and must be in the future. This prevents users from entering reminder of overdue tasks as inputs.

  2. In this feature, the reminderMessage attribute cannot be constructed with empty spaces. The purpose of this limitation is to prevent users from entering a reminder without specifying a message to be displayed.

Design Considerations

Aspect Alternative 1 (Current choice) Alternative 2

How reminders are stored

Store reminders together with other information in moneygowhere.json.

Pros:
Allows re-use of existing codes for implementation.
Only has to manage a single file for storage of user’s data.

Cons:
Could lead to larger file size.
More data could be lost in cases of file corruption.

Store reminders in a new json file separated from other information.

Pros:
Smaller file size compared to alternative 1.
Lesser data loss in case of file corruption compare to alternative 1.

Cons:
Requires additional implementation for storing reminders.
Has to manage multiple files for storage of user’s data

Alternative 1 from the above table, is currently implemented in MoneyGoWhere since it is efficient for the application to access user’s data from a single storage file.

The following Architecture Diagram summarizes how different components in MoneyGoWhere application interact with each other while storing a reminder from the valid user input with the current implementation.

AddReminderArchitectureSequenceDiagram
Figure 6. Architecture Diagram
The above high-level Architecture Diagram only provides the summarized steps taken by different components while storing a reminder into MoneyGoWhere.json.