{"ns":"hrm","title":"Tangerine HRM","version":"1.1","summary":"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.","personas":[{"name":"Employee (ESS)","need":"Apply for leave, check personal details, view the timesheet and read the newsfeed."},{"name":"HR admin","need":"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."],"features":[{"id":"AUT","title":"Login and logout","summary":"Classic login page with client-side and server-side validation.","reqs":[{"id":"FR-AUT-01","weight":"Must","text":"A valid user signs in from the Login page and lands on the Dashboard with their name in the header.","accept":["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"]},{"id":"FR-AUT-02","weight":"Should","text":"Logout from the user menu ends the session; protected pages then redirect to Login.","accept":["Menu: About, Support, Change Password, Logout","After Logout the URL contains \"/auth/login\", fields are empty; opening the Dashboard URL returns to Login"]},{"id":"FR-AUT-03","weight":"Must","text":"An empty login is blocked client-side.","accept":["\"Required\" under Username and under Password; URL stays on /auth/login"]},{"id":"FR-AUT-04","weight":"Must","text":"A wrong password is refused with a generic message that does not reveal which part was wrong.","accept":["Alert \"Invalid credentials\"; still on the Login page"]},{"id":"FR-AUT-05","weight":"Should","text":"The session is kept in the browser: after visiting an unrelated page on another path and returning, the user is still signed in.","accept":["Returning to My Info shows Personal Details without a new login"]}]},{"id":"PIM","title":"PIM employee records","summary":"Employee list, search and Add Employee (admin).","reqs":[{"id":"FR-PIM-01","weight":"Must","text":"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.","accept":["\"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\""]},{"id":"FR-PIM-02","weight":"Must","text":"An Employee Id that is already in use is refused inline and no record is created.","accept":["\"Employee Id already exists\" under the field; no toast; stays on Add Employee"]},{"id":"FR-PIM-03","weight":"Must","text":"Employee List search by Employee Id returns exactly the matching employee.","accept":["Id 0422: \"(1) Records Found\" with Jacob Palmer only"]}]},{"id":"DIR","title":"Directory","summary":"Cards for every active employee.","reqs":[{"id":"FR-DIR-01","weight":"Should","text":"The Directory lists every active employee as a card; the count is unchanged by Search without filters and returns after Reset.","accept":["\"(46) Records Found\"","Job Title \"QA Engineer\" narrows the cards and count; Reset restores 46","Footer reads \"Tangerine HRM OS 5.7\""]},{"id":"FR-DIR-02","weight":"Must","text":"The \"Records Found\" count equals the number of cards and excludes deleted employees.","accept":["46 cards for \"(46) Records Found\""]}]},{"id":"MYI","title":"My Info","summary":"Employee self-service profile.","reqs":[{"id":"FR-MYI-01","weight":"Should","text":"My Info has ten tabs, each opening its own heading.","accept":["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"]},{"id":"FR-MYI-02","weight":"Should","text":"Personal Details shows the seeded master data and the Employee Id is read-only.","accept":["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\""]}]},{"id":"LEV","title":"Leave","summary":"Apply for leave and review requests.","reqs":[{"id":"FR-LEV-01","weight":"Must","text":"An employee can apply for leave and the request is stored as Pending Approval and listed in My Leave List.","accept":["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)\""]},{"id":"FR-LEV-02","weight":"Should","text":"A request that overlaps an existing pending request is refused and the overlap is shown.","accept":["Toast \"Failed to Submit\" and panel \"Overlapping Leave Request Found\" listing the pending \"Moving house\" request"]},{"id":"FR-LEV-03","weight":"Should","text":"My Leave List has this calendar year pre-filled, default status chips and the standard columns; clearing all statuses is rejected.","accept":["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"]}]},{"id":"TIM","title":"Timesheet","summary":"Weekly timesheet.","reqs":[{"id":"FR-TIM-01","weight":"Could","text":"My Timesheet shows the current Monday-Sunday week with a grid and submission status; the period arrows move one whole week.","accept":["Columns Project, Activity, Mon..Sun with dates, Total","Current week \"Status: Not Submitted\" with Edit","Two weeks back: \"Status: Submitted\", total 37.50 hours"]}]},{"id":"CLM","title":"Claims","summary":"Claim request form.","reqs":[{"id":"FR-CLM-01","weight":"Could","text":"The Create Claim Request form shows its required fields and Cancel returns to My Claims without saving.","accept":["Event and Currency dropdowns at \"-- Select --\", Remarks, \"* Required\", Cancel, Create","After Cancel: \"(1) Records Found\""]}]},{"id":"BUZ","title":"Buzz newsfeed","summary":"Posts with sorting and anniversaries.","reqs":[{"id":"FR-BUZ-01","weight":"Could","text":"The newsfeed lists posts, offers Most Recent, Most Liked and Most Commented sorting and shows Upcoming Anniversaries.","accept":["Most Liked: first post is the volunteering-day post (31 Likes)","Most Recent: selected, newest first"]}]}],"nfr":[],"glossary":[{"term":"ESS","meaning":"Employee self-service: a regular employee user."},{"term":"PIM","meaning":"Personnel information management: the employee master list."}],"outOfScope":["Leave approval by a supervisor","Payroll and salary maintenance","Recruitment and Performance modules","File upload storage"]}