Pocket Project: About the Application

Pocket Project was built by my team and I in our second year in NUS while pursuing a Computer Science degree. We were inspired to create this application as we sought ways to improve efficiency in project management. This application was created with the intention of supporting software engineering project managers throughout the lifetime of a project, from the planning phase until it is delivered to the client.

Pocket Project’s core functionality includes adding user stories to a project which is essential for planning, assigning projects to employees based on their individual skill sets and monitoring the progress of a project through milestones and tasks.

Before We Begin

The following section details and previews a few symbols and formats that will be used in this portfolio.

Symbol Meaning

ug notepadpencil

The note pad icon indicates any useful tips or things that you need to take note of while using the Pocket Project application.

ug lightbulb

The light bulb icon indicates any shortcuts that you can use while using the Pocket Project application.

ug exclamation

The exclamation mark icon indicates any warnings that you can take note of while using the Pocket Project application.

code

Words highlighted, known as markups, are used to indicate code segments or commands in the application.

Summary Of My Contributions

In this section, I detail some of my key contributions towards this application in terms of both features and documentation.

Major Contribution: Smart Dates

  • What it does: This allows the user flexibility in keying in dates when required and supports 2 main sub-formats.

    • Firstly, it supports a fixed date format where users can key in a date according to DD/MM/YYYY.

    • Secondly, it also accepts flexible input from the user. If the user wants a date relative to the current day, he/she can simply type today/tomorrow/yesterday. Otherwise if the user wants a date relative to current week, he/she can input this/next/last week DAY_OF_WEEK. Lastly if the user wants a date relative to the current month, he/she can simply go for this/next/last month DAY_OF_MONTH.

    • The validity of the target date is also verified.

  • Why it is useful and important: In this application, dates are used extensively in other features. So, smart dates provides the user with a quick and user-friendly way to execute certain commands. Some of these commands include:

    • Setting of dates when creating and completing projects and milestones.

    • Editing of the all components with dates inside a particular project.

    • Finding projects that are due by a certain DEADLINE.

  • Highlights: The flexible date input is parsed by a separate PocketProjectDateParser. Also, the user does not need to indicate his/her intended format as the feature is designed to differentiate based on the input received.

  • The code that I contributed: Functional Code & Tests Part 1 Functional Code & Tests Part 2

Minor Contributions:

  • Enabled adding projects to the application. #49 #116 #198 #208

  • Enabled adding employees and milestones to projects. #88 #95 #109 #120

  • Designed the Pocket Project application logo.

PPLogo
Figure 1. Pocket Project Logo

Overall Code Contributions: RepoSense

Other Contributions:

  • Project Management

    • Helped track issues on the team repository using labels and assignees.

    • Compiled and formatted the entire User Guide after individual contributions by team members: #242

  • Other Enhancements/Fixes to Existing Features

    • Abstracted out common code in classes in the Model to reduce code duplication: #221

    • Fixed Various Bugs: #172 #232 #245

  • Documentation

    • Enhanced documentation of existing and new features such as help, add employee among others: #229

    • Created a set of symbols/legends for User Guide and Developer Guide #84

    • Documented all user stories used in planning in the Developer Guide #149

  • Community

    • Reviewed pull requests with valid non-trivial feedback: #118 #126 #141 #214 #230

    • Reported bugs and offered suggestions to another team, CS2103-AY1819S2-T12-4, in the module: #247

    • The Smart Date feature that I implemented was adopted by my some of my fellow teammates for use in their own individual features: #165 #209

  • Tools

    • Integrated a new GitHub plugin, Codacy, to the GitHub team repository: #154

Contributions to the User Guide

In this section, I detail some of the key contributions I made to the User Guide targeted at helping users understand how to use the application.

Date Feature in Pocket Project

Whenever a particular command requires a date field, you can choose to use either of the below mentioned formats.

Fixed Date Format

You can input a date using the fixed date format.
Format: DD/MM/YYYY

Examples:
1. 23/12/2019
2. 09/03/2020

ug lightbulb

The year field will not accept values beyond the year 2099 and acts as a loose safety feature for accidental errors while inputting the year.

Flexible Date Format

Alternatively, you can also input a date using the flexible date format. The flexible date format allows you to give an input with relation to the current date. It supports the below mentioned 3 formats.

Choosing a date relative to the current day
You can key in today,tomorrow and yesterday to get today’s, tomorrow’s and yesterday’s date respectively.

Format: today/tomorrow/yesterday

Choosing a date relative to the current week You can also aim to choose a date with relation to the current week.
Format: this/next/last week DAY_OF_WEEK

ug notepadpencil

The DAY_OF_WEEK takes an integer in the range of 1 to 7 which corresponds to Monday to Sunday respectively.

Examples:
1. next week 7
This would select next week’s Sunday as the target date.
2. last week 2
This would select last week’s Tuesday as the target date.

You can refer to the screenshots of the program below for a clearer picture. Assume that the current date is 12 April 2019 (12/04/2019), Friday. It will be demonstrated using the add project command which requires a s/START_DATE and a d/DEADLINE.

][width="500"
Figure 2. Using "this/next/last week DAY_OF_WEEK" as a flexible date input

Choosing a date relative to the current month

You can also aim to choose a date with relation to the current week.
Format: this/next/last month DAY_OF_MONTH

ug exclamation

The DAY_OF_MONTH takes the value of positive integer but it cannot exceed the maximum number of days of a particular month in the chosen year.

Examples:
1. this month 24
This would select the current month’s 24th day as the target date.
2. next month 17
This would select next month’s 17th day as the target date. ==== Add a project to the application: add project

You can add a project to the Pocket Project when the team takes on a new project so that key details of the project are stored and employees, milestones, tasks and user stories can be assigned to them in the future.

The project has a default description when created and this can be edited using the edit project info command.

Format: add project n/NAME c/CLIENT_NAME s/START_DATE d/DEADLINE

ug exclamation

The deadline of the project should minimally be 1 day after the start of a project.

Examples:
1. add project n/Apollo s/10/03/2019 d/12/12/2019 c/FairPrice
2. add project n/Xtreme c/John Smith s/09/02/2020 d/13/04/2020

You can refer to the screenshot below to have a clearer picture of how it works and looks like.

][width="500"
Figure 3. Adding a project to the application and what we can do with it

ug lightbulb

You can also view the list of all employees currently working on the project, a list of milestones and tasks, and a list of user stories by toggling the arrows on the details panel.

These sections are not exhaustive of my contributions and the rest can be viewed at Pocket Project: User Guide

Contributions to the Developer Guide

In this section, I detail some of the key contributions I made to the Developer Guide targeted at helping fellow developers understand the implementation and design considerations that went behind the building of the application.

Pocket Project Dates (Smart Dates)

Overview

As dates are widely used throughout the application, it is important that the user is able to easily input any target date but at the same time retain some flexibility so that it is more user-friendly. Therefore, the dates used in the Pocket Project supports 2 main formats as shown below.

Fixed Date Format Format(s):
1. DD/MM/YYYY

Flexible Date Format Format(s):
1.today/tomorrow/yesterday
2.this/next/last week DAY_OF_WEEK
3.this/next/last month DAY_OF_MONTH

How it Works

The section details how a fixed and flexible date format is parsed and processed.

dg activitydiagdate
Figure 4. Activity Diagram: Showing how a fixed and flexible date format is parsed and processed.

Refer to the Activity Diagram above while reading the summary below so as to have a visual representation of what happens.

To simplify the explanation, the process can be summarized into the following key points:
1. A check is first made to determine if the input is a fixed or flexible date format. This is done by checking for the presence of a / in the input.
2. If it is a fixed format input, a check is made to determine if it conforms to the DD/MM/YYYY format.
3. If it is a flexible format input, the input is parsed and the PocketProjectParser identifies keywords to determine the appropriate methods to call from the model. The target date is then formatted into the DD/MM/YYYY format.
4. Regardless of the initial format of the input, the current string would represent the form of DD/MM/YYYY at this stage. The validity of the date is then checked.

Refer to the code snippet below to see how the validity of the date is verified.

dg codesnippet
Figure 5. Code snippet showing verification of a validity of a date.

As can be seen above, the code not only checks if the selected day falls within the maximum number of days in a month, but it also checks for leap years. This ensures that only valid calendar dates are accepted as a viable input.

Design Considerations

Potential Design 1
User keys in Wednesday, next Wednesday, last Wednesday to denote the current, next and last week’s Wednesday respectively

Potential Design 2 (Selected Implementation)
User keys in this week 3, next week 3, last week 3 to denote the current, next and last week’s Wednesday respectively

The second design was chosen as the first one is subjective to an individual’s language use. For example, if today was Monday, and a person was to mention next Wednesday, some people may be thinking of the Wednesday in 2 days time whereas others may be thinking of next week’s Wednesday. Thus to remove confusion, the keyword this/next/last was added. In addition, instead of spelling out the days, users can key in the day number instead. This speeds things up and also reduces errors due to spelling mistakes in the name of the day.

Adding Employees and Milestones to a Project

Overview

This feature focuses on the adding of employees and milestones to a selected project. It supports two commands which are explained below.

  1. addto PROJECT_NAME employee EMPLOYEE_INDEX
    Adds the employee at index EMPLOYEE_INDEX to the list of employees in the project named PROJECT_NAME.

  2. addto PROJECT_NAME milestone m/MILESTONE_DESCRIPTION d/MILESTONE_DATE
    Adds the specified milestone to the list of milestones in project named PROJECT_NAME.

In addition, the AddToEmployeeCommand class and AddToMilestoneCommand class is abstracted into a AddToCommand class which inherits from Command class. This allows for further functionalities to be added while conforming to the Open-Closed Principle.

Refer to the Class Diagram below for a better visualization of the inheritance relationship.

dg addtoclassdiagram
Figure 6. Class Diagram: Showing inheritance relationship between the commands.

How it Works

The section details how a AddToCommand is parsed and processed.

dg addemployeeto
Figure 7. Sequence Diagram: How the Add Employee To Command Works

Refer to the sequence diagram above to better understand how the AddEmployeeTo Command works. The diagram shows the sequence when a addto Apollo employee 1 is executed.

To simplify the explanation, the process can be summarized into the following key points:
1. The PocketProjectParser parses the string received and uses the addto keyword to identify that the input is linked with the AddToCommand class.
2. The AddToCommandParser then identifies the type of AddToCommand that is being executed and the arguments involved.
3. The AddToCommandParser then creates the AddEmployeeToCommand/AddMilestoneToCommand object and this is passed on to the LogicManager for execution.
4. The command execution will check the validity of the arguments and then call the methods of the Model component to add the corresponding employee/milestone to the project.

ug lightbulb

The main difference between the 2 commands is deciding the object to be added (Employee or Milestone) from model based on the user input.

Design Considerations

Potential Design 1
The idea is to have only 1 parser ,PocketProjectParser, which receives and parses the whole input string before constructing the relevant command.

Potential Design 2 (Selected Implementation)
The idea is to have a total of 2 parsers where the first parser, PocketProjectParser identifies the addto key word and the rest of the input string is then parsed by the corresponding second parser, AddToCommandParser.

The 2nd design was chosen as there is better abstraction of the details and it also allows further functionality to be add on top of the implemented parser. If future developers want to add more objects to the project, they can simply make use of this AddToCommandParser to handle different inputs. Choosing this design was a good choice as it helped with the implementation of adding user stories and project tasks to a project after this was initially constructed.

These sections are not exhaustive of my contributions and the rest can be viewed at Pocket Project: Developer Guide