# Tangerine HRM — Product Requirements (v1.1)

Tangerine HRM is an HR suite with an employee self-service (ESS) role and an HR admin role. It covers sign-in, the employee master list (PIM) with Add Employee, a company Directory, My Info, leave application and listing, a weekly timesheet, claim requests and a Buzz newsfeed. Screens follow the classic /web/index.php/<module>/<screen> URL layout and confirm writes with toasts.

**Problem.** Employees and HR staff need everyday HR tasks to work the same way every time: validation must be inline and specific, and anything confirmed with a success message must really be saved and visible afterwards.

## Users
- **Employee (ESS)** — Apply for leave, check personal details, view the timesheet and read the newsfeed.
- **HR admin** — Add employees with unique ids and find any employee quickly.

## Goals
- A "Successfully Saved" toast always means the data was stored and can be found again.
- Employee ids are unique; searching by id returns exactly that employee.
- Counts shown to the user equal the records actually listed.
- Overlapping leave cannot be submitted.

## Login and logout (AUT)

Classic login page with client-side and server-side validation.

- **FR-AUT-01** (Must) A valid user signs in from the Login page and lands on the Dashboard with their name in the header.
  - Login page shows Username, Password, Login and a "Forgot your password?" link, both fields empty, password masked
  - URL contains "/dashboard/index"; header shows "Jacob Palmer" for the seeded employee
- **FR-AUT-02** (Should) Logout from the user menu ends the session; protected pages then redirect to Login.
  - Menu: About, Support, Change Password, Logout
  - After Logout the URL contains "/auth/login", fields are empty; opening the Dashboard URL returns to Login
- **FR-AUT-03** (Must) An empty login is blocked client-side.
  - "Required" under Username and under Password; URL stays on /auth/login
- **FR-AUT-04** (Must) A wrong password is refused with a generic message that does not reveal which part was wrong.
  - Alert "Invalid credentials"; still on the Login page
- **FR-AUT-05** (Should) The session is kept in the browser: after visiting an unrelated page on another path and returning, the user is still signed in.
  - Returning to My Info shows Personal Details without a new login

## PIM employee records (PIM)

Employee list, search and Add Employee (admin).

- **FR-PIM-01** (Must) An admin can add an employee with first, middle and last name and an Employee Id of at most 10 characters; the form pre-fills a generated id.
  - "Successfully Saved" toast, then the new employee's Personal Details opens
  - The employee appears in Employee List when searched by name, under "(N) Records Found"
- **FR-PIM-02** (Must) An Employee Id that is already in use is refused inline and no record is created.
  - "Employee Id already exists" under the field; no toast; stays on Add Employee
- **FR-PIM-03** (Must) Employee List search by Employee Id returns exactly the matching employee.
  - Id 0422: "(1) Records Found" with Jacob Palmer only

## Directory (DIR)

Cards for every active employee.

- **FR-DIR-01** (Should) The Directory lists every active employee as a card; the count is unchanged by Search without filters and returns after Reset.
  - "(46) Records Found"
  - Job Title "QA Engineer" narrows the cards and count; Reset restores 46
  - Footer reads "Tangerine HRM OS 5.7"
- **FR-DIR-02** (Must) The "Records Found" count equals the number of cards and excludes deleted employees.
  - 46 cards for "(46) Records Found"

## My Info (MYI)

Employee self-service profile.

- **FR-MYI-01** (Should) My Info has ten tabs, each opening its own heading.
  - Personal Details, Contact Details, Emergency Contacts, Dependents, Immigration, Job, Salary, Report-to, Qualifications, Memberships
  - Headings "Contact Details", "Emergency Contacts", "Dependents", "Job Details", "Qualifications", "Memberships"; record tabs show an "Assigned ..." list
- **FR-MYI-02** (Should) Personal Details shows the seeded master data and the Employee Id is read-only.
  - Jacob Palmer; Employee Id 0422 disabled
  - Nationality Singaporean, Marital Status Single, Date of Birth 1993-05-23, Gender Male
  - Save button and Attachments section with "+ Add"

## Leave (LEV)

Apply for leave and review requests.

- **FR-LEV-01** (Must) An employee can apply for leave and the request is stored as Pending Approval and listed in My Leave List.
  - Selecting Annual Leave shows the Leave Balance, e.g. "9.00 Day(s)"; To Date mirrors From Date
  - "Successfully Saved" toast
  - My Leave lists the date with status "Pending Approval (1.00)"
- **FR-LEV-02** (Should) A request that overlaps an existing pending request is refused and the overlap is shown.
  - Toast "Failed to Submit" and panel "Overlapping Leave Request Found" listing the pending "Moving house" request
- **FR-LEV-03** (Should) My Leave List has this calendar year pre-filled, default status chips and the standard columns; clearing all statuses is rejected.
  - Status chips Pending Approval, Scheduled, Taken; Leave Type "-- Select --"
  - Columns Date, Employee Name, Leave Type, Leave Balance (Days), Number of Days, Status, Comments, Actions; no Cancelled row
  - No chips: "Required" under the status filter

## Timesheet (TIM)

Weekly timesheet.

- **FR-TIM-01** (Could) My Timesheet shows the current Monday-Sunday week with a grid and submission status; the period arrows move one whole week.
  - Columns Project, Activity, Mon..Sun with dates, Total
  - Current week "Status: Not Submitted" with Edit
  - Two weeks back: "Status: Submitted", total 37.50 hours

## Claims (CLM)

Claim request form.

- **FR-CLM-01** (Could) The Create Claim Request form shows its required fields and Cancel returns to My Claims without saving.
  - Event and Currency dropdowns at "-- Select --", Remarks, "* Required", Cancel, Create
  - After Cancel: "(1) Records Found"

## Buzz newsfeed (BUZ)

Posts with sorting and anniversaries.

- **FR-BUZ-01** (Could) The newsfeed lists posts, offers Most Recent, Most Liked and Most Commented sorting and shows Upcoming Anniversaries.
  - Most Liked: first post is the volunteering-day post (31 Likes)
  - Most Recent: selected, newest first

## Glossary and rules

- **ESS** — Employee self-service: a regular employee user.
- **PIM** — Personnel information management: the employee master list.

## Out of scope

- Leave approval by a supervisor
- Payroll and salary maintenance
- Recruitment and Performance modules
- File upload storage
