Review: CRM: show jersey payment status per player (re-review)

review-667-2026-03-29-v2 Doc

review ready

Verdict: READY

Re-review after NEEDS_REFINEMENT on review-667-2026-03-29. All 6 recommendations addressed.

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- "Decomposed -- frontend only. Backend dependency: basketball-api#248."
  • [x] Repo -- forgejo_admin/westside-landing
  • [x] User Story -- As Marcus (admin), I want to see jersey payment status per player in the admin CRM
  • [x] Context -- References basketball-api#248 and the fields it will return
  • [x] Dependency Gate -- Explicit: "MUST NOT execute until basketball-api#248 is merged and deployed"
  • [x] File Targets -- Specific file with explanation; exclusion list present
  • [x] Acceptance Criteria -- 3 concrete, verifiable criteria
  • [x] Test Expectations -- Visual Playwright screenshot + manual validation
  • [x] Constraints -- Frontend-only, match existing badge patterns
  • [x] Checklist -- Standard PR checklist
  • [x] Related -- project-westside-basketball + basketball-api#248

Traceability

  • [x] story:WS-S9 label -- "As an admin, I want to track payment status per player so that I know who owes what"
  • [x] story note verified -- found in project-westside-basketball user-stories section under Admin (Marcus)
  • [x] arch:westside-app label -- frontend component
  • [ ] arch note MISSING -- [SCOPE] No arch-westside-app note exists in pal-e-docs. This is a platform-wide gap (not specific to this ticket). Create architecture note arch-westside-app for component westside-app.
  • [x] Forgejo issue -- forgejo_admin/westside-landing#183, open

File Targets

  • [x] src/routes/(app)/admin/players/+page.svelte -- verified: file exists at ~/westside-app/src/routes/(app)/admin/players/+page.svelte. Currently displays subscription_status and contract_status badges on lines 291-292. Existing badge pattern functions (getStatusBadgeClass, getContractBadgeClass) provide a clear template for jersey_order_status badges.
  • [x] Exclusion: src/routes/(app)/jersey/ -- correctly excluded (ordering page, separate concern)
  • [x] Exclusion: Backend API -- correctly excluded (decomposed to basketball-api#248)

Repo Placement

OK. Issue filed on forgejo_admin/westside-landing, which is the correct Forgejo repo for ~/westside-app (confirmed via git remote). Backend work correctly decomposed to forgejo_admin/basketball-api#248 as a separate issue.

Dependencies

  • basketball-api#248 (open, blocking) -- "Add jersey fields to AdminPlayerItem response." Must be merged and deployed before this ticket executes. Dependency Gate section explicitly documents this.
  • Board item #534 (done): "Show contract status in admin CRM player list" -- same story (WS-S9), same file target. Provides pattern precedent for badge additions.
  • No in_progress or next_up items conflict with or block this work.

Acceptance Criteria

3 criteria, all verifiable:
  • "jersey_order_status as a colored badge (none=grey, pending=yellow, paid=green, shipped=blue)" -- concrete, covers all 4 enum values (verified: JerseyOrderStatus enum in basketball-api has none, pending, paid, shipped)
  • "Paid players show jersey_option label and jersey_number" -- concrete, testable via screenshot
  • "Works on mobile" -- standard, testable via Playwright viewport resize
Previous vague AC ("Easy to filter or sort by jersey status") was removed. Remaining criteria are tight and agent-verifiable.

Blast Radius

  • Admin CRM is a single page. Badge addition is isolated -- no other views consume the admin player list.
  • jersey_number is already displayed in 3 other views (teams, coach, public teams) via different API endpoints. No cross-contamination risk.
  • jersey_order_status and jersey_option are not currently used anywhere in the frontend -- this is a net-new display.

Decomposition

No decomposition needed. Single file target, 3 acceptance criteria, single repo. Estimated agent time well under 5 minutes. Previous decomposition recommendation (split backend/frontend) was executed -- basketball-api#248 handles backend.

Fixes From First Review

All 6 recommendations from review-667-2026-03-29 addressed:
  • [BODY] File target fixed: src/routes/(app)/admin/ -> src/routes/(app)/admin/players/+page.svelte -- DONE
  • [BODY] Incorrect "backend data already exists" constraint removed, replaced with accurate dependency statement -- DONE
  • [BODY] Backend file target removed (decomposed to separate issue) -- DONE
  • [BODY] Vague "filter or sort" AC removed -- DONE
  • [BODY] Missing "shipped" status added (4 badge colors now specified) -- DONE
  • [DECOMPOSE] Split into backend (basketball-api#248) + frontend (this ticket) -- DONE

Recommendation

  • [SCOPE] Create architecture note arch-westside-app -- platform-wide gap, not a blocker for this ticket.
No body or label fixes needed. Ticket is ready for execution once basketball-api#248 is merged and deployed.