CSD Payroll Demo Guide

50-Point Vendor Demo Script — City Schools of Decatur RFP 26-001

📅 Demo Slot: 12:30 – 1:15 PM 🖥 Branch: csdecatur 🎯 50 / 50 Points Covered
Demo Readiness
50 / 50 DONE

Quick Reference — All URLs

# Page URL
1Gross-Up Calculator/account/gross-up
2Payroll Imports/account/payroll-imports
3Additional Payments/account/additional-payments
4Gusto Integration/account/gusto-settings
5Blackout Periods/account/payroll-audit/blackouts
6Salary Changes/account/salary-changes
7-8Fund Allocations/account/fund-allocations
9Garnishments/account/garnishments
10Deduction Codes/account/deduction-codes
11Substitute Payroll/account/substitute-payroll
13-14Retro Pay/account/retro-pay
15Tax Overrides/account/payroll-compliance/tax-overrides
16PTO Accrual Policies/account/pto-accruals
19-20Payroll Reports/account/payroll-reports
21Direct Deposit/account/direct-deposit
22Employee List/account/employees
27-30Audit & Controls/account/payroll-audit
31Payroll Dashboard/account/payroll/dashboard
33Payroll Adjustments/account/payroll-adjustments
36Disbursements/account/payroll-disbursements
37Payroll Accruals/account/payroll-accruals
39W-2 Forms/account/payroll-compliance/w2s
41Quarterly Reports/account/payroll-compliance/quarterly
35FLSA Calculator/account/payroll-compliance/flsa
411095 Forms/account/payroll-compliance/1095
48New Hire Onboarding/account/new-hire-onboarding
Salary Schedules/account/salary-schedules
Pay Calendars/account/pay-calendars
Pay Stubs/account/paychecks
Journal Entries/account/payroll-journal-entries

Payroll Processing

2

Load payroll data from a list or Excel template

One-time payments, stipends, benefit deductions, employee data, direct deposit, YTD adjustments
✓ DONE

What's Built

  • PayrollImportService with file validation, template generation, and batch import
  • Import types: one-time payments, stipends, deductions, employee data, direct deposit, YTD adjustments
  • Upload UI with field mapping, validation errors display, preview before commit
  • Template download per import type
MethodURLDescription
GET/account/payroll-importsImport history list
GET/account/payroll-imports/createUpload new import file
GET/account/payroll-imports/download-templateDownload Excel template

Demo Steps

2
Click Download Template and select an import type (e.g., "One-Time Payments") to show the pre-formatted Excel template
3
Click New Import, select import type, upload the filled Excel file
4
Show the validation results — errors are highlighted row-by-row with specific field issues
5
Preview the data, then click Process to commit the import
11

Process substitute payroll from third-party system

AESOP, Frontline Absence & Substitute Management integration
✓ DONE

What's Built

  • SubstitutePayrollService — CSV/Excel parsing with employee name matching (exact + fuzzy + last-name-first reversal)
  • Source systems: Frontline (AESOP), AESOP Legacy, Manual Upload
  • Validation with error reporting, match rate display, import as Additional Payments
  • Manual match UI for unmatched substitutes via SweetAlert modal
  • Template download per source system
MethodURLDescription
GET/account/substitute-payrollSubstitute import history
GET/account/substitute-payroll/createUpload substitute file
GET/account/substitute-payroll/template?source=manualDownload template

Demo Steps

2
Click New Import, select source system (Frontline/AESOP/Manual), upload file
3
Show the match results — matched employees in green, unmatched in yellow
4
For unmatched subs, click Manual Match to assign to an employee in the system
5
Click Import to Payroll to create Additional Payments grouped by employee
12

Process semi-annual payroll

Athletic supplements paid twice a year
✓ DONE

What's Built

  • AdditionalPaymentService::processSemiAnnualPayments() for semi-annual frequency
  • Semi-annual payment type via Additional Payments with frequency = semi_annual
  • Athletic supplement / coaching stipend support
MethodURLDescription
GET/account/additional-paymentsAdditional Payments list
GET/account/additional-payments/createCreate with semi-annual frequency

Demo Steps

2
Select payment type "Semi-Annual" and frequency "semi_annual"
3
Enter the employee, amount (e.g., coaching supplement of $2,500), and fund code
4
Show how the system auto-includes this in the next eligible payroll run twice per year
17

Mass load information from Excel templates

Pay, deductions, employee data, direct deposit, YTD adjustments
✓ DONE

What's Built

  • Same as #2 — PayrollImportService supports all import types
  • Template download per type, file validation, error row tracking, preview and commit workflow
MethodURLDescription
GET/account/payroll-importsImport history
GET/account/payroll-imports/createNew import

Demo Steps

1
Same flow as #2. Emphasize the 6 different import types available in the dropdown: one-time payments, stipends, deductions, employee data, direct deposit, YTD adjustments
2
Show downloading different templates for each type to demonstrate flexibility
31

Process off-cycle payroll with direct deposit

Enter payroll data and process off-cycle checks using direct deposit
✓ DONE

What's Built

  • Payroll Dashboard supports off-cycle run initiation via Gusto API
  • Retro pay and gross-up payments submit as off-cycle payrolls
  • Direct deposit records honored for off-cycle disbursements
MethodURLDescription
GET/account/payroll/dashboardPayroll Management dashboard

Demo Steps

2
Click Initiate Run and select Off-Cycle as the run type
3
Add employees and payment amounts, submit for review, approve, and submit to Gusto
4
Show that direct deposit settings are automatically applied for off-cycle payments
💰

Compensation

1

Complete a gross up for all payroll

Gross-up calculator with iterative convergence algorithm
✓ DONE

What's Built

  • GrossUpCalculatorService with iterative convergence algorithm
  • Supplemental flat rate method (22% federal + 5.49% GA + FICA)
  • Aggregate method for complex calculations
  • Submit as off-cycle payment to Gusto
  • Full CRUD with DataTable listing, create form, and detail view
MethodURLDescription
GET/account/gross-upGross-Up Calculator list
GET/account/gross-up/createNew gross-up calculation
POST/account/gross-up/calculateAJAX calculation endpoint

Demo Steps

2
Click New Gross-Up, select an employee, enter the desired net amount (e.g., $1,000 bonus)
3
Click Calculate — system shows gross amount needed, tax breakdown (federal, state, FICA), and net result
4
Click Approve then Submit to Gusto to process as off-cycle payment
3

Process additional pay or allowances

Stipends, bonuses, allowances, supplements, one-time, semi-annual
✓ DONE

What's Built

  • AdditionalPaymentService with pending payment retrieval per pay period
  • Payment types: stipend, bonus, allowance, supplement, one-time, semi-annual
  • Frequency: one-time, per pay period, monthly, semi-annual, annual
  • Fund code/account code mapping, GL accounts, approval workflow
  • Integrates into payroll via includeInPayroll()
MethodURLDescription
GET/account/additional-paymentsAdditional Payments list
GET/account/additional-payments/createNew additional payment

Demo Steps

2
Click New Payment, select employee, choose type (e.g., "Stipend"), set amount and frequency
3
Assign fund code and GL account for proper cost allocation
4
Submit → Approve workflow. Show how approved payments are auto-included in the next payroll run
6

Salary changes with effective dating and documentation

Change documentation attachments, mass step increment
✓ DONE

What's Built

  • SalaryChangeService with createChangeRequest(), approve(), apply(), massStepIncrement()
  • Change reasons: annual step, promotion, COLA, correction
  • Old/new salary, old/new step/lane, effective_date, board_approval_date, document_paths JSON
  • Triggers retro pay flag when effective date is in the past
  • Pushes to Gusto on approval via EmployeeSalaryPlacement
MethodURLDescription
GET/account/salary-changesSalary changes list
GET/account/salary-changes/createNew salary change
POST/account/salary-changes/mass-step-incrementMass step increment

Demo Steps

2
Click New Salary Change, select employee, set effective date, choose reason (e.g., "Promotion")
3
Show old vs. new salary comparison, attach board approval document
4
If effective date is in the past, show the "Triggers Retro" flag automatically checked
5
For mass changes: click Mass Step Increment to advance all eligible employees one step on the salary schedule
7

Pay across multiple process levels

Departments, cost centers, grants
✓ DONE
MethodURLDescription
GET/account/fund-allocationsFund allocation list

Demo Steps

2
Show an employee split across multiple fund codes (e.g., 60% General Fund, 40% Title I Grant)
3
Show how payroll automatically distributes salary costs according to these percentages
8

Employee salary splits / labor cost allocations

Grant-funded vs. general fund salary splits
✓ DONE
MethodURLDescription
GET/account/fund-allocationsFund allocations
GET/account/payroll-journal-entriesJournal entries showing split

Demo Steps

1
Same as #7 — show fund allocation setup, then navigate to GL & Accruals → Journal Entries
2
Show how journal entries reflect the split with separate debit lines per fund code
25

Process special payments (staff development stipends)

Stipend-type additional payments with approval workflow
✓ DONE
MethodURLDescription
GET/account/additional-payments/createNew payment → select "Stipend"

Demo Steps

2
Select type "Stipend", frequency "One-Time", enter staff development amount
3
Show the approval workflow: submit → approve → auto-included in next payroll
🔒

Deductions & Garnishments

9

Set up garnishments with multiple garnishments and Finance interface

CCPA-aware, priority ordering, court order docs, GL mapping
✓ DONE

What's Built

  • GarnishmentService — CCPA-aware calculation, priority ordering, Gusto sync
  • Types: child_support, tax_levy, creditor, student_loan
  • Multiple garnishments per employee with CCPA max limits enforced
  • GL account mapping, court order document storage, total owed/collected tracking
MethodURLDescription
GET/account/garnishmentsGarnishments list
GET/account/garnishments/createNew garnishment
GET/account/garnishments/ccpa-summaryCCPA compliance summary

Demo Steps

2
Click New Garnishment, select employee, enter type (e.g., "Child Support"), amount, court order number
3
Show adding a second garnishment for the same employee — system auto-assigns priority
4
Navigate to CCPA Summary to show compliance limits are being enforced
5
Show GL account mapping for Finance interface on the garnishment detail page
10

Employee deduction setup with multiple deduction types

Descending balance, flat, one-time, percentage, hours-based
✓ DONE

What's Built

  • DeductionCalculationServicecalculateForEmployee(), applyDescendingBalance(), getArrears()
  • Categories: tax, benefit, garnishment, retirement, voluntary
  • Methods: flat, percentage, descending_balance, hours_based
  • Per-employee overrides with goal_amount, ytd_collected, remaining_balance
  • Pre-tax/post-tax flag, GL account mapping, Gusto benefit ID linking
MethodURLDescription
GET/account/deduction-codesDeduction codes list
GET/account/deduction-codes/createNew deduction code

Demo Steps

2
Show existing codes with different calculation methods (flat, percentage, descending balance)
3
Click into a descending balance deduction to show goal amount, YTD collected, and remaining balance
4
Show GL debit/credit account mapping and pre-tax vs. post-tax configuration
18

Withholding locked for garnishment employees

W-4 changes blocked when active garnishment requires lock
✓ DONE

What's Built

  • GarnishmentService::lockWithholding() — sets withholding_locked flag
  • When active garnishment exists with lock, W-4 withholding changes are blocked
  • HR admin override capability
MethodURLDescription
GET/account/garnishments/{id}Garnishment detail showing lock status

Demo Steps

1
Open a garnishment detail page for an employee with an active garnishment
2
Point out the "Withholding Locked" indicator on the garnishment record
3
Explain that employees with this flag cannot self-service change their W-4 withholding allowances
23

Pay and deduction codes with taxation and GL mapping

Control taxation, check visibility, general ledger flow
✓ DONE
MethodURLDescription
GET/account/deduction-codesDeduction codes with GL mapping

Demo Steps

1
Same as #10 — emphasize the GL debit/credit account fields and pre-tax/post-tax flag
2
Show how the Gusto benefit ID links the deduction to the paycheck stub for employee visibility
26

Arrears deductions management

Track and follow arrears throughout payroll
✓ DONE

What's Built

  • DeductionCalculationService::getArrears() — tracks arrears balances per employee
  • When deduction can't be fully taken (insufficient net pay), remainder goes to arrears
  • Automatic catch-up collection from future paychecks
MethodURLDescription
GET/account/deduction-codesDeduction codes (arrears visible per employee)

Demo Steps

1
Navigate to Deduction Codes and click into a deduction with arrears
2
Show the arrears balance for employees where the full deduction couldn't be taken
3
Explain that the system automatically collects arrears from subsequent paychecks
🔄

Adjustments & Corrections

13

Retro pay by date entry

Calculate correct pay amounts based on effective dates
✓ DONE

What's Built

  • RetroPayService with calculateRetro(), calculateRetroByDate(), submitRetroPayment()
  • Old/new rate, pay periods affected, per-period difference, total retro amount
  • Submit retro as off-cycle payroll via Gusto
MethodURLDescription
GET/account/retro-payRetro pay list
GET/account/retro-pay/createNew retro calculation

Demo Steps

2
Click New Retro Calculation, select employee, enter effective date and new rate
3
System shows per-period breakdown: original pay vs. corrected pay vs. difference
4
Approve and submit — processes as off-cycle payment via Gusto
14

Automatic retro calculations on effective-dated transactions

Triggered by salary changes with past effective dates
✓ DONE

What's Built

  • RetroPayService::calculateRetro() — auto-engine compares old vs. new rate across historical pay periods
  • Triggered by salary change requests with triggers_retro = true
MethodURLDescription
GET/account/retro-payRetro pay (auto-generated entries)

Demo Steps

1
Create a salary change at Salary Changes → New with an effective date in the past
2
Note the "Triggers Retro" flag is automatically set
3
After approval, navigate to Retro Pay to see the auto-generated retro calculation
22

Corrections or changes to employee record

Edit employee profile, personal info, pay details
✓ DONE
MethodURLDescription
GET/account/employeesEmployee list

Demo Steps

1
Navigate to Employees, click any employee name
2
Click Edit, make a correction (e.g., update address, change department)
3
Save — changes are audited and synced to Gusto if connected
24

Corrections to employee record (duplicate of #22)

Same as #22
✓ DONE
Note: This is a duplicate of #22 in the RFP script. Same demo flow applies.
32

Identify underpayments and process as retroactive payments

Automatic underpayment detection with retro correction
✓ DONE

What's Built

  • RetroPayService::identifyUnderpayments() — compares expected vs. actual pay
  • Underpayment detection triggers retro pay calculation
  • Submit correction as off-cycle payroll via Gusto
MethodURLDescription
GET/account/retro-payRetro pay list
GET/account/retro-pay/underpaymentsUnderpayment detection

Demo Steps

2
System scans historical pay periods and flags employees with detected underpayments
3
Select an underpayment, approve, and submit as retro off-cycle payment
33

Identify and track overpayments including DD reversals

Recovery plans: payroll deduction, DD reversal, lump sum, installment
✓ DONE

What's Built

  • PayrollAdjustmentService::trackOverpayment() with installment calculation
  • Recovery methods: payroll_deduction, direct_deposit_reversal, lump_sum, installment
  • Progress tracking with recovered_amount, remaining_amount, progress bar
  • requestDirectDepositReversal() for early-catch reversals
MethodURLDescription
GET/account/payroll-adjustmentsAdjustments list
GET/account/payroll-adjustments/createNew adjustment (overpayment)

Demo Steps

2
Select type "Overpayment", enter employee and amount
3
Set up recovery plan: choose method (installment), enter number of pay periods
4
Show the recovery progress bar on the adjustment detail page
44

Retroactive labor redistribution

Correct fund allocation errors after payroll has run
✓ DONE

What's Built

  • PayrollAdjustmentService::createLaborRedistribution() with old/new fund_code and account_code
  • Generates correcting journal entries on approval
MethodURLDescription
GET/account/payroll-adjustments/createNew adjustment (labor_redistribution type)

Demo Steps

1
Navigate to Adjustments → New, select type "Labor Redistribution"
2
Enter old fund code → new fund code, affected pay periods, amount
3
Approve — system generates correcting journal entries automatically
47

YTD adjustments to employee wages

Adjust year-to-date accumulators for any of 12 types
✓ DONE

What's Built

  • PayrollAdjustmentService::applyYtdAdjustment() — applies to PayrollAccumulator on approval
  • YTD fields: gross_pay, federal_tax, state_tax, social_security, medicare, retirement, etc.
  • Old value / new value with auto-calculated difference
MethodURLDescription
GET/account/payroll-adjustments/createNew adjustment (ytd_adjustment type)

Demo Steps

1
Navigate to Adjustments → New, select type "YTD Adjustment"
2
Select YTD field (e.g., "Gross Pay"), enter old and new values
3
Approve — accumulator is updated, flows through to W-2 and quarterly reports
💳

Disbursements

21

Set up and maintain direct deposits

Multiple accounts, checking/savings splits, Gusto sync
✓ DONE

What's Built

  • GustoDirectDepositServicegetBankAccounts(), updatePaymentMethod(), addBankAccount()
  • Multiple account splits (checking/savings, by amount/percentage)
  • View masked bank accounts, update routing/account numbers, switch to check
MethodURLDescription
GET/account/direct-depositAll employees DD status
GET/account/direct-deposit/{userId}Employee DD detail

Demo Steps

2
Show the list of employees with their current payment method status
3
Click an employee to view/edit their bank accounts, split percentages
36

Create paychecks, ACH file, and garnishment file

NACHA-format ACH generation, batch check issuance
✓ DONE

What's Built

  • PayrollDisbursementService::generateAchFile() — NACHA-format with file/batch/entry/control records
  • generateCheckBatch() — batch check issuance with auto-numbering
  • Garnishment disbursements with agency, case number tracking
  • Downloadable ACH file for bank upload
MethodURLDescription
GET/account/payroll-disbursementsDisbursements list
POST/account/payroll-disbursements/generate-achGenerate ACH file
POST/account/payroll-disbursements/print-checksPrint checks batch

Demo Steps

2
Click Generate ACH File to create the NACHA-format file for bank upload
3
Click Print Checks for non-DD employees
4
Show garnishment disbursements with agency and case number details
42

Check printing for non-direct deposit payments

Auto-numbering, batch printing, manual checks
✓ DONE
MethodURLDescription
GET/account/payroll-disbursementsDisbursements list
GET/account/payroll-disbursements/createNew manual check

Demo Steps

1
Same as #36 — focus on Print Checks button and check number auto-assignment
2
Show creating a manual check for hand-written check situations
50

Online check replacement for lost check

Void original, issue replacement with full audit trail
✓ DONE

What's Built

  • PayrollDisbursementService::voidAndReplace() — void + optional replacement
  • Void reason tracking, replacement links to original via original_disbursement_id
  • SweetAlert confirmation with void reason and "Issue replacement" checkbox
  • Full audit trail: original → voided → replacement chain
MethodURLDescription
GET/account/payroll-disbursementsFind the lost check
POST/account/payroll-disbursements/{id}/voidVoid and replace

Demo Steps

1
Navigate to Disbursements, find the check to replace
2
Click Void & Replace, enter void reason (e.g., "Lost in mail")
3
Check "Issue replacement check" — new check is auto-generated with next number
4
Show the audit trail: original check → void record → replacement check
Demo Tip: Emphasize the disclaimer — the void/replace process requires manager approval and creates a permanent audit record.

Time & Leave

16

PTO accrual integration with HR + automated journal entries

Tenure-based rates, max balance caps, journal entries per cost center
✓ DONE

What's Built

  • PtoAccrualService — accrue per pay period, max balance cap, tenure-based rates
  • PtoAccrualPolicy linked to existing leave_types
  • PtoAccrualEntry tracks accrual/usage/adjustment/payout/carryover/forfeiture
  • Journal entry generation for PTO liability by cost center
  • syncQuotaBalance() writes back to employee_leave_quotas for Leave module consistency
MethodURLDescription
GET/account/pto-accrualsPTO accrual policies
GET/account/pto-accruals/createNew policy
GET/account/pto-accruals/entriesAccrual entries ledger
GET/account/payroll-accrualsPayroll accruals (PTO liability)

Demo Steps

2
Show a policy with tenure-based tiers (e.g., 0-5 yrs: 10 days, 5-10 yrs: 15 days)
3
Navigate to Accrual Entries to show the running ledger
4
Navigate to GL & Accruals → Payroll Accruals and show PTO liability journal entries
40

Month-end PTO liability to GL with multi-position employees

PTO valued at hourly rates, split by fund allocation
✓ DONE
MethodURLDescription
GET/account/payroll-accrualsPayroll accruals
GET/account/payroll-accruals/pto-liabilityPTO liability report

Demo Steps

2
Show PTO liability calculated at each employee's hourly rate, split by their fund allocations
3
Show the generated journal entry with separate debit lines per cost center
45

PTO payout on termination

Calculate and pay eligible PTO balance on separation
✓ DONE

What's Built

  • PtoAccrualService::processTerminationPayout() — calculates payout using hourly_rate or annual_salary/2080
  • Checks which leave types are eligible for payout per policy payout_on_termination flag
  • Creates payout entry, zeros balance, syncs to leave quotas
MethodURLDescription
GET/account/pto-accruals/entriesAccrual entries (trigger payout here)
POST/account/pto-accruals/termination-payoutProcess termination payout

Demo Steps

2
Select a terminating employee, click Process Termination Payout
3
System calculates: eligible hours × hourly rate = payout amount, zeros the balance
📈

GL & Accruals

37

Month-end accrual calculation

Salary payable, benefit payable, PTO liability with reversal
✓ DONE

What's Built

  • PayrollAccrualService::calculateMonthEndAccruals() — salary payable, benefit payable, PTO liability
  • GL account mapping, journal entry generation
  • Accrual reversal with offsetting entries
  • Workflow: draft → posted → reversed
MethodURLDescription
GET/account/payroll-accrualsPayroll accruals list
POST/account/payroll-accruals/calculateCalculate month-end accruals
POST/account/payroll-accruals/postPost accruals to GL

Demo Steps

2
Click Calculate Month-End — system creates draft accrual entries
3
Review the draft, then click Post to generate journal entries in GL
4
Show the Reverse capability for the next period's opening entries
46

Provide payroll accruals

Salary payable, benefit payable, PTO liability with GL posting
✓ DONE
MethodURLDescription
GET/account/payroll-accrualsPayroll accruals

Demo Steps

1
Same as #37 — emphasize the three accrual types: salary payable, benefit payable, PTO liability
2
Show the full lifecycle: draft → post → reverse
📜

Compliance & Tax

4

Vendor maintains all tax and legislative tables

Gusto handles federal, state, FICA, Georgia TRS automatically
✓ DONE

What's Built

  • Gusto integration handles ALL tax table maintenance automatically
  • Federal income tax, Georgia state tax, Social Security (6.2%), Medicare (1.45%)
  • Georgia TRS retirement (6% employee / 19.81% employer)
  • Paycheck detail shows complete tax breakdown
MethodURLDescription
GET/account/gusto-settingsGusto integration settings
GET/account/paychecksPaychecks with tax detail

Demo Steps

1
Navigate to Settings → Gusto Integration to show the active connection
2
Navigate to Pay Stubs, open any paycheck to show the full tax breakdown
3
Explain: "Gusto maintains all federal, state, and local tax tables — automatic updates with legislative changes"
15

Georgia SUI override with retroactive tax calculation

State-specific tax rate overrides with retro recalculation
✓ DONE

What's Built

  • TaxOverrideServicesetGeorgiaSuiRate(), calculateRetroactiveSui(), getEffectiveRate()
  • Tax types: SUI, FUTA, local, supplemental, workers_comp
  • Retroactive calculation on taxable wages in affected period
  • Company-wide or employee-specific overrides with expiration
MethodURLDescription
GET/account/payroll-compliance/tax-overridesTax overrides list
GET/account/payroll-compliance/tax-overrides/createNew override

Demo Steps

2
Click New Override, select "SUI", state "GA", enter new rate
3
Check "Retroactive" — system calculates the difference for prior periods
35

FLSA blended rate for varying pay

Interactive calculator for stipends and multiple pay rates
✓ DONE
MethodURLDescription
GET/account/payroll-compliance/flsaFLSA blended rate calculator

Demo Steps

2
Add multiple pay rates (e.g., base $25/hr for 40 hrs + stipend $500 for 10 hrs)
3
Click Calculate — shows blended rate, OT premium rate (1.5x), FLSA methodology explanation
39

W-2s and W-2Cs

Annual tax documents with correction capability
✓ DONE
MethodURLDescription
GET/account/payroll-compliance/w2sW-2 forms by year
POST/account/payroll-compliance/w2cRequest W-2C correction

Demo Steps

2
Select tax year, show employee listing with wages and tax summary
3
Show Request W-2C button for corrections to previously issued W-2s
41

Quarter-end and year-end reporting

FICA/GA tax, quarterly reports, 1095 forms, multi-worksite
✓ DONE
MethodURLDescription
GET/account/payroll-compliance/quarterlyQuarterly tax report
GET/account/payroll-compliance/10951095-B/C ACA forms

Demo Steps

2
Select year and quarter, show federal/state tax liability breakdown
3
Navigate to 1095-B/C Forms for ACA compliance
🔍

Audit & Controls

5

Restrict access during payroll blackout

Middleware blocks writes during processing, 423 Locked for AJAX
✓ DONE

What's Built

  • PayrollBlackoutCheck middleware blocks write operations during payroll processing
  • PayrollBlackout model with default restrictions, isBlackoutActive()
  • Auto-activate on payroll run initiation, deactivate on completion
  • Blackout banner on dashboard when active
MethodURLDescription
GET/account/payroll-auditAudit dashboard
GET/account/payroll-audit/blackoutsBlackout management

Demo Steps

2
Click Activate Blackout — show the banner appearing on the dashboard
3
Try to make a change (e.g., edit a salary) — show the system blocking it with a lockout message
4
Deactivate the blackout to restore normal access
27

Trial payroll run (pre-list) with reconciliation

Validate time, deductions, pay; address warnings before processing
✓ DONE

What's Built

  • PayrollAuditService::runPreListValidation() — checks missing hours, unapplied salary changes, CCPA limits, SS wage base
  • Warning/error severity levels with resolution tracking
  • Pre-list creates audit log entries for all findings
MethodURLDescription
GET/account/payroll-auditAudit dashboard with unresolved issues
GET/account/payroll-audit/trial-runsTrial runs list
GET/account/payroll-audit/logsAudit logs

Demo Steps

2
Click Run Pre-List Validation for the current payroll run
3
Show warnings (missing hours, new hires not onboarded, CCPA limit exceeded)
4
Resolve each finding with explanation, then mark as resolved
28

Current vs. previous payroll comparison

Gross variance detection, headcount changes, per-employee drill-down
✓ DONE
MethodURLDescription
GET/account/payroll-audit/trial-runsTrial runs with comparison

Demo Steps

1
Navigate to Audit → Trial Runs, open a trial run
2
Show the side-by-side comparison: current vs. previous run totals
3
Highlight employees with >10% variance flagged in red
29

Capture trial payroll adjustments

Snapshot, review, and finalize trial run before committing
✓ DONE
MethodURLDescription
GET/account/payroll-audit/trial-runsTrial runs list

Demo Steps

1
Navigate to Trial Runs, click Capture Trial
2
Show the snapshot: total gross, net, taxes, deductions summary cards
3
Review the employee-level detail, make adjustments, then Finalize
30

Post payroll audit reports

Zero net pay, deductions >50% of gross, exception reporting
✓ DONE
MethodURLDescription
GET/account/payroll-auditAudit overview
GET/account/payroll-audit/logsFilterable audit logs

Demo Steps

1
After payroll is processed, navigate to Audit → Overview
2
Click Post-Audit Report — shows exceptions (zero net pay, high deduction ratio)
3
Navigate to Audit Logs and filter by run, severity, or type
📊

Reports

19

Managers view labor costs in aggregate by pay component

Regular pay, overtime, benefits, taxes by department
✓ DONE
MethodURLDescription
GET/account/payroll-reportsReports dashboard
GET/account/payroll-reports/labor-costsLabor costs by department

Demo Steps

2
Show department breakdown: regular pay, overtime, benefits, taxes per department
3
Adjust date range (fiscal year, quarter, month) to show trending
20

Managers view overtime by employee

OT hours, OT pay, effective rate per employee
✓ DONE
MethodURLDescription
GET/account/payroll-reports/overtimeOvertime report

Demo Steps

2
Show employees sorted by highest OT hours with regular vs. OT breakdown
34

YTD/QTD/MTD accumulators

12 accumulator types tracked across all period types
✓ DONE
MethodURLDescription
GET/account/payroll-reports/ytd-summaryYTD summary report

Demo Steps

2
Show all 12 accumulator types: gross pay, federal tax, state tax, SS, Medicare, retirement, etc.
3
Toggle between YTD, QTD, and MTD views
38

Hours/wages alignment between HR and Finance

Effective rate vs. configured rate variance detection
✓ DONE
MethodURLDescription
GET/account/payroll-reports/hours-wagesHours/wages alignment

Demo Steps

2
Show employees where effective hourly rate diverges from configured rate (flagged)
43

Labor reporting by category

Certificated, classified employees by fund code
✓ DONE
MethodURLDescription
GET/account/payroll-reports/labor-by-fundLabor by category/fund

Demo Steps

2
Show fund-level breakdown with regular pay, benefits, taxes per fund code
49

Drill down through employee history

24-period pay timeline with YTD summary cards
✓ DONE
MethodURLDescription
GET/account/payroll-reportsReports dashboard (select employee)

Demo Steps

2
Select an employee to view their timeline — up to 24 pay periods of history
3
Show YTD summary cards: gross pay, net pay, federal tax, state tax, retirement, benefits
4
Show per-paycheck detail: gross, deductions, taxes, net, hours
🔗

Other

48

New hire record from Talent Acquisition

10-step onboarding checklist with Gusto sync
✓ DONE

What's Built

  • NewHireOnboardingService — 10-step checklist tracking
  • Quick onboard form: create employee + employee_details + optional Gusto sync in one step
  • Recent hires dashboard (last 90 days) with completion progress bars
  • Gusto sync: full 9-step onboarding (SSN, job, compensation, tax, address, payment method)
MethodURLDescription
GET/account/new-hire-onboardingOnboarding dashboard
GET/account/new-hire-onboarding/createQuick onboard form

Demo Steps

1
2
Show recent hires with progress bars (% complete of 10-step checklist)
3
Click Quick Onboard to create a new hire: name, email, start date, pay type, department
4
Check "Sync to Gusto" — system creates the employee in Gusto with full onboarding
5
Click into the new hire to show the 10-step checklist with completion status