diff --git a/README.md b/README.md
index 13f5c77403f..97c48bb4f23 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,15 @@
-[](https://github.com/se-edu/addressbook-level3/actions)
+[](https://github.com/AY2122S1-CS2103T-W13-1/tp/actions)

-* This is **a sample project for Software Engineering (SE) students**.
- Example usages:
- * as a starting point of a course project (as opposed to writing everything from scratch)
- * as a case study
-* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.
- * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.
- * It comes with a **reasonable level of user and developer documentation**.
-* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).
-* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.
-* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.
+## HR Manager
+
+HR Manager will help you manage the people to be interviewed, making the scheduling process **easier** and **faster** for your company!
+
+Tired of losing track of scheduled interviews?
+HR manager's interviewee manager’s easy to use features will help you to arrange for upcoming interviews quickly and in your desired manner.
+
+The data you have provided will also be stored safely and securely for subsequent uses, transferrable to other devices too!
+
+**_This project is based on the AddressBook-Level3 project created by the SE-EDU initiative._**
+
diff --git a/build.gradle b/build.gradle
index be2d2905dde..944fe88e7dd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -66,7 +66,11 @@ dependencies {
}
shadowJar {
- archiveName = 'addressbook.jar'
+ archiveName = 'HRManager.jar'
}
defaultTasks 'clean', 'test'
+
+run {
+ enableAssertions = true
+}
diff --git a/docs/AboutUs.md b/docs/AboutUs.md
index 1c9514e966a..ff1e0141a68 100644
--- a/docs/AboutUs.md
+++ b/docs/AboutUs.md
@@ -5,55 +5,68 @@ title: About Us
We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).
-You can reach us at the email `seer[at]comp.nus.edu.sg`
-
## Project team
-### John Doe
+### Xu Jiheng
-
+
-[[homepage](http://www.comp.nus.edu.sg/~damithch)]
-[[github](https://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/JeffZincatz)] [[portfolio](team/jeffzincatz.md)]
-* Role: Project Advisor
+* Role: Developer
+* Responsibilities:
+ * Position and interview modelling
+ * List commands (`list_p` and `list_i`)
+ * Refactoring GUI components
+ * Formatting for UG and DG
+ * Reviewing PRs
-### Jane Doe
+### Chua Sue-Ann
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/sueann-chua)] [[portfolio](team/sueann-chua.md)]
-* Role: Team Lead
-* Responsibilities: UI
+* Role: Developer
+* Responsibilities:
+ * Edit and Assign commands (`edit_p`, `edit_i` and `assign`)
+ * Proofreading changes to UG and DG
-### Johnny Doe
+### Mohamed Noriman
-
+
-[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]
+[[github](http://github.com/seaweediman)] [[portfolio](team/seaweediman.md)]
* Role: Developer
-* Responsibilities: Data
+* Responsibilities:
+ * Remark candidate command (`remark_c`)
+ * Add position command (`add_p`)
+ * Delete interview command (`delete_i`)
+ * 'Unassign' command (`unassign`)
+ * Reviewing PRs
-### Jean Doe
+### Liu Wanyu
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/wanyu-l)] [[portfolio](team/wanyu-l.md)]
* Role: Developer
-* Responsibilities: Dev Ops + Threading
+* Responsibilities:
+ * Draft Position Model
+ * Changes to Storage Component
+ * Delete position command (`delete_p`)
+ * Add interview command (`add_i`)
+ * Code tests
-### James Doe
+### Nobel Ang
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/angnobel)] [[portfolio](team/angnobel.md)]
* Role: Developer
-* Responsibilities: UI
+* Responsibilities:
+ * Handle Github issues and milestones
+ * `find_x` command, documentation and tests
diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index 46eae8ee565..b1f79467ef2 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -2,20 +2,42 @@
layout: page
title: Developer Guide
---
-* Table of Contents
+
--------------------------------------------------------------------------------------------------------------------
-
## **Acknowledgements**
-* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}
+* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
+
+--------------------------------------------------------------------------------------------------------------------
+## **Introduction** ##
+
+HR Manger is a simple to use and easy to learn local desktop application that allows you to easily manage your candidates, positions and interviews.
+HR Manager is built on Java and can be run on all major desktop operating systems. HR Manager has a graphic user interface to display information and uses text-based commands to interact with the application.
+
+--------------------------------------------------------------------------------------------------------------------
+## **Purpose** ##
+
+The purpose of this guide is to provide a comprehensive documentation of the design and overview of the application for developers to quickly onboard and develop the application.
+
+You can read the entire guide from the start, which will give you a complete view of the structure of HR Manager.
+
+Alternatively, you can quickly get started by reading through the [Setting Up](#setting-up-getting-started) and [Design](#design) sections to get a overview of the application.
+You can then read the [Feature Implementation](#feature-implementation) for more details of specific features.
--------------------------------------------------------------------------------------------------------------------
## **Setting up, getting started**
-Refer to the guide [_Setting up and getting started_](SettingUp.md).
+
+*HR Manager* is a desktop application built with JavaFX GUI which aims to help with the HR management in small companies. With the application, the user will be able to easily manage their candidates, job postings, and interview sessions.
+
+To set up the application, please refer to the guide [_Setting up and getting started_](SettingUp.md).
+
--------------------------------------------------------------------------------------------------------------------
@@ -23,12 +45,12 @@ Refer to the guide [_Setting up and getting started_](SettingUp.md).
-:bulb: **Tip:** The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/se-edu/addressbook-level3/tree/master/docs/diagrams/) folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.
+:bulb: **Tip:** The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/docs/diagrams/) folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.
### Architecture
-
+
The ***Architecture Diagram*** given above explains the high-level design of the App.
@@ -36,7 +58,7 @@ Given below is a quick overview of main components and how they interact with ea
**Main components of the architecture**
-**`Main`** has two classes called [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java). It is responsible for,
+**`Main`** has two classes called [`Main`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/MainApp.java). 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.
@@ -54,7 +76,7 @@ The rest of the App consists of four components.
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),
@@ -63,19 +85,19 @@ Each of the four main components (also shown in the diagram above),
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`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)
+The **API** of this component is specified in [`Ui.java`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/ui/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. 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`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)
+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`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/resources/view/MainWindow.fxml)
The `UI` component,
@@ -86,168 +108,191 @@ The `UI` component,
### Logic component
-**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)
+**API** : [`Logic.java`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/logic/Logic.java)
Here's a (partial) class diagram of the `Logic` component:
-
+
How the `Logic` component works:
-1. When `Logic` is called upon to execute a command, it uses the `AddressBookParser` class to parse the user command.
-1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `AddCommand`) which is executed by the `LogicManager`.
+1. When `Logic` is called upon to execute a command, it uses the `HrManagerParser` class to parse the user command.
+1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `AddCandidateCommand`) which is executed by the `LogicManager`.
1. The command can communicate with the `Model` when it is executed (e.g. to add a person).
-1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.
+1. The result of the command execution is encapsulated as a `CommandResult` object which is returned from `Logic`.
-The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("delete 1")` API call.
+The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("delete_c 1")` API call.
-
+
-
:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
:information_source: **Note:** The lifeline for `DeleteCandidateCommandParser` 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 `AddressBookParser` 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 `AddressBookParser` returns back as a `Command` object.
-* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.
+* When called upon to parse a user command, the `HrManagerParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCandidateCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCandidateCommand`) which the `HrManagerParser` returns as a `Command` object.
+ * Most significantly, the ArgumentTokenizer is used to parse the arguments using the provided prefixes to retrieve the inputs from the user
+* All `XYZCommandParser` classes (e.g., `AddCandidateCommandParser`, `DeletePositionCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.
### Model component
-**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)
-
-
+**API** : [`Model.java`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/model/Model.java)
+
+
+
+
The `Model` component,
-* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).
-* stores the currently 'selected' `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` 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 the HR Manager data i.e.
+ * all `Person` objects (which are contained in a `UniquePersonList` object).
+ * all `Position` objects (which are contained in a `UniquePositionList` object).
+ * all `Interview` objects (which are contained in a `UniqueInterviewList` object).
+* stores the currently 'selected' `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed'.
+* stores the currently 'selected' `Position` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed'.
+* stores the currently 'selected' `Interview` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed'.
+>To be 'observed' means that the UI can be bound to this list so that the UI automatically updates when the data in the list change.
* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.
* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)
-
:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.
-
-
-
-
-
-
### Storage component
-**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)
+**API** : [`Storage.java`](https://github.com/AY2122S1-CS2103T-W13-1/tp/tree/master/src/main/java/seedu/address/storage/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 `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).
-* depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`)
+* can save both HR Manager data and user preference data in json format, and read them back into corresponding objects.
+* inherits from both `HrManagerStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).
+* depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`).
### Common classes
-Classes used by multiple components are in the `seedu.addressbook.commons` package.
+Classes used by multiple components are in the `seedu.address.commons` package.
--------------------------------------------------------------------------------------------------------------------
-## **Implementation**
+## **Documentation, logging, testing, configuration, dev-ops**
-This section describes some noteworthy details on how certain features are implemented.
+* [Documentation guide](Documentation.md)
+* [Testing guide](Testing.md)
+* [Logging guide](Logging.md)
+* [Configuration guide](Configuration.md)
+* [DevOps guide](DevOps.md)
-### \[Proposed\] Undo/redo feature
+--------------------------------------------------------------------------------------------------------------------
+## **Feature Implementation** ##
-#### Proposed Implementation
+### **Find Commands** ###
-The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:
+The `find_c`, `find_p` and `find_i` command allows users to search for candidates, positions and interviews using their parameters.
+Generally, they are called `find_x` in this section.
-* `VersionedAddressBook#commit()` — Saves the current address book state in its history.
-* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.
-* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.
+The class structure of an execution of `find_x` command is as follows. Only important classes are shown.
+
-These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.
+The `FindXCommandPredicate` holds the parsed arguments from the command and a `test` method to check if X fufils the condition
-Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.
+The sequence diagram of a `find_x` command execution is as follows:
-Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.
+Firstly, the parsing of the command and argument occurs as follows
+
-
+Continuing the previous diagram, the FindXCommand is executed, and the UI is updated
+
-Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.
+#### Design Considerations ####
+Aspect: Logical operators and combinations for find fields
+* Implemented: AND between separate fields and OR within multiple entries in same field
+ * eg: `find_c name=alex brad phone=12345678` === `(phone=12345678) AND (name contains alex OR brad)`
+ * Pros: Easy to implement, simple command format for the most common usecase
+ * Cons: Unable to search using more complex combination of logical operators
+* Alternative: Allow users to specify which operators are used and how they are combined
+ * Pros: Give granular control to the user for find
+ * Cons: Very complex command format
-
-Step 3. The user executes `add n/David …` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.
+### **List Commands** ###
-
+The `list_c`, `list_p` and `list_i` command allows users to list all candidates, positions and interviews in the respective display panel.
+Generally, they are called `list_x` in this section.
-
:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.
+The class structure of an execution of `list_x` command is as follows. Only important classes are shown.
-
+
-Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.
+The `ListXCommandPredicate` uses the preset predicate such that all X fulfills the condition.
-
+The sequence diagram of a `list_x` command execution is as follows:
-
:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather
-than attempting to perform the undo.
+Firstly, the parsing of the command and argument occurs as follows
-
+
-The following sequence diagram shows how the undo operation works:
+Continuing the previous diagram, the ListXCommand is executed, and the corresponding X panel in the UI is updated
-
+
-
:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+### **Edit Commands** ###
-
-
-The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.
+The `edit_c`, `edit_p` and `edit_i` commands allow users to edit a specific candidate, position
+or interview in the respective display panel.
-
:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.
-
-
+Generally, they are called `edit_x` in this section.
-Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.
+The edit mechanism is facilitated by `editXDescriptor`, where X is the placeholder for the object to be edited, for example
+`editPersonDescriptor` for editing candidates, `editPositionDescriptor` for editing positions, and
+`editInterviewDescriptor` for editing interviews, and each non-empty field value will replace the corresponding
+field value of the object that is being edited. `editXDescriptor` stores the details to edit the candidate,
+position or interview with. `editXCommand` extends `Command` and implements the
+`Command#execute()` operation, which executes the command and returns a result message to be displayed.
-
+Similar to any other command, the `Command#execute()` operation is exposed in the `Logic` interface as
+`Logic#execute()`. Please refer to the 'Logic component' under 'Design' for information on how the `Logic`
+component works when a command is executed.
-Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …` command. This is the behavior that most modern desktop applications follow.
+As an example, the parsing and execution of an edit_p command is as follows
-
+
-The following activity diagram summarizes what happens when a user executes a new command:
+### **Add commands** ###
-
+The `add_c`, `add_p` and `add_i` commands allow users to add a candidate, position
+or interview in the respective display panel.
-#### Design considerations:
+Generally, they are called `add_x` in this section. I will also be using X to represent a candidate, position or interview here.
-**Aspect: How undo & redo executes:**
+The add_x functionality is facilitated by `ModelManager`. It uses the following operation of `ModelManager`.
+- `ModelManager#hasX()` — Check if the candidate, position or interview already exists within Hr Manager. If so, `CommandException` will be thrown.
-* **Alternative 1 (current choice):** Saves the entire address book.
- * Pros: Easy to implement.
- * Cons: May have performance issues in terms of memory usage.
+- `ModelManager#addX()` — Adds a candidate, position or interview to Hr Manager. If that position already exists, a
+ `DuplicatePositionException` will be thrown.
-* **Alternative 2:** Individual command knows how to undo/redo by
- itself.
- * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).
- * Cons: We must ensure that the implementation of each individual command are correct.
+`AddXCommandParser` and `AddXCommand` are created to achieve this functionality.
+
-_{more aspects and alternatives to be added}_
+Given below is an example usage scenario and the workflow of the`add_x` command.
-### \[Proposed\] Data archiving
+Step 1. The user executes command `add_x...`.
+`Ui` component reads the command as a string from user's input. After that, `MainWindow`
+passes the string to `LogicManager` to manipulate the command.
-_{Explain here how the data archiving feature will be implemented}_
+Step 2. `LogicManager` passes the command to `HrManagerParser` to parse the command. Since the command starts
+with `add_x`, a new `AddXCommandParser` is created to parse the command further.
+Step 3. `AddXCommandParser` uses `ArgumentMultimap` to tokenize the prefixes part the command. After extracting the
+information of the object such as the title of a position or the name of a candidate, a new `X` is created and a new
+`AddXCommand` is created with that `X`.
---------------------------------------------------------------------------------------------------------------------
+Step 4. `AddXCommand` passes the given `X` to `ModelManager#hasX`. If the position does not exist in the app, `AddXCommand`
+passes the `Position` to `ModelManager#addPosition()`.
-## **Documentation, logging, testing, configuration, dev-ops**
+Step 5. `Modelmanager#addX()` updates the respective list with the new added `X`.
-* [Documentation guide](Documentation.md)
-* [Testing guide](Testing.md)
-* [Logging guide](Logging.md)
-* [Configuration guide](Configuration.md)
-* [DevOps guide](DevOps.md)
+To better illustrate this example, the parsing and execution of an add_p command is as follows
+
--------------------------------------------------------------------------------------------------------------------
@@ -257,73 +302,259 @@ _{Explain here how the data archiving feature will be implemented}_
**Target user profile**:
-* has a need to manage a significant number of contacts
+* is HR professional
+* has to manage multiple applicants, roles, and interviews
* prefer desktop apps over other types
* can type fast
* prefers typing to mouse interactions
* is reasonably comfortable using CLI apps
-**Value proposition**: manage contacts faster than a typical mouse/GUI driven app
-
+**Value proposition**: help them quickly enter the data into the system, reminders of interview timings and ranking of candidates for roles
### User stories
Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`
-| Priority | As a … | I want to … | So that I can… |
-| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |
-| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |
-| `* * *` | user | add a new person | |
-| `* * *` | user | delete a person | remove entries that I no longer need |
-| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |
-| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |
-| `*` | user with many persons in the address book | sort persons by name | locate a person easily |
-
-*{More to be added}*
+| Priority | As a … | I want to … | So that I can… |
+| -------- | ---------- | ------------------------------ | ---------------------------------------------------------------------- |
+| `* * *` | user | be able to add a candidate with all relevant information such as full name, age, contact information, scheduled interview time and date.| |
+| `* * *` | user | be able to delete a candidate | remove the application if it was withdrawn entirely |
+| `* * *` | user | be able to see all active candidates | |
+| `* * *` | user | be able to see the details of a specific candidate | |
+| `* * *` | user | be able to edit the information related to a candidate | correct any wrongly filled information |
+| `* * *` | user | be able to categorize the candidate, whether it was self-applied or referred | carry out administrative processes afterwards more easily |
+| `* * *` | user | be able to add a remark/status to a candidate | make it more visible for the next course of administrative action|
+| `* * *` | user | be able to edit comments of a candidate | update any further remarks for them|
+| `* * *` | user | be able to delete comments of a candidate | remove mistakenly put remarks entirely |
+| `* * *` | user | be able to edit existing tags of a candidate | |
+| `* * *` | user | be able to remove existing tags of a candidate | |
+| `* * *` | user | be able to search for a particular candidate to see his/her upcoming sessions | |
+| `* * *` | user searching for candidates | be able to search for candidates who have a certain remark/description | find candidates by criteria |
+| `* * *` | user | be able to add a job position with its job title | |
+| `* * *` | user | be able to delete a job position | remove the job posting if it was no longer open |
+| `* * *` | user | be able to see all posted job positions | |
+| `* * *` | user preparing interviews | be able to delete an interview session for a candidate if it no longer takes place | |
+| `* * *` | user preparing interviews | be able to view all candidates who will be interviewed on a particular date | keep track of the interviews planned for that day |
+| `* * *` | user after interviews | be able to tag a candidate e.g. by the position they are applying for | group them according to the tags |
+| `* *` | user | see all the candidates scheduled for interview sessions for a particular job posting | |
+| `* *` | user searching for candidates | be able to filter the candidates for some specific requirements | find the right person for the post more efficiently |
+| `* *` | user searching for candidates | be able to search who applied for certain positions | I know all the candidates for that specific position |
+| `* *` | user after interviews | be able to mark a candidate as ‘Interviewed’ | |
+| `* *` | user preparing interviews | be able to schedule a new interview for a candidate | recruit more talent |
+| `* *` | user preparing interviews | be able to delete all other scheduled interview sessions for a particular candidate once I decide to assign him a particular post | |
+| `* *` | user preparing interviews | be reminded of what interviews I have the next day | keep track of them |
+| `* *` | user preparing interviews | be able to reschedule the interview session for a candidate | so that I can keep up with changes coming from the candidate's end |
+| `* *` | user preparing interviews | be able to delete the interview sessions on a particular date | |
+| `* *` | user preparing interviews | search what interviews I have for a particular date | better prepare for that day |
+| `*` | user preparing interviews | add a co-interviewer to an interview | I know who I will be interviewing the candidate with |
+| `*` | user | be able to password lock the application to prevent unauthorised access | |
+| `*` | user | encrypt the save file | prevent my data from being easily stolen |
### Use cases
-(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)
+#### Use case: UC01 - Add a candidate
+
+**MSS**
+
+1. User requests to add a new candidate, with the initial details of the new candidate.
+2. User can see the added candidate.
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The format when adding a candidate is incorrect.
+
+ * 1a1. HR Manager shows an error message.
+
+ Use case ends.
+
+* 1b. The position title the user provided does not exist in the position list.
+
+ * 1b1. HR Manager shows an error message.
+
+ Use case ends.
+
-**Use case: Delete a person**
+#### Use case: UC02 - List all candidates
**MSS**
-1. User requests to list persons
-2. AddressBook shows a list of persons
-3. User requests to delete a specific person in the list
-4. AddressBook deletes the person
+1. User requests to list all candidates.
+2. HR Manager shows a list of all candidates.
- Use case ends.
+ Use case ends.
**Extensions**
-* 2a. The list is empty.
+* 2a. The list of candidates is empty.
+ * 2a1. HR Manager shows that list is empty.
- Use case ends.
+ Use case ends.
+
+#### Use case: UC03 - Delete a candidate
+
+**MSS**
+
+1. User requests to list all candidates (UC02).
+2. User requests to delete a specific candidate.
+3. HR Manager deletes the corresponding candidate and displays result.
+
+ Use case ends
+
+**Extensions**
* 3a. The given index is invalid.
- * 3a1. AddressBook shows an error message.
+ * 3a1. HR Manager shows an error message.
Use case resumes at step 2.
-*{More to be added}*
+#### Use case: UC04 - Add a position
-### Non-Functional Requirements
+**MSS**
+
+1. User requests to add a new position, with the title of the new job position.
+2. User can see the added job position.
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The format when adding a position is incorrect.
+
+ * 1a1. HR Manager shows an error message.
+
+ Use case ends.
+
+* 1b. The position title the user provided already exists in the position list.
-1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.
-2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.
-3. 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.
+ * 1b1. HR Manager shows an error message.
-*{More to be added}*
+ Use case ends.
+
+#### Use case: UC05 - List all positions
+
+**MSS**
+
+1. User requests to list all positions
+2. HR Manager shows a list of all positions
+
+ Use case ends.
+
+**Extensions**
+
+* 2a. The list of positions is empty.
+ * 2a1. HR Manager shows that list is empty.
+
+ Use case ends.
+
+#### Use case: UC06 - Delete a position
+
+**MSS**
+
+1. User requests to list all positions (UC05).
+2. User requests to delete a specific position.
+3. HR Manager deletes the corresponding position and displays result.
+
+ Use case ends
+
+**Extensions**
+
+* 2a. The given index is invalid.
+
+ * 2a1. HR Manager shows an error message.
+
+ Use case resumes at step 2.
+
+
+#### Use case: UC07 - Add an interview
+
+**MSS**
+
+1. User requests to list all positions (UC05).
+2. User requests to list all candidates (UC03).
+3. User requests to add an interview with details for the interview.
+4. HR Manager adds interview.
+5. User can see the added job position.
+
+ Use case ends.
+
+**Extensions**
+
+* 3a. The given position is invalid.
+
+ * 3a1. HR Manager shows an error message.
+
+ Use case resumes at step 3.
+
+* 3b. The given index is invalid.
+
+ * 3b1. HR Manager shows an error message.
+
+ Use case resumes at step 3.
+
+* 3c. The given date is invalid.
+
+ * 3c1. HR Manager shows an error message.
+
+ Use case resumes at step 3.
+
+* 3d. The given time is invalid.
+
+ * 3d1. HR Manager shows an error message.
+
+ Use case resumes at step 3.
+
+* 3e. The given duration is invalid.
+
+ * 3d1. HR Manager shows an error message.
+
+ Use case resumes at step 3.
+
+* 3f. The given status is invalid.
+
+ * 3d1. HR Manager shows an error message.
+
+ Use case resumes at step 3.
+
+#### Use case: UC08 - List all interviews
+
+**MSS**
+
+1. User requests to list all positions
+2. HR Manager shows a list of all positions
+
+ Use case ends.
+
+#### Use case: UC09 - Delete an interview
+
+1. User requests to list all interviews (UC08).
+2. User requests to delete a specific interview.
+3. HR Manager deletes the corresponding position and displays result.
+
+ Use case ends.
+
+**Extensions**
+
+* 2a. The given index is invalid.
+
+ * 2a1. HR Manager shows an error message.
+
+ Use case resumes at step 2.
+
+
+### Non-Functional Requirements
+
+1. Program needs to run on all operating systems with Java 11 installed.
+2. Application needs to handle at least 500 candidates and 500 interviews without a noticeable sluggishness in performance for typical usage and no graphical errors.
+3. A user with above average typing speed should be able to complete tasks faster using commands than they would have using a click-based interface.
### Glossary
* **Mainstream OS**: Windows, Linux, Unix, OS-X
* **Private contact detail**: A contact detail that is not meant to be shared with others
---------------------------------------------------------------------------------------------------------------------
## **Appendix: Instructions for manual testing**
@@ -334,44 +565,244 @@ testers are expected to do more *exploratory* testing.
-### Launch and shutdown
+### Launching the program
1. Initial launch
+ 1. Download the jar file and copy into an empty folder
+ 2. Double-click the jar file Expected: Shows the GUI with a set of sample data. The window size may not be optimum.
+
+1. Saving window preferences
+ 1. Resize the window to an optimum size. Move the window to a different location. Close the window.
+ 2. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained.
- 1. Download the jar file and copy into an empty folder
+### Position Management
- 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
+#### Add a position
-1. Saving window preferences
+1. Adding a position
+ 1. Prerequisite: There must not be a position with `title` 'Software Tester' inside HR Manager.
+ 2. Test case: `add_p title=Software Tester status=open`
+ Expected: Position Software Tester with open status is added to HR Manager. Details of the added position are shown in command feedback box.
- 1. Resize the window to an optimum size. Move the window to a different location. Close the window.
+2. Adding a position with a title already existing in HR Manager.
+ 1. Prerequisite: There must be a position with `title` 'Software Tester' inside HR Manager.
+ 2. Test case: `add_p title=Software Tester`
+ Expected: Position is not added. HR Manager states that `Software Tester` already exists in HR Manager.
- 1. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained.
+#### List all positions
-1. _{ more test cases … }_
+1. Listing all positions
+ 1. Prerequisite: There must be at least 1 position inside HR Manager.
+ 2. Test case: `list_p`
+ Expected: All positions are listed in HR Manager.
-### Deleting a person
+#### Delete a position
-1. Deleting a person while all persons are being shown
+1. Deleting a position
+ 1. Prerequisite: There must be at least 1 position inside HR Manager.
+ 2. Test case: `delete_p 1`
+ Expected: The first position in the list is deleted from the list. Details of the deleted position shown in the command feedback box.
- 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
+2. Entering an invalid position index
+ 1. Prerequisite: There must be at least 1 position inside HR Manager
+ 2. Test case: `delete_p 0`
+ Expected: No position is deleted. HR Manager states that the position index must be a non-zero unsigned integer.
- 1. Test case: `delete 1`
- Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.
+3. Not entering any position index
+ 1. Prerequisite: There must be at least 1 position inside HR Manager
+ 2. Test case: `delete_p`
+ Expected: No position is deleted. HR Manager states that the command format is invalid.
- 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.
+#### Edit a position
- 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous.
+1. Editing a position's title
+ 1. Prerequisite: There must be at least 1 position inside HR Manager.
+ 2. Test case: `edit_p 1 title=Librarian`
+ Expected: The first position in the list has its position edited to 'Librarian'. Details of the edited position are shown in the command feedback box.
-1. _{ more test cases … }_
+2. Editing a position's title to one that already exists in HR Manager.
+ 1. Prerequisites: There must be a 'Software Tester' position in HR Manager. The first position's title is not 'Software Tester'.
+ 2. Test case: `edit_p 1 name=Software Tester`
+ Expected: The position is not edited. HR Manager states that the position already exists in HR Manager.
-### Saving data
+3. Editing a position's status
+ 1. Prerequisite: There must be at least 1 position inside HR Manager.
+ 2. Test case: `edit_p 1 status=closed`
+ Expected: The first position in the list has its status edited to 'closed'. Details of the edited position are shown in the command feedback box. Any candidate with this position will have their position removed.
-1. Dealing with missing/corrupted data files
+2. Editing a position's status to an invalid one.
+ 1. Prerequisite: There must be at least 1 position inside HR Manager.
+ 2. Test case: `edit_p 1 status=invalid`
+ Expected: The position is not edited. HR Manager states that the position status can only be open or closed.
+
+#### Find positions
+
+1. Find positions by title
+ 1. Prerequisite: At least 1 position with the title containing keyword 'Software' inside HR Manager.
+ 2. Test case: `find_p title=Software`
+ Expected: All positions whose title contains 'Software' are listed.
+
+2. Find positions with a title not in HR Manager
+ 1. Prerequisite: No position with the title containing the keyword 'Accountant' inside HR Manager.
+ 2. Test case: `find_p title=Accountant`
+ Expected: No position is listed.
+
+### Candidate Management
+
+#### Add a candidate
+
+1. Adding a candidate
+ 1. Prerequisites : There must not be candidate with `Email` 'johnd@example.com' inside HR Manager. There must be an `Accountant` position in HR Manager.
+ 2. Test case: `add_c name=John Doe phone=98765432 email=johnd@example.com address=311, Clementi Ave 2, #02-25 position=Accountant`
+ Expected: Candidate John Doe is added to HR Manager. Details of the added candidate shown in command feedback box.
+
+2. Adding a candidate applying for a position that does not exist in HR Manager.
+ 1. Prerequisites : There must not be candidate with `Email` 'johnd@example.com' inside HR Manager. There must be an `Accountant` position in HR Manager. There must not be a `Bookkeeper` position.
+ 2. Test case: `add_c name=John Doe phone=98765432 email=johnd@example.com address=311, Clementi Ave 2, #02-25 position=Bookkeeper`
+ Expected: Candidate is not added. HR Manager states that `Bookkeeper` does not exist in HR Manager.
+
+#### List all candidates
+
+1. Listing all candidates
+ 1. Prerequisite : There must be at least 1 candidate inside HR Manager.
+ 2. Test case: `list_c`
+ Expected: All candidates are listed in HR Manager.
+
+#### Delete a candidate
+
+1. Deleting a candidate
+ 1. Prerequisite: There must at least 1 candidate inside HR Manager.
+ 2. Test case: `delete_c 1`
+ Expected: First candidate in the list is deleted from the list. Details of the deleted candidate shown in the command feedback box.
+
+2. Entering an invalid candidate index
+ 1. Prerequisite: There must at least 1 candidate inside HR Manager.
+ 2. Test case: `delete_c 0`
+ Expected: No candidate is deleted. HR Manager states that the candidate index must be a non-zero unsigned integer.
+
+3. Not entering any candidate index
+ 1. Prerequisite: There must be at least 1 candidate inside HR Manager.
+ 2. Test case: `delete_c`
+ Expected: No candidate is deleted. HR Manager states that the command format is invalid.
+
+#### Remark a candidate
+
+1. Remarking a candidate
+ 1. Prerequisite: There must at least 1 candidate inside HR Manager.
+ 2. Test case: `remark_c 1 remark=Great past experiences"
+ Expected: First candidate in the list is given the remark and the remark is displayed together with the candidate's other details. Details of the remarked candidate shown in command feedback box.
+
+2. Entering an invalid candidate index
+ 1. Prerequisite: There must at least 1 candidate inside HR Manager
+ 2. Test case: `remark_c 0 remark=Great past experiences"
+ Expected: No candidate is remarked. HR Manager states that the candidate index must be a non-zero unsigned integer.
+
+#### Edit a candidate
+
+1. Editing a candidate
+ 1. Prerequisite: There must be at least 1 candidate inside HR Manager.
+ 2. Test case : `edit_c 1 name=Aiken Lee`
+ Expected: First candidate in the list has their name edited to Aiken Lee. Details of the editedd candidate shown in the command feedback box.
+
+2. Editing a candidate's position to a position that does not exist in HR Manager.
+ 1. Prerequisite: There must not be a `Bookkeeper` position in HR Manager.
+ 2. Test case : `edit_c 1 position=Bookkeeper`
+ Expected: Candidate is not edited. HR Manager states that `Bookkeeper` does not exist in HR Manager.
+
+#### Find candidates
+
+1. Finding candidates
+ 1. Prerequisite: There must be an `Accountant` position in HR Manager. There must be at least 1 candidate inside HR Manager that applied for the `Accountant` position.
+ 2. Test case : `find_c position=Accountant`
+ Expected: Candidates that applied for the `Accountant` position are listed in the candidates list.
+
+2. Finding candidates with a position not in HR Manager
+ 1. Prerequisite: There must be no `Bookkeeper` position in HR Manager.
+ 2. Test case: `find_c position=Bookkeeper`
+ Expected: No candidates listed.
+
+### Interview Management
+
+#### Add an Interview
+
+1. Adding an interview with multiple candidates to HR Manager
+ 1. Prerequisites:
+ * Position `Bookkeeper` exists in HR Manager.
+ * No other interview for `Bookkeeper` with the same date, time and duration that already exist in HR Manager.
+ * Current displayed list of candidates has at least 2 entries and the first and second candidates have applied for `Bookkeeper`.
+ 2. Test case: `add_i position=Bookkeeper c=1 2 date=17/10/2021 time=1400 duration=120 interviewed=pending`
+ Expected: new interview for `Bookkeeper` on `17 Oct 2021`, `1400 ~ 1600` with status `PENDING`, with first and second candidates from the current displayed list of candidates is added to the bottom of the list of interviews.
+
+2. Adding an interview with an invalid date provided
+ 1. Prerequisites: There must be an `Bookkeeper` position in HR Manager. There must be at least 1 candidate inside HR Manager. First candidate must have applied for `Bookkeeper`.
+ 2. Test case: `add_i position=Bookkeeper c=1 date=32/10/2021 time=1400 duration=120 interviewed=pending`
+ Expected: no interview added, invalid date error message shown in feedback box.
+
+#### List All Interviews
+
+1. Listing all interviews in HR Manager
+ 1. Prerequisite : There must be at least 1 interview inside HR Manager
+ 2. Test case: `list_i`
+ Expected: If filtered list of interviews was displayed previously, the complete list of interviews is rendered. Otherwise, the interview list is re-rendered. This command should not fail if typed correctly.
+
+#### Delete An Interview
+
+1. Deleting an interview from HR Manager
+ 1. Prerequisites: Current displayed list of interviews is not empty
+ 2. Test case: `delete_i 1`
+ Expected: First interview from the current displayed list of interviews is deleted from HR Manager.
+
+2. Deleting an interview with an invalid index
+ 1. Prerequisites: Current displayed list of interviews is not empty
+ 2. Test case: `delete_i 0`
+ Expected: No interview deleted, error message and sample input shown in feedback box.
+
+#### Edit An Interview
+
+1. Editing an interview in HR Manager
+ 1. Prerequisites: Current displayed list of interviews is not empty
+ 2. Test case: `edit_i 1 date=11/11/2021`
+ Expected: First interview from the current displayed list of interviews has its date set to 11th November 2021.
+
+2. Editing an interview in HR Manager with an invalid index
+ 1. Prerequisites: There must be at least 1 interview in HR Manager
+ 2. Test case: `edit_i 0 date=12/11/2021`
+ Expected: No interview edited, error message and sample input shown in feedback box.
+
+#### Assign An Interview
+
+1. Assigning multiple candidates to an interview in HR Manager.
+ 1. Prerequisites: Current displayed lists of interviews and candidates are not empty and the first two candidates have applied for the position that the first interview is for
+ 2. Test case: `assign c=1 2 i=1`
+ Expected: First and second candidates is assigned to the first interview
+
+2. Assigning invalid candidates from an interview in HR Manager
+ 1. Prerequisites: There must be at least 1 candidate and 1 interview in HR Manager
+ 2. Test case: `assign c=0 2 i=1`
+ Expected: No candidate is assigned to the first interview, invalid index error message shown in feedback box
+
+#### Unassign Candidates
+
+1. Unassigning multiple candidates from an interview in HR Manager
+ 1. Prerequisites: Current displayed lists of interviews and candidates are not empty and the first two candidates have been assigned to the first interview
+ 2. Test case: `unassign c=1 2 i=1`
+ Expected: First and second candidates is unassigned from the first interview.
+
+2. Unassigning invalid candidates from an interview in HR Manager
+ 1. Prerequisites: There must be at least 1 candidate and 1 interview in HR Manager
+ 2. Test case: `unassign c=0 1 i=1`
+ Expected: No candidates unassigned from the first interview, invalid index error message shown in feedback box.
+
+#### Find An Interview
+
+1. Finding an interview with date information
+ 1. Prerequisites: There must be no interviews on 11th November 2021
+ 2. Test case: `find_i date=11/11/2021`
+ Expected: No interviews listed
+
+2. Finding an interview with an invalid time
+ 1. Test case: `find_i time=2500`
+ Expected: Command does not execute, invalid time error message is shown in feedback box
- 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_
-1. _{ more test cases … }_
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index 3716f3ca8a4..e938e8a2cf3 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -3,190 +3,687 @@ layout: page
title: User Guide
---
-AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.
-
-* Table of Contents
+
+
+## Introduction
+HR Manger is a simple to use and easy to learn local desktop application that allows you to easily manage your candidates, positions and interviews.
+HR Manager is built on Java and can be run on all major desktop operating systems. HR Manager has a graphic user interface to display information and uses text-based commands to interact with the application.
+
+HR Manager will help you manage the candidates to be interviewed,
+making the scheduling process easier and faster for your company!
+It is easy to interact with the app through simple to learn and easy to share text commands!
+Tired of losing track of scheduled interviews?
+HR manager's easy to use features will help you to arrange for upcoming interviews quickly in your desired manner.
+The data you provide will also be stored safely and securely for subsequent uses,
+transferable to other devices too!
+
+--------------------------------------------------------------------------------------------------------------------
+
+## Purpose
+The purpose of this user guide is to give a complete documentation of HR Manger and allow you to easily get started on HR Manager.
+The user guide is also the easiest way for you to troubleshoot any issues and clarify any questions you have with HR Manager.
+Lets simplify your HR processes!
+
+--------------------------------------------------------------------------------------------------------------------
+
+## How to use this user guide?
+This user guide is a complete guide for all commands and features for HR Manager.
+You can read the whole guide for a comprehensive understanding of the application.
+
+Alternatively, you can quickly get started using the [Quick Start](#quick-start) and [Command Summary](#command-summary).
+If you face any issues, you can check the details for each command under the [Features](#features) section.
+There are 4 sections under the Features section: [General Commands](#feature-general-commands), [Job Position Management](#feature-job-position-management), [Candidate Management](#feature-candidate-management) and [Interview Management](#feature-interview-management).
+Each section has its own input table that details the requirements and restrictions of each input of that section.
+
+--------------------------------------------------------------------------------------------------------------------
+
+## HR Manager User Interface
+Before going into the features, you may want to familiarise yourself with the user interface.
+HR Manager has a simple user interface that consists of 6 main components, which are shown in the image below.
+
+
+
+
+#### Table of components of HR Manager's user interface, with reference to the image above
+
+| No. | Component | Description |
+| -------- | ------------------ | ------------------ |
+| **1** | Tool Bar | Provides easy access to Exit and Help functions. |
+| **2** | Command Input Box | This is where you would type in the commands in HR Manager. |
+| **3** | Command Feedback Box | This is where feedback will be displayed after HR Manager receives your command input. |
+| **4** | Candidate List | This is where all the candidates stored in HR Manager will be displayed. The list can be filtered by using the relevant commands. |
+| **5** | Position List | This is where all the job positions stored in HR Manager will be displayed. The list can be filtered by using the relevant commands. |
+| **6** | Interview List | This is where all the interviews stored in HR Manager will be displayed. The list can be filtered by using the relevant commands. |
--------------------------------------------------------------------------------------------------------------------
## Quick start
-1. Ensure you have Java `11` or above installed in your Computer.
+1. Ensure you have Java `11` or above installed in your Computer. You can check what version of Java you have by following this guide [here](https://www.java.com/en/download/help/version_manual.html).
-1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).
+2. Download the latest `HRManager.jar` from [here](https://github.com/AY2122S1-CS2103T-W13-1/tp/releases).
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+3. Copy the file to the folder you want to use as the _home folder_ for your HR Manager.
-1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
+4. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.

-1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
+5. Type a command in the command box, which is the box that says "Enter command here...", and press Enter to execute it. e.g., typing **`help`** and pressing Enter will open the help window.
Some example commands you can try:
- * **`list`** : Lists all contacts.
+* **`list_c`** : Lists all candidates.
- * **`add`**`n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.
+* **`add_c`**`name=Bryan Seah email=bsah@gmail.com phone=12345678 address=311, Clementi Ave 2, #02-25 position=Project Manager` : Adds a contact named `Bryan Seah` to the HR Manager.
- * **`delete`**`3` : Deletes the 3rd contact shown in the current list.
+* **`delete_c`**`3` : Deletes the 3rd candidate shown in the current candidate list.
- * **`clear`** : Deletes all contacts.
+* **`clear`** : Deletes all candidates, positions, interviews.
- * **`exit`** : Exits the app.
+
-1. Refer to the [Features](#features) below for details of each command.
+WARNING: Please note that `clear` is an irreversible command and all existing data will be permanently deleted.
---------------------------------------------------------------------------------------------------------------------
+
-## Features
+* **`exit`** : Exits the app.
+
+* Refer to [Features](#features) below for details of each command.
+--------------------------------------------------------------------------------------------------------------------
+## Features
-**:information_source: Notes about the command format:**
+**Notes about the command format:**
-* Words in `UPPER_CASE` are the parameters to be supplied by the user.
- e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.
+* Words in `` are the parameters to be supplied by the user.
+ e.g., in `add_c name=`, `NAME` is a parameter which can be used as `add_c name=John Doe`.
* Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.
+ e.g., `name= [tag=] [status=]` can be used as `name=John Doe tag=friend status=scheduled` or as `name=John Doe`.
* Items with `…` after them can be used multiple times including zero times.
- e.g. `[t/TAG]…` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.
+ e.g., `[position=]...` can be used as ` ` (i.e. 0 times), `position=Accountant`, `position=Accountant position=Bookkeeper` etc.
* Parameters can be in any order.
- e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.
+ e.g., if the command specifies `name= phone=`, `phone= name=` is also acceptable.
-* If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken.
- e.g. if you specify `p/12341234 p/56785678`, only `p/56785678` will be taken.
+* If a parameter is expected only once in the command, but you specified it multiple times, only the last occurrence of the parameter will be taken.
+ e.g., if you specify `phone=12341234 phone=56785678`, only `phone=56785678` will be taken.
* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
- e.g. if the command specifies `help 123`, it will be interpreted as `help`.
+ e.g., if the command specifies `help 123`, it will be interpreted as `help`.
-### Viewing help : `help`
+### Feature: General Commands
+
+#### Viewing help: `help`
-Shows a message explaning how to access the help page.
+Shows a message explaining how to access the user guide.

-Format: `help`
+Format:
+`help`
-### Adding a person: `add`
+#### Clearing all entries : `clear`
-Adds a person to the address book.
+Clears all entries from HR Manager
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…`
+Format:
-
:bulb: **Tip:**
-A person can have any number of tags (including 0)
-
+`clear`
-Examples:
-* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`
-* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`
+#### Exiting the program : `exit`
-### Listing all persons : `list`
+Exits the program.
-Shows a list of all persons in the address book.
+Format:
-Format: `list`
+`exit`
-### Editing a person : `edit`
+### Feature: Job Position Management
-Edits an existing person in the address book.
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…`
+Manage a list of job positions posted by your company, with the simple instructions below!
-* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …
-* At least one of the optional fields must be provided.
-* Existing values will be updated to the input values.
-* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.
-* You can remove all the person’s tags by typing `t/` without
- specifying any tags after it.
-Examples:
-* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.
-* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.
+#### Table of Inputs for Position Management
-### Locating persons by name: `find`
+| Parameter | Examples | Conditions |
+| -------- | ------------------ | ------------------ |
+| **TITLE** | `Software engineer`, `Accountant`| Must be alphanumeric (spaces allowed) and contain at least 1 character |
+| **INDEX** | `1`, `2`| Must be a positive integer smaller than 2147483647 corresponding to the index of the intended position in the currently displayed list of candidates|
+| **STATUS** | `open`, `closed` | Must only be either of the 2 examples for the status of an interview, case insensitive |
-Finds persons whose names contain any of the given keywords.
+All commands below are subjected to these restrictions except `find_p`
-Format: `find KEYWORD [MORE_KEYWORDS]`
+> Refer to the [Notes about the command format](#features) for the details on the command format
-* The search is case-insensitive. e.g `hans` will match `Hans`
-* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`
-* Only the name is searched.
-* Only full words will be matched e.g. `Han` will not match `Hans`
-* Persons matching at least one keyword will be returned (i.e. `OR` search).
- e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`
+#### Add a position: `add_p`
-Examples:
-* `find John` returns `john` and `John Doe`
-* `find alex david` returns `Alex Yeoh`, `David Li`
- 
+*Adds a job position to the list of positions.*
-### Deleting a person : `delete`
+Format:
-Deletes the specified person from the address book.
+`add_p title=`
-Format: `delete INDEX`
+Example:
-* Deletes the person at the specified `INDEX`.
-* The index refers to the index number shown in the displayed person list.
-* The index **must be a positive integer** 1, 2, 3, …
+`add_p title=Assistant`
-Examples:
-* `list` followed by `delete 2` deletes the 2nd person in the address book.
-* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.
+* Adds a job position with the title of Assistant, with a default status of 'open'.
-### Clearing all entries : `clear`
+* Adding a job position always sets the position status to 'open'. Refer to `edit_p` on how you can change the status
+ of a job position to 'closed'.
+
+
-Clears all entries from the address book.
+#### List all positions: `list_p`
-Format: `clear`
+*Displays a list of all the positions stored in the application.*
-### Exiting the program : `exit`
+Format:
-Exits the program.
+`list_p`
+
+
+
+#### Delete a position: `delete_p`
+
+*Deletes a position from the list of positions.*
+
+Format:
+
+`delete_p `
+
+Example:
+
+`delete_p 3`
+
+* Deletes the 3rd position from the list of positions.
+* Also deletes this position from every candidate who applied for the position
+
+
+
+#### Edit a position: `edit_p`
+
+*Edits a specific position's details. Only one edit field is needed, but users cannot edit both fields.
+ For instance, you can either choose to edit the title of a position, or the status of the position,
+ but not both at the same time.*
+
+Format:
+
+`edit_p [title=]`
+
+OR
+
+`edit_p [status=]`
+
+Example:
+
+`edit_p 2 title=Data Analyst`
+
+* Edits the title of the 2nd position in the list to 'Data Analyst'.
+
+* Editing the title of the specified position will update the position title in any scheduled interviews for
+ that position, along with any candidates who have applied for that position.
+
+
+
+`edit_p 3 status=closed`
+
+* Edits the status of the 3rd position in the list to closed.
+* Setting position status to close will delete the position from every candidate who applied for the position.
+
+
+
+#### Find a position: `find_p`
+
+*Filters the position list based on the parameters provided. Minimum of 1 field is needed. Searching is case-insensitive*
+
+All fields are not subjected to the restriction in the input table and can take any string.
+
+Format:
+
+`find_p [title=]... [status=]...`
+
+Example:
+
+`find_p status=closed title=Accountant Engineer`
+
+* Finds all positions that are closed and title contains "Accountant" or "Engineer"
+ * (status contains word "closed") AND (title contains word "Accountant" OR "Engineer")
+* Within 1 field, keywords are separated by a space
+ * Command will find jobs that contains at least 1 of the keywords (OR)
+* Across different fields
+ * Command will return jobs that contain all the fields (AND)
+
+
+
+
+### Feature: Candidate Management
+
+Manage a list of candidates for your company, with the simple instructions below!
+Each candidate is uniquely identified by their email.
+Different candidates can have the same name as along as they do not share the same email.
+
+#### Table of Inputs for Candidate Management
+
+| Parameter | Examples | Conditions |
+| -------- | ------------------ | ------------------ |
+| **NAME** | `Alex`, `Clarice`| Any string. Any leading or trailing spaces will be removed |
+| **EMAIL** | `alex@gmail.com`, `clarice@usc`| In the format local-part@domain 1. The local-part should only contain alphanumeric characters and these special characters, excluding the parentheses, (+_.-). The local-part may not start or end with any special characters.
2. This is followed by a '@' and then a domain name. The domain name is made up of domain labels separated by periods. The domain name must: - end with a domain label at least 2 characters long - have each domain label start and end with alphanumeric characters - have each domain label consist of alphanumeric characters, separated only by hyphens|
+| **PHONE_NUMBER** | `928389492, 623792` | At least 3 numbers |
+| **ADDRESS** | `Block 123, Woodlands Avenue 1, #09-34` | Any string. Any leading or trailing spaces will be removed |
+| **POSITION** | `Software engineer`, `teSTer` | Title of any position that is currently open, case insensitive |
+| **STATUS** | `None`, `Applied`, `Scheduled`, `Interviewed`, `Accepted`, `Rejected`, `Withdrawn` | Must be one of the given examples, case insensitive |
+| **TAG** | `experienced`, `priority` | Must be alphanumeric, without spaces |
+| **INDEX** | `1`,`2` | Must be a positive integer smaller than 2147483647 corresponding to the index of the intended candidate in the currently displayed list of candidate |
+| **REMARK** | `Great Experience`, `@@@ ___ Test Remark` | Any string, leading or trailing spaces are removed|
+
+> Status for candidates are different than statuses for position and interviews
+
+All commands in this section are subjected to the restriction in this table except `find_c`
+
+> Refer to the [Notes about the command format](#features) for the details on the command format
+
+#### Add a candidate: `add_c`
+
+*Adds a candidate to the list of candidates.*
+
+Format:
+
+`add_c name= email= phone= address= position=... [status=] [tag=]...`
+
+Example:
+
+`add_c name=Bryan Seah email=bsah@gmail.com phone=12345678 address=311, Clementi Ave 2, #02-25 position=Project Manager status=Scheduled`
+
+* Subjected to all constraints per the Table of Inputs for Candidate Management
+* `STATUS` will default to `APPLIED` if field is left empty
+
+
+
+#### List all candidates: `list_c`
+
+*Displays a list of all the candidates stored in the application.*
+
+Format:
+
+`list_c`
+
+
+
+#### Delete a candidate: `delete_c`
+
+*Deletes a candidate along with his/her details from the list of candidates.*
+
+Format:
+
+`delete_c `
+
+Example:
+
+`delete_c 3`
+
+* Deletes the 3rd candidate along with his/her details from the list of candidates.
+ * Also deletes this candidate from any interview he/she was scheduled for.
+
+
+
+
+#### Remark a candidate: `remark_c`
+
+*Adds a remark to a candidate.*
+
+Format:
+
+`remark_c remark=`
+
+Example:
+
+`remark_c 1 remark=20 years of experience`
+
+* Adds a remark to the 1st candidate that he/she has 20 years of experience.
+* There is practically no limit to the length of remark you can add
+
+
+
+#### Edit a candidate: `edit_c`
-Format: `exit`
+*Edits a candidate's details. All the details of the candidate can potentially be edited. At least 1 edit field is needed. Fields specified will be replaced with the new value*
-### Saving the data
+Format:
-AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+`edit_c [name=] [email=] [phone=] [address=] [status=] [tag=]... [position=]...`
-### Editing the data file
+Example:
-AddressBook data are saved as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.
+`edit_c 3 name=Ryan Koh`
-
:exclamation: **Caution:**
-If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run.
+* Edit the name of the 3rd candidate in the list to Ryan Koh.
+* If a candidate has an [interview](#feature-interview-management), editing a status to `APPLIED` is not allowed and an error message will be shown. You can choose to change to other status such as `NONE`.
+
+
+#### Find a Candidate: `find_c`
+
+*Filters the candidate list based on the parameters provided. Minimum of 1 field is needed. Searching is case-insensitive*
+
+All fields are not subjected to the restriction in the input table and can take any string
+
+Format:
+
+`find_c [name=]... [email=]... [phone=]... [address=]... [status=]... [tag=]... [position=]...`
+
+Example:
+
+`find_c name=Alex tag=recommended priority`
+
+* Finds all candidates that have the word "Alex" in their name and have position that contain the word "Accountant" or "Engineer"
+ * (name contains "Alex") AND (title contains Accountant OR Engineer)
+* Candidates that will be found
+ * name="Alex Maslow", tags="recommended", ...
+ * name="alex", tags="priority candidate",...
+* Candidates that will not be found
+ * name="AlexMaslow", tags="recommended", ... (Word "Alex" not in name)
+ * name="Alex Maslow", tags="" (No tags containing word "recommended" or "priority")
+* Within 1 field, keywords are separated by a space
+ * Command will find candidates that contains at least 1 of the keywords (OR)
+* Across different fields
+ * Command will return candidates that contain all the fields (AND)
+
+
+
+
+
+### Feature: Interview Management
+
+Manage a list of scheduled interviews, with the simple instructions below!
+
+#### Table of Inputs for Interview Management
+
+| Parameter | Examples | Conditions |
+| -------- | ------------------ | ------------------ |
+| **POSITION** | `Software engineer`, `Accountant`| Must be added to HR Manager and must have been applied by corresponding candidates before it can be used |
+| **INDEX** | `1`, `2`| Must be a positive integer smaller than 2147483647 corresponding to the index of the intended candidate in the currently displayed list of candidates|
+| **DATE** | `18/10/2021` for 18th October 2021, `1/9/2021` for 1st September 2021 | Must be in DD/MM/YYYY form and can tolerate single digit for day and month, but year must be 4 digits |
+| **TIME** | `0600` for 6 a.m., `1800` for 6 p.m. | Must be in HHMM, following 24-hour format |
+| **DURATION** | `120` for 120 minutes, `75` for 75 minutes | Must a positive integer more than 0 and less than 1440, number of minutes in a day|
+| **STATUS** | `pending`, `completed` | Must only be either of the 2 examples for the status of an interview, case insensitive |
+
+All commands in this section are subjected to the restriction in this table except `find_i`.
+
+> Refer to the [Notes about the command format](#features) for the details on the command format
+
+#### Add an interview: `add_i`
+Use the following command to record the details of an interview session with the candidate(s) for a position!
+
+*Adds an interview to the list of interviews.*
+
+Format:
+
+`add_i position= date= time=