Review: Admin player detail page -- product payment matrix and contact info (re-review)

review-1609-2026-06-25-r2 Review

review approved

Verdict: APPROVED

Re-review of board item #1609 after refinements. Previous review (review-1609-2026-06-25) found 3 issues, all resolved.

Previous Issues — Resolution

  • [x] arch-rails-views note missing — RESOLVED. Note arch-rails-views (id: 1839) exists in pal-e-docs, scoped to paldocs project. Both paldocs and westside-basketball are Rails ERB apps sharing the same architecture pattern. Cross-project arch note is acceptable.
  • [x] players_controller.rb listed as "modify" — RESOLVED. Issue body now clarifies: "add show action (controller created by #55)." File is correctly listed under "Files the agent should modify" since #55 creates it first.
  • [x] Missing routing constraint — RESOLVED. Constraints section now includes: "Existing admin/players resource has a member { patch :monthly_fee } route dispatched to roster_report_controller. The show action uses the players_controller — do not disrupt existing member routes."

Template Completeness

  • [x] Type — Feature
  • [x] Lineage — References #55 and story WS-S9
  • [x] Repo — ldraney/westside-basketball
  • [x] User Story — As Marcus (admin), track payment status
  • [x] Context — Good background on data model and purpose
  • [x] File Targets — Create and modify targets listed with DO NOT TOUCH directive
  • [x] Feature Flag — none (appropriate for internal admin page)
  • [x] Acceptance Criteria — 6 criteria listed
  • [x] Test Expectations — Controller tests with run command
  • [x] Constraints — 5 constraints listed (up from 3, added routing caution and controller dependency note)
  • [x] Checklist — Standard 3-item checklist
  • [x] Related — References companion tickets and future sprints

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:rails-views label — Rails views component
  • [x] arch note verified — arch-rails-views note exists in pal-e-docs (id: 1839, project: paldocs, cross-project pattern)
  • [x] Forgejo issue — ldraney/westside-basketball#58, state: open

File Targets

  • [x] app/views/admin/players/show.html.erb — to be created. Directory does not yet exist (expected, will be created by #55 or at file creation time). No collision.
  • [x] app/controllers/admin/players_controller.rb — to be modified (created by dependency #55). File does not yet exist, consistent with dependency chain. Ticket correctly notes "#55 creates it, this ticket adds show action."
  • [x] config/routes.rb — verified exists. Current routes have resources :players, only: [] at line 15 inside admin namespace with only a monthly_fee member route via roster_report controller. Adding :show is the correct approach.
  • [x] app/views/admin/payments/ — DO NOT TOUCH directive verified. Directory exists with index.html.erb.

Data Model Verification

  • [x] subscription_status — exists on players table (enum: subscriptionstatus, default: none)
  • [x] jersey_order_status — exists on players table (enum: jerseyorderstatus: none/pending/paid/shipped)
  • [x] monthly_fee — exists on players table (integer column)
  • [x] orders.amount_cents — exists (integer, not null) with status enum (pending/paid/refunded/canceled)
  • [x] orders.product_id — exists with FK and index
  • [x] product.category — exists (enum: jersey/contract/tournament/equipment/monthly) — matches AC categories
  • [x] email_log.email_type — exists (enum includes payment_request and outstanding_balance) — matches AC filter
  • [x] Player model associations verified: has_many :orders, :payment_links, :email_logs, :teams (through player_teams), :registrations, :jersey_public_orders; belongs_to :parent, :tenant

Repo Placement

OK — issue filed on ldraney/westside-basketball, all file targets are in that repo. Single-repo change.

Dependencies

  • [x] depends:55 (Admin player list page) — board item #1606, currently in backlog. Correctly documented. #55 depends on #54 (Keycloak auth, now done). Dependency chain: #54 (done) → #55 (backlog) → #58 (backlog). Sprint:5 label on both #55 and #58 is correct.
  • [x] Issue body references #54 as prerequisite — consistent with board labels.
  • [x] Downstream: board item #1610 (sprint:6) has depends:58. Not documented in issue body but acceptable — downstream awareness is sprint-level.

Acceptance Criteria

6 acceptance criteria — all are verifiable by an agent:
  • AC1-4: Route response, DOM content checks, data correctness — testable via controller tests and view assertions
  • AC5: Back button — testable via link presence check
  • AC6: Mobile-responsive — standard for ERB; verifiable via viewport meta tag presence. Acceptable as-is.
Test commands are real: rails test test/controllers/admin/players_controller_test.rb is the correct Rails test invocation path.

Blast Radius

  • The existing admin/roster_report controller handles update_fee on the player member route. The new admin/players_controller.rb show action must coexist with this. The Constraints section now explicitly documents this routing concern — the agent is instructed not to disrupt existing member routes. Risk mitigated.
  • No similar admin detail pattern exists elsewhere — this is the first admin detail page, so no blast radius to sibling services.

Decomposition Assessment

3 file targets in 1 repo, 6 acceptance criteria (just over the 5 threshold but all are tightly related view/controller concerns for a single page). Estimated agent work: ~3-4 minutes. No decomposition needed — the 6th AC (mobile-responsive) is a CSS concern bundled with the view, not a separate system.

Recommendation

No action needed. All three issues from the previous review have been resolved. Ticket is ready for implementation.