Developer Guide
Table of Contents
- About HMHero
- How to use this Developer Guide
- Acknowledgements
- Setting up, getting started
- Design
- Implementation
- Documentation, Logging, testing, configuration, dev-ops
- Appendix: Requirements
- Appendix: Instructions for manual testing
- Effort
- Planned Enhancements
About HMHero
HMHero is an Applicant Managing System designed to be used by human resource professionals, hiring managers, and recruiters who want to streamline the recruitment process and make it more efficient, helping their organizations manage job applications and hiring processes more effectively.
This Developer Guide is a detailed documentation on HMHero’s design and implementation, describing the architecture, an outline of all parts of HMHero and how they work together, and specifications on feature implementation and considerations.
This guide is intended to assist developers in maintaining, upgrading or evolving HMHero.
How to use this Developer Guide
Person in place of Applicant
In this Developer Guide, Person is used in place of Applicant. Take note that when mentioning Person, we are
always talking about an Applicant in HMHero.
Icons and Hyperlinks
You may come across colored boxes containing text that will aid you in better understanding how to use each feature.
Highlight and display information you should pay attention to.
Highlight tips which you might find useful.
Highlight dangers and things to look out for.
Other than the icons mentioned above, you maye also come across Phrases coloured in blue are hyperlinks that will bring you to another part of this documentation that is relevant to the phrase.
Acknowledgements
HMHero is a brownfield software engineering project based off AddressBook Level-3, taken under the CS2103T Software Engineering held by School of Computing at National University of Singapore.
Java dependencies:
Documentation dependencies:
Setting up, getting started
Refer to the guide Setting up and getting started.
Design
.puml files used to create diagrams in this document can be found in the diagrams folder. Refer to the PlantUML Tutorial at se-edu/guides to learn how to create and edit diagrams.
Architecture

The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
Main components of the architecture
Main has two classes called Main and MainApp. It is responsible for,
- At app launch: Initializes the components in the correct sequence, and connects them up with each other.
- At shut down: Shuts down the components and invokes cleanup methods where necessary.
Commons represents a collection of classes used by multiple other components.
The rest of the App consists of four components.
-
UI: Manage the HMHero application User Interface -
Logic: Manage the execution of commands. -
Model: Holds the data of the App in memory. -
Storage: Reads data from and writes data to the hard disk.
How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete n/Alex p/91234567.

delete n/Alex p/91234567
Each of the four main components (also shown in the diagram above),
-
defines its API in an
interfacewith the same name as the Component. -
implements its functionality using a concrete
{Component Name}Managerclass (which follows the corresponding APIinterfacementioned in the previous point.)
For example, the Logic component defines its API in the Logic.java interface and implements its functionality using the LogicManager.java class which follows the Logic interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component’s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.

The sections below give more details of each component.
UI component
The API of this component is specified in Ui.java

The UI consists of a MainWindow that is made up of parts e.g.CommandBox, ResultDisplay, PersonListPanel, StatusBarFooter etc. All these, including the MainWindow, inherit from the abstract UiPart class which captures the commonalities between classes that represent parts of the visible GUI.
The UI component uses the JavaFx UI framework.
Steps to start making changes to the UI:
- The layout of these UI parts are defined in matching
.fxmlfiles that are in thesrc/main/resources/viewfolder. - The managing classes of these UI parts are defined in matching
.javafiles in thesrc/main/java/seedu/address/uifolder. - The stylesheets for these UI parts can be found in
Extensions.css,HMHero.css, andMainwindow.css, exceptUserProfilePanelandHelpWindowwith separate CSS files in matching.cssfiles in thesrc/main/resources/viewfolder. - For instance, the layout of the
HelpWindowis specified inHelpWindow.fxmlwith managing class atHelpWindow.javaand CSS file atHelpWindow.css.
The UI component,
- executes user commands using the
Logiccomponent. - listens for changes to
Modeldata so that the UI can be updated with the modified data. - keeps a reference to the
Logiccomponent, because theUIrelies on theLogicto execute commands. - depends on some classes in the
Modelcomponent, as it displaysPersonobject residing in theModel.
Logic component
API : Logic.java
Here’s a (partial) class diagram of the Logic component:

How the Logic component works:
- When
Logicis called upon to execute a command, it uses theHMHeroParserclass to parse the user command. - This results in a
Commandobject (more precisely, an object of one of its subclasses e.g.,AddCommand) which is executed by theLogicManager. - The command can communicate with the
Modelwhen it is executed (e.g. to add a person). - The result of the command execution is encapsulated as a
CommandResultobject which is returned back fromLogic.
The Sequence Diagram below illustrates the interactions within the Logic component for the execute("delete n/John p/91234567") API call.

delete n/Alex p/91234567
DeleteCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
Here are the other classes in Logic (omitted from the class diagram above) that are used for parsing a user command:

How the parsing works:
- When called upon to parse a user command, the
HMHeroclass creates anXYZCommandParser(XYZis a placeholder for the specific command name e.g.,AddCommandParser) which uses the other classes shown above to parse the user command and create aXYZCommandobject (e.g.,AddCommand) which theHMHeroParserreturns back as aCommandobject. - All
XYZCommandParserclasses (e.g.,AddCommandParser,DeleteCommandParser, …) inherit from theParserinterface so that they can be treated similarly where possible e.g, during testing.
Model component
API : Model.java

The Model component,
- stores the address book data i.e., all
Personobjects (which are contained in aUniquePersonListobject). - stores the currently ‘selected’
Personobjects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiableObservableList<Person>that can be ‘observed’ e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. - stores a
UserPrefobject that represents the user’s preferences. This is exposed to the outside as aReadOnlyUserPrefobjects. - does not depend on any of the other three components (as the
Modelrepresents data entities of the domain, they should make sense on their own without depending on other components)
Note list in the HMHero, which Person references. This allows HMHero to only require one Note object per unique note, instead of each Person needing their own Note objects.
Storage component
API : Storage.java

The Storage component,
- can save both address book data and user preference data in json format, and read them back into corresponding objects.
- inherits from both
HMHeroStorageandUserPrefStorage, which means it can be treated as either one (if only the functionality of only one is needed). - depends on some classes in the
Modelcomponent (because theStoragecomponent’s job is to save/retrieve objects that belong to theModel)
Common classes
Classes used by multiple components are in the seedu.addressbook.commons package.
Implementation
This section describes some noteworthy details on how certain features are implemented.
Adding an Applicant
Overview
The add command creates a new Person, which represents an Applicant in HMHero’s Applicant Managing System.
add n/NAME p/PHONE e/EMAIL a/ADDRESS [applied/APPLIEDDATETIME] [note/NOTE]... Refer to Glossary for more information on Command format.
Here is the activity diagram showing the process of the add command:

Feature Details
- The user specifies Applicants details to create. Compulsory fields are name, phone, address, and email. Optional fields include application date time and notes about the applicant.
- If any of the compulsory fields are not provided, or the provided inputs are in the wrong format, an error message will be displayed. The user will be prompted to enter the command correctly via the error message.
- All applicants added will start at the Applied Status.
- If application date time was not provided, HMHero would assume the application date time of the Applicant to be now (the current date and time on the user’s computer)
- The applicant is cross-referenced in the
Modelto check if it already exists. If it does, an error is raised to inform the user. - If step 5 completes without any exceptions, the new
Personis created and stored inside HMHero.
Feature Considerations
When checking for duplicates in the UniquePersonList inside Model, any Person cannot have the same name and phone
as another. HMHero checks for both the name and phone number when checking for duplicates to prevent the situation of
applicants having the same name.
When implementing this feature, we restricted users to only add applicants into the APPLIED status. This is because
we wanted HMHero to adhere to the flow of the hiring process. Allowing users to add applicants into specific statuses
could introduce confusion to how add command is used.
Advancing an Applicant
Overview
The advance command advances an Person in HMHero, which advances the Status of a Person.
advance n/NAME p/PHONE [d/INTERVIEWDATETIME] Refer to Glossary for more information on Command format and applicant status.
Here is the activity diagram showing the process of the advance command:

Feature Details
- The user specifies an applicant name and phone that represents a
Personto be advanced. - If the name and phone is not provided, an error is thrown and the user is prompted to enter the command correctly via an error message.
- The name and phone are cross-referenced in the
Modelto check if an applicant with the corresponding name and phone exists. If it does not, then an error is raised to inform the user. - The status must be either Applied or Shortlisted. Else, then an error is raised to inform the user.
- If the interview datetime is not provided when the status is Applied, the user will be prompted to enter the command correctly via an error message.
- If the interview datetime provided exists in the
Model, the user will be prompted to enter the command correctly via an error message. - If the interview datetime is provided when the status is Shortlisted, the user will be prompted to enter the command correctly via an error message.
- If step 7 is reached without any error message, HMHero advances the specified
Person’sStatus.
Feature Considerations
When implementing this feature, we realised that we could model HMHero to track hiring process in the real world more effectively by enforcing the rule that the user can only advance applicants one stage at a time. We thus decided to provide a default behaviour when advancing an applicant’s status.
Rejecting an Applicant
Overview
The reject command rejects a Person in HMHero, which changes the status of a Person to REJECTED.
Here is the activity diagram showing the process of the reject command:

Feature Details
- The user specifies an applicant name and phone that represents an
Personto be rejected. - If the name and phone is not provided, an error is thrown and the user is prompted to enter the command correctly via an error message.
- The name and phone are cross-referenced in the
Modelto check if an applicant with the corresponding name and phone exists. If it does not, then an error is raised to inform the user. - HMHero confirms that the applicant’s status is not already
REJECTED. Else, an error is raised to inform the user. - If step 4 completes without any exceptions, then the
Personis successfully rejected.
Feature Considerations
While it may be feasible to implement the reject command to successfully execute on
applicants with REJECTED status, we felt that throwing an error message would provide more value for the user to
inform them that the applicant has already been rejected.
Additionally, we realised that it is common for hiring managers to reject applicants without removing them. Thus, the
reject command does not perform the same functionality as the delete command.
We also allowed the rejecting of applicants with the ACCEPTED status for the rare case where users might want to
reject an accepted applicant due to an unforeseen circumstance.
Finding an Applicant
Overview
The find command filters applicants based on fields specified by the user.
Fields have to be denoted by flags. Allowed fields for filtering are name and phone.
Here is the activity diagram showing the process of the find command:

The sequence diagram for find n/John in HMHero is as such:

FindCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of the diagram.
Additionally, take note that interactions with utility classes such as ArgumentTokenizer, ArgumentMultimap, and Messages are excluded as including them would cause the UML diagram to be cluttered and too small to read.
Feature Details
- The user specifies one or more fields to filter through the applicant list.
- If the user specifies more than one field, the filtered applicant list has to match all fields.
- If the user specifies a field more than once, only the last argument is considered when filtering applicants.
Feature considerations
The UI displays a FilteredList obtained from an immutable applicant list.
The FindCommandParser creates the Predicate used to filter the applicant list. When the FindCommand is executed,
the FilteredList sets its Predicate field to the created Predicate. The UI shows the new FilteredList.
Applicant fields are required as an input as it is helpful to reduce user confusion and facilitate finding applicants based on multiple fields.
Editing an Applicant
Overview
The edit feature edits the attached attributes of a specified Person,which is specified by the one-indexed personList presented to the user.
edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [d/INTERVIEWDATETIME] [note/NOTE]... Refer to Glossary for more information on Command format.
Here is the activity diagram showing the process of the edit command:

Feature Details
- The user can perform commands that modify the shown applicant list. (Eg.
findandinterviewcommands) - The user specifies an index that represents a
Personto be edited. - If a non-zero unsigned integer index is not provided, an error is thrown and the user is prompted to enter the command correctly via an error message.
- At least one field to be edited has to be provided. Else, the user will be prompted to enter the command correctly via an error message.
- If an index that is not in the valid range of the list is provided, an error is thrown and the user is prompted to enter the command correctly via an error message.
- The
editcommand creates a new applicant based on the given fields. The created applicant is cross-referenced in theModelto check if it already exists. If it already does, then an error is raised to inform the user. - If step 6 completes without any exceptions, then the
Personat the specified index is successfully edited.
Feature Considerations
Similar to the add command, it should be noted that when checking for duplicates in the UniquePersonList inside the
Model, Applicants cannot have the same name and phone number. For example, if a Person with the name Thomas and
phone number 91823452 already exists inside the list, then you cannot edit an existing Person to have the name Thomas and
phone number 91823452.
When providing multiple arguments with the same delimiter,
the last instance of the repeat delimiter is taken during the parse command.
Displaying the list
Overview
The list command displays the full list by HMHero.
Here is the activity diagram showing the process of the list command:

Feature Details
- The user calls the
listcommand. - HMHero performs the necessary calculations to obtain the statistics. HMHero displays the result to the user.
Feature Considerations
The statistics of the number of applicants in each stage of the application cycle were chosen as a baseline, and they are a good starting point for users to help track the number of applicants. For example, the user can obtain the total number of applicants, and also provide the total numbers of applicants for each status.
Showing all shortlisted applicants
Overview
The interview command displays the list of all shortlisted applicants, sorted by earliest interview date.
Feature Details
- The user calls the
interviewcommand. - The applicant list is filtered for shortlisted applicants.
- The resulting filtered applicant list is sorted by interview date, from earliest to latest.
- HMHero displays the resulting
SortedListto the user.
Filter applicants based on notes
Overview
The skill command displays the list of applicants that matches the keyword provided.
Feature Details
- The user calls the
skillcommand. - The applicant list is filtered for applicants with notes that match the keyword provided.
- HMHero displays the filtered applicant list to the user.
Feature Considerations
We limited the length of the keyword to a maximum of 45 characters because the longest word in the English dictionary has a length of 45 characters so there is no reason for the keyword to have a length longer than that.
Documentation, logging, testing, configuration, dev-ops
Appendix: Requirements
Product scope
Target user profile:
- Has a need to manage a significant number of applicants who applied to their department
- Is a Hiring Manager
- Prefers desktop apps over other types
- Can type fast
- Prefers typing to mouse interactions
- Prefers using CLI to GUI to increase productivity
Value proposition:
- Users can track and monitor the progress of each applicant in the application cycle very easily.
- Users can quickly search applicants with particular skill-sets.
- Users can obtain insights on their hiring practices to look for areas for improvement.
User stories
Info: The following legend describes the symbols used in this section:
| Priority | Symbol | Meaning |
|---|---|---|
| High | * * * |
Must have |
| Medium | * * |
Nice to have |
| Low | * |
Unlikely to have |
| Priority | As a … | I want to … | So that … |
|---|---|---|---|
* * * |
Hiring Manager | List out all existing applicants | I can have a glance of the status of the application cycle of all applicants. |
* * * |
Hiring Manager | Advance the application stage of an applicant | I can change an applicant status into the next stage of the application cycle. |
* * * |
Hiring Manager | Add an applicant into HMHero | I can add users who have applied to the department. |
* * * |
Hiring Manager | Delete a single applicant | I can delete applicants that I do not wish to track in the application anymore. |
* * * |
Busy Hiring Manager | Search for applicants | I can view the details of specific applicants. |
* * * |
Senior Hiring Manager | Identify duplicate applications from the same applicant | I can prevent applicants from sending multiple applications. |
* * |
Busy Hiring Manager | View the interview dates for all shortlisted applicants | I can better schedule future working days. |
* * |
Hiring Manager | Take down some additional notes for each applicant | I can note down skill-sets of an applicant, for future reference. |
* * |
Forgetful Hiring Manager | Remind myself of interviews that are coming up | I will not forget to attend any interview that I have scheduled. |
* * |
Clumsy Hiring Manager | Check whether there are any clashes in interview dates and timings | I can prevent myself from scheduling more than 1 interview in the same date and time. |
* * |
Hiring Manager | View the summary statistics of my hiring process | I can work on improving my future hiring processes. |
* |
Clumsy Hiring Manager | Get a confirmation message when deleting an applicant | I can prevent accidental deletions of applicants. |
* |
Old Hiring Manager | Highlight and enlarge the keywords that I am looking for | I can easily see the keywords that I am looking for. |
* |
Careless Hiring Manager | Undo recent actions or commands | I can reverse commands that I have mistakenly carried out. |
* |
Hiring Manager for multiple positions | Create jobs with required skill sets for each job | I can keep track of skill-sets needed for each job to match applicants. |
Use cases
(For all use cases below, the System is the HMHero and the Actor is the Hiring Manager, unless specified otherwise)
MSS refers to Main Success Scenario.
Use case: List all applicants
Precondition: HMHero already has some applicants stored.
MSS
- User enters command to view applicants in the list.
-
HMHero shows list of applicants.
Use case ends.
Use case: Add an applicant
Precondition: Applicant does not exist in HMHero yet.
MSS
- User enters command to add a specific applicant in the list.
-
HMHero adds the applicant.
Use case ends.
Extensions
-
1a. Compulsory fields (name, phone, email, address) are not given.
-
1a1. HMHero shows an error message.
Use case resumes at step 1.
-
Use case: Delete an applicant
Precondition: HMHero already has some applicants stored.
MSS
- User requests to list all applicants.
- HMHero shows a list of applicants.
- User enters the command to delete a specific applicant in the list.
-
HMHero deletes the applicant.
Use case ends.
Extensions
-
3a. The given applicant’s name does not exist.
-
3a1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3b. The given applicant’s phone number does not exist.
-
3b1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3c. The given applicant’s name and corresponding phone number combination for an applicant does not exist.
-
3c1. HMHero shows an error message.
Use case resumes at step 3.
-
Use case: Advance an applicant’s status
Precondition: Status of Applicant to advance is not Accepted or Rejected and HMHero already has some applicants stored.
MSS
- User requests to list applicants.
- HMHero shows a list of applicants.
- User enters the command to advance the status of a specific applicant in the list.
-
HMHero advances the applicant’s status.
Use case ends.
Extensions
-
3a. The given applicant’s name does not exist.
-
3a1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3b. The given applicant’s phone number does not exist.
-
3b1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3c. The given applicant’s name and corresponding phone number combination for an applicant does not exist.
-
3c1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3d. The given applicant’s current status is Applied but no interview date and time was given.
-
3d1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3e. The given applicant’s current status is Shortlisted but an interview date and time was given.
-
3e1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3f. The given interview date time is of invalid formatting.
-
3f1. HMHero shows an error message.
Use case resumes at step 3.
-
Use case: Reject an applicant’s status
Precondition: Status of Applicant to reject is not Rejected and HMHero already has some applicants stored.
MSS
- User requests to list applicants.
- HMHero shows a list of applicants.
- User enters the command to reject a specific applicant in the list.
-
HMHero sets the applicant’s status as Rejected.
Use case ends.
Extensions
-
3a. The given applicant’s name does not exist.
-
3a1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3b. The given applicant’s phone number does not exist.
-
3b1. HMHero shows an error message.
Use case resumes at step 3.
-
-
3c. The given applicant’s name and corresponding phone number combination for an applicant does not exist.
-
3c1. HMHero shows an error message.
Use case resumes at step 3.
-
Use case: Finding applicants
Precondition: Applicant to find exists in HMHero.
MSS
- User requests to list applicants.
- HMHero shows a list of applicants.
- User enters the command to find an applicant.
-
HMHero shows all applicants that matches the given parameters.
Use case ends.
Extensions
- 3a. HMHero detects that the command entered is of invalid formatting.
-
3a1. HMHero shows an error message
Use case resumes at step 3.
-
Use case: Finding applicants with specific skills
Precondition: Applicants with skills that user gave exists in HMHero.
MSS
- User requests to list applicants.
- HMHero shows a list of applicants.
- User enters the command to find applicants that match specific skills.
-
HMHero shows all applicants with notes that match the given skills.
Use case ends.
Extensions
- 3a. HMHero detects that the command entered is of invalid formatting.
-
3a1. HMHero shows an error message
Use case resumes at step 3.
-
Use case: Remind upcoming interviews
Precondition: There are shortlisted applicants in HMHero.
MSS
- User requests to list applicants.
- HMHero shows a list of applicants.
- User enters the command to remind himself/herself of the upcoming interviews.
-
HMHero shows all applicants with interview dates within the next three days.
Use case ends.
Extensions
- 3a. HMHero detects that the command entered is of invalid formatting.
-
3a1. HMHero shows an error message
Use case resumes at step 3.
-
Use case: View all interview dates
Precondition: There are shortlisted applicants in HMHero.
MSS
- User enters the command to view interview dates and times of all
SHORTLISTEDapplicants. -
HMHero shows the interview date and times of all
SHORTLISTEDapplicants, sorted from earliest to latest.Use case ends.
Extensions
- 1a. HMHero detects that the command entered is of invalid formatting.
-
1a1. HMHero shows an error message
Use case resumes at step 3.
-
Use case: View summary statistics of hiring cycle
MSS
- User enters the command to view summary statistics.
-
HMHero shows summary statistics.
Use case ends.
Extensions
- 1a. HMHero detects that the command entered is of invalid formatting.
-
1a1. HMHero shows an error message
Use case resumes at step 1.
-
Non-Functional Requirements
- Should work on any mainstream OS as long as it has Java
11or above installed. - Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.
- A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.
- Should not require any internet connection.
- Should be usable by a novice who has never used managed applicants on HMHero before.
- Should be for a single user (i.e. not a multi-user product where different users can run the application at different times on a shared computer).
- The data of the application is stored locally.
- No database management system should be used.
- The product is not required to handle the screening of resumes for each applicant.
Glossary
Quick Reference
- ADDRESS (Placeholder)
- Address
- Applicant
- Application Cycle
- COMMAND_WORD (Placeholder)
- Command
- Command Line (CLI)
- Placeholder
- Flags
- Graphical User Interface(GUI)
- Help Window
- Hiring Manager
- Input
- INTERVIEW_DATE (Placeholder)
- Interview Date
- KEYWORD (Placeholder)
- Main Operating System
- Main Success Scenario
- NAME (Placeholder)
- Name
- NOTES (Placeholder)
- Notes
- Output
- Parameter
- PHONE_NUMBER (Placeholder)
- Phone Number
- Placeholder
- STATUS (Placeholder)
- Status
- Syntax
- URL
- Use Case
- User Story
A
ADDRESS Placeholder
The ADDRESS is a text representing the address of the applicants.
Address
The address of the applicant provided by the user.
Applicant
The person who apply to the company for the job.
Application Cycle
All applicants added are at the Applied status by default. From there, hiring managers can advance their application status to Shortlisted, then to Accepted. Applicants can be rejected at any stage.
C
COMMAND_WORD Placeholder
The COMMAND_WORD is a text indicating a command word of a command
Command
A feature or function that HMHero can perform.
Command Line
The typing interface that you use to interact with HMHero. It is represented as the box where you type in commands.
E
EMAIL Placeholder
The EMAIL is a text representing the email address of the applicants.
The email address of the applicant provided by the user.
F
Flags
A marker to identify the type of input by the user. For instance, in
n/NAME,n/is the flag.
G
Graphical User Interface
A Graphical User Interface is a graphics-based interface that uses icons, menus and a mouse (to click on the icon or pull down the menus) to manage interaction with the system. In HMHero, this presents as the window that appears when launching it.
H
Help Window
A pop-up window containing help information, shown only after calling a help command.
Hiring Manager
A person responsible for overseeing the recruitment process within an organization, from identifying staffing needs to making hiring decisions.
I
Input
The text that a user would enter into HMHero
INTERVIEW_DATE Placeholder
The INTERVIEW_DATE is the date indicating when the applicant is having his/her interview.
Interview Date
Date where applicants are going to have their interviews. Interview date is in the format “day-month-year hour:minute”, represented in the “DD-MM-YYYY HH:MM” format.
K
KEYWORD Placeholder
The KEYWORD is the text we use search for an item. It can be
NAMEorPHONE_NUMBERof the applicant.
M
Mainstream OS
Mainstream Operating Systems (OS) refers to Windows, Linux, Unix, OS-X
Main Success Scenario
The Main Success Scenario (MSS) describes the most straightforward interaction for a given use case, assuming that nothing goes wrong.
N
NAME Placeholder
The NAME is a text representing the name of the applicants.
Name
The name of the applicant provided by the user.
NOTES Placeholder
The NOTES are some texts that use to represent the skill set of the applicants.
Notes
The skill set the applicant possesses provided by the user.
O
Output
The result after calling a Command. Results are displayed in the GUI.
P
Parameter
Values that are passed while calling the Commands. For instance, when calling
find n/NAME, parameter here isn/NAME.PHONE_NUMBER Placeholder
The PHONE_NUMBER is an integer representing the phone number of the applicant.
Phone Number
The phone number of the applicant provided by the user.
Placeholder
Placeholders in HMHero refers to the UPPER_CASE words that appear after the flags in commands that is provided by the user. For instance,
n/NAME,NAMEis a placeholder
S
STATUS Placeholder
The STATUS is a text that represent the current state of the applicant.
Status
Status has four stages, which are APPLIED, SHORTLISTED, ACCEPTED and REJECTED. Status can only be modified by using advance or reject command.
Syntax
The structure of statements/inputs users type into the Command Line.
U
URL
A hyperlink to a website.
Use Case
A use case describes an interaction between the user and the system for a specific functionality of the system.
User Story
User stories are short, simple descriptions of a feature told from the perspective of the person who desires the new capability, usually a user or customer of the system. It is typically in the format “As a {user type/role} I can {function} so that {benefit}”.
Appendix: Instructions for manual testing
Given below are instructions to test the app manually.
Launch
-
Initial launch
-
Download the
hmhero.jarfile and copy into an empty folder. -
Double-click the jar file
Expected: Shows the GUI with a set of sample applicants.
</br>
-
-
Saving window preferences
-
Resize the window to an optimum size. Move the window to a different location. Close the window.
-
Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
-
Adding an applicant
Prerequisites: An applicant with the name Fred and phone number 999 does not exist in HMHero yet.
Test case: add n/Fred p/999 e/test@gmail.com a/12345
Expected: Applicant named Fred and with phone number 999 is added to the list.
Details of the added applicant shown in the output box.
Application date follows the current date and time.
Test case: add n/Fred p/999 e/test@gmail.com a/12345 applied/01-01-2023 18:00
Expected: Applicant named Fred and with phone number 999 is added to the list.
Details of the added applicant shown in the output box.
Application date is 01-01-2023 18:00.
Test case: add n/Fred p/999
Expected: No applicant is added. Error message for invalid command format.
Deleting an applicant
Prerequisites: An applicant with the name Fred and phone number 999 exists in HMHero.
Test case: delete n/Fred p/999
Expected: Applicant named Fred and with phone number 999 is deleted from the list.
Details of the deleted applicant shown in the output box.
Test case: delete n/Fred p/000
Expected: No applicant is deleted. Error message for not finding any applicant.
Test case: delete n/Fred
Expected: No applicant is deleted. Error message for invalid command format.
Advancing an applicant
Prerequisites: There are two applicants:
- Applicant with the name Fred, phone number 999 and status
APPLIED. - Applicant with the name Freddy, phone number 000, status
SHORTLISTEDand interview date time05-05-2023 18:00.
Test case: advance n/Fred p/999 d/04-04-2023 18:00
Expected: Applicant named Fred and with phone number 999 is advanced to SHORTLISTED.
Test case: advance n/Fred p/999 d/05-05-2023 18:00
Expected: Applicant is not advanced. Error message for clashing interview date time with Freddy
Test case: advance n/Fred p/999
Expected: Applicant is not advanced. Error message for no interview date time given.
Test case: advance n/Freddy p/000 d/05-05-2023 18:00
Expected: Applicant is not advanced. Error message for no interview date time is needed.
Test case: advance n/Fred
Expected: Applicant is not advanced. Error message for invalid command format.
Rejecting an applicant
Prerequisites: There are two applicants:
- Applicant with the name Fred, phone number 999 and status
APPLIED. - Applicant with the name Freddy, phone number 000, status
REJECTED.
Test case: reject n/Fred p/999
Expected: Applicant named Fred and with phone number 999 is rejected.
Test case: reject n/Freddy p/999
Expected: Applicant is not rejected. Error message for applicant is already rejected.
Test case: reject n/Fred
Expected: Applicant is not rejected. Error message for invalid command format.
Finding applicants
Prerequisite: Applicants to find exist in HMHero
Test case: find n/Fred
Expected: All applicants with name Fred listed.
Test case: find p/999
Expected: All applicants with phone number 999 listed.
Test case: find n/Fred p/999
Expected: Applicant with name Fred and phone number 999 listed.
Test case: find n/
Expected: Error message for invalid command format.
Finding applicants with specific skills
Test case: skill java
Expected: All applicants with java written in notes
Test case: skill
Expected: Error message for invalid command format.
Remind upcoming interviews
Prerequisite: There are shortlisted applicants with scheduled interviews in the next 3 days.
Test case: remind
Expected: All applicants with interviews coming up in the next 3 days are listed (if any).
View all interviews
Prerequisite: There are shortlisted applicants with scheduled interviews
Test case: interview
Expected: All shortlisted applicants are listed, sorted by their interview dates from earliest
to latest.
View summary statistics
Test case: summary
Expected: Statistic of overall hiring process is shown in output box.
Help
Test case: help
Expected: The Help Window pops up and shows a general help message.
Clear
Test case: clear
Expected: All applicants in HMHero are deleted.
Exit
Test case: exit
Expected: HMHero application closes.
Effort
It was not easy to develop HMHero. Our team struggled with ways to make our product unique and stand out from existing products in the market, while at the same time ensuring that this product could be completed in the short span of time given.
Managing Tasks
While working on this project, our team was also occupied with other modules that we were juggling throughout the semester. Hence, it was not easy carving out time every week to meet with the team, apart from the scheduled weekly meetings. Some weeks required more than one meeting, and we had to work around the different clashes in timetables between each team members. However, we are grateful for the effort that every member has put in to make this project a success and meet our expectations.
Improved UI
The original AB3 program only displayed the list of persons which is not very useful for an application tracking applicants. To make our app effective, we enhanced the output command box to include information of each applicant for each command that is associated with the specific applicant. This makes it easier for the user to track the status of their applicants as they execute their commands.
In terms of colour scheme, we thought that the dark theme of AB3 was uninspiring and made use of own blue and light colored theme to give this app a nice, warm and welcoming feel.
Extensive Testing
The increased number of classes, along with all the commands, means that code coverage is likely to decrease and more testing had to be done as compared to that in AB3.
Hence, we took it as an opportunity to do extensive testing for our application through writing effective unit tests for our commands, parsers and model objects. We redesigned how testing is done for commands and manage to cover all commands successfully. We achieved a ~86% code coverage from the original ~72% in AB3, and increased the number of test cases from 248 (in AB3) to 301 (in HMHero).
Planned Enhancements
- Allowing a command specific to adding of notes to an applicant. Our current implementation requires for the user to re-key every single note that was already registered in HMHero when trying to edit the applicant and adding extra notes to the applicant. This may be very cumbersome and troublesome for the user especially if the applicant already has a long list of notes registered.
- Enhancing commands involving date time inputs to check for invalid date inputs for specific months. For example,
31-02-2023is an invalid date for the month of February. However, with Java’s LocalDateTime class, it does not see this as an invalid LocalDateTime class but instead automatically refactors this date to28-02-2023, without notifying the user. This would be better if an error message is thrown to alert the user of this automatic change instead of silently changing it without notifying the user. Note that an error is still thrown for obvious invalid dates such as32-02-2023, but just not for the case of specific dates that may be valid in certain months but invalid for other months. - Enhancing the
editcommand to check for changing an interview date to a date in the past should throw a warning to alert the user that the edited interview date time is in the past. This should not be the case when the user edits the interview date time of an applicant and hence should be warned to the user, but still allow the change to execute. - Enhancing the GUI to show more information such as the Application DateTime of an applicant more easily instead of having to execute a command to view information. Currently out GUI hides these information and is only available for the user after the user executes a relevant command that changes these information. This might be inconvenient for users and is a room for improvement in future enhancements.
- Enhancing the
addandeditcommand to warn the user if duplicate phone numbers are used in the new or edited entries. While phone numbers are unique, there is the slight possibility that a new applicant is using the phone number of an old applicant (who has changed his/her phone number). Hence, we shall not deny these commands to throw an error but rather we should warn the user when these commands are executed so that the user aware of it. - Adding a feature that allows for importing of csv files so that users can transfer existing data into HMHero, instead of having to re-key all the existing entries manually into HMHero at the start.
- Enhancing the
summarycommand to produce useful charts and graphs for Hiring Managers to have a better visualisation of the hiring process. - Enhancing the checking of emails to have a valid domain name such as
@gmail.comor@nus.edu.sginstead of just checking for the presence of@in the email. - Advancing of applicants should apply for cases where there are multiple rounds of interview. So we should also allow for multiple stages of
SHORTLISTED. Hence when advancing aSHORTLISTEDapplicant, the applicant can be advanced into the next stage ofSHORTLISTEDinstead of immediately toACCEPTED.
