P-02b · Staff: the Collecting inputs Work page (stage-first layout)
SOP:
Payroll_Processing.md§6 / Step 2.0 (intake). This page describes how staff work intake on the console; the SOP is unchanged. Actors: Payroll Executive, Payroll Lead (and Admin / Platform admin). Pre-state: a payroll month inREQUESTEDorINTAKE_IN_PROGRESS, staff-opened or agent-run. Post-state: intake confirmed; the month isSUBMITTEDand validation runs.
Since 30 Oct 2026 (branch feat/work-page-stage-first) a month at Collecting inputs opens on a stage-first page at /dashboard/work/<id>. Every other stage still opens today's page. The route decides by stage (stageFirstLayoutFor). Add ?layout=classic to the URL to see today's page for any month.
What the page shows, top to bottom
- Header. Company · month, the "Inputs" pill (was "Collecting inputs" until 1 Nov 2026, now the stepper's word), then who it is assigned to, pay-by date, inputs-due date with days left, when the month reached this stage, and how long it has waited. The opened-late banner shows here when the month was opened past the cutoff.
- This stage's job. One sentence on what the stage is for, one on what ends it.
- Open now. One count per kind of open thing: people to decide, waiting on the client, needing a Lead, items in Needs attention, documents needing a look. Each count is a link that scrolls to the place it is dealt with and picks the right tab or filter.
- New since you last opened this month. Shown from your second visit on. Each staff member's last visit is stored per month (
payroll_cycle_staff_views), so a colleague opening the month does not clear your marks. Opening the page counts as seen. New rows carry a dot. - Employee list. One row per person; every change, warning, request and question about that person is on their row. Tabs by who acts next, with counts: To decide (default), Waiting on client, Needs a Lead (a Lead's default when it has rows), Done, All. A person with one change to decide and another waiting on a document appears in both tabs. Under All, people with nothing this month fold into one line. "View employees (pay figures)" opens the employees drawer, read-only.
- Needs attention. Only what spans people: issues about the whole month (client messages with Mark handled, a request that never went, the closing answer, the day-7 silence task), the client's employee list document (approved whole, here), the first month's registration list (accepted on the company's People tab; used as the month's list here), the attendance sheet, changes not yet tied to a person (with one button per likely employee), and payroll-link requests about the company. Hidden when empty.
- Documents. Every file received, once, one line each. Filters All · Needs a look · Filed · Set aside. Each row says what the document did in one word (to decide, held, to approve, approved, applied, attached, rejected, moved, set aside, not used, no change) and one line, e.g. "applied · Set the employee list: 7 added, approved by Sarah on 3 Nov". Opening it links to each person it touched ("Open Arjun Menon →"); a change's "from change letter '…'" jumps back to the document. When something is wrong, the opened row gives the ways on (Run again, Ask client, Take in, Set aside, Take back). The "⋯" menu keeps Preview, Download, Move to another month, Change type and read again, Remove / Put back, Review a list again, Pass to a Lead.
- Background (folded): reminders and Review and send reminder, a document the client handed over, a new request on the payroll link, closed warnings with Reopen, Cancel this month, the full cycle page.
- Bottom bar, fixed: "N things still open · Show me", the closing question or Resend request when the month's next step offers it, and Confirm intake complete…. After an action the bar says what you did and where that person is now.
Lists show 8 rows and Show all; rows that need a look are always shown.
Added on 1 Nov 2026 (gap review)
- Client line under the header: when the month's request went, to whom and how; the last reminder; the next one, counted from when the request actually went (the worker's rule). When the request never went, it says so in amber with the reason. Data:
GET /ops/cycles/:id/client-notices, which now gives each notice akind(REQUEST, REMINDER, OTHER). - Dates line: pay-by, payslip copy, CPF and IR21 dates still open, amber inside a date's warning buffer, red once passed (from
task.deadlines). The IR21 date is one per company-month, so it is on this line, not on a leaver's row. - Deadline at risk gets its own red tile; the warning is still in Needs attention.
- Who prepared this month (Payroll Leads and admins): one line under the header, as on today's page.
- A reminder that reaches the client also clears "the client was not told the month opened"; before, only resending the request itself cleared it, and while it stood the automatic reminders were skipped.
- The confirm dialog lists month-wide items still open (they do not stop intake) instead of saying "Nothing is open".
- People whose attendance was approved and who have no pay change read "N people with no pay change this month (attendance approved for all)".
- One toast on Confirm intake, not two.
Where each action went (from today's page)
| Today's page | Stage-first page |
|---|---|
| Attention strip | Open now line |
| Intake readiness card | Confirm summary; inputs-due date in the header |
| Open warnings | On the person's change, on the document row, or in Needs attention (about the whole month) |
| Roster review | Employee-list card in Needs attention |
| Proposed changes table | The person's row; attendance in the Attendance card |
| Requests to the client | The person's row; company-wide ones in Needs attention; Ask the client for something in Background |
| Files list | Documents |
| Employees drawer Correct… (Lead) | Correct residency… on the person's row (the drawer is read-only here) |
The registration list (first month)
Two approvals, in two places (31 Oct 2026):
- Accept, on the company's People tab. The employees the client entered on the payroll link. The client's Submit is refused until every employee is complete, so no request card chases a detail and nobody is "held". Any payroll staff can accept the first time; a later change to residency or birth month needs a Payroll Lead. Accepting records the list; it puts nobody on a month.
- Use, on the first month's Work page. Once accepted, the list appears under Needs attention as a proposal, next to any list document the client sent, with "Use as this month's employee list". The Payroll Executive presses it; the rows go on the month under
NEW-…placeholders until staff record Infotech codes. Before that, the month page shows only a status card linking to the People tab, and Confirm intake warns while the list is not accepted or not yet used.
Approving attendance in bulk
The Attendance card's Approve N covers only rows that are undecided, have no open warning, were read at 80% or more (a row typed by staff counts as read), and carry no overtime, absence or unpaid leave. That last condition is today's rule; whether to drop it is open decision J12 (ATTENDANCE_BULK_INCLUDES_PAY_MOVES). Rows that need a look also appear on the person's row under To decide. Bulk approval sends one approval per row, as before.
Confirming intake
Confirm intake complete… opens a summary first: what is still open, that a change still waiting on a document at the Validation sign-off moves to next month, that validation starts at once, and whether anything goes to the client. A staff-opened month sends nothing; an agent-run month sends the drafted reply, which can be edited in the dialog. When the client's earlier "no changes" no longer matches the month, the server asks for a reason and the dialog asks for it. Confirming is offered on INTAKE_IN_PROGRESS (staff-opened) or when the agent run's Confirm intake review is waiting.
Not on this page by design
- Rohan's 80% rule (flag a bad document to the client automatically when the system is sure): not built. No message reaches the client without staff reading it first.
- "Anything else coming?" asked-state on the button: the page has no record of when it was asked. The server refuses a second ask while one is open.
Manual test (seeded stage companies, built app)
Run the built api and web; sign in as executive@spade.local / lead@spade.local.
- Open a month at Collecting inputs. Expect the stage-first page;
?layout=classicshows today's page; a month at Validation shows its own stage-first page (P-04b); a month at Client approval shows today's page. - Click each "Open now" link: it scrolls and picks the tab or filter.
- Approve a change on a row (accept its warnings if asked). The bar says where the person is now; counts update.
- On a second visit after a document or message arrives, the "new since" line names it and the row has a dot.
- Ask the client about N things in one message in Waiting on client opens the numbered draft.
- Confirm intake complete… lists what is open; Not yet keeps the month; confirming moves it to Validation and the page becomes the stage-first Validation page.