Payroll — Pay runs & STP lodgement¶
Manual test plan for the whole pay-run flow: creating and editing a pay run, finalising, lodging to the ATO (Single Touch Payroll), journal posting, the bank (ABA) file, and payslip email. Read How testing works first.
Test/EVTE only — lodgement reports real money to the ATO
Submitting a pay run sends a Single Touch Payroll report to the ATO. Use the test / EVTE environment only. The ATO responses in the 🔧 cases must be produced/simulated by a developer.
You will need: a payroll company with employees who have complete tax/super/bank details, and a developer for the ATO-response and integration cases.
A. Pay runs list¶
A1 — Filters (status, needs-super, FY)¶
Steps 1. Go to Payroll → Pay Runs. Change the status, needs-super, and financial-year filters.
✅ Pass if each filter re-scopes the list and resets to page 1; summary cards follow the FY scope.
❌ Fail if a filter has no effect — 🟠 Major.
A2 — New Pay Run (pre-filled)¶
Steps 1. Click New Pay Run.
✅ Pass if the create form pre-fills from the most recent Regular run (frequency carried, start = previous end + 1 day, end/pay-date auto-calculated), or is blank if there's no prior run.
❌ Fail if the pre-fill dates are wrong — 🟠 Major.
A3 — Sort columns¶
Steps 1. Click sortable column headers (Pay Period, Gross, Tax, Net, Super).
✅ Pass if the list re-sorts (server-side) and resets to page 1; non-sortable columns (Status, Super status, actions) don't react.
❌ Fail if sorting reorders incorrectly — 🟠 Major.
A4 — "Lodge with ATO" per-row shortcut¶
Steps 1. On a Finalised, not-yet-lodged row, click Lodge with ATO.
✅ Pass if it opens the pay-run detail with the STP declaration dialog auto-open. Only shown for Finalised + not lodged.
❌ Fail if it shows on an already-lodged run — 🟠 Major.
A5 — "Check ATO status" per-row 🔧 Needs developer setup¶
Steps 1. On a row that is lodging (Queued/Submitted/Pending), click Check ATO status.
✅ Pass if it fetches the ATO status; it's hidden while auto-polling is active (shows "Automatically checking…").
❌ Fail if it errors or shows when auto-polling — 🟠 Major.
A6 — Super column¶
Steps 1. In the Super column, click a badge (linked) and a Create button (NotCreated).
✅ Pass if the badge links to the super contribution; Create opens the create-from-pay-run panel pre-selected. A due suffix (Overdue/Due today/Due in N days) shows appropriately.
❌ Fail if the link/create goes to the wrong place — 🟠 Major.
A7 — Delete a Draft from the list¶
Steps 1. On a Draft row, click trash, confirm.
✅ Pass if delete is offered only for Draft rows and a confirm warns it's permanent.
❌ Fail if a finalised/lodged pay run can be deleted from the list — 🔴 Blocker.
A8 — Summary cards & pagination¶
Steps 1. Review the earnings/deductions/tax/net/super summary cards (whole filtered set); page through.
✅ Pass if cards reflect the filtered totals (Deductions hides at $0) and pagination works.
❌ Fail if the totals are wrong — 🔴 Blocker (money).
B. Create a pay run¶
B1 — Create with date validation¶
Steps 1. In the create form, set an end before start and a pay date before the period start.
✅ Pass if both are rejected (end ≥ start, pay date ≥ start); choosing frequency/start auto-calculates end and pay date (weekend pay dates roll forward).
❌ Fail if invalid dates create a run — 🟠 Major.
B2 — Create¶
Steps 1. Submit a valid create form.
✅ Pass if it creates ("Pay run created."), opens the new run in Draft, and pre-populates employees with carried-forward pay items.
❌ Fail if creation fails or carried-forward items are missing/wrong — 🔴 Blocker (money).
C. Pay run detail — Draft editing¶
C1 — Add employees to the run¶
Steps 1. On a Draft, use Add Employee → select employees → Add.
✅ Pass if only employees not already in the run are offered (select-all works); adding shows partial-success toasts; "All active employees are already in this pay run" when none left.
❌ Fail if a duplicate employee is added — 🟠 Major.
C2 — Remove employees (single & bulk)¶
Steps 1. Remove one employee (row trash → confirm); select several and Remove from pay run.
✅ Pass if both confirm and remove with a toast; only available on Draft.
❌ Fail if removal is possible on a non-Draft run — 🔴 Blocker.
C3 — Edit the pay period inline¶
Steps 1. On a Draft, click the period bar, change dates, save.
✅ Pass if it saves ("Pay run updated.") with the same date validation; pay recalculates.
❌ Fail if invalid dates save, or pay doesn't recalculate — 🟠 Major.
C4 — Migration BMS Id (Migration runs) 🔴¶
Steps 1. On a Migration-type Draft, edit the BMS Id inline.
✅ Pass if it saves ("BMS Id updated"); read-only when non-draft.
❌ Fail if the BMS Id doesn't save — 🔴 Blocker (STP migration).
C5 — Warnings panel doesn't block finalise¶
Steps 1. Create a Draft with a warning condition (e.g. an employee missing a detail).
✅ Pass if the warnings panel lists issues but explicitly allows finalising ("You can still finalise…").
❌ Fail if warnings block finalise, or aren't shown — 🟠 Major.
C6 — Download payslips (Draft)¶
Steps 1. On a Draft, use Download Payslips.
✅ Pass if payslip PDFs are generated and downloaded (toast "Downloaded N payslip(s)").
❌ Fail if the download fails — 🟠 Major.
C7 — Delete the pay run¶
Steps 1. On a Draft, use Delete Pay Run, confirm.
✅ Pass if it deletes and returns to the list. (A pay run that is posted to the ledger, has an ATO submission, or a linked super batch must be blocked from deletion with a clear reason.)
❌ Fail if a posted/lodged/super-linked pay run deletes — 🔴 Blocker.
D. Pay run — employee detail (edit lines)¶
D1 — Edit pay item quantity / amount 🔴¶
Steps 1. Open an employee within a Draft run. Inline-edit a pay item's Qty and Amount.
✅ Pass if edits save (debounced/on-blur), the totals recalculate, and a bad value reverts with an error toast. Editable only on Draft (Migration hides Qty/Amount; Finalise-type is read-only).
❌ Fail if amounts are editable on a non-Draft/Finalise run, or a bad value sticks — 🔴 Blocker.
D2 — Add / remove a pay item¶
Steps 1. Click Add Pay Item, select types, Add. Then delete a pay-item line (X → confirm).
✅ Pass if available types are offered (no duplicates), adding works with partial-success toasts, and removing confirms then removes. Blocked on Finalise-type runs.
❌ Fail if a duplicate pay item is added, or delete has no confirm — 🟠 Major.
D3 — Manual tax override 🔴¶
Steps 1. Inline-edit Manual Tax; then clear it (X).
✅ Pass if setting a manual tax shows an amber "Manual override" label and uses that value; clearing reverts to calculated ("Tax override cleared — using calculated tax."). Draft only.
❌ Fail if the override doesn't apply or can't be cleared — 🔴 Blocker (money).
D4 — Manual super override 🔴¶
Steps 1. Inline-edit Manual Super; then clear it.
✅ Pass if it behaves like D3 for super ("Super override cleared — using calculated super.").
❌ Fail if the override doesn't apply/clear — 🔴 Blocker (money).
D5 — Lump Sum E financial year / ETP income date 🔴¶
Steps 1. On a pay item that is Lump Sum E, set the financial year; on an ETP line, set the income date.
✅ Pass if the fields save (blank = null). These are required for finalise/STP.
❌ Fail if they don't save (finalise would later fail) — 🔴 Blocker.
D6 — Migration previous payroll id 🔴¶
Steps 1. On a Migration Draft, set the employee's Previous Payroll Id inline.
✅ Pass if it saves per employee (STP migration field).
❌ Fail if it doesn't save — 🔴 Blocker.
D7 — Payslip note¶
Steps 1. Add a payslip note for the employee (Draft, not Finalise).
✅ Pass if it saves on blur (blank = removed) and appears on the employee's payslip.
❌ Fail if the note doesn't save/appear — 🟡 Minor.
D8 — Navigate between employees & download one payslip¶
Steps 1. Use Prev/Next and the employee picker; click Download Payslip.
✅ Pass if navigation works (disabled at ends), the "X of N" counter is right, and the single payslip downloads.
❌ Fail if navigation lands on the wrong employee, or the download fails — 🟠 Major.
E. Finalise¶
E1 — Finalise a Draft pay run 🔴¶
Steps 1. On a Draft, use Finalise and confirm.
✅ Pass if a confirm warns pay items can't be edited after; finalising shows "Pay run finalised." and locks editing. If auto-post journal is on, the journal posts; if auto-create super is on, a Draft super is created.
❌ Fail if finalise fails on valid data, or leaves the run editable — 🔴 Blocker.
F. STP submission (ATO)¶
F1 — Submit to ATO with the declaration 🔴¶
Steps 1. On a Finalised run, click Submit to ATO. In the declaration modal, enter the declarer name, tick the declaration, submit.
✅ Pass if the modal requires a declarer name and the ticked declaration before Lodge is enabled; submitting sends the STP report and the status moves to Submitted/Pending.
❌ Fail if you can submit without the declaration ticked or name entered — 🔴 Blocker.
F2 — Lodge-as-client (accountant) 🔴¶
Steps 1. As an accountant acting for a client, open the declaration and choose lodge as the business vs as agent.
✅ Pass if the lodge-as radio is available only in a practice→client context; choosing "business" shows the authority note.
❌ Fail if the option appears for a normal (non-practice) user — 🟠 Major.
F3 — Check ATO status 🔧 Needs developer setup¶
Steps 1. After submitting, ask a developer to make the ATO return accepted, then rejected. 2. Click Check ATO Status.
✅ Pass if it reports "ATO accepted the submission", or "ATO returned N errors" (with the errors panel), or "still processing".
❌ Fail if the status shown doesn't match the ATO response — 🔴 Blocker.
F4 — ATO errors panel & diagnostics 🔧 Needs developer setup¶
Steps 1. With an ATO rejection, view the ATO Submission Errors panel and the STP Diagnostic panel.
✅ Pass if errors/warnings are listed (informational ones collapsible); the diagnostic panel offers Apply fix / Dismiss on applicable diagnoses.
❌ Fail if apply-fix corrupts data or the errors aren't shown — 🔴 Blocker.
F5 — Send Update 🔧 Needs developer setup¶
Steps 1. On a successfully-submitted Regular run, use Edit & Send Update → revert to Draft → make a change → re-finalise → Send Update.
✅ Pass if the update path reverts to Draft (with a warning the original submission is preserved), and Send Update re-lodges as an update (the declaration modal can pre-select rejected payees).
❌ Fail if the update path loses the original submission or mis-lodges — 🔴 Blocker.
F6 — Send Replacement (Full File Replacement) 🔧 Needs developer setup¶
Steps 1. On an eligible submitted run, use Send Replacement / Edit & Send Replacement.
✅ Pass if it's only enabled when FFR is eligible (a clear reason shown when not), and the confirm warns it replaces the original submission.
❌ Fail if FFR is allowed when ineligible — 🔴 Blocker.
F7 — Revert to Draft¶
Steps 1. On a Finalised/Error/Success run, use Edit / Revert to Draft, confirm.
✅ Pass if revert is state-aware (a Success run warns the original submission is preserved) and unlocks editing. Edit is intentionally hidden while a submission is in-flight (Submitted/Pending).
❌ Fail if you can revert an in-flight run and cause a double lodgement — 🔴 Blocker.
F8 — STP artifacts & history¶
Steps 1. Use Download XML; open the STP submission history; View payload on a row.
✅ Pass if the request/response XML is downloadable, the history shows each submission (action/status/declarer/errors), and "View payload" opens the artifacts.
❌ Fail if an artifact download or history is broken — 🟠 Major.
G. Journal posting & Xero¶
G1 — Post pay run to the ledger 🔴¶
Steps 1. On a non-Draft run (Accounting plan), use Post Pay Run.
✅ Pass if it posts the payroll journal to the general ledger ("Journal entries posted.") — only when not already posted.
❌ Fail if posting produces an unbalanced/wrong journal, or double-posts — 🔴 Blocker (ledger).
G2 — Unpost pay run 🔴¶
Steps 1. On a posted run, use Unpost Pay Run, confirm.
✅ Pass if a confirm appears and it reverses the journal ("Journal entries reversed.").
❌ Fail if unpost leaves a residual/duplicate ledger entry — 🔴 Blocker.
G3 — Export to Xero 🔧 Needs developer setup¶
Steps 1. On a non-Draft run with no existing Xero journal, use Export to Xero (choose Draft/Posted).
✅ Pass if it exports and reports "Journal exported to Xero as X. N lines created."
❌ Fail if the export duplicates or posts wrong figures — 🔴 Blocker.
H. Bank (ABA) file¶
H1 — ABA pre-flight & download 🔴¶
Steps 1. On a non-Draft run, use Download ABA File.
✅ Pass if a pre-flight modal validates employer + per-employee bank details (OK / Excluded / Needs-attention); Download is disabled until issues are fixed; the payment date defaults to the pay date; the ABA file downloads once valid.
❌ Fail if an ABA file downloads with unresolved bank errors — 🔴 Blocker (bank payments).
I. Payslip email¶
I1 — Email payslips (all / selected)¶
Steps 1. Use Email payslips with no rows ticked (emails all), then with specific rows ticked.
✅ Pass if it queues emails ("N payslips queued for sending", "M skipped (no email)"); an optional subject/message can be set; a no-email warning links to add emails.
❌ Fail if it emails the wrong employees or fails silently — 🟠 Major.
I2 — Resend failed¶
Steps 1. After some emails bounce/fail, use Resend failed (N).
✅ Pass if it re-emails only the Bounced/Failed/NotSent employees (available once at least one was sent).
❌ Fail if resend hits already-delivered employees — 🟠 Major.
I3 — Email status column & summary¶
Steps 1. Watch the payslip email-status column and the summary line.
✅ Pass if statuses show Sent/Bounced/Not-sent (optimistic "Sending…" resolves within ~60s); the summary counts are clickable filters.
❌ Fail if statuses never resolve or are wrong — 🟠 Major.