: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`.
+
:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the RecruitIntel state will not be saved into the `addressBookStateList`.
-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.
+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 RecruitIntel state, and restores the RecruitIntel to that state.

@@ -206,17 +244,17 @@ Similarly, how an undo operation goes through the `Model` component is shown bel

-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 `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 RecruitIntel to that state.
-
: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.
+
:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest RecruitIntel 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.
-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.
+Step 5. The user then decides to execute the command `list`. Commands that do not modify the RecruitIntel, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.

-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.
+Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all RecruitIntel 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.

@@ -228,7 +266,7 @@ The following activity diagram summarizes what happens when a user executes a ne
**Aspect: How undo & redo executes:**
-* **Alternative 1 (current choice):** Saves the entire address book.
+* **Alternative 1 (current choice):** Saves the entire RecruitIntel.
* Pros: Easy to implement.
* Cons: May have performance issues in terms of memory usage.
@@ -237,12 +275,6 @@ The following activity diagram summarizes what happens when a user executes a ne
* 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.
-_{more aspects and alternatives to be added}_
-
-### \[Proposed\] Data archiving
-
-_{Explain here how the data archiving feature will be implemented}_
-
--------------------------------------------------------------------------------------------------------------------
@@ -262,121 +294,537 @@ _{Explain here how the data archiving feature will be implemented}_
**Target user profile**:
-* has a need to manage a significant number of contacts
-* prefer desktop apps over other types
-* can type fast
-* prefers typing to mouse interactions
-* is reasonably comfortable using CLI apps
+* Manages a high volume of candidates across multiple hiring roles.
+* Prefers fast, efficient tools over traditional GUI-based applicant tracking systems (ATS).
+* Comfortable using CLI-based applications and prefers keyboard-driven workflows.
+* Needs quick access to candidate details, notes, and filtering functions for better decision-making.
+* Requires an organized and structured way to track candidate interactions, evaluations, and hiring progress.
+
+**Value proposition**:
+
+A highly efficient, CLI-driven contact management system that enables Apple’s HR recruiters to quickly add, retrieve, and evaluate candidates, reducing manual screening time and improving hiring accuracy.
-**Value proposition**: manage contacts faster than a typical mouse/GUI driven app
### 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… |
+|----------|-----------|----------------------------------------------------------------|---------------------------------------------------------------------------------------|
+| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App or when I start using the app. |
+| `* * *` | recruiter | add a candidate’s name, contact details, and role applied for | keep track of them easily. |
+| `* * *` | recruiter | list all candidates in the system | see at a glance who is currently in the database. |
+| `* * *` | recruiter | remove outdated or irrelevant candidate records | maintain a clean list. |
+| `* * *` | recruiter | find candidates by their names or skills | quickly locate specific individuals. |
+| `* * *` | recruiter | record the candidate's interview performance | facilitate subsequent admission evaluation. |
+| `* * *` | recruiter | add candidates' interview time | schedule an interview. |
+| `* *` | recruiter | sort candidates by increasing interview time | know who is the first to be interviewed. |
+| `* *` | recruiter | edit a candidate's details (e.g. phone, email) | correct mistakes and keep data accurate conveniently. |
+| `* *` | recruiter | classify candidates by a combination of attributes | filter candidates based on specific criteria. |
### Use cases
-(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)
+(For all use cases below, the **System** is the `RecruitIntel` and the **Actor** is the `user`, unless specified otherwise)
+
-**Use case: Delete a person**
+#### Use Case: UC01 - Add New Candidate
**MSS**
+1. HR Recruiter adds a new candidate.
+2. **System** validates the details.
+3. **System** creates a new candidate record and displays a success message.
+ Use case ends.
-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
+**Extensions**
+
+- **1a.** HR Recruiter omits a mandatory detail.
+ - **1a1.** **System** shows an error message and requests correction.
+ - **1a2.** HR Recruiter enters the required detail.
+ - Steps 1a1–1a2 are repeated until all mandatory details are provided.
+ Use case resumes from step 2.
+
+- **2a.** **System** detects invalid data (e.g., phone is non-numeric or email is malformed).
+ - **2a1.** **System** shows an error message and requests correction.
+ - **2a2.** HR Recruiter enters valid data.
+ - Steps 2a1–2a2 are repeated until all data are valid.
+ Use case resumes from step 3.
+
+- **2b.** **System** detects a duplicate candidate (same email).
+ - **2b1.** **System** notifies the recruiter that the candidate already exists.
+ - Steps 2b1–2b2 are repeated until all data are valid.
+ Use case resumes from step 3.
+
+ Use case ends.
+
+#### Use Case: UC02 - List All Candidate
+
+**MSS**
+1. HR Recruiter chooses to list all candidates.
+2. **System** retrieves all candidates.
+3. **System** displays the list of candidates.
+ Use case ends.
- Use case ends.
+#### Use Case: UC03 - Edit Candidate Information
+
+**MSS**
+1. HR Recruiter chooses to edit a candidate.
+2. **System** requests the candidate to be edited.
+3. HR Recruiter enters the candidate to be edited.
+4. **System** requests the new details for the candidate.
+5. HR Recruiter enters the new details for the candidate.
+6. **System** updates the candidate’s details and display a success message.
+
+Use case ends.
+
+**Extension**
+- **3a.** **System** detects an invalid candidate.
+ - **3a1.** **System** requests the recruiter to enter a valid candidate.
+ - **3a2.** HR Recruiter enters a new valid candidate.
+ - Steps 3a1–3a2 are repeated until the input is valid.
+ Use case resumes from step 4.
+- **5a.** **System** detects an invalid detail.
+ - **5a1.** **System** requests the recruiter to enter a valid detail.
+ - **5a2.** HR Recruiter enters a new valid detail.
+ - Steps 5a1–5a2 are repeated until the input is valid.
+ Use case resumes from step 6.
+
+Use case ends.
+
+#### Use Case: UC04 - Classify Candidate
+**MSS**
+1. HR Recruiter chooses to classify some candidates based on tags.
+2. **System** requests the tags to be used to classify.
+3. **System** displays the candidates classified by tags.
+
+Use case ends.
+
+#### Use Case: UC05 - Find Candidate
+**MSS**
+1. HR Recruiter chooses to find a candidate.
+2. **System** requests the keywords to be used to find candidate.
+3. HR Recruiter enters the keywords to find.
+4. **System** finds the candidate and displays the candidate.
+
+ Use case ends.
+
+#### Use Case: UC06 - Enter Note for Candidate
+**MSS**
+1. HR Recruiter chooses to enter a note for a candidate.
+2. **System** requests the candidate that to be added a note.
+3. HR Recruiter enters the chosen candidate.
+4. **System** requests the note to be added for the candidate.
+5. HR Recruiter enters the note for the candidate.
+6. **System** displays the note for the candidate.
+ Use case ends.
+
+**Extension**
+- **3a.** **System** detects an invalid candidate.
+ - **3a1.** **System** requests the recruiter to enter a valid candidate.
+ - **3a2.** HR Recruiter enters a new valid candidate.
+ - Steps 3a1–3a2 are repeated until the input is valid.
+ Use case resumes from step 4.
+- **5a.** **System** detects an invalid note.
+ - **5a1.** **System** requests the recruiter to enter a valid note.
+ - **5a2.** HR Recruiter enters a new valid note.
+ - Steps 5a1–5a2 are repeated until the input is valid.
+ Use case resumes from step 6.
+Use case ends.
+
+#### Use Case: UC07 - Delete Candidate
+
+**MSS**
+1. HR Recruiter chooses to delete a candidate.
+2. **System** requests the candidate to be deleted.
+3. HR Recruiter enters the candidate to be deleted.
+4. **System** deletes the candidate and displays a success message.
+
+Use case ends.
**Extensions**
+- **3a.** **System** detects an invalid candidate.
+ - **3a1.** **System** requests the recruiter to enter a valid candidate.
+ - **3a2.** HR Recruiter enters a new valid candidate.
+ - Steps 3a1–3a2 are repeated until the input is valid.
+ Use case resumes from step 4.
-* 2a. The list is empty.
+Use case ends.
- Use case ends.
+#### Use Case: UC08 - Add Interview Time Information for Candidate
+**MSS**
+1. HR Recruiter chooses to add interview time information for a candidate.
+2. **System** requests the candidate to be added interview time information.
+3. HR Recruiter enters the candidate to be added interview time information.
+4. **System** requests the interview time information for the candidate.
+5. HR Recruiter enters the interview time information for the candidate.
+6. **System** displays the interview time information for the candidate.
+ Use case ends.
-* 3a. The given index is invalid.
+**Extensions**
+- **3a.** **System** detects an invalid candidate.
+ - **3a1.** **System** requests the recruiter to enter a valid candidate.
+ - **3a2.** HR Recruiter enters a new valid candidate.
+ - Steps 3a1–3a2 are repeated until the input is valid.
+ Use case resumes from step 4.
+- **5a.** **System** detects an invalid interview time information.
+ - **5a1.** **System** requests the recruiter to enter a valid interview time information.
+ - **5a2.** HR Recruiter enters a new valid interview time information.
+ - Steps 5a1–5a2 are repeated until the input is valid.
+ Use case resumes from step 6.
+
+Use case ends.
- * 3a1. AddressBook shows an error message.
+#### Use Case: UC09 - Sort Candidates
+
+**MSS**
+1. HR Recruiter chooses to sort candidates.
+2. **System** sorts the candidates based on the interview time.
+3. **System** displays the sorted list.
+ Use case ends.
- Use case resumes at step 2.
+#### Use Case: UC10 - Undo Actions
+**MSS**
+1. HR Recruiter chooses to undo the last action.
+2. **System** undoes the last action.
+ Use case ends.
+
+**Extensions**
+- **1a.** **System** detects that there are no actions to undo.
+ - **1a1.** **System** shows an error message and requests the recruiter to enter a valid action.
-*{More to be added}*
+Use case ends.
+
+#### Use Case: UC11 - Redo Actions
+**MSS**
+1. HR Recruiter chooses to redo the last action.
+2. **System** redoes the last action.
+ Use case ends.
+
+**Extensions**
+- **1a.** **System** detects that there are no actions to redo.
+ - **1a1.** **System** shows an error message and requests the recruiter to enter a valid action.
+
+Use case ends.
+
+#### Use Case: UC12 - Clear All Candidates
+**MSS**
+1. HR Recruiter chooses to clear all candidates.
+2. **System** clears all candidates.
+ Use case ends.
### Non-Functional Requirements
1. Should work on any _mainstream OS_ as long as it has Java `17` 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.
-
-*{More to be added}*
+4. Should ensure that all data entries are processed within 5 seconds under normal operating conditions, providing quick feedback to user interactions.
+5. Application should maintain user data privacy and security, adhering to the latest data protection regulations.
+6. The system should be user-friendly, with an interface that requires no more than 20 minutes of training for new users to perform basic operations.
+7. The system should store candidate information securely.
+8. The system should not crash or freeze when an invalid command is entered.
+9. The system should be self-contained and should not require an internet connection or external databases.
### Glossary
-
-* **Mainstream OS**: Windows, Linux, Unix, MacOS
-* **Private contact detail**: A contact detail that is not meant to be shared with others
-
+* **AB3**: The codebase provided as a starting point for this project. RecruitIntel extends and modifies AB3.
+* **CLI (Command Line Interface)**: A user interface navigated by typing commands into a terminal or console window.
+* **GUI (Graphical User Interface)**: An interface allowing users to interact with electronic devices through graphical icons and visual indicators.
+* **JSON (JavaScript Object Notation)**: A lightweight data-interchange format, easy for humans to read and write, and easy for machines to parse and generate.
+* **Mainstream OS**: Operating systems that are widely used and supported, such as Windows, macOS, Linux, and UNIX.
+* **Parser**: A component that interprets text data within a file according to predefined rules or specifications.
+* **PlantUML**: A tool for quickly writing and sharing visual representations of programs, algorithms, and systems.
+* **Sequence Diagram**: A type of UML diagram showing how objects operate with one another and in what order.
+* **State Pointer**: A reference point tracking the current state or position in a sequence of states.
+* **UML (Unified Modeling Language)**: A standardized modeling language consisting of an integrated set of diagrams.
+* **XML (eXtensible Markup Language)**: A markup language defining rules for encoding documents in a format that is both human-readable and machine-readable.
+* **Tag**: A keyword or term assigned to a piece of information, making it easier to search for and locate.
+* **Candidate**: A person who applies for a job or position, often undergoing an interview process.
+* **Interview**: A formal meeting in which a candidate is evaluated for a position.
+* **Recruiter**: A person responsible for finding and hiring candidates for job positions.
--------------------------------------------------------------------------------------------------------------------
## **Appendix: Instructions for manual testing**
Given below are instructions to test the app manually.
-
:information_source: **Note:** These instructions only provide a starting point for testers to work on;
-testers are expected to do more *exploratory* testing.
-
-
-
### Launch and shutdown
1. Initial launch
1. Download the jar file and copy into an empty folder
- 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
+ 2. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
-1. Saving window preferences
+2. Saving window preferences
1. Resize the window to an optimum size. Move the window to a different location. Close the window.
- 1. Re-launch the app by double-clicking the jar file.
+ 2. Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
-1. _{ more test cases … }_
+3. Exit the App
+
+Enter exit in the command box. This will exit the app.
+
+### Adding a person
+
+Adding a person in the person list:
+
+ 1. Test case `add n/Byran high p/33665544 e/byranh@example.com a/123, Clementi Rd, 335544 j/Hardware Engineer tm/Machine Learning System t/C t/AI`
+ Assumption: We assume there is no person with duplicate email.
+ Excepted:Person added successfully and displayed in the list.
+ 2. Test Case (duplicate email): `add n/Anna Doe p/12345678 e/byranh@example.com a/789, Pasir Panjang Rd, 112233 j/Software Engineer tm/Frontend`
+ Assumption: We assume there is a person with duplicate email in the list.
+ Excepted:Error message shown indicating email duplication.
+ 3. Test Case : `add n/Anna Doe e/bryanh@ab.com a/789, Pasir Panjang Rd, 112233 j/Software Engineer `
+ Excepted:No person is added. Error message shown indicating wrong format.
### Deleting a person
-1. Deleting a person while all persons are being shown
+Deleting a person while all persons are being shown:
1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
- 1. Test case: `delete 1`
+ 2. 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.
- 1. Test case: `delete 0`
+ 3. Test case: `delete 0`
Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.
- 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ 4. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
Expected: Similar to previous.
-1. _{ more test cases … }_
-
-### Saving data
-
-1. Dealing with missing/corrupted data files
-
- 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_
+### Editing a person's information
+Editing a person in the person list:
+ 1. Assumption: We assume the index here is valid if it is a positive integer
+ Test case: `edit 1 t/Java`
+ Expected: The Tag of the first person in the list is changed to Java
+ 2. Test case: `edit 0 t/Java`
+ Expected: No person is edited, an error message will be displayed.
+ 3. Other invalid edit command to try :
+ `edit -1 p/00`
+ `edit 1 e/ab@cd`
+ Expected: No person is edited, an error message will be displayed.
+
+ 4. Other valid edit command to try :
+ `edit 1 n/Robin gen`
+ `edit 1 p/96754328`
+ Expected: the field indicated by the prefix is edit to the information given.
+
+### Finding a person
+Finding a person by name:
+ 1. Test case: `find alice`
+ Expected: All persons with the name that contains `alice` are shown in the list. Other persons are hidden.
+
+### Classifying Persons
+Classifying Persons by some of the tags, team and jobPosition:
+ 1. Test case: `classify t/Python tm/Design j/Software Engineer`
+ Expected: Displays persons matching all given filters.
+
+ 2. Test case : `classify t/Python`
+ Expected: Displays persons have tag Python.
+
+### Clearing All Persons
+Clearing All Persons in the list:
+1. Test Case: `clear`
Expected: All entries are deleted. Application shows an empty list.
+
+### Scheduling an Interview
+Scheduling an interview with duration for a person with positive integer indexes:
+1. Assumption: The minutes of StartTime and Duration must be multiple of 5.
+2. Test case: `interview 1 2025-04-01 10:00 40`
+ Expected: Interview scheduled with startTime 2025-04-01 10:00 and Duration 40;
+3. Test case: `interview 0 2025-04-12 14:00 20`
+ Expected: No interview is scheduled, an error message will be displayed.
+4. Other invalid interview command to try:
+ `interview 1 2025-04-12 14:00 23`
+ `interview 1 2025-04-12 14:12 20`
+ `interview 1 2025 04-12 14:12 15`
+ Expected: No interview is scheduled, an error message will be displayed.
+
+### Adding a Note
+Adding a note for a person:
+1. Assumption: The index here is valid if it is a positive integer
+2. Test case: `note 1 Excellent technical skills observed during the interview.`
+ Expected: Note successfully added to the person's details.
+
+### Sorting the List
+Sort the persons by interview startTime in the current list by ascending order:
+1. Test case: `sort`
+ Expected: List sorted by person's interview time. For persons without interviews,they are displayed at the end of the list.
+
+### Viewing Help
+Viewing help for the commands:
+1. Test case: `help`
+ Expected: Help window opens showing the link of User Guide.
+
+### Undo
+Restores the previous state:
+1. Assumption: Last command belongs to modifying commands (add, delete, edit, etc.)
+2. Test case: undo
+ Expected: Last operation is reversed. The person list is restored to the previous state.
+
+### Redo
+Reapplies the last undone action:
+1. Assumption: Last command is undo.
+2. Test case: redo
+ Expected: Previously undone action reapplied. The person list information is changed.
+
+
+## **Planned Enhancements**
+
+Team size: 4
+1. **Support Multiple Job Applications per Candidate**: Currently, candidates can only apply for one job position and one team at a time, which doesn't reflect real-world scenarios where candidates might be able to apply for multiple roles. We plan to enhance this by:
+ * Modifying the `add` command to accept multiple job positions and teams:
+ ```
+ add n/NAME p/PHONE e/EMAIL a/ADDRESS j/[JOB_POSITION_1, JOB_POSITION_2]
+ tm/[TEAM_1, TEAM_2] [t/TAG]...
+ ```
+ * Example usage:
+ ```
+ add n/John Doe p/98765432 e/johnd@example.com a/123 Apple Park Way
+ j/[Software Engineer, Product Manager] tm/[iOS, Product] t/Swift
+ t/UIKit t/Agile
+ ```
+ * Updating the UI to display multiple roles in the candidate card
+ * Enhancing the `classify` command to match any of the candidate's roles:
+ ```
+ classify j/Software Engineer
+ // Will show candidates who applied for Software Engineer,
+ // even if they applied for other roles too
+ ```
+ * Modifying the storage format to support arrays of job positions and teams per candidate
+
+2. **Prevent Scheduling Interviews in the Past**: Currently, RecruitIntel allows scheduling interviews for past dates, which can lead to confusion and invalid data. We plan to enhance the interview scheduling feature by:
+ * Adding date validation to ensure interview times are always in the future:
+ ```
+ // Current behavior
+ interview 1 2023-01-01 10:00 30 // Allows scheduling in the past
+
+ // Enhanced behavior
+ interview 1 2023-01-01 10:00 30
+ // Error: Cannot schedule interviews in the past. The interview date
+ // must be after the current date and time
+ ```
+ * Implementing real-time date validation that:
+ - Checks if the proposed interview date/time is at least 1 hour in the future
+ - Provides helpful error messages with the current date/time for reference
+
+3. **Enhanced Interview Sorting with Past Interview Handling**: Currently, the sort command doesn't distinguish between upcoming and past interviews, making it difficult to figure out if an interview has happened or not. We plan to enhance the sorting functionality by:
+ * Adding flags to the sort command for more flexible sorting options:
+ ```
+ //Default: sorts all interviews
+ sort
+
+ //Sorts interviews that haven't been completed first
+ sort --nc
+ ```
+ * Key behaviors:
+ - sort --nc sorts upcoming interviews and places past interviews at the end, right before candidates with no interviews
+ - Adds visual indicators for past interviews in the UI
+
+4. **Improved Tag Management**: Currently, tags are completely replaced when editing, which can lead to accidental tag deletion. We plan to enhance tag management by:
+ * Adding specific tag commands:
+ ```
+ tag 1 add t/Python // Adds Python tag to candidate #1
+ tag 1 remove t/Python // Removes only Python tag
+ tag 1 clear // Removes all tags
+ ```
+ * Example usage scenarios:
+ ```
+ // Current behavior (using edit command)
+ edit 1 t/Python // Replaces ALL existing tags with just Python
+
+ // Enhanced behavior (using new tag commands)
+ tag 1 add t/Python // Adds Python while preserving existing tags
+ tag 1 remove t/Java // Removes only Java tag, keeps others
+ ```
+ * Implementing tag validation:
+ - Prevents duplicate tags automatically
+ - Warns before removing all tags
+ * Adding tag management features:
+ - Group related tags (e.g., programming languages, soft skills)
+
+5. **Enhanced Interview Command with Types**: Currently, the interview command only captures timing information without structuring the recruitment process. We plan to enhance the interview scheduling system by:
+ * Adding interview type for better tracking of candidates in the recruitment process:
+ ```
+ //Schedule HR Interview
+ interview 1 2024-03-20 14:00 60 --ty HR
+
+ //Schedule 1st Technical Interview
+ interview 1 2024-03-22 10:00 90 --ty TECH --n 1
+
+ //Schedule Hiring Manager Interview
+ interview 1 2024-03-25 15:00 45 --ty HM
+ ```
+ * Supporting standard interview types:
+ - HR: Initial screening interview
+ - TECH: Technical assessment (can be numbered 1,2,...)
+ - HM: Hiring manager interview
+ - TEAM: Team fit discussion
+ - SYS: System design interview
+ - CODE: Coding assessment
+ - BEHAV: Behavioral interview
+ - FIN: Final round interview
+
+ * Managing interview status:
+ ```
+ // Removes the scheduled interview for candidate #1
+ interview 1 clear
+ ```
+ * Adding type-based filtering:
+ ```
+ list interview --ty TECH // List candidates with technical interviews
+ ```
+
+6. **Enhanced Notes Management**: Currently, notes can only be added as a single entry with limited character space. We plan to enhance the notes functionality by:
+ * Adding commands for more flexible note management:
+ ```
+ // Adds a note entry for candidate #1
+ note 1 add Great technical skills in the system design interview
+
+ // Appends some text to the 1st note
+ note 1 append 1 Also showed strong team collaboration mindset
+
+ // Clears all text of the 1st note
+ note 1 clear 1
+
+ // Removes the second note
+ note 1 remove 2
+ ```
+ * Supporting enhanced note features:
+ - Increased character limit to 1500 characters for each note
+ - Multiple note entries for each candidate
+ - Timestamp for each note entry
+ * Example usage:
+ ```
+ > note 1 add Technical Interview: Candidate showed strong Java knowledge.
+ Added note #1 to John Doe
+
+ > note 1 append Particularly impressed with his system design skills.
+ Updated note #1 for John Doe
+
+ > note 1 add Strong communication and intrapersonal skills. Involved
+ with alot of social work and clubs at university.
+ Added note #2 to John Doe
+
+ > note 1 list
+ Notes for John Doe:
+ 1. Technical Interview: Candidate showed strong Java knowledge.
+ Particularly impressed with his system design skills.
+ 2. Strong communication and intrapersonal skills. Involved with alot
+ of social work and clubs at university.
+ ```
+
+7. **Enhanced Undo Redo Messages**: currently executing the undo and redo command will only show that undo or redo is successful. To help the user better know what has been undone or redone, we plan to enhance the undo and redo command by:
+ * Adding messages to show what action was undone or redone.
+ * Example usage:
+ ```
+ > undo
+ Added Candidate: Bernice Yu; Phone: 99272758; Email: berniceyu@example.com; Address: Blk 30 Lorong 3 Serangoon Gardens, #07-18; Job Position: UI/UX Designer; Team: Design; Tags: [figma][design][experienced]
+ Undo successful!
+
+ > redo
+ Deleted Candidate: Bernice Yu; Phone: 99272758; Email: berniceyu@example.com; Address: Blk 30 Lorong 3 Serangoon Gardens, #07-18; Job Position: UI/UX Designer; Team: Design; Tags: [figma][design][experienced]
+ Redo successful!
+ ```
+
-1. _{ more test cases … }_
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index 27c2d1cf16c..c526ec085d8 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -3,7 +3,29 @@ 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.
+RecruitIntel is a **desktop application designed specifically for Apple's HR recruiters** to efficiently manage candidate information. While offering an easy-to-use visual interface, it features powerful text commands that help process candidate information considerably faster than traditional mouse-based applications.
+### Who is RecruitIntel For?
+**Primary Users:**
+* HR recruiters at Apple, particularly those handling:
+ * Hardware teams (chip design, hardware engineering)
+ * Software teams (iOS, macOS, website development)
+ * Operations teams (retail, security, facilities)
+
+**Prerequisites:**
+* Basic familiarity with command-line interfaces
+* Experience with candidate management systems
+* Access to a computer with Java 17 or above
+
+### What RecruitIntel Does
+**Core Features:**
+* 🚀 Fast candidate information entry and search
+* 🏷️ Classification system for candidate organization
+* 📅 Interview scheduling and management
+* 📝 Note-taking capability for interview feedback
+* 💾 Automated saving of data after changes
+
+
+Navigate through sections using the table of contents below:
* Table of Contents
{:toc}
@@ -12,31 +34,42 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo
## Quick start
-1. Ensure you have Java `17` or above installed in your Computer.
+1. Ensure you have Java `17` or above installed in your computer.
**Mac users:** Ensure you have the precise JDK version prescribed [here](https://se-education.org/guides/tutorials/javaInstallationMac.html).
-1. Download the latest `.jar` file from [here](https://github.com/se-edu/addressbook-level3/releases).
+2. Download the latest `RecruitIntel.jar` from our [releases page](https://github.com/AY2425S2-CS2103T-F14-3/tp/releases).
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+3. Create a dedicated folder for RecruitIntel:
+ * Choose a location with at least 1GB of free space
+ * Ensure you have write permissions for this location
+ * Copy the downloaded JAR file into this folder
+
+4. Launch RecruitIntel:
+ * Open your terminal/command prompt
+ * Navigate to the folder containing the JAR file: `cd path/to/folder`
+ * Run the application: `java -jar recruitintel.jar`
+ * A screen similar to the one below should appear within 5 seconds:
-1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.
- A 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 the command in the command box and press Enter to execute it. For example, typing **`help`** and pressing Enter will open the help window.
Some example commands you can try:
- * `list` : Lists all contacts.
+ * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 j/Software Engineer tm/IOS Development` : Adds a candidate named `John Doe` applying for a `Software Engineer` position in the `IOS Development` team.
+
+ * `note 1 Strong backend experience, but lacks iOS exposure.` : Adds a note to the 1st candidate in the list.
+
+ * `interview 1 2025-04-01 10:00 40` : Schedules a 40-minute interview for the 1st candidate at 10:00 AM on April 1, 2025.
- * `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.
+ * `sort` : Sorts the candidates by ascending order of their scheduled interview time.
- * `delete 3` : Deletes the 3rd contact shown in the current list.
+ * `undo` : Reverts the most recent change (e.g. adding, deleting, or editing a candidate).
- * `clear` : Deletes all contacts.
+ * `clear` : Deletes all candidates.
- * `exit` : Exits the app.
-1. Refer to the [Features](#features) below for details of each command.
+6. Refer to the [Features](#features) below for details of each command.
--------------------------------------------------------------------------------------------------------------------
@@ -46,155 +79,545 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo
**:information_source: 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`.
+* Replace words in `UPPER_CASE` with the required information.
+ * Example: in `add n/NAME`, replace `NAME` with the actual name like `add n/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`.
+* Items in square brackets `[...]` are optional.
+ * Example: `[t/TAG]` can be used as `t/Python` or omitted entirely
-* 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.
+* Items with `…` can be used multiple times or omitted.
+ * Example: `[t/TAG]…` allows:
+ * No tags: ` `
+ * One tag: `t/Python`
+ * Multiple tags: `t/Python t/Java t/AWS`
-* Parameters can be in any order.
+* You can enter the information in any order.
e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.
-* 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`.
-
-* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
-
-
-### Viewing help : `help`
+* The `sort` command only sorts **currently displayed** candidates (i.e. those shown by the last command such as `classify`, `find`, etc.).
-Shows a message explaning how to access the help page.
+* When using `classify` to filter candidates, it will show only candidates that match all of your search criteria.
+ Example: `classify t/python tm/Design` shows candidates who have both Python skills and applied for a position in the Design team.
-
+* For simple commands like `help`, `list`, `exit`, and `clear`, any extra information you type will be ignored.
+ Example: typing `help 123` works the same as typing just `help`.
-Format: `help`
+* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
+