CRM: show jersey payment status per player #183

Closed
opened 2026-03-29 18:59:14 +00:00 by forgejo_admin · 3 comments
Contributor

Type

Feature

Lineage

Decomposed — frontend only. Backend dependency: forgejo_admin/basketball-api#248.

Repo

forgejo_admin/westside-landing

User Story

As Marcus (admin)
I want to see jersey payment status per player in the admin CRM
So that I know who ordered and who still needs to follow up

Context

Once basketball-api#248 is deployed, the /admin/players endpoint will return jersey_option, jersey_size, jersey_number, and jersey_order_status for each player. This ticket adds visual display of that data to the admin player list.

Dependency Gate

This ticket MUST NOT execute until basketball-api#248 is merged and deployed.

File Targets

Files the agent should modify:

  • src/routes/(app)/admin/players/+page.svelte — add jersey status badge/column to player list

Files the agent should NOT touch:

  • src/routes/(app)/jersey/ — ordering page
  • Backend API

Acceptance Criteria

  • Admin player list shows jersey_order_status as a colored badge (none=grey, pending=yellow, paid=green, shipped=blue)
  • Paid players show jersey_option label and jersey_number
  • Works on mobile

Test Expectations

  • Visual: Playwright screenshot of admin CRM with jersey badges
  • Run command: manual visual validation

Constraints

  • Backend data comes from basketball-api#248 — frontend only
  • Match existing admin CRM badge patterns (subscription_status, contract_status)

Checklist

  • PR opened
  • Tests pass
  • No unrelated changes
  • project-westside-basketball
  • forgejo_admin/basketball-api#248 — backend dependency (BLOCKING)
### Type Feature ### Lineage Decomposed — frontend only. Backend dependency: `forgejo_admin/basketball-api#248`. ### Repo `forgejo_admin/westside-landing` ### User Story As Marcus (admin) I want to see jersey payment status per player in the admin CRM So that I know who ordered and who still needs to follow up ### Context Once basketball-api#248 is deployed, the `/admin/players` endpoint will return `jersey_option`, `jersey_size`, `jersey_number`, and `jersey_order_status` for each player. This ticket adds visual display of that data to the admin player list. ### Dependency Gate This ticket MUST NOT execute until `basketball-api#248` is merged and deployed. ### File Targets Files the agent should modify: - `src/routes/(app)/admin/players/+page.svelte` — add jersey status badge/column to player list Files the agent should NOT touch: - `src/routes/(app)/jersey/` — ordering page - Backend API ### Acceptance Criteria - [ ] Admin player list shows `jersey_order_status` as a colored badge (none=grey, pending=yellow, paid=green, shipped=blue) - [ ] Paid players show `jersey_option` label and `jersey_number` - [ ] Works on mobile ### Test Expectations - [ ] Visual: Playwright screenshot of admin CRM with jersey badges - Run command: manual visual validation ### Constraints - Backend data comes from basketball-api#248 — frontend only - Match existing admin CRM badge patterns (subscription_status, contract_status) ### Checklist - [ ] PR opened - [ ] Tests pass - [ ] No unrelated changes ### Related - `project-westside-basketball` - `forgejo_admin/basketball-api#248` — backend dependency (BLOCKING)
Author
Contributor

Scope Review: NEEDS_REFINEMENT

Review note: review-667-2026-03-29

Critical finding: The /admin/players endpoint's AdminPlayerItem schema does NOT include jersey fields (jersey_option, jersey_size, jersey_number, jersey_order_status). The issue incorrectly claims "Backend data already exists — this is frontend-only." A backend change in basketball-api is required first.

Issues to fix:

  • [BODY] Fix file target: src/routes/(app)/admin/src/routes/(app)/admin/players/+page.svelte
  • [BODY] Correct constraint: backend data is NOT available — AdminPlayerItem needs jersey fields added
  • [BODY] Add backend file target: src/basketball_api/routes/admin.py (AdminPlayerItem, lines 289-302)
  • [BODY] Clarify AC: "Easy to filter or sort by jersey status" — specify mechanism (filter tab? sort? badge only?)
  • [BODY] Add missing jersey_order_status value: "shipped" (4 enum values exist, issue only lists 3)
  • [DECOMPOSE] Recommend splitting into 2 tickets: (1) basketball-api: add jersey fields to AdminPlayerItem, (2) westside-app: display jersey badges in CRM. Backend blocks frontend.
## Scope Review: NEEDS_REFINEMENT Review note: `review-667-2026-03-29` **Critical finding:** The `/admin/players` endpoint's `AdminPlayerItem` schema does NOT include jersey fields (`jersey_option`, `jersey_size`, `jersey_number`, `jersey_order_status`). The issue incorrectly claims "Backend data already exists — this is frontend-only." A backend change in `basketball-api` is required first. ### Issues to fix: - **[BODY]** Fix file target: `src/routes/(app)/admin/` → `src/routes/(app)/admin/players/+page.svelte` - **[BODY]** Correct constraint: backend data is NOT available — `AdminPlayerItem` needs jersey fields added - **[BODY]** Add backend file target: `src/basketball_api/routes/admin.py` (AdminPlayerItem, lines 289-302) - **[BODY]** Clarify AC: "Easy to filter or sort by jersey status" — specify mechanism (filter tab? sort? badge only?) - **[BODY]** Add missing `jersey_order_status` value: "shipped" (4 enum values exist, issue only lists 3) - **[DECOMPOSE]** Recommend splitting into 2 tickets: (1) basketball-api: add jersey fields to AdminPlayerItem, (2) westside-app: display jersey badges in CRM. Backend blocks frontend.
Author
Contributor

Scope review: NEEDS_REFINEMENT — parked in backlog

Per review review-667-2026-03-29:

  1. False assumption: Issue says "frontend-only" but AdminPlayerItem in basketball-api doesn't return jersey fields. Backend change required first.
  2. Decomposition needed: Split into backend ticket (add jersey fields to /admin/players response) + frontend ticket (display in CRM).
  3. File target imprecise: Should be src/routes/(app)/admin/players/+page.svelte.
  4. Missing status: shipped is a 4th enum value not mentioned.
  5. Vague AC: "Easy to filter or sort" needs specific mechanism.

Will refine and decompose in a future session. Not blocking jersey send.

**Scope review: NEEDS_REFINEMENT — parked in backlog** Per review `review-667-2026-03-29`: 1. **False assumption:** Issue says "frontend-only" but `AdminPlayerItem` in basketball-api doesn't return jersey fields. Backend change required first. 2. **Decomposition needed:** Split into backend ticket (add jersey fields to `/admin/players` response) + frontend ticket (display in CRM). 3. **File target imprecise:** Should be `src/routes/(app)/admin/players/+page.svelte`. 4. **Missing status:** `shipped` is a 4th enum value not mentioned. 5. **Vague AC:** "Easy to filter or sort" needs specific mechanism. Will refine and decompose in a future session. Not blocking jersey send.
Author
Contributor

Scope Review: READY

Review note: review-667-2026-03-29-v2

Re-review after NEEDS_REFINEMENT. All 6 prior recommendations addressed: file target fixed, backend decomposed to basketball-api#248, vague AC removed, shipped status added, dependency gate documented.

One non-blocking scope item remains:

  • [SCOPE] Create architecture note arch-westside-app (platform-wide gap, not ticket-specific)

Ticket is ready for execution once basketball-api#248 is merged and deployed.

## Scope Review: READY Review note: `review-667-2026-03-29-v2` Re-review after NEEDS_REFINEMENT. All 6 prior recommendations addressed: file target fixed, backend decomposed to basketball-api#248, vague AC removed, shipped status added, dependency gate documented. One non-blocking scope item remains: - `[SCOPE]` Create architecture note `arch-westside-app` (platform-wide gap, not ticket-specific) Ticket is ready for execution once basketball-api#248 is merged and deployed.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
ldraney/westside-app#183
No description provided.