# CSD ERP Demo Script - Payroll Module
## 50-Point Vendor Demo Script Analysis

**District:** City Schools of Decatur (RFP 26-001)
**Demo Slot:** 12:30 - 1:15 PM (Payroll)
**Branch:** `csdecatur`
**Last Updated:** April 10, 2026

---

## Status Legend

| Status | Meaning |
|--------|---------|
| DONE | Feature is fully built and demo-ready |

---

## Summary: 50/50 DONE

All 50 demo script points have dynamic, database-backed implementations with full CRUD, services, controllers, and Blade views. The system architecture is: **Missio = smart UI/calculation layer, Gusto = payroll processing engine underneath.**

---

## Point-by-Point Analysis

### 1) Demonstrate the ability to complete a gross up for all payroll

**Status: DONE** (Phase 1)

**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

**URLs:**
- Gross-Up Calculator List: `/account/gross-up`
- New Gross-Up: `/account/gross-up/create`
- Gross-Up Detail: `/account/gross-up/{id}`

---

### 2) Demonstrate the ability to load payroll data from a list or Excel template (e.g., one-time payments, stipends, benefit deductions)

**Status: DONE** (Phase 2)

**What's Built:**
- `PayrollImportService` with file validation, template generation, and batch import
- Support for 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

**URLs:**
- Payroll Imports List: `/account/payroll-imports`
- New Import: `/account/payroll-imports/create`
- Import Detail: `/account/payroll-imports/{id}`

---

### 3) Demonstrate the ability to process additional pay or allowances

**Status: DONE** (Phase 2)

**What's Built:**
- `AdditionalPaymentService` with pending payment retrieval per pay period
- Payment types: stipend, bonus, allowance, supplement, one-time, semi-annual
- Frequency options: one-time, per pay period, monthly, semi-annual, annual
- Fund code/account code mapping, GL accounts, approval workflow
- Integrates into payroll via `includeInPayroll()` (builds Gusto fixed_compensations)

**URLs:**
- Additional Payments List: `/account/additional-payments`
- New Payment: `/account/additional-payments/create`
- Payment Detail: `/account/additional-payments/{id}`

---

### 4) Demonstrate how the system vendor maintains all tax and legislative requirements, tables and payroll functionality

**Status: DONE** (via Gusto)

**What's Built:**
- Gusto integration handles ALL tax table maintenance automatically
- Federal income tax, Georgia state tax, Social Security (6.2%), Medicare (1.45%) calculated by Gusto
- Georgia TRS retirement (6% employee / 19.81% employer) tracked
- Paycheck detail shows complete tax breakdown

**URLs:**
- Gusto Settings: `/account/gusto-settings`
- Paycheck Detail: `/account/paychecks/{id}`
- Payroll Demo Dashboard: `/account/payroll/demo`

---

### 5) Demonstrate the ability to restrict access during payroll blackout (e.g., what is not able to be accessed / updated while payroll is processing)

**Status: DONE** (Phase 4)

**What's Built:**
- `PayrollBlackoutCheck` middleware — blocks write operations during payroll processing, returns 423 Locked for AJAX
- `PayrollBlackout` model with `DEFAULT_RESTRICTIONS` constant, `isBlackoutActive()` static method
- Auto-activate/deactivate blackouts on payroll run initiation/completion
- Blackout management DataTable with activate/deactivate controls
- Blackout banner on audit dashboard when active

**URLs:**
- Audit & Controls Dashboard: `/account/payroll-audit`
- Blackouts Management: `/account/payroll-audit/blackouts`
- Activate Blackout: `POST /account/payroll-audit/blackouts/activate`

---

### 6) Demonstrate how changes to salaries are documented and processed using effective dating and change documentation attachments

**Status: DONE** (Phase 3)

**What's Built:**
- `SalaryChangeService` with `createChangeRequest()`, `approve()`, `apply()`, `massStepIncrement()`
- `salary_change_requests` table: old/new salary, old/new step/lane, change_reason, effective_date, board_approval_date, document_paths JSON, triggers_retro flag
- Change reasons: annual step, promotion, COLA, correction
- Pushes to Gusto on approval via `EmployeeSalaryPlacement`
- DataTable with filters, create form, detail view with old vs. new comparison

**URLs:**
- Salary Changes List: `/account/salary-changes`
- New Salary Change: `/account/salary-changes/create`
- Salary Change Detail: `/account/salary-changes/{id}`
- Mass Step Increment: `POST /account/salary-changes/mass-step`

---

### 7) Demonstrate the ability to pay an employee across multiple process levels (e.g., departments, cost centers)

**Status: DONE** (Pre-existing)

**URLs:**
- Fund Allocations: `/account/fund-allocations`
- Allocation Detail: `/account/fund-allocations/{id}`

---

### 8) Demonstrate how payroll process handles employee salary splits / labor cost allocations (e.g., part of a salary is covered by a grant and part of the salary is covered by another funding source)

**Status: DONE** (Pre-existing)

**URLs:**
- Fund Allocations: `/account/fund-allocations`
- Journal Entries: `/account/payroll-journal-entries`
- Journal Entry Detail: `/account/payroll-journal-entries/{id}`

---

### 9) Demonstrate the ability to set up new garnishments and to allow multiple garnishments with all garnishments interfaced to Finance

**Status: DONE** (Phase 1)

**What's Built:**
- `GarnishmentService` — CCPA-aware calculation, priority ordering, Gusto sync, garnishment file generation
- Garnishment types: child_support, tax_levy, creditor, student_loan
- Multiple garnishments per employee with priority ordering
- CCPA max percentage limits enforced
- GL account mapping for Finance interface
- Court order document storage, total_owed/collected tracking

**URLs:**
- Garnishments List: `/account/garnishments`
- New Garnishment: `/account/garnishments/create`
- Garnishment Detail: `/account/garnishments/{id}`

---

### 10) Demonstrate the employee deduction set up process including how multiple deduction types (e.g., descending balance, flat, one-time) are maintained

**Status: DONE** (Phase 1)

**What's Built:**
- `DeductionCalculationService` — `calculateForEmployee()`, `calculateSingle()`, `applyDescendingBalance()`, `updateYtdTotals()`, `getArrears()`
- Deduction code management: category (tax/benefit/garnishment/retirement/voluntary), calculation_method (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

**URLs:**
- Deduction Codes List: `/account/deduction-codes`
- New Deduction Code: `/account/deduction-codes/create`
- Deduction Code Detail: `/account/deduction-codes/{id}`

---

### 11) Demonstrate the ability to process substitute payroll sourced from a third-party substitute system (e.g., AESOP substitute system, Frontline Absence & Substitute Management)

**Status: DONE** (Phase 8)

**What's Built:**
- `SubstitutePayrollService` — CSV/Excel parsing, employee name matching (exact + fuzzy + last-name-first reversal)
- Source systems: Frontline (AESOP), AESOP Legacy, Manual Upload
- `substitute_payroll_imports` + `substitute_payroll_details` tables
- Validation with error reporting, match rate display
- Import as AdditionalPayments (grouped by employee)
- Manual match UI for unmatched substitutes via SweetAlert
- Template download per source system

**URLs:**
- Substitute Payroll Imports: `/account/substitute-payroll`
- Upload File: `/account/substitute-payroll/create`
- Import Detail (with match/import actions): `/account/substitute-payroll/{id}`
- Download Template: `/account/substitute-payroll/template?source=manual`

---

### 12) Demonstrate the ability to process semi-annual payroll (e.g., athletic supplements paid twice a year)

**Status: DONE** (Phase 2)

**What's Built:**
- `AdditionalPaymentService::processSemiAnnualPayments()` for semi-annual frequency
- Semi-annual payment type in Additional Payments with frequency = `semi_annual`
- Athletic supplement / coaching stipend support via additional payment types

**URLs:**
- Additional Payments: `/account/additional-payments`
- New Payment (select semi-annual frequency): `/account/additional-payments/create`

---

### 13) Demonstrate ability to handle retro pay by date entry to calculate correct pay amounts

**Status: DONE** (Phase 3)

**What's Built:**
- `RetroPayService` with `calculateRetro()`, `calculateRetroByDate()`, `submitRetroPayment()` (off-cycle via Gusto)
- `retro_pay_adjustments` table: old_rate, new_rate, pay_periods_affected, per_period_difference, total_retro_amount, fund_allocations JSON
- Retro calculation shows original vs. corrected amounts per pay period
- Submit retro as off-cycle payroll via Gusto

**URLs:**
- Retro Pay List: `/account/retro-pay`
- New Retro Calculation: `/account/retro-pay/create`
- Retro Pay Detail: `/account/retro-pay/{id}`

---

### 14) Demonstrate ability to automatic retro calculations on effective dated transactions

**Status: DONE** (Phase 3)

**What's Built:**
- `RetroPayService::calculateRetro()` — automatic retro engine compares old vs. new rate across historical pay periods
- Triggered by salary change requests with `triggers_retro = true`
- Shows periods affected, difference per period, total owed
- Batch processing of retro amounts

**URLs:**
- Retro Pay: `/account/retro-pay`
- Retro Pay Detail (shows per-period breakdown): `/account/retro-pay/{id}`

---

### 15) Demonstrate ability to support US / Georgia SUI state override options with the ability to retroactively calculate taxes based on changes

**Status: DONE** (Phase 9)

**What's Built:**
- `TaxOverrideService` with `setGeorgiaSuiRate()`, `calculateRetroactiveSui()`, `getEffectiveRate()`
- `tax_overrides` table: tax_type (sui/futa/local/supplemental/workers_comp), state, rate, previous_rate, retroactive fields
- Retroactive calculation based on taxable wages in affected period
- Company-wide or employee-specific overrides
- Override expiration and auto-expire logic

**URLs:**
- Tax & Compliance Dashboard: `/account/payroll-compliance`
- Tax Rate Overrides: `/account/payroll-compliance/tax-overrides`
- New Override: `/account/payroll-compliance/tax-overrides/create`
- Override Detail: `/account/payroll-compliance/tax-overrides/{id}`

---

### 16) Demonstrate the ability to integrate the PTO accrual within the human resources system with automated PTO journal entries within the ledger for each cost center

**Status: DONE** (Phase 5)

**What's Built:**
- `PtoAccrualService` — accrue per pay period, max balance cap, annual accrual cap, tenure-based rates
- `PtoAccrualPolicy` linked to existing `leave_types` table
- `PtoAccrualEntry` tracks accrual/usage/adjustment/payout/carryover/forfeiture
- `PayrollAccrualService::calculatePtoLiability()` — values outstanding PTO at employee hourly rates, split by fund allocation
- `syncQuotaBalance()` writes back to existing `employee_leave_quotas` for Leave module consistency
- Journal entry generation for PTO liability by cost center

**URLs:**
- PTO Accrual Policies: `/account/pto-accruals`
- New Policy: `/account/pto-accruals/create`
- Policy Ledger (entries): `/account/pto-accruals/{id}/entries`
- Payroll Accruals: `/account/payroll-accruals`
- PTO Liability Report: `POST /account/payroll-accruals/pto-liability`

---

### 17) Demonstrate the ability to mass load information from Excel templates (e.g., pay, deductions, employee data changes, direct deposit, YTD adjustments)

**Status: DONE** (Phase 2)

**What's Built:**
- `PayrollImportService` — supports all import types: one_time_payments, stipends, deductions, employee_data, direct_deposit, ytd_adjustments
- Template download per type, file validation, error row tracking
- Preview and commit workflow

**URLs:**
- Payroll Imports: `/account/payroll-imports`
- New Import: `/account/payroll-imports/create`
- Import Detail: `/account/payroll-imports/{id}`

---

### 18) Demonstrate the ability to ensure that withholding allowances cannot be changed by an employee with a garnishment that would be affected by the change

**Status: DONE** (Phase 1)

**What's Built:**
- `GarnishmentService::lockWithholding()` — sets `withholding_locked` flag on active garnishments
- Business rule: when active garnishment exists with lock, W-4 withholding changes are blocked
- Override capability for HR admin

**URLs:**
- Garnishment Detail (shows lock status): `/account/garnishments/{id}`

---

### 19) Demonstrate the ability for managers to view labor costs in aggregate, by pay component

**Status: DONE** (Phase 6)

**What's Built:**
- `PayrollReportingService::getLaborCostsByDepartment()` — joins paychecks -> payroll_runs -> pay_periods -> employee_details -> teams
- Breakdown by department: regular pay, overtime, benefits, taxes, total cost
- Configurable date range (fiscal year, quarter, month)

**URLs:**
- Payroll Reports Dashboard: `/account/payroll-reports`
- Labor Costs by Department: `/account/payroll-reports/labor-costs`

---

### 20) Demonstrate the ability for managers to view overtime worked, shift differential paid, etc. by employee

**Status: DONE** (Phase 6)

**What's Built:**
- `PayrollReportingService::getOvertimeReport()` — employees with OT sorted by highest
- Shows regular hours, OT hours, OT pay, effective OT rate per employee
- Filterable by date range and department

**URLs:**
- Payroll Reports Dashboard: `/account/payroll-reports`
- Overtime Report: `/account/payroll-reports/overtime`

---

### 21) Demonstrate the ability to set up and maintain direct deposits

**Status: DONE** (Phase 10)

**What's Built:**
- `GustoDirectDepositService` — `getBankAccounts()`, `updatePaymentMethod()`, `addBankAccount()`, `switchToCheck()`
- `DirectDepositController` — list all employees with payment method status, manage per employee
- Support for multiple account splits (checking/savings, split by amount/percentage)
- View bank accounts (masked), update routing/account numbers, switch to check

**URLs:**
- Direct Deposit Management: `/account/direct-deposit`
- Employee DD Detail: `/account/direct-deposit/{userId}`

---

### 22) Demonstrate the ability to make correction or changes to employee record

**Status: DONE** (Pre-existing)

**URLs:**
- Employee List: `/account/employees`
- Employee Edit: `/account/employees/{id}/edit`
- Employee Profile: `/account/employees/{id}`

---

### 23) Demonstrate the ability to set up pay and deduction codes, control taxation and provide visibility on checks as well as account mapping to flow to general ledger

**Status: DONE** (Phase 1)

**What's Built:**
- `DeductionCodeController` with full CRUD for deduction codes
- Categories: tax, benefit, garnishment, retirement, voluntary
- Calculation methods: flat, percentage, descending_balance, hours_based
- Pre-tax/post-tax flag, GL debit/credit account mapping
- Gusto benefit ID linking for paycheck visibility

**URLs:**
- Deduction Codes: `/account/deduction-codes`
- New Deduction Code: `/account/deduction-codes/create`
- Deduction Code Detail: `/account/deduction-codes/{id}`

---

### 24) Demonstrate the ability to make correction or changes to employee record

**Status: DONE** (Duplicate of #22)

**URLs:** Same as #22

---

### 25) Demonstrate the ability to process special payments (e.g., staff development stipends)

**Status: DONE** (Phase 2)

**What's Built:**
- Additional Payments with payment_type = `stipend`, frequency = `one_time`
- Approval workflow (requested_by, approved_by, approved_at)
- Fund code / account code assignment for GL posting
- Included in payroll via `AdditionalPaymentService::includeInPayroll()`

**URLs:**
- Additional Payments: `/account/additional-payments`
- New Payment: `/account/additional-payments/create`

---

### 26) Demonstrate how arrears deductions are managed and followed throughout a payroll

**Status: DONE** (Phase 1)

**What's Built:**
- `DeductionCalculationService::getArrears()` — tracks arrears balances per employee
- When deduction can't be fully taken (insufficient net pay), remaining goes to arrears
- Automatic arrears collection from future paychecks
- Arrears balance visible on employee deduction detail

**URLs:**
- Deduction Codes (arrears tracking per employee): `/account/deduction-codes`

---

### 27) Demonstrate the ability to calculate gross and net payroll, perform reconciliations on the payroll and address system warnings/messages to validate time and benefit deductions and calculated pay (audit) using a trial payroll run (e.g., pre-list)

**Status: DONE** (Phase 4)

**What's Built:**
- `PayrollAuditService::runPreListValidation()` — checks missing hours, unapplied salary changes, new hires, CCPA limits, SS wage base ($176,100 for 2026)
- Warning and error severity levels with resolution tracking
- Pre-list run creates audit log entries for all findings
- Audit dashboard shows unresolved issues with resolve action

**URLs:**
- Audit & Controls Dashboard: `/account/payroll-audit`
- Run Pre-List Validation: `POST /account/payroll-audit/pre-list/{runId}`
- Audit Logs: `/account/payroll-audit/logs`

---

### 28) Demonstrate the ability to support a review of current payroll amounts versus the previous payroll amounts through the pre-list process

**Status: DONE** (Phase 4)

**What's Built:**
- `PayrollAuditService::compareWithPrevious()` — gross variance >5%, headcount changes, per-employee >10% variance detection
- Side-by-side comparison table in trial run view
- Variance highlighting with drill-down to employee detail

**URLs:**
- Run Comparison: `POST /account/payroll-audit/compare/{runId}`
- Trial Run Detail (shows comparison): `/account/payroll-audit/trial-runs/{id}`

---

### 29) Demonstrate the ability to capture trial payroll adjustments

**Status: DONE** (Phase 4)

**What's Built:**
- `PayrollAuditService::captureTrialSnapshot()` — builds full paycheck snapshot, runs pre-list + comparison
- `payroll_trial_runs` table: snapshot JSON, warnings JSON, comparison JSON, adjustments_made JSON
- Trial run review workflow: draft -> reviewed -> finalized
- Summary cards (total gross, net, taxes, deductions) + employee snapshot table

**URLs:**
- Trial Runs List: `/account/payroll-audit/trial-runs`
- Capture Trial: `POST /account/payroll-audit/trial-runs/{runId}/capture`
- Trial Run Detail: `/account/payroll-audit/trial-runs/{id}`

---

### 30) Demonstrate the ability to create post payroll audit reports

**Status: DONE** (Phase 4)

**What's Built:**
- `PayrollAuditService::generatePostAuditReport()` — zero net pay detection, deductions >50% of gross flagging
- Post-audit report with summary + exception details
- Audit summary endpoint with counts by severity and category

**URLs:**
- Post-Audit Report: `POST /account/payroll-audit/post-audit/{runId}`
- Audit Summary: `/account/payroll-audit/summary`
- Audit Logs (filterable by run, severity, type): `/account/payroll-audit/logs`

---

### 31) Demonstrate the ability to enter payroll data and process off-cycle payroll checks and utilize direct deposit on these off-cycle checks

**Status: DONE** (Pre-existing)

**URLs:**
- Payroll Dashboard: `/account/payroll/dashboard`
- Payroll Run Detail: `/account/payroll/{id}`

---

### 32) Demonstrate the ability to identify payroll underpayments and to process like retroactive payments

**Status: DONE** (Phase 3)

**What's Built:**
- `RetroPayService::identifyUnderpayments()` — compares expected vs. actual pay across historical periods
- Underpayment detection triggers retro pay calculation
- Submit retro correction as off-cycle payroll via Gusto

**URLs:**
- Retro Pay: `/account/retro-pay`
- New Retro Calculation: `/account/retro-pay/create`
- Retro Pay Detail: `/account/retro-pay/{id}`

---

### 33) Demonstrate the ability to identify and track payroll overpayments including direct deposit reversals if caught early enough

**Status: DONE** (Phase 7)

**What's Built:**
- `PayrollAdjustmentService::trackOverpayment()` — creates adjustment with installment calculation
- Recovery methods: payroll_deduction, direct_deposit_reversal, lump_sum, installment
- Recovery progress tracking (recovered_amount, remaining_amount, progress bar)
- `setupRecoveryPlan()`, `recordRecoveryPayment()`, auto-completes when remaining=0
- `requestDirectDepositReversal()` for early-catch reversals

**URLs:**
- Payroll Adjustments: `/account/payroll-adjustments`
- New Adjustment (overpayment type): `/account/payroll-adjustments/create`
- Adjustment Detail (with recovery progress): `/account/payroll-adjustments/{id}`

---

### 34) Demonstrate the ability to create and report on Fiscal Year-To-Date (YTD), Quarter-To-Date (QTD) and Month-To-Date (MTD) accumulators

**Status: DONE** (Phase 6)

**What's Built:**
- `PayrollAccumulator` model with 12 accumulator types (gross_pay, federal_tax, state_tax, social_security, medicare, retirement, health_benefit, dental_benefit, other_deductions, net_pay, employer_fica, employer_benefits)
- Period types: YTD, QTD, MTD — all updated simultaneously via `increment()` static
- `PayrollReportingService::getYtdSummary()` with fallback to `buildYtdFromPaychecks()`
- Configurable fiscal year, quarter, month views

**URLs:**
- Payroll Reports Dashboard: `/account/payroll-reports`
- YTD Summary Report: `/account/payroll-reports/ytd-summary`

---

### 35) Demonstrate the ability to calculate FLSA rate due to varying pay (e.g., stipends)

**Status: DONE** (Phase 9)

**What's Built:**
- `GustoComplianceService::calculateFlsaBlendedRate()` — blended rate = total earnings / total hours, OT rate = 1.5x blended
- Interactive calculator UI: add multiple pay rates/hours, calculates blended rate and OT premium
- Explanation of FLSA methodology in the UI

**URLs:**
- Tax & Compliance Dashboard: `/account/payroll-compliance`
- FLSA Blended Rate Calculator: `/account/payroll-compliance/flsa`

---

### 36) Demonstrate the ability to create paychecks along with the ACH File and garnishment file used to upload to bank

**Status: DONE** (Phase 10)

**What's Built:**
- `PayrollDisbursementService::generateAchFile()` — NACHA-format ACH file generation with file/batch/entry/control records
- `generateCheckBatch()` — batch check issuance with auto-numbering
- ACH garnishment disbursements with agency, case number, routing tracking
- Downloadable ACH file for bank upload

**URLs:**
- Payroll Disbursements: `/account/payroll-disbursements`
- New Disbursement: `/account/payroll-disbursements/create`
- Disbursement Detail: `/account/payroll-disbursements/{id}`
- Generate ACH File: `POST /account/payroll-disbursements/generate-ach`
- Print Checks: `POST /account/payroll-disbursements/print-checks`

---

### 37) Demonstrate how the month end accrual is calculated after the last pay period of the month

**Status: DONE** (Phase 5)

**What's Built:**
- `PayrollAccrualService::calculateMonthEndAccruals()` — salary payable, benefit payable, PTO liability
- Accrual types: pto_liability, salary_payable, benefit_payable
- GL account mapping, journal entry generation
- Accrual reversal capability with offsetting entries

**URLs:**
- Payroll Accruals: `/account/payroll-accruals`
- Calculate Month-End: `POST /account/payroll-accruals/calculate`
- Post Accruals: `POST /account/payroll-accruals/{id}/post`
- Reverse Accrual: `POST /account/payroll-accruals/{id}/reverse`

---

### 38) Demonstrate the ability for alignment of all hours/wages as well as overtime hours/wages tracking between human resources and finance

**Status: DONE** (Phase 6)

**What's Built:**
- `PayrollReportingService::getHoursWagesAlignment()` — effective rate vs. configured rate comparison
- Variance highlighting: flags employees where actual hourly rate diverges from configured rate
- Cross-references HR hours (employee_details) with payroll hours (paychecks)

**URLs:**
- Payroll Reports Dashboard: `/account/payroll-reports`
- Hours/Wages Alignment: `/account/payroll-reports/hours-wages`

---

### 39) Demonstrate the ability to create annual payroll reporting documents (e.g., W-2s, W-2Cs)

**Status: DONE** (Phase 9)

**What's Built:**
- `GustoComplianceService::getW2s()` — fetch W-2s from Gusto by year
- `getW2Pdf()` — download individual W-2 PDFs
- `requestW2C()` — submit W-2C corrections via Gusto API
- Year selector, employee listing with wages/tax summary

**URLs:**
- Tax & Compliance Dashboard: `/account/payroll-compliance`
- W-2 Forms: `/account/payroll-compliance/w2s`
- W-2 by Year: `/account/payroll-compliance/w2s?year=2025`

---

### 40) Demonstrate how the system prepares the month end entry for accrued PTO liability to interface to GL including employee with multiple positions and/or department or cost center allocations

**Status: DONE** (Phase 5)

**What's Built:**
- `PayrollAccrualService::calculatePtoLiability()` — values all outstanding PTO at employee hourly rates
- PTO liability split by fund allocation percentages for multi-position employees
- Generates accrual journal entries with GL accounts per cost center
- Draft -> posted -> reversed workflow

**URLs:**
- Payroll Accruals: `/account/payroll-accruals`
- PTO Liability Report: `POST /account/payroll-accruals/pto-liability`

---

### 41) Demonstrate the ability to support quarter end and year end reporting processes (e.g., FICA / GA tax report, Quarterly reports, 1095 reports, multi-worksite report)

**Status: DONE** (Phase 9)

**What's Built:**
- `GustoComplianceService::getQuarterlyTaxReport()` — federal and state quarterly tax liability
- `get1095Forms()` — ACA compliance forms (1095-B and 1095-C)
- `getFederalTaxRequirements()`, `getStateTaxRequirements()` — tax requirement details
- Quarterly report view with year/quarter selector and tax breakdown table
- 1095 forms view with year selector

**URLs:**
- Tax & Compliance Dashboard: `/account/payroll-compliance`
- Quarterly Tax Report: `/account/payroll-compliance/quarterly`
- 1095 Forms (ACA): `/account/payroll-compliance/1095`

---

### 42) Demonstrate the ability to support check printing for non-direct deposit payments

**Status: DONE** (Phase 10)

**What's Built:**
- `PayrollDisbursementService` — check issuance with auto-numbering (starts at 10001)
- `generateCheckBatch()` — batch check printing for selected disbursements
- Check number tracking, check date, payee name, memo
- Manual check type for hand-written checks
- DataTable with type/status filters

**URLs:**
- Payroll Disbursements: `/account/payroll-disbursements`
- New Check: `/account/payroll-disbursements/create`
- Check Detail: `/account/payroll-disbursements/{id}`

---

### 43) Demonstrate the ability for labor reporting for salary, PTO accruals, and other pay classifications by category (e.g., Certificated Employees, Classified Employees)

**Status: DONE** (Phase 6)

**What's Built:**
- `PayrollReportingService::getLaborByCategory()` — labor costs by fund code from `employee_fund_allocations`
- Summary cards with total labor, fund count, employee count, average cost
- Fund breakdown table with regular pay, benefits, taxes per fund
- Configurable date range

**URLs:**
- Payroll Reports Dashboard: `/account/payroll-reports`
- Labor by Category/Fund: `/account/payroll-reports/labor-by-category`

---

### 44) Demonstrate the ability to retroactively redistribute the labor distribution on an exception basis when informed of an error by an employee or their time approver

**Status: DONE** (Phase 7)

**What's Built:**
- `PayrollAdjustmentService::createLaborRedistribution()` — old/new fund_code and account_code
- Labor redistribution adjustment type with approval workflow
- Shows old fund -> new fund in detail view
- Generates correcting journal entries on approval

**URLs:**
- Payroll Adjustments: `/account/payroll-adjustments`
- New Adjustment (labor_redistribution type): `/account/payroll-adjustments/create`
- Adjustment Detail (shows fund redistribution): `/account/payroll-adjustments/{id}`

---

### 45) Demonstrate how the PTO plan balance is paid when employee terminates employment and is eligible for a plan balance payout

**Status: DONE** (Phase 5)

**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 in pto_accrual_entries, zeros balance
- Syncs back to employee_leave_quotas

**URLs:**
- PTO Accrual Entries: `/account/pto-accruals/{id}/entries`
- Termination Payout: `POST /account/pto-accruals/termination-payout` (via SweetAlert on entries page)

---

### 46) Demonstrate the ability to provide payroll accruals

**Status: DONE** (Phase 5)

**What's Built:**
- `PayrollAccrualService` — salary payable, benefit payable, PTO liability accruals
- Draft -> posted -> reversed status workflow
- GL account mapping (debit/credit) per accrual type
- Journal entry generation for posted accruals
- Reversal creates offsetting entry with swapped GL accounts

**URLs:**
- Payroll Accruals: `/account/payroll-accruals`
- Calculate: `POST /account/payroll-accruals/calculate`
- Post: `POST /account/payroll-accruals/{id}/post`
- Reverse: `POST /account/payroll-accruals/{id}/reverse`

---

### 47) Demonstrate ability to enter YTD adjustments to employee wages

**Status: DONE** (Phase 7)

**What's Built:**
- `PayrollAdjustmentService::applyYtdAdjustment()` — applies to PayrollAccumulator on approval
- YTD adjustment fields: ytd_field, ytd_old_value, ytd_new_value, auto-calculates difference
- Applies to all 12 accumulator types (gross_pay, federal_tax, state_tax, etc.)
- Impact flows through to W-2 and quarterly reports via accumulators

**URLs:**
- Payroll Adjustments: `/account/payroll-adjustments`
- New Adjustment (ytd_adjustment type): `/account/payroll-adjustments/create`
- Adjustment Detail (shows old/new values): `/account/payroll-adjustments/{id}`

---

### 48) Show a new hire employee record that has been created from Talent Acquisition

**Status: DONE** (Phase 8)

**What's Built:**
- `NewHireOnboardingService` — 10-step checklist (employee record, personal info, position, salary, fund allocation, benefits, Gusto sync, Gusto onboarding, direct deposit, tax forms)
- Quick onboard form: create employee + employee_details + optional Gusto sync in one step
- Recent hires dashboard (last 90 days) with completion percentage progress bars
- Gusto sync status per employee (synced/error/pending/not_synced)
- `syncToGusto()` triggers full 9-step Gusto onboarding flow

**URLs:**
- New Hire Onboarding Dashboard: `/account/new-hire-onboarding`
- Quick Onboard Form: `/account/new-hire-onboarding/create`
- Employee Onboarding Checklist: `/account/new-hire-onboarding/{userId}`
- Sync to Gusto: `POST /account/new-hire-onboarding/{userId}/sync-gusto`

---

### 49) Demonstrate the ability to drill down through employee history

**Status: DONE** (Phase 6)

**What's Built:**
- `PayrollReportingService::getEmployeePayHistory()` — 24-period pay timeline with 6 YTD summary cards
- YTD cards: gross pay, net pay, federal tax, state tax, retirement, benefits
- Pay history table: period, gross, deductions, taxes, net, hours per paycheck
- Employee selector on reports dashboard

**URLs:**
- Payroll Reports Dashboard: `/account/payroll-reports`
- Employee Timeline: `/account/payroll-reports/employee/{employeeId}`

---

### 50) Demonstrate ability to provide online check replacement request for lost check (need to include a disclaimer)

**Status: DONE** (Phase 10)

**What's Built:**
- `PayrollDisbursementService::voidAndReplace()` — voids original check + optionally issues replacement
- Void reason tracking, voided_at timestamp, voided_by user
- Replacement check links to original via `original_disbursement_id` / `replacement_id`
- SweetAlert confirmation with void reason input + "Issue replacement" checkbox
- Full audit trail: original -> voided -> replacement chain visible on detail page

**URLs:**
- Payroll Disbursements: `/account/payroll-disbursements`
- Disbursement Detail (void/replace actions): `/account/payroll-disbursements/{id}`

---

## Summary Dashboard

### Status Overview

| Status | Count | Points |
|--------|-------|--------|
| **DONE** | **50** | All 50 points |

### Implementation Phases

| Phase | Features | Points Covered |
|-------|----------|----------------|
| Pre-existing | Fund allocations, Gusto tax tables, employee CRUD, off-cycle payroll | #4, #7, #8, #22, #24, #31 |
| Phase 1: Deductions & Garnishments | Deduction codes, garnishments, gross-up calculator | #1, #9, #10, #18, #23, #26 |
| Phase 2: Import & Additional Pay | Payroll imports, additional payments, semi-annual | #2, #3, #12, #17, #25 |
| Phase 3: Salary & Retro Pay | Salary changes, retro pay, underpayment detection | #6, #13, #14, #32 |
| Phase 4: Audit & Controls | Blackouts, pre-list validation, trial runs, post-audit | #5, #27, #28, #29, #30 |
| Phase 5: PTO & Accruals | PTO accrual policies, payroll accruals, PTO liability, termination payout | #16, #37, #40, #45, #46 |
| Phase 6: Reports | Accumulators, labor costs, overtime, hours/wages, employee timeline | #19, #20, #34, #38, #43, #49 |
| Phase 7: Corrections | Overpayment recovery, labor redistribution, YTD adjustments | #33, #44, #47 |
| Phase 8: External Integrations | Substitute payroll imports, new hire onboarding bridge | #11, #48 |
| Phase 9: Tax & Compliance | Tax overrides, W-2/1095, FLSA calculator, quarterly reports | #15, #35, #39, #41 |
| Phase 10: Disbursements | Direct deposit, check issuance, ACH files, void/replace | #21, #36, #42, #50 |

### New Pages Quick Reference

| Page | URL |
|------|-----|
| Gross-Up Calculator | `/account/gross-up` |
| Deduction Codes | `/account/deduction-codes` |
| Garnishments | `/account/garnishments` |
| Payroll Imports | `/account/payroll-imports` |
| Additional Payments | `/account/additional-payments` |
| Salary Changes | `/account/salary-changes` |
| Retro Pay | `/account/retro-pay` |
| Audit & Controls Dashboard | `/account/payroll-audit` |
| Blackouts | `/account/payroll-audit/blackouts` |
| Trial Runs | `/account/payroll-audit/trial-runs` |
| Audit Logs | `/account/payroll-audit/logs` |
| PTO Accrual Policies | `/account/pto-accruals` |
| Payroll Accruals | `/account/payroll-accruals` |
| Payroll Reports Dashboard | `/account/payroll-reports` |
| YTD Summary | `/account/payroll-reports/ytd-summary` |
| Labor Costs by Dept | `/account/payroll-reports/labor-costs` |
| Overtime Report | `/account/payroll-reports/overtime` |
| Hours/Wages Alignment | `/account/payroll-reports/hours-wages` |
| Labor by Fund/Category | `/account/payroll-reports/labor-by-category` |
| Employee Timeline | `/account/payroll-reports/employee/{id}` |
| Payroll Adjustments | `/account/payroll-adjustments` |
| Substitute Payroll | `/account/substitute-payroll` |
| New Hire Onboarding | `/account/new-hire-onboarding` |
| Tax & Compliance | `/account/payroll-compliance` |
| Tax Rate Overrides | `/account/payroll-compliance/tax-overrides` |
| W-2 Forms | `/account/payroll-compliance/w2s` |
| 1095 Forms (ACA) | `/account/payroll-compliance/1095` |
| FLSA Calculator | `/account/payroll-compliance/flsa` |
| Quarterly Tax Report | `/account/payroll-compliance/quarterly` |
| Payroll Disbursements | `/account/payroll-disbursements` |
| Direct Deposit | `/account/direct-deposit` |

### Database Tables Created

| Table | Phase |
|-------|-------|
| `deduction_codes` | 1 |
| `employee_deductions` | 1 |
| `garnishments` | 1 |
| `garnishment_payments` | 1 |
| `gross_up_calculations` | 1 |
| `payroll_imports` | 2 |
| `additional_payments` | 2 |
| `salary_change_requests` | 3 |
| `retro_pay_adjustments` | 3 |
| `payroll_blackouts` | 4 |
| `payroll_trial_runs` | 4 |
| `payroll_audit_logs` | 4 |
| `pto_accrual_policies` | 5 |
| `pto_accrual_entries` | 5 |
| `payroll_accruals` | 5 |
| `payroll_accumulators` | 6 |
| `payroll_adjustments` | 7 |
| `substitute_payroll_imports` | 8 |
| `substitute_payroll_details` | 8 |
| `tax_overrides` | 9 |
| `payroll_disbursements` | 10 |
