[T05] Stock Reports

Summary

Tenant-level reporting surface for race-number stock and assignments. Surfaces existing backend data; CSV export per report.

Actor & Context

Actor: tenant admin, finance, organiser preparing for an event. Frequency: monthly+; ad-hoc before each event. Precondition: user has TENANT_ADMIN (or EVENT_MANAGER for event-scoped reports) permission. Entry point: Tenant-admin workspace nav Reports; deep-link from E01 for event-scoped reports.

Main Flow

  1. Operator picks a report from a list (sidebar or tab strip — TBD by design pass).

  2. Report renders with appropriate filters (date range, NumberType, event).

  3. Operator exports to CSV when needed.

Reports in scope:

  • Stock status — counts by state and type.

  • Assignments per event — driven by event scope.

  • UNFIT summary — date filtered.

  • Person pick-list — per person_id → numbers ordered by last_used (the WS1b endpoint).

Alternative Flows

  • AF-1: Report empty — empty state with hint.

  • AF-2: CSV export large dataset — server-side pagination + streaming export (TBD).

Acceptance Criteria

  • Use-case page authored.

  • Status design-todo → handoff-ready after Claude Design pass.

  • Reports surface against existing endpoints.

  • CSV export works for each report.

API Surface

Call Purpose

GET /api/race-numbers/stats?groupBy=state,type

Stock status report.

GET /api/events/{id}/race-numbers/assignments

Assignments per event.

GET /api/race-numbers?state=UNFIT_FOR_SERVICE&from=&to=

UNFIT summary.

GET /api/people/{personId}/number-pickList

Person pick-list (WS1b).

Out of Scope

  • Stock browsing/drill-down — T02.

  • Stock return — T03.

  • Bulk actions — T04.

Design Anchors

Notes

Reports surface existing backend data. Likely the simplest D2b screen after the design pass.