Overview
This project portfolio page serves to document my contributions to the VolunCHeer project.
VolunCHeer is an open-sourced Command Line Interface (CLI) management application designed for Volunteering Project Managers. We aim to help our target users alleviate the haystack of managing multiple projects, beneficiaries, and volunteers in an efficient and effective manner.
Team T08-1 consists of Zhao Jun Ru, Wong Kai Wen Jeremy, Liow Zhu Hui and myself.

The user interacts with VolunCHeer using a command-line interface, and has a GUI created with JavaFX. VolunCHeer is written in Java, and has about 10 kLoC.
VolunCHeer’s codebase draws from SE-EDU's AddressBook Level 4.
Role
I am the Lead Developer, who ensure the application is bug free, or report bugs and assign developers to fix them. I am also the adviser for implementation of commands and bug fixes.
Summary of contributions
-
Major enhancement: added Beneficiary management feature
-
What it does: Beneficiary Management feature allows the user to manage beneficiary, including:
-
add a beneficiary: to open a new record of a beneficiary.
-
edit a beneficiary: to edit an existing record of a beneficiary.
-
find a beneficiary by name: to help the user quickly navigate to the wanted beneficiary record.
-
list beneficiaries: to list all beneficiary records.
-
summarise beneficiaries' data: to enable the user to see most active beneficiary based on attached project list.
-
-
Justification: This feature improve the product significantly because:
-
The beneficiary management feature allows the dynamic of tracking beneficiary records for the user to revise, and reuse every time a project initiation process starts with a known beneficiary.
-
The feature efficiently saves time in terms of searching beneficiaries’s details and navigate through beneficiary records.
-
Moreover, it also allows the user to do consideration on which beneficiary to come for in terms of funding based on the activeness measurement of beneficiaries.
-
-
Highlights: This enhancement affects the existing commands such as Undo and Redo Command. It also requires the analysis of resources we have in term of time and performance of algorithm in the context of VolunCHeer. Moreover, it requires challengingly synchronization with related Projects and storage files. The summary table also requires adaptation of Ui components and learning of JavaFX.
-
Credits: The implementation of the order list is based on the code written for the person list in the Address Book Level 4 made by SE-EDU initiative.
-
-
Minor enhancement: updated Storage Management #55
-
What it does: Storage is ensured to capture any change the user makes in the application reflects them in the storage file. When the user reopens the application, these changes are correctly viewed or if the data is corrupted, such as duplicated data or two beneficiaries have the same attached project, the application will prompt the user.
-
Justification: The data storage is important because the main purpose of the application is to reserve these data. Hence, storage management is essential for the application to work properly and serve its purposes.
-
-
Minor enhancement: quality control of synchronization of assigning beneficiary to project #61 #125
-
Code contributed: My code contribution can be viewed here
-
Other contributions:
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. |
Beneficiary Management
Adding a beneficiary: addBeneficiary
/ ab
Similar to the previous adding command, this adds a beneficiary to the list of Beneficiaries
Format: addBeneficiary n/NAME a/ADDRESS e/EMAIL p/PHONE_NUMBER
Example:
-
addBeneficiary n/Orphanage p/98765432 e/Orphanage@example.com a/311, Clementi Ave 2, #02-25

In the figure above, after the add command, we can observe a new beneficiary card is shown on the GUI.
Editing a beneficiary: editBeneficiary
/ eb
In case of incorrect information, we also allow you to edit the beneficiary at the given INDEX
Format: editBeneficiary INDEX (must be a positive integer) [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS]
Examples:
-
editBeneficiary 1 n/Old Folk Home p/91234567

In the figure, we can see that the WHO information including phone number and email has changed, compared to the last figure.
When a beneficiary is edited, the data of the beneficiary in its attached projects is in sync, meaning that that data is automatically updated in the mentioned projects. |
Deleting a beneficiary: deleteBeneficiary
/ db
Of course, once a beneficiary is no longer associated with you, it can be removed by providing the INDEX.
Format: deleteBeneficiary i/INDEX -D
-D is optional and should not be misused (see below)
|
Examples:
-
deleteBeneficiary i/1
soft delete mode -
deleteBeneficiary i/1 -D
hard delete mode

In Figure 3, we are trying to soft delete a beneficiary which was assigned to project Run. Hence, a message appears and informs us to switch to hard delete mode.

In Figure 4, the beneficiary and its attached projects have been deleted successfully.
Listing all beneficiaries: listBeneficiary
/ lb
As before, you can show a list of all Beneficiaries in the beneficiary pool.
Format: listBeneficiary
The command can be used to get back to full list after several commands which change the list. |
Locating beneficiaries by name: findBeneficiary
/ fb
TO facilitate searching for beneficiary, you can locate a specific one easily with via given keyword/keywords.
Format: findBeneficiary KEYWORD [MORE_KEYWORDS]
Examples:
-
find Nursing
ReturnsNursing Home
andNursing Center
Summarising all beneficiaries: summariseBeneficiary
/ sb
Sometimes we have a beneficiary assigned to many projects and we just want to see a list of everything it is attached to. This command opens a pop up summary table of the beneficiaries for easy view. You can use even the arrow in header cells number of Projects to sort beneficiaries by the number of attached projects.
Format: summariseBeneficiary

The command can be used to consider future partners or fundraising. |
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. |
Beneficiary Management Feature
Implementation
Beneficiary is implement in order to manage the information a benefited volunteer organization. These organizations interact
with the user’s organization through projects. Hence, Beneficiary
class has a bidirectional navigability with Project
class,
as shown in the Figure 10.

Beneficiary
class including its attributes, and its bidirectional navigability with Project
class.This means that if an operation such as deletion is done on a beneficiary, this should be updated on the projects that the beneficiary is assigned to. The figure below shows how the delete beneficiary command works:

"-D" indicates that the deletion is in the hard mode, meaning that the respective projects that are attached to this beneficiary will be deleted. |
-
The
DeleteBeneficiaryParser
parses the index of the beneficiary that is required to delete. The Parser constructs aDeleteBeneficiaryCommand
with constructor as shown below:
public DeleteBeneficiaryCommand(Index targetIndex, boolean isHardDeleteMode) {
this.targetIndex = targetIndex;
this.isHardDeleteMode = isHardDeleteMode;
}
-
Method deleteAttachedProjects(model, beneficiaryToDelete) then calls the
ModelManager
to update the deletion of the respective projects.
private void deleteAttachedProjects(Model model, Beneficiary beneficiaryToDelete) {
HashSet<ProjectTitle> attachedProjects = beneficiaryToDelete.getHashAttachedProjectLists();
List<Project> projectsToDelete = new ArrayList<>(model.getFilteredProjectList());
for (Project p : projectsToDelete) {
if (attachedProjects.contains(p.getProjectTitle())) {
model.deleteProject(p);
}
}
}
-
The
ModelManager
is then called to update the deletion of the beneficiary and update all the changes.
model.deleteBeneficiary(beneficiaryToDelete);
model.commitAddressBook();
In order to view the synchronization, you can observe via project pool. This is to alleviate the worries of looking at attached projects
when dealing with beneficiary, as a beneficiary can have multiple projects.
However, the Beneficiary Management Feature support the viewing of these information via Summarise Command. The Summarise Command generates
the summarised statistics information of beneficiary based on their activeness.
The activeness of a beneficiary is measured by the number of projects that beneficiary has collaborated with the user’s organization |
The sequence diagram below shows how the Summarise Command works.

-
SummaryBeneficiaryCommand
calls theModel
to get the beneficiary list. -
A summary list is generated and passed to
Logic
. -
The Ui component which is
MainWindow
does handling of summarised list by generate a summary table and show on the screen.
Design Considerations
Aspect | Alternatives | Pros (+)/ Cons(-) |
---|---|---|
Implementation of Synchronization |
Update the by linear search for designed object |
+ : It is easier to implement because the code base are list based. Moreover, the use of the application is limited to only local
use without a large amount of data. Hence, this method gives a good performance in the context. |
Hash Table of the data |
+ : It has a better time complexity and reduce the work in scaling stage since this data structure is more optimized (O(1) can be achieved). |
|
Display and use of attached project list |
The beneficiary card shows the list |
+ : The synchronization can be observed throughout the execution of commands. |
Generation of summary table |
+ : The summary gives a good way to look at the statistics of the beneficiary list. As it allows the dynamic of sorting in ascending or descending order
of the list based on the beneficiary’s activeness |