JABPro aims to solve the problem of HR managers having to manage and sort through tons of job applications.
The problem that we have identified included:
view
command to view a candidate's details in a separate panel (to reduce visual noise and clutter) whereby the candidate's details are displayed in full in a very organised and formatted manner.filter
command to filter candidates based on statistical metrics and values. Whereby the user can filter and display candidates whose value is greater than or equal to the specified value for the specified statistic metric.
This allows the user to easily compare candidates based on their performance for a particular tag. We use tag as a way to tag assessments that the candidate has taken. This allows the user to easily compare candidates based on their performance for a particular assessment.Thereby additional enhancement that I have implemented to support filter to support Score
and ScoreList
are:
edit
command to edit the score of a candidate for a particular assessment.Code contributed: RepoSense link
Enhancement implemented:
remark
, edit
(for scores portion) , filter
, view
command and featuresScore
, ScoreList
, Remark
and its relevant storing and parsing of dataContribution to the UG:
Overview of Main Features
for Introductionadd
, remark
, filter
, view
, edit
command and Summary Statistic
sectionContribution to DG:
* * *
Must-have features for user stories which links to the commands I have implementedadd
, remark
, view
, Using scores to compare and filter people
view
.add
, edit
, view
, filter
, remark
features.Contribution to team-based tasks:
Review/mentoring contributions:
Contributions beyond the project team:
Test Case Contributions:
The view feature is implemented using the ViewCommand
class. It extends Command
and overrides the execute()
method to display the person's details in full in a new window.
Like every other command class, it involves a command ViewCommand
class and a parser ViewCommandParser
. ViewCommand Parser
takes in the user input and returns a ViewCommand
object.
When executed, ViewCommand
saves the index of the person to be viewed as LastViewedPersonIndex
in the Model
and returns a CommandResult
object with isView
property being true.
By having a isView
property in CommandResult
, the MainWindow
component is able to toggle the UI
to the view the person of the LastViewedPersonIndex
after the command has been executed.
Given below is an example usage scenario and how the view feature behaves at each step.
Step 1. The user launches the application. The AddressBook
will be initialized with the current saved address book state
User should see the UI as shown below.
Step 2. The user wants to see the full information displayed for the first person in the displayed list. The user enters the command view 1
to view the first person in the list.
The following sequence diagram shows how the view operation works:
Note: The lifeline for RemarkCommand
and RemarkCommandParser
should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
User should see the UI as shown below after entering View 1
Step 3. The user can then read or process the information stored for the viewed person.
Note: The view command can be most effectively used with search
and list
. Since the view index is dependent on the Index on the filtered list shown, the user can view the profile after filtering for specific properties in a person using search
and sorting them using list
.
Alternatives considered
Alternative 1 (Chosen):
The view feature is implemented using the ViewCommand
class. It extends Command
and overrides the execute()
method to display the person's details in full in a new window.
Pros: Follows the Software Design Patterns of Command. This is the same pattern used for all other commands thus creating consistency.
Cons: Tougher to implement since other commands do not have the ability to trigger the ViewCommand
in their execution. That is we specifically need to set the isView property to true if we want the ViewCommand
to occur simultaneously with another command.
Alternative 2 (Not Chosen):
The view feature is implemented using the ViewCommand
class. It extends Command
and overrides the execute()
method to display the person's details in full in a new window.
Commands that involved viewing will extend ViewCommand
instead of the Command
class. All of them are returned as ViewCommand
to ensure toggling of the UI after command is executed.
Pros: Arguably a more OOP approach since all commands that trigger view IS-A ViewCommand
.
Cons: You cannot implement any command that does not involve viewing but inherits from any command that is a children of ViewCommand
.
An example could be trying to create identical commands that does not toggle the UI after execution. This would require duplication of the exact same command code but inheriting from Command
instead of ViewCommand
.
Priority | As a … | I want to … | So that… |
---|---|---|---|
* * * | Hiring Manager | add a candidate's contact information, including name, email, phone number | I can easily access and reach out to candidates when needed |
* * * | Hiring Manager | add notes and comments to candidate profiles to document interview feedback and impressions | I can maintain a record of interactions and feedback |
* * * | Hiring Manager | view a specific job applicant's resume or portfolio | I can check whether they meet the requirements requested by other department heads |
* * * | Hiring Manager | record the score of the different activities such as interviewsor assessments that an applicant might go through | I can use them for effective comparison and filter the candidates easily |
* * * | Hiring Manager | compare candidates using their performance in their assessments or interviews | I can choose the best candidates to move to the next stage of the hiring process and get the best performing candidates objectively |
The remaining not mentioned are the use cases for my features related and test cases for manual testing.
add
Adds an applicant to JABPro.
Format: add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/[CATEGORY] TAGNAME]…
Type | Prefix | Constraints |
---|---|---|
Mandatory | n/NAME | NAME must be alphanumeric (Letters and numbers, no symbols allowed such as / , , ...). |
Mandatory | p/PHONE_NUMBER | PHONE_NUMBER must contain numbers only and should be at-least 3 digits long. |
Mandatory | e/EMAIL | EMAIL must be the standard email address format (There must be an email-prefix followed by @ symbol and email domain). |
Mandatory | a/ADDRESS | ADDRESS can be any value, including special characters such as # , , ... |
Optional | t/[CATEGORY] TAGNAME | TAGNAME must be alphanumeric with no spaces. Any details after the space will be ignored. |
Notes regarding additional constraint on add
command:
add
command will be added to the end of the list.Notes on adding tags:
create
command,
you can specify the category that you would like it to be categorised to in the add
command. e.g. ...t/role swe
add
command,
the tag would still be saved but it would be "uncategorised" by default.Tip:
An example of the add
command being successfully executed:
Enter the command add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/dept finance
This is the result of the successful add
command (Take note that command entered will not be shown in the result):
Error Handling Table for add
command:
Reason for Error | Error Message | Remedy / Suggested course of action |
---|---|---|
Missing add keyword: add | Unknown command | Follow the command format of add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAGNAME]… closely |
Missing mandatory fields | Invalid command format! | Ensure that all mandatory fields are filled up. |
Duplicate name | This person already exists in the address book | Ensure that the name of the applicant is unique. That is you cannot add the same name twice. Use some form of extra identification like a number |
Invalid phone number | Phone numbers should only contain numbers, and it should be at least 3 digits long | Ensure that the phone number only contains number and should be at least 3 digits long |
Invalid email | Emails should be of the format local-part@domain and adhere to the following constraints: | Ensure that the prefix and domain of the email is correct following the constraints stated by the error |
Invalid tag name | Tag names should only contain alphanumeric characters and should not be blank | Ensure that the tag name only contains alphanumeric characters and should not be blank |
Multiple prefixes of the same type being used | Multiple values specified for the following single-valued field(s): prefix/ | Remove the duplicate prefix. The command should only have 1 of every prefix except for t/ |
Tip: To know if it is an error, the command entered will light up in red. It remains in the command box.
remark
Edits a remark of an existing applicant in JABPro.
Format: remark INDEX r/REMARK
Type | Prefix | Constraints |
---|---|---|
Mandatory | INDEX | INDEX must be an existing index in the displayed applicant list and it must not be greater than the total number of applicants in JABPro. |
Optional | r/ [REMARK] | REMARK can be any value, including special characters such as # , , ... |
Notes regarding remark
command:
r/
without any text after it or by omitting the r/
prefix.remark 1 r/**remark**
will just replace the remark with the word **remark**
.remark
but only the last prefix will be used. This means that remark 1 r/remark r/remark2
will just replace the remark with remark2
.An example of the remark
command being successfully executed:
Enter the command remark 1 r/Great attitude, hardworking
This is the result of the successful remark
command (Take note that command entered will not be shown in the result):
An example of the remark
command being successfully executed with the REMARK keyword:
Enter the command remark 1 r/**REMARK** furthermore he is great at teamwork
This is the result of the successful remark
command (Take note that command entered will not be shown in the result):
Error Handling Table for remark
command:
Reason for Error | Error Message | Remedy / Suggested course of action |
---|---|---|
Missing remark keyword: remark | Unknown command | Follow the command format of remark INDEX r/[REMARK] closely |
Missing Index | Invalid command format! | Ensure that the index is filled up. |
Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
Negative or 0 Index | Invalid command format! | Ensure that the index is a positive integer and is also a number that is on the displayed applicant list. |
Tip: To know if it is an error, the command entered will light up in red. It remains in the command box.
Additional Examples:
remark 1
Empties the remark of the 1st applicant. It is equivalent to remark 1 r/
.view
Creates a complete view for details of an applicant in the second main panel and summary statistics (if applicable) of an applicant in the third main panel.
Format: view INDEX
Type | Prefix | Constraints |
---|---|---|
Mandatory | INDEX | INDEX must be an existing index in the displayed applicant list and it must not be greater than the total number of applicant in JABPro. |
Notes regarding view
command:
Tip: Other operations that affect user's data will trigger a refresh of the view.
These include add
, edit
, set
, remark
, addL
, addG
.
This means that the view will be updated to reflect the latest changes to the data for that particular applicant.
An example of the view
command being successfully executed:
Enter the command view 3
This is the result of the successful view
command (Take note that command entered will not be shown in the result):
An example of the view
command being successfully executed for applicant with tags and score:
Enter the command view 2
(Applicant with tags and score)
This is the result of the successful view
command (Take note that command entered will not be shown in the result):
Error Handling Table for view
command:
Reason for Error | Error Message | Remedy / Suggested course of action |
---|---|---|
Missing view keyword: view | Unknown command | Follow the command format of view INDEX closely |
Missing Index | Invalid command format! | Ensure that the index is filled up. |
Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
Tip: To know if it is an error, the command entered will light up in red. It remains in the command box.
edit
Edits an existing applicant's detail in JABPro
Format: edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAGNAME]… [sc/TAGNAME SCORE]
Type | Prefix | Constraints |
---|---|---|
Mandatory | INDEX | INDEX must be a non-zero unsigned integer and must also not be greater than the total number of applicants in JABPro. |
Optional | n/NAME | NAME must be alphanumeric (Letters and numbers, no symbols allowed such as / , , ...). |
Optional | p/PHONE_NUMBER | PHONE_NUMBER must contain numbers only and should be at-least 3 digits long. |
Optional | e/EMAIL | EMAIL must be the standard email address format (There must be an email-prefix followed by @ symbol and email domain). |
Optional | a/ADDRESS | ADDRESS can be any value, including special characters such as # , , ... |
Optional | t/TAGNAME | TAGNAME must be alphanumeric with no spaces. Any details after the space will be ignored. |
Optional | sc/TAGNAME SCORE | TAGNAME a tag that is being created or already exist for that applicant. SCORE must be a non-negative integer. |
Notes regarding edit
command:
t/[CATEGORY] TAGNAME
for more details.Notes on editing the tags of the specified applicant for t/TAGNAME
:
t/
without
specifying any tags after it.Notes on editing the score of the specified applicant for sc/TAGNAME SCORE
:
TAG
in sc/TAG SCORE
must be a tag of the category assessment
. You cannot use the sc/TAG SCORE
field for tags that are not of the assessment
category.sc/TAG SCORE
field can only be used after the t/TAG
field is used if the tag has not been created or the TAG
already exist on the applicant.SCORE
in sc/TAG SCORE
is non-negative, that is SCORE
must be more than or equal to 0.sc/TAG SCORE
field.Notes on rules for edit
command involving tags with categories for t/[CATEGORY] TAGNAME
:
add
apply to the edit
command involving tags:
create
command,
you can specify the category that you would like it to be categorised to in the edit
command. e.g. edit 1 t/role swe
add
command,
the tag would still be saved but it would be "uncategorised" by default.create
before using edit
to tag applicants. This is to reduce the confusion of having two ways to tag applicants.An example of the edit
command being successfully executed:
Enter the command edit 1 n/Alex Ho p/91234567
(Edit name and phone number)
This is the result of the successful edit
command (Take note that command entered will not be shown in the result):
An example of the edit
command being successfully executed with tags and score:
Ensure that you have created a tag Interview
under the assessment
category using the create
command. That is, enter the command create t/assessment Interview
Enter the command edit 1 t/Interview sc/Interview 80
(Edit tag and score)
This is the result of the successful edit
command (Take note that command entered will not be shown in the result):
An example of the edit
command being successfully executed to clear a tags and score:
Enter the command edit 1 t/
(Clear all tags)
This is the result of the successful edit
command (Take note that command entered will not be shown in the result):
Error Handling Table for edit
command:
Reason for Error | Error Message | Remedy / Suggested course of action |
---|---|---|
Missing edit keyword: edit | Unknown command | Follow the command format of edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAGNAME]… [sc/TAGNAME SCORE] closely |
Missing Index | Invalid command format! | Ensure that the index is filled up. |
Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
Missing at least one of the field | At least one field to edit must be provided. | Ensure that at least one of the field is filled up and to be changed. |
Duplicate name | This person already exists in the address book | Ensure that the name of the applicant is unique. That is you cannot add the same name twice. Use some form of extra identification like a number |
Invalid phone number | Phone numbers should only contain numbers, and it should be at least 3 digits long | Ensure that the phone number only contains number and should be at least 3 digits long |
Invalid email | Emails should be of the format local-part@domain and adhere to the following constraints: | Ensure that the prefix and domain of the email is correct following the constraints stated by the error |
Invalid tag name | Tag names should only contain alphanumeric characters and should not be blank | Ensure that the tag name only contains alphanumeric characters and should not be blank |
Multiple prefixes of the same type being used | Multiple values specified for the following single-valued field(s): prefix/ | Remove the duplicate prefix. The command should only have 1 of every prefix except for t/ |
Missing score for tag | Invalid score, score must be non-negative integer. | Ensure that the score is filled up and has a space from the TAGNAME . |
Invalid tag to attach score | Invalid score tag, tag must a tag of the category assessment and must exist on the applicant | Ensure that the tag is of the category assessment and exist on the applicant. If its the wrong category, use create , if it is not tagged to the person use edit |
Tip: To know if it is an error, the command entered will light up in red. It remains in the command box.
filter
Filters and display applicants in the current displayed applicant list using statistical metrics and values.
Format:filter t/TAGNAME met/METRIC val/VALUE
or filter t/TAGNAME met/METRIC
Type | Prefix | Constraints |
---|---|---|
Mandatory | t/TAGNAME | TAGNAME must be a tag that is of the category assessment . |
Mandatory | met/METRIC | METRIC must be either score , percentile , mean , median . |
Optional | val/VALUE | Optional only for mean and median . Otherwise, VALUE must be a non-negative integer and is a mandatory field. |
Notes regarding filter
command:
list
before using filter
to ensure that you are filtering the correct list of job applicants.filter
after you have tagged most of the job applicants with a tag that has a score.METRIC
that is mean
or median
, the VALUE
is optional. Specifying a VALUE
here will be ignored accordingly. filter t/TAGNAME met/METRIC
is equivalent to filter t/TAGNAME met/METRIC val/X
where X
is any positive integer.list
again.Notes on the different metrics: Do look at the Summary Statistics section for more details on the summary statistics metrics.
You should use filter
after you have tagged most of the job applicants with a tag that has a score.
This is because some of the metrics such as percentile
, mean
and median
require a certain number of scores to be considered meaningful.
Read more about this in the Summary Statistics section.
Set up for examples when you first start JABPro with default data:
list
create t/assessment interview
to create a tag interview
under the assessment
category.
edit 1 t/interview sc/interview 80
edit 2 t/interview sc/interview 90
edit 3 t/interview sc/interview 70
The result of the above commands should look like this:
An example of the filter
command being successfully executed:
Enter the command list
Enter the command filter t/interview met/percentile val/80
(Filter by percentile)
This is the result of the successful filter
command (Take note that command entered will not be shown in the result):
An example of the filter
command being successfully executed with median
:
Enter the command list
Enter the command filter t/interview met/median
(Filter by median)
This is the result of the successful filter
command (Take note that command entered will not be shown in the result):
Error handling for filter
command:
Reason for Error | Error Message | Remedy / Suggested course of action |
---|---|---|
Missing filter keyword: filter | Unknown command! | Follow the command format strictly of filter t/TAGNAME met/METRIC val/VALUE for score and percentile or filter t/TAGNAME met/METRIC for mean or median. |
Missing parameters | Incomplete parameter inputs. t/TAG and met/SCORE are compulsory fields. | Enter the command again with the correct parameters. |
Invalid tag as tag has wrong category or does not exist | Tag does not exist! | Check that the tag is of the category assessment and that the tag exists using listT . Use the create command if it does not. |
Invalid metric | Invalid metric provided. Needs to be one of: score, mean, median, percentile | Check that the metric is one of the following: score , mean , median , percentile and that it is spelt correctly. Enter the command again with any of the 4 metric |
Invalid value | Invalid value provided. Needs to be a non negative integer that is more than or equal to 0 | Check that the value is a non-negative integer that is more than or equal to 0. Enter the command again with the correct value. |
Missing value | val/VALUE is missing, it is compulsory. | Enter a value for val/VALUE since the metric requires it. |
Multiple prefixes of the same type being used | Multiple values specified for the following single-valued field(s): prefix/ | Remove the duplicate prefix. The command should only have 1 of every prefix |
Tip: To know if it is an error, the command entered will light up in red. It remains in the command box.
Significance of using filter
with the metrics score
, percentile
, mean
and median
:
In essence, this allows you to find job applicants whose performance rating is above a certain percentile, score or mean/median score for that tag.
Ideally, this feature can then be used to find the best applicants easily and quickly without having to manually look through the list of applicants.
Summary Statistics is a table generated by JABPro that displays the following information about an applicant:
It is generated for tags that are categorised under the assessment
category.
Statistic / Metric | Description |
---|---|
score | The score of the applicant for the tag. |
mean | The mean score of applicant with that tag. |
median | The median score of applicant with that tag. |
minimum | The minimum score of applicant with that tag. |
maximum | The maximum score of applicant with that tag. |
percentile | The percentile of the applicant for that tag. |
You should ensure that you have sufficient candidates of more than 20 with a score for the tag you are interested in, before using the summary statistics to make comparisons.
Notes on why you should have sufficient applicants with a score for the tag you are interested in:
median
and percentile
to make your judgement on the performance of an applicant.median
to find applicants who are the better performing halfpercentile
as where this applicant stands among all other applicants (treat it like a ranking system, the higher the percentile, the better the applicant is performing)Advanced users
percentile
has limited functionality in some context. This is because if two applicants have the same score, they are rank
the same. This means that the percentile of both applicants will be the same.
rank
the same.Formula used to calculate the summary statistics:
mean is calculated by using the formula sum of all scores with that tag / number of applicants with that tag
median is calculated by using the formula middle score of all scores with that tag
minimum is calculated by using the formula lowest score of all scores with that tag
maximum is calculated by using the formula highest score of all scores with that tag
percentile is calculated by using the formula number of applicants with a score strictly lower than the applicant / total number of applicants with that tag