PROJECT: Clubhub


Overview

Clubhub is a desktop application for managing members, inventory, finances and events in a club. The main targets for this application are student clubs and groups in University and it includes features (i.e. majors) that are more relatable to University setting. Using Clubhub, users can create, edit and delete club information through the command-line interface (CLI). Graphical user interface (GUI) is also available to display these informations neatly and clearly. The development of Clubhub was team-based and the task was divided among the 4 team members. Each member developed one of the components of the application individually while code integration and documentations were done together as a team. Java programming language was used for the development. For the integrated development environment (IDE) and version control software (VCS), IntelliJ and Github were used respectively.

Summary of contributions

  • Major enhancement: reformatted and refactored existing Person code base in the AB4 as Member to fit the context of the Clubhub and added new additional attributes to each member object.

    • The following attributes were added to Clubhub:

      • Major

      • Postal code

    • What it does: It allows the user to add information about each member’s major and postal code in the Clubhub.

    • Justification: These additional attributes allow the user to store more information about the club member such as major and postalcode. Ability to store each member’s major is relevant in a University club context as each club member is a student studying a particular major in the university. Furthermore, storing of each member’s home postal code as a separate attribute from home address will allow easier mailing procedure.

    • Highlights: This enhancement required modification in the add and edit function of the club member as they had to be adjusted to taken in the two new arguments. New models also had to be created for these new member attributes.

  • Major enhancement: created new Find features that allows the user to search for club members by major, phone number and postal code.

    • The following commands were added to Clubhub:

      • findmajor

      • findphone

      • findpostalcode

    • What it does: These additions enable the user to find the club members by their majors, phone numbers and postal codes. After filtration, the graphical user interface will display the members that have the searched information.

    • Justification: There are many situations when managing a University club whereby a quick advanced search is needed to look for member with a particular attribute. With the help of the new find features, the user can now search the club members not only by their names but also their majors, phone numbers and postal codes.

    • Highlights: This enhancement required creation of MajorContainsKeywordsPredicate, PhoneContainsKeywordsPredicate and PostalcodeContainsKeywordsPredicate models together with the corresponding sets of parsers and commands.

  • Minor enhancement: changed the duplicate check feature to fit the University context of the Clubhub better.

    • Originally, it is recognized as unique only if the new name is added or same name with different phone number and email address is added.

    • Now, it is recognized as unique only if the new name is added or same name with different phone number and major is added

  • Code contributed: [RepoSense]

  • Other contributions:

    • Project management:

      • Managed releases v1.2 - v1.4 (3 releases) on GitHub

    • Enhancements to existing features:

      • Wrote additional tests for the newly added attributes of the member object (Pull requests: #36, #47)

    • Version 2.0 Feature

      • Thought of a potential integration feature [Records] for version 2.0 and updated the User guide accordingly

    • Reported bugs and suggestions for other teams in the class (Issues: #162, #164, #170, #173, #179)

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.

Members

Adding a member: addmember

Adds a person to the ClubHub
Format: addmember n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS c/POSTALCODE m/MAJOR [t/TAG]…​

A person can have any number of tags (including 0)

Examples:

  • addmember n/John Doe p/98765432 e/johnd@example.com a/311, Clementi Ave 2, #02-25 c/609653 m/Computer engineering t/friends t/owesMoney

Editing a member : editmember

Edits an existing person in the ClubHub.
Format: editmember INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [c/POSTALCODE] [m/MAJOR] [t/TAG]…​

  • Edits the person at the specified INDEX. The index refers to the index number shown in the displayed person list. The index must be a positive integer 1, 2, 3, …​

  • At least one of the optional fields must be provided.

  • Existing values will be updated to the input values.

  • When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.

  • You can remove all the person’s tags by typing t/ without specifying any tags after it.

Examples:

  • editmember 1 p/91234567 e/johndoe@example.com
    Edits the phone number and email address of the 1st person to be 91234567 and johndoe@example.com respectively.

  • editmember 2 n/Betsy Crower t/
    Edits the name of the 2nd person to be Betsy Crower and clears all existing tags.

Locating members by name: find

Finds persons whose names contain any of the given keywords.
Format: find KEYWORD [MORE_KEYWORDS]

  • The search is case insensitive. e.g hans will match Hans

  • The order of the keywords does not matter. e.g. Hans Bo will match Bo Hans

  • Only the name is searched.

  • Only full words will be matched e.g. Han will not match Hans

  • Persons matching at least one keyword will be returned (i.e. OR search). e.g. Hans Bo will return Hans Gruber, Bo Yang

Examples:

  • find John
    Returns john and John Doe

  • find Betsy Tim John
    Returns any person having names Betsy, Tim, or John

Locating members by major: findmajor

Finds persons whose names contain any of the given keywords.
Format: findmajor KEYWORD [MORE_KEYWORDS]

  • The search is case insensitive. e.g computer will match Computer

  • The order of the keywords does not matter. e.g. Engineering computer will match Computer engineering

  • Only the name is searched.

  • Majors matching at least one keyword will be returned e.g ` Computer Engineering` will be listed when Engineering is searched

  • Only full words will be matched e.g. Compute will not match Computer

Examples:

  • findmajor Computer Engineering
    Returns member whose major is Computer Engineering

  • findmajor Engineering
    Returns members whose major contains the keyword Engineering

Locating members by phone number: findphone

Finds persons whose names contain any of the given keywords.
Format: findphone KEYWORD [MORE_KEYWORDS]

  • The order of the keywords does not matter.

  • Only the phone number is searched.

  • Only full numbers will be matched e.g. 9723 will not match 97233234

Examples:

  • findphone 97233234
    Returns member whose phone number is 97233234

  • findphone 97233234 84280511
    Returns members whose phone numbers are`97233234 or 84280511'

Locating members by postalcode: findpostalcode

Finds persons whose names contain any of the given keywords.
Format: findpostalcode KEYWORD [MORE_KEYWORDS]

  • The order of the keywords does not matter.

  • Only the postalcode is searched.

  • Only full numbers will be matched e.g. 609 will not match 609653

Examples:

  • findpostalcode 609653
    Returns member whose postalcode is 609653

  • findpostalcode 609653 555555
    Returns members whose postalcodes are 609653 or 555555

Deleting a member : delete

Deletes the specified person from ClubHub.
Format: delete INDEX

  • Deletes the person at the specified INDEX.

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

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

Examples:

  • list
    delete 2
    Deletes the 2nd person in ClubHub.

  • find Betsy
    delete 1
    Deletes the 1st person in the results of the find command.

Record feature [coming in v2.0]

Record feature allows the user to update many new club information all at once.

For Example:

`Bernice` pays `$100` membership fee, attends `Basketball training on 01/11` and borrows `1 chair`.

In order to record this information on Clubhub, the user just has to enter the following command:

AddRecord M/Bernice d/10/10 b/100 D/01/11 n/chair q/-1

This command will do the following:

  • Look for the name Bernice to see whether it already exists in Clubhub (It will inform the user that the input is invalid if the name does not already exist in Clubhub)

  • Add a ledger in Club Account panel and update the balance accordingly

  • Add a basketball event on 01/11 in Club Calendar

  • Take away 1 chair from the inventory from Club Inventory

Furthermore, there will a panel at the bottom of Clubhub to show history of all the Records added

AddRecordUI
Figure 1. Sample New UI

Command Summary

  • Help : help

  • Select : select INDEX
    e.g.select 2

  • History : history

  • Undo : undo

  • Redo : redo

  • UndoAll : undoAll

  • RedoAll : redoAll

  • List : list

  • Addmember : addmember n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS c/POSTALCODE m/MAJOR [t/TAG]…​

  • Editmember : editmember INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [c/POSTALCODE] [m/MAJOR] [t/TAG]…​

  • Findbyname : find KEYWORD [MORE_KEYWORDS]

  • Findbymajor : findmajor KEYWORD [MORE_KEYWORDS]

  • Findbyphonenumber : findphone KEYWORD [MORE_KEYWORDS]

  • Findbypostalcode : findpostalcode KEYWORD [MORE_KEYWORDS]

  • Deletemember : delete INDEX

  • AddLedger: addLedger d/[DD/MM]

  • DeleteLedger : deleteLedger d/[DD/MM]

  • Credit: credit d/[DD/MM] b/[NUM]

  • Debit: debit d/[DD/MM] b/[NUM]

  • AddEvent : addEvent n/EVENT_NAME v/VENUE d/DESCRIPTION D/EVENT_DATE

  • EditEvent : editEvent EVENT_NAME to EVENT_NAME EVENT_DATE EVENT_LOCATION EVENT_DESCRIPTION

  • DeleteEvent : deleteEvent n/EVENT_NAME

  • AddItem : addItem n/ITEM_NAME q/ITEM_QUANTITY l/ITEM_LOCATION

  • DeleteItem : deleteItem INDEX

  • EditItem : editItem INDEX [n/ITEM_NAME] [q/ITEM_QUANTITY] [l/ITEM_LOCATION]

  • IncreaseItem : increaseItem INDEX q/ITEM_QUANTITY

  • DecreaseItem : decreaseItem INDEX q/ITEM_QUANTITY

  • FindItem : findItem KEYWORD [MORE_KEYWORDS]

  • ListItem : listItems

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.

Member

  • As of V1.4, the commands related to the member component that are fully functional are: addmember, editmember, find, findmajor, findphone, findpostalcode and delete.

Add/Remove/Edit member feature

The add/remove mechanism is facilitated by VersionedAddressBook. It extends AddressBook model with an Addmember, Editmember and Delete method.

  • AddressBook#addPerson() — Adds a member object to the UniquePersonList.

  • AddressBook#removePerson() — Removes a member object from the UniquePersonList.

These operations are exposed in the Model interface as Model#addPerson and Model#deletePerson respectively.

Below is a scenario of how a user adds a member into Clubhub.

Step 1. The user inputs the command addmember n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS c/POSTALCODE m/MAJOR [t/TAG] into the command box.

Step 2. The commandBox ui will then create a Logic object which parses the command to ascertain that it is an addmember command.

Step 3. The AddressBookParser will then parse the command to create a new addmemberParser object.

Step 4. This AddCommandParser will parse the arguments of the command line and create a new AddPerson object.

Step 5. This will then be put into the model, into the versioned address book.

The Member class creates an object that instantiates name, phone, email, postalcode, major, email and tag objects. These multiple member objects created will be stored in a UniquePersonList, where the uniqueness of every member depends on their names, phone number and email address. It will detect the entry as unique if it has different name or different phone number or email address.

This uniqueness check is obtained through the use of the object getName(), getPhone() and getEmail() method in Person

Remove and edit member uses the similar concept and procedure but starts with looking for the Member in the UniquePersonList instead.

Find by name, major, phone and postalcode feature

Similarly to the add/remove/edit member features, is facilitated by VersionedAddressBook. It then extends AddressBook model to find, findmajor, findphone and finddpostalcode methods.

These operations are exposed in the Model interface as Model#updatePerson.

Below is a scenario of how a user finds a member into Clubhub.

Step 1. The user inputs the command find [Valid Parameter] into the command box.

Step 2. The commandBox ui will then create a Logic object which parses the command to ascertain that it is an findmember command

Step 3. The AddressBookParser will then parse the command to create a new findmemberParser object.

Step 4. This findmemberParser will parse the arguments of the command line.

Step 5. By making use of the PersonContainsKeywordsPredicate, the members that has matching details would be found.

Step 5. This will then be put into the model, into the versioned address book.