Staff-Snap is based on the AddressBook-Level3 project created by the SE-EDU initiative, and it incorporates the following third-party libraries: JavaFX, Jackson, JUnit5, OpenCSV, TestFX.
Refer to the guide Setting up and getting started.
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
(consisting of
classes Main
and MainApp
) is
in charge of the app launch and shut down.
The bulk of the app's work is done by the following four components:
UI
: The UI of the App.Logic
: The command executor.Model
: Holds the data of the App in memory.Storage
: Reads data from, and writes data to, the hard disk.Commons
represents a collection of classes used by multiple other components.
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 1
.
Each of the four main components (also shown in the diagram above),
interface
with the same name as the Component.{Component Name}Manager
class (which follows the corresponding
API interface
mentioned 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.
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
, ApplicantListPanel
, 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. The layout of these UI parts are defined in matching .fxml
files that
are in the src/main/resources/view
folder. For example, the layout of
the MainWindow
is specified
in MainWindow.fxml
The UI
component,
Logic
component.Model
data so that the UI can be updated with the modified data.Logic
component, because the UI
relies on the Logic
to execute commands.Model
component, as it displays Applicant
object residing in the Model
.API : Logic.java
Here's a (partial) class diagram of the Logic
component:
The sequence diagram below illustrates the interactions within the Logic
component, taking execute("delete 1")
API
call as an example.
DeleteCommandParser
should end at the destroy marker (X) but due to a limitation of
PlantUML, the lifeline reaches the end of diagram.
How the Logic
component works:
Logic
is called upon to execute a command, it is passed to an ApplicantBookParser
object which in turn
creates
a parser that matches the command (e.g., DeleteCommandParser
) and uses it to parse the command.Command
object (more precisely, an object of one of its subclasses e.g., DeleteCommand
) which
is executed by the LogicManager
.Model
when it is executed (e.g. to delete a applicant).CommandResult
object which is returned back from Logic
.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:
ApplicantBookParser
class creates an XYZCommandParser
(XYZ
is a
placeholder for the specific command name e.g., AddCommandParser
) which uses the other classes shown above to parse
the user command and create a XYZCommand
object (e.g., AddCommand
) which the ApplicantBookParser
returns back as
a Command
object.XYZCommandParser
classes (e.g., AddCommandParser
, DeleteCommandParser
, ...) inherit from the Parser
interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
The Model
component,
Applicant
objects (which are contained in a UniqueApplicantList
object).Applicant
objects (e.g., results of a search query) as a separate filtered list
which
is exposed to outsiders as an unmodifiable ObservableList<Applicant>
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.UserPref
object that represents the user’s preferences. This is exposed to the outside as
a ReadOnlyUserPref
objects.Model
represents data entities of the domain, they
should make sense on their own without depending on other components)API : Storage.java
The Storage
component,
ApplicantBookStorage
and UserPrefStorage
, which means it can be treated as either one (if only
the functionality of only one is needed).Model
component (because the Storage
component's job is to save/retrieve objects
that belong to the Model
)Classes used by multiple components are in the seedu.staffsnap.commons
package.
This section describes some noteworthy details on how certain features are implemented.
The add applicant feature allows users to add an applicant to the applicant list.
add n/John Doe hp/98765432 e/jd@gmail.com p/software engineer
to add a new applicant.AddCommandParser#parse()
checks whether all the prefixes and the required values are provided.AddCommand#execute()
checks if the applicant exists in the applicant list.Model#addApplicant()
adds the applicant to the applicant list.The following sequence diagram shows how the add command works:
The following activity diagram summarizes what happens when a user executes the add
command:
Alternative 1 (current choice): Separate command add
and addi
for adding applicants and interviews respectively.
Alternative 2: Same command add
for adding applicants and interviews.
addi
command for user to add a new interview to an existing applicant.The edit applicant feature allows users to edit the details of an applicant.
edit 1 hp/87654321 p/front-end engineer
to edit the phone number and position of the first
applicant.EditCommandParser#parse()
checks whether the index of the applicant is valid and at least one prefix with the
required values are provided.EditCommand#execute()
checks if the identity of the applicant after the edit is the
same as the identity of another existing applicant.Model#setApplicant()
updates the details of the applicant while
the Model#updateFilteredApplicantList()
updates applicant list to display the updated applicant list.Alternative 1 (current choice): At least one field to edit has to be provided.
Alternative 2: All fields of the applicant has to be provided, regardless of whether it is edited.
help
.clear
(and subsequently sees a message asking to confirm).yes
to confirm the clear.As a hiring management software, we need to perform CRUD operations for the interviews of applicants. This allows us to add new interviews, view existing interviews, edit current interviews, and delete interviews. As we aim so make our program intuitive and efficient, the UI design and data structure used to store these interview objects were crucial considerations in the implementation process.
The Interview
class is used to store the information of each interview. It contains the following attributes: type
and rating
. The type
attribute represents the type of interview, while the rating
attribute represents how well
the applicant performed in an interview (out of a score of 10). The CRUD commands involving Interview
includes
the AddInterviewCommand
, EditInterviewCommand
, and DeleteInterviewCommand
. These are implemented in a largely
similar manner to the Applicant
class. The main difference is in how an EditInterviewDescriptor
class facilitates
the editing of an interview and how the edit and delete commands requires 2 indices: the applicant index as well as the
chosen interview index.
The activity diagram below gives an overview of the behavior when the DeleteInterviewCommand
is executed:
In deciding the data structure to house our Interview objects, we were torn between using a PriorityQueue
and
a List
. A PriorityQueue
would have been useful in sorting the interviews by rating, but it would have been difficult
to implement the EditInterviewCommand
and DeleteInterviewCommand
as the PriorityQueue
does not have a get()
method. Also, if we wanted to extend a sorting function for interviews in the future, a PriorityQueue
would make it
more difficult for us to change the comparator for Interview
objects. For the sake of extensibility of the codebase,
we decided to use a List
instead. This is because a List
provides us with greater abstraction and code flexibility
in extending various functions for the Interview
class.
The sort feature is facilitated by Descriptor
, an enumeration which describes the valid fields which can be used to
sort an applicant.
To enable sorting, Applicant
implements Comparable<Applicant>
, to allow for comparison between applicants. To allow
for applicants to be sorted by different descriptors, Applicant
is augmented to contain a static descriptor
field.
This is used in Applicant#compareTo()
, where a switch case checking the state of the Descriptor
field will then
compare the specified field of both applicants.
In order to enable comparison of each valid field, these fields will implement the Comparable
interface. Currently
valid fields for sorting are
Additionally, a static boolean Applicant#isDescendingOrder
has been added to keep track of the order to sort the
applicants.
sort d/ [valid field] [dsc/]
, where valid field is one of the fields listed above to be sorted by.SortCommandParser#parse()
checks that the field input is valid and if the dsc/
flag has been entered to sort
in descending order.SortCommand#execute()
updates both the descriptor
and isDescendingOrder
fields of
the Applicant
class.The following diagram summarises what happens when a user executes a Sort command:
sort d/ [valid field]
sort d/ [valid field] [asc/]/[dsc/]
sort d/ [valid field] [dsc/]
where dsc/
is optional
dsc/
feature may not use it.The filter feature works by updating the Predicate
used in the FilteredList<Applicant>
of ModelManager
. Using the
predicate, minimal changes to the implementation of StaffSnap is required.
To create a single predicate that is able to search and filter for multiple fields, a CustomFilterPredicate
class is
created. It currently contains the following fields and is able to filter for applicants which match all specified
fields.
When CustomFilterPredicate#test()
is called, it will check if the specified fields are a substring of the same field
of
the applicant, returning true if all specified fields match, and false otherwise.
filter [n/, e/, p/, hp/, s/, lts/, gts/] [term]
, where at least one or more of the prefixes is
specified to
be filtered by.FilterCommandParser#parse()
checks that all entered fields are valid and creates a new CustomFilterPredicate
with all the specified fields.FilterCommand#execute()
takes in the CustomFilterPredicate
and uses it to replace the
current predicate in ModelManager
via ModelManager#updateFilteredApplicantList()
.The following diagram summarises what happens when a user executes a Filter command:
CustomFilterPredicate
can easily be extended when more applicant fields are ready to expand the utility of
the
filter command.filter n/ [Name] e/ [Email] p/ [Position] hp/ [Phone] s/ [Status] lts/ [Score] gts/ [Score]
filter [n/, e/, p/, hp/, s/, lts/, gts/] [term]
, where only one term is allowed
filter [n/, e/, p/, hp/, s/, lts/, gts/] [term]
, where at least one term is required
and the others are optional
The find feature allows HR managers to find applicants by name, allowing for a faster and more efficient way of finding and tracking specific candidates.
After the user enters the find command in the format find KEYWORD [MORE_KEYWORDS]
,
the input is passed to the ApplicantBookParser
class which calls FindCommandParser#parse()
which parses the keywords
in the input and creates a list of keywords.
FindCommandParser
then creates a new instance of NameContainsKeywordsPredicate
with this list of keywords.
This NameContainsKeywordsPredicate
object is then used as the parameter to instantiate a new FindComand
object.
LogicManager#execute()
then calls FindCommand#execute()
and the current applicant book is updated by calling
ModelManager#updateFilteredApplicantList()
which checks which applicant's name contains any of the keywords.
An instance of CommandResult
is then created which contains the message and information that will be displayed to the
user.
The GUI then updates to show this information to the user.
find JOHN
will return both john and John.find Alice Tan
will match Tan Alice.find Ben Bobby
will return Ben Yang, Bobby Chin.find KEYWORD [MORE_KEYWORDS]
.Alternative 1: Find applicants by name using exact match search
(e.g. find Eddy
will only result in applicants whose name is Eddy)
Alternative 2 (current choice): Find applicants by name using partial match search (or "fuzzy" search)
Pros: More inclusive, can find matches that are related but not exactly the same as KEYWORD
.
This is more user-friendly and allows for faster typing as users do not need to type the exact name out in order
to find
an applicant.
Cons: May return a larger number of results, some of which may not be relevant (false positives), potentially requiring additional filtering or sorting which can be inconvenient and time-consuming.
Alternative 1: find n/NAME
where n/
represents the name to be searched
n/
is unnecessary.Alternative 2 (current choice): find KEYWORDS [MORE_KEYWORDS]
n/
tag.find
command finds applications by name.
This will have to be explained in the user guide.A future extension to this find command is to allow it to find applicants by other fields such as their email or their handphone number. As handphone numbers and emails are likely to be distinct for each applicant, it is possible to enhance the find feature so that it can also search for applicants by these fields.
The import
feature allows users to import data from a CSV file into Staff-Snap. This allows users to populate
Staff-Snap with data from other sources via the commonly used CSV format. By allowing users to import large amounts of
data from other sources without manually typing it in, Staff-Snap becomes more versatile and useful to users.
The import
feature is implemented as a command that takes in a CSV file name as an argument. The command is parsed by
the ImportCommandParser
class, which then calls the ImportCommand
class to execute the command. The ImportCommand
class uses the static parse()
method under CsvApplicantParser
to parse the applicant data into
a List<CsvApplicant>
with the help of the CsvToBeanBuilder<T>
class under com.opencsv.bean
package. If
the List<CsvApplicant>
has been successfully parsed, we then call the ParserUtil::parseApplicantFromCsv()
method to
convert each CsvApplicant
into Applicant
. Lastly, we call the ModelManager
class to import the data from
the List<Applicant>
into Staff-Snap.
Below is the sequence diagram for the import
feature:
Before initiating the import process, we considered it crucial to perform a thorough validation of the CSV file. This included checks for the file's existence, format, and integrity to ensure that the data can be successfully processed.
We also implemented a robust error-handling mechanism to gracefully manage scenarios where the CSV file is malformed or contains errors. For example, to address the possibility of duplicate entries, we first check if the CSV contains duplicate entries within itself, then we also check if the CSV contains entries which are duplicates with existing entries in Staff-Snap. If such duplicates exists, we inform the user of the problematic entries and allow them to rectify the entries before importing.
Target user profile:
Value proposition:
Priorities: High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
* * * | user | view all the available commands | know how to use the app |
* * * | user | add a new applicant | track the the progress of all applicants |
* * * | user | edit an applicant descriptor | maintain an updated database of all applicants |
* * * | user | view the full list of applicants | view the overall progress and performance of all applicants |
* * * | user | delete an applicant entry | only track valid applicants |
* * * | user | add an interview for an applicant | plan screenings and keep track of an applicant's interviews |
* * * | user | edit an interview for an applicant | keep accurate data on an applicant's interview |
* * * | user | delete an interview for an applicant | delete incorrect or unnecessary interviews |
* * * | user | store data locally | use it on a daily basis consistently |
* * | user | find a specific applicant | access the applicant's information quickly |
* * | user | sort applicants by a descriptor | find relevant applicants quickly |
* * | user | filter applicants by a descriptor | look at applicants of a specific category |
* * | user | purge all existing data | remove sample data and populate real data |
* * | user | exit the program | close the program |
* * | user | import data from CSV file | access all applicants' details |
* * | user | mark an applicant as undecided, offered or rejected | keep track of applicants' application status |
* | user | schedule a date for an interview | keep track of all interview timings |
* | user | view a graphical representation of each applicant's rating | get a quick idea of each applicant's ability |
(For all use cases below, the System is Staff-Snap
and the Actor is the user
, unless specified otherwise)
Use case: UC01 - Add an applicant
Guarantees: The new applicant will be added to the list of applicants.
MSS
User inputs the command to add an applicant.
Staff-Snap adds the new applicant to the list and displays the updated list.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends
1b. User enters an applicant that already exists.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User does not enter a required field.
1c1. Staff-Snap shows an error message.
Use case ends.
1d. User enters an invalid value for a field.
1d1. Staff-Snap shows an error message.
Use case ends.
Use case: UC02 - Edit applicant's information
Guarantees: The applicant's information will be updated.
MSS
User inputs the command to edit an applicant's information.
Staff-Snap updates the applicant list with the updated applicant information.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User enters an invalid index for the applicant.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User does not enter at least one field to edit.
1c1. Staff-Snap shows an error message.
Use case ends.
1d. User enters an invalid value for a field.
1d1. Staff-Snap shows an error message.
Use case ends.
1e. User edits the applicant's phone number or email to be the same as another applicant's.
1e1. Staff-Snap shows an error message.
Use case ends.
Use case: UC03 - Delete an applicant
Guarantees: The applicant will be removed from the list of applicants.
MSS
User inputs the command to delete an applicant.
Staff-Snap removes the applicant from the list of applicants.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User enters an invalid index for the applicant.
1b1. Staff-Snap shows an error message.
Use case ends.
Use case: UC04 - List all applicants
Guarantees: All applicants will be listed.
MSS
User inputs the command to view the list of all applicants.
Staff-Snap displays the list of all applicants.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. Applicant list is empty.
1b1. Staff-Snap shows an empty applicant list.
Use case ends.
Use case: UC05 - Change an applicant's status
Guarantees: The applicant's status will be updated.
MSS
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User enters an invalid index for the applicant.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User enters an invalid status.
1c1. Staff-Snap shows an error message.
Use case ends.
Use case: UC06 - Add an interview to an applicant
Guarantees: A new interview will be added to the applicant.
MSS
User inputs the command to add an interview to an applicant.
Staff-Snap updates the applicant information with the new interview.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends
1b. User enters an invalid index for the applicant.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User does not enter a required field.
1c1. Staff-Snap shows an error message.
Use case ends.
1d. User enters an invalid value for a field.
1d1. Staff-Snap shows an error message.
Use case ends.
1e. User enters a duplicate interview type for the applicant that does not exceeds the maximum length after duplicate handling.
1e1. Staff-Snap increment the last number in the interview type until it hits a unique input, or add 1 if there is no number at the end of the interview type.
Use case continues at step 2.
1f. User enters a duplicate interview type for the applicant that exceeds the maximum length after duplicate handling.
1f1. Staff-Snap shows an error message.
Use case ends.
Use case: UC07 - Edit an interview of an applicant
Guarantees: The specified interview will be updated.
MSS
User inputs the command to edit an interview of an applicant.
Staff-Snap updates the interview with the new details and updates the applicant information with the new interview.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends
1b. User enters an invalid index for the applicant.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User enters an invalid index for the interview.
1c1. Staff-Snap shows an error message.
Use case ends.
1d. User does not enter a field to edit.
1d1. Staff-Snap shows an error message.
Use case ends.
1e. User enters an invalid value for a field.
1e1. Staff-Snap shows an error message.
Use case ends.
Use case: UC08 - Delete an interview from an applicant
Guarantees: The specified interview will be deleted from the applicant.
MSS
User inputs the command to delete an interview from an applicant.
Staff-Snap removes the interview from the applicant and updates the applicant information.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends
1b. User enters an invalid index for the applicant.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User enters an invalid index for the interview.
1c1. Staff-Snap shows an error message.
Use case ends.
Use case: UC09 - Find an applicant by name
Guarantees: The applicants whose name matches the search term will be listed.
MSS
User inputs the command to find an applicant by name.
Staff-Snap displays the list of all applicants that match the search.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. No applicant found.
1b1. Staff-Snap shows an empty applicant list.
Use case ends.
1c. No search term provided.
1c1. Staff-Snap shows an error message.
Use case ends.
Use case: UC10 - Sort applicants
Guarantees: The list of applicants will be sorted by the descriptor.
MSS
User inputs the command to sort the applicants by a particular descriptor.
Staff-Snap displays the list of applicants sorted by the descriptor.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User enters an invalid descriptor.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. No descriptor provided.
1c1. Staff-Snap shows an error message.
Use case ends.
Use case: UC11 - Filter applicants
Guarantees: Only applicants that satisfy the specified criterion will be listed.
MSS
User inputs the command to filter the list of applicants by a specified criterion.
Staff-Snap displays the list of all applicants that satisfies the specified criterion.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User enters an invalid criterion.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. No criterion provided.
1c1. Staff-Snap shows an error message.
Use case ends.
Use case: UC12 - Import CSV file
Guarantees: The applicant list will be populated with data from the imported CSV file.
MSS
User inputs the command to import a CSV file.
Staff-Snap updates the applicant list to show the applicant data from the CSV file.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User enters an invalid filename.
1b1. Staff-Snap shows an error message.
Use case ends.
1c. User uses a file with incorrect headers.
1c1. Staff-Snap shows an error message.
Use case ends.
1d. User uses a file with duplicate applicants.
1d1. Staff-Snap shows an error message.
Use case ends.
1e. User uses a file with applicants that are already in Staff-Snap.
1e1. Staff-Snap shows an error message.
Use case ends.
1f. User uses a file with invalid fields.
1f1. Staff-Snap shows an error message.
Use case ends.
Use case: UC13 - List all commands
Guarantees: The list of all available commands will be made accessible.
MSS
User inputs the command to view the list of all available commands.
Staff-Snap opens the user guide in the default browser.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
Use case: UC14 - Clear list of applicants
Guarantees: The list of applicants will be cleared.
MSS
User inputs the command to clear the list of applicants.
Staff-Snap prompts for confirmation
User confirms the action.
Staff-Snap clears the list of applicants and displays an empty list.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
2a. User rejects the confirmation.
2a1. Staff-Snap clears confirmation message.
Use case ends.
Use case: UC15 - Exit the program
Guarantees: Staff-Snap exits.
MSS
User inputs the command to exit the program.
Staff-Snap exits and closes.
Use case ends.
Extensions
1a. User enters an invalid command.
1a1. Staff-Snap shows an error message.
Use case ends.
1b. User closes the application window.
Use case resumes at step 2.
11
or above installed..txt
file)Given below are instructions to test the app manually.
Note: These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing.
Initial launch
Saving window preferences
Adding an applicant
Test case: add n/Jane Greenwood p/Project Manager e/janeg@yahoo.com hp/81234567
Expected: Applicant is added to the list. Details of the new applicant shown in the response area.
Applicant area shows the updated list of applicants.
Test case: add n/Jane Greenwood p/Project Manager e/janeg@yahoo.com hp/81234567
again (Duplicate applicant)
Expected: No applicant is added. Error details shown in the response area. Applicant list in applicant area
remains the same.
Test case: add n/Jane Greenwood p/Project Manager e/janeg@yahoo.com
Expected: Similar to previous.
Other incorrect add commands to
try: add
, add -1
, add n/John Doe e/johndoe@gmail.com p/Software Engineer hp/abc
Expected: Similar to previous.
Editing an applicant while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list.
Test case: edit 1 n/Tom Greenwood
Expected: The name of the first applicant is updated to Tom Greenwood. Updated details of the applicant shown
in the response area.
Applicant area shows the updated list of applicants.
Test case: edit n/Pop Greenwood
Expected: No applicant is edited. Error details shown in the response area. Applicant list in applicant area
remains the same.
Other incorrect edit commands to try: edit
, edit -1 n/Jane Doe
, edit e/email
Expected: Similar to previous.
Deleting an applicant while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list.
Test case: delete 1
Expected: First applicant is deleted from the list. Details of the deleted applicant shown in the response area.
Applicant area shows the updated list of applicants.
Test case: delete 0
Expected: No applicant is deleted. Error details shown in the response area. Applicant list in applicant area
remains the same.
Other incorrect delete commands to try: delete
, delete -1
, delete a
Expected: Similar to previous.
Editing an applicant's status while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list.
Test case: status 1 s/o
Expected: The status of the first applicant is updated to OFFERED. Updated details of the applicant shown in
the response area.
Applicant area shows the updated list of applicants.
Test case: status 1 s/l
Expected: No applicant's status is edited. Error details shown in the response area. Applicant list in applicant
area remains the same.
Other incorrect edit status commands to try: status
, status -1 s/o
, status 1 s/
Expected: Similar to previous.
Adding an interview to an applicant while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list.
Test case: addi 1 t/technical r/8.6
Expected: A technical interview with rating 8.6 is added to the first applicant in the list. Updated details of
the applicant shown in the response area.
Applicant area shows the updated list of applicants.
Test case: addi 0
Expected: No interview is added to any applicant. Error details shown in the response area. Applicant list in
applicant area remains the same.
Other incorrect add interview commands to
try: addi
, addi -1
, addi r/6.0
, addi 1 t/toolonginterviewtypeeeeeeeeeeeeeeee
Expected: Similar to previous.
Editing an interview to an applicant while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list. The first applicant
has at least one interview.
Test case: editi 1 i/1 t/technical r/8.6
Expected: The first interview of the first applicant in the list is updated to a technical interview with rating
8.6. Updated details of the applicant shown in the response area.
Applicant area shows the updated list of applicants.
Test case: editi 0
Expected: No interview is added to any applicant. Error details shown in the response area. Applicant list in
applicant area remains the same.
Other incorrect edit interview commands to
try: editi
, editi -1
, editi 1 i/8 t/technical
, editi 1 i/1 r/12.0
Expected: Similar to previous.
Deleting an interview from an applicant while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list. The first applicant
has at least one interview.
Test case: deletei 1 i/1
Expected: First interview is deleted from the first applicant in the list. Updated details of the applicant shown
in the response area.
Applicant area shows the updated list of applicants.
Test case: deletei 0
Expected: No interview is deleted from any applicant. Error details shown in the response area. Applicant list in
applicant area remains the same.
Other incorrect delete interview commands to try: deletei
, deletei 1
, deletei 1 i/8
Expected: Similar to previous.
Sorting applicants while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list.
Test case: sort d/status
Expected: The applicants in the list are sorted by their status, in the order UNDECIDED, OFFERED, REJECTED.
Success message shown in the response area.
Applicant area shows the updated list of applicants in the sorted order.
Test case: sort d/i
Expected: The list of applicants is not sorted. Error details shown in the response area. Applicant list in
applicant area remains the same.
Other incorrect sort commands to try: sort
, sort d/
Expected: Similar to previous.
Filtering applicants while all applicants are being shown
Prerequisites: List all applicants using the list
command. Multiple applicants in the list.
Test case: filter gts/5.0
Expected: The applicants in the list are filtered by their score, and the updated list contains only applicants
with score of at least 5.0.
Success message shown in the response area. Applicant area shows the filtered list of applicants.
Test case: filter name
Expected: The list of applicants is not filtered. Error details shown in the response area. Applicant list in
applicant area remains the same.
Other incorrect filter commands to try: filter
, filter n/
Expected: Similar to previous.
Importing applicants from a CSV file
Prerequisites: Download a sample CSV file here. The correctly formatted CSV file demo.csv
should be
placed in the home folder of Staff-Snap (i.e. the same folder as the Staff-Snap JAR file).
Test case: import f/demo.csv
Expected: The applicants are imported into Staff-Snap.
Success message shown in the response area. Applicant area shows the updated list of applicants.
Test case: import f/.csv
Expected: No applicants are not imported. Error details shown in the response area. Applicant list in applicant
area remains the same.
-
and slashes /
.import
command does not contain the correct
headers as specified.filter
command.s/
in filter
receives an invalid input, such as p
or 2
.preferences.json
file created by the application before running the application again. We plan to fix this issue in the next iteration.Challenges were faced in evolving the AB3 codebase to support the new features. This was especially true when implementing the Interview features. Since we evolved the Interview components out of the original Tag components, there were many changes that had to be made in order to accommodate the functionalities we intended. For example, we wanted the ability to cumulatively add interviews to an applicant, but the original AB3 Tag system would reset the entire Tag list whenever it was edited.
We also faced challenges in implementing the import
feature. This was because we had to learn how to use the OpenCSV
library and decide which functionalities to include. We also had to learn how to use the CsvToBeanBuilder<T>
class
under the com.opencsv.bean
package to parse the CSV file. While the use of OpenCSV helped to simplify the parsing
process, there were still many modification we made to enable the import
feature. For example, we also had to create a
separate intermediate class CsvApplicant
to store the data parsed from the CSV file before converting it into
an Applicant
object.
The team implemented proactive strategies such as establishing coding conventions, adopting branching strategies, and breaking down tasks into manageable units. Regular meetings were held to discuss the progress of the project and regular communication channels were maintained for team members to update, seek assistance and share insights.
Regular testing and debugging sessions were conducted to identify and address any issues that arose during the integration process. This was crucial to maintain a bug-free, reliable and stable application.
Despite all the challenges faced, we managed to overcome them as a team, picking up valuable skills along the way. We are proud of what we have achieved and are confident that Staff-Snap will be a useful tool for Hiring Managers to manage the hiring and tracking of their applicants.