Skip to content

Analytics / Reports — Production Readiness Audit

FieldValue
Date2026-08-16
StatusGo — engineering + companion CI green for 1.4.0 People Payroll soft source; staging migrate smoke remains ops checkbox
ScopeAnalytics module analytics catalog 1.4.0 (People soft source Payroll, gated by payroll.view)
Branchfeature/analytics-payroll-people-1-4-0
CompanionAnalytics production · Developer guide · User guide · API

PRs: Backend #113 · Frontend #109 · Docs #134 · Website #28

Prior Go audits for 1.2.0 / 1.3.0 / 1.3.1 remain valid for those slices; this audit covers the 1.4.0 Payroll People delta.


Executive summary

Reports (analytics slug) is a free Operations Marketplace SKU ($0). Catalog 1.4.0 adds People soft source Payroll:

  • Soft gate: Payroll entitled + payroll.view (stricter than plain analytics.view; staff default role map omits compensation)
  • Metrics: pay runs overlapping the report period, paid net (sum of pay_run_lines.net for paid runs), org-wide payroll profile count
  • Rows: status mix draft / approved / paid with line-net amounts (no per-employee compensation dump)
  • No staff self-scope (mirrors PayRunPolicy); leave/attendance self-scope unchanged
  • Out of scope (intentional): executive overview payroll strip, report builder, saved reports, multi-currency conversion

Go / No-Go: Go — merge companions Backend → Frontend → Docs → Website, migrate through 1.4.0, complete staging smoke (manager Payroll + staff omit).

GateResult
Catalog: operations / analytics / 1.4.0 / free opt-in / sort 70 / not default-includedPass (local DB verified 1.4.0)
Migrate-only bumps: … → 1.3.11.4.0 (2026_08_16_034000_… after 220001)Pass
Soft source payroll + canSource(..., 'payroll.view')Pass
No payroll in AnalyticsOverviewServicePass
Leave/attendance self-scope unchangedPass
SPA People copy / nav / donut chartPass
Pest tests/Feature/Tenant/AnalyticsPass (23 passed local)
Playwright test:e2e:analytics:headedPass (14/14, ~4.9m)
Backend Laravel Tests (workflow_dispatch)Pass
Backend Code Quality Gate (workflow_dispatch)Pass
Frontend Quality GatePass (PR #109)
Docs Quality GatePass (PR #134)
Website Quality GatePass (PR #28)
Report builder; saved reports; email analyticsDeferred
Staging human smoke☐ Ops

Locked-decision matrix

DecisionBackendFrontendDocsWebsite
Free Operations Marketplace opt-inPassPassPassPass
Soft sources (no hard module_dependencies)PassPassPassPass
People Payroll soft sourcePassPassPassPass
Gate Payroll on payroll.viewPassPassPassPass
No staff payroll self-scopePassn/aPassn/a
Period overlap on pay-run datesPassPassPassn/a
Aggregates only (no employee salary rows)PassPassPassn/a
No overview payroll section in 1.4.0PassPassPassPass
Keep Financial Reports + Department reports separatePassPassPassPass

Findings

Open this audit

None (engineering). Staging smoke remains an ops pre-flight checkbox, not a code blocker.

Resolved this audit

IDSeverityFindingResolution
F19MEDIUMCompanion PRs missing; Backend CI manual-onlyOpened #113 · #109 · #134 · #28; dispatched Laravel Tests + Code Quality Gate — both success
F20MEDIUMLocal catalog still 1.3.1Migrated; central modules.version for analytics verified 1.4.0

Accepted / intentional

ItemNotes
No dedicated Analytics tablesAggregates pay_runs / pay_run_lines / payroll_profiles
Multi-currency sums without FXSame pattern as Billing domain reports
No executive overview payroll KPIExplicitly out of scope for 1.4.0
E2e asserts owner Payroll; staff omit covered by PestAuthz e2e remains SPA-gate focused
Backend Tests / Quality Gate remain workflow_dispatchOrg cost control; dispatched before merge

Test evidence

SuiteResultNotes
php artisan test --compact --filter=Analytics23 passedLocal 2026-08-16
npm run test:e2e:analytics:headed14 passedIncludes People + payroll assert
Backend Laravel TestsSuccessworkflow_dispatch on feature branch
Backend Code Quality GateSuccessworkflow_dispatch on feature branch
Frontend Quality GateSuccessPR #109
Docs Quality GateSuccessPR #134
Website Quality GateSuccessPR #28
Catalog row (local after migrate)1.4.0, not default, not billable, $0

Deploy order

  1. Backend — merge #113; php artisan migrate --force through 2026_08_16_034000_bump_analytics_module_to_reports_1_4_0
  2. SPA — merge #109
  3. Docs — merge #134
  4. Website — merge #28
  5. Staging smoke below

No new queues, schedulers, or env vars.


Pre-flight checklist

#CheckOwnerPass?
1Migrations through …_bump_analytics_module_to_reports_1_4_0 appliedOps☑ local; ☐ staging
2Catalog: published, Operations, not default-included, not billable, $0, v1.4.0Ops☑ local; ☐ staging
3New workspace lacks Reports until Marketplace installQA
4SPA RequireAccess (module=analytics, analytics.view)QA
5Nested sidebar People when Employees/Leave/Attendance/Payroll entitledQA
6Soft sources + charts only for entitled modules + view permissionQA
7People Payroll when payroll.view; staff omit without itQA
8Payroll status mix donut; legend values readableQA
9Domain CSV export includes payroll rows when entitledQA
10Period validation + Apply period refetch UXQA
11Pest Analytics 23 + Backend CI greenEng
12Frontend Quality Gate greenEng
13Playwright test:e2e:analytics:headedQA☑ (14/14)
14Website Quality Gate green + timeline 1.4.0Eng
15Docs Quality Gate greenEng
16Smoke steps below signed offQA / Ops

Staging smoke (human)

  1. Marketplace → install Reports (+ Payroll + Employees as needed)
  2. As manager/owner with payroll.view: Overview → Reports → People shows Payroll KPIs, status chart, table, Export CSV
  3. Create a paid pay run overlapping the selected period → paid net and paid bucket update after Apply period
  4. As staff with analytics.view + HR view but without payroll.view: People still loads; Payroll source omitted
  5. Leave/attendance self-scope for staff still holds (regression)
  6. Custom period validation (missing dates / end before start)
  7. Module uninstall Reports → SPA /403 and API 403
  8. Confirm Financial Reports and Department reports remain separate

Rollback

LayerAction
FrontendRedeploy previous SPA
Backend codeRedeploy previous release; keep additive migrations
Module disableMarketplace uninstall (no Analytics domain rows to purge)
SchemaNo Analytics domain schema; catalog bump is additive

Monitoring

  • No Analytics-specific audit events (read-only)
  • Watch GET /api/tenant/v1/analytics/reports/people latency when Payroll entitled
  • Watch for unexpected Payroll visibility for staff roles (should never appear without payroll.view)

Sign-off

RoleNameDateDecision
Engineering2026-08-16Go (F19–F20 closed; companion CI green)
ProductAccept report builder / overview payroll deferred
OpsStaging migrate through 1.4.0 + smoke ☐

Recommendation: Merge companions Backend → Frontend → Docs → Website, migrate staging to 1.4.0, run staging smoke (Payroll manager+ / staff omit), then promote. Do not add report builder or overview payroll under this SKU without a new catalog version and DoD.

Official documentation for the EloSync SaaS Platform.