Add declined status to ContractStatus enum #379

Closed
opened 2026-04-07 17:51:53 +00:00 by forgejo_admin · 1 comment

Type

Bug

Lineage

Standalone — discovered during email blast preparation session (2026-04-07). Three families declined via email but have no status to reflect it, risking future unwanted emails.

Repo

forgejo_admin/basketball-api

What Broke

ContractStatus enum only has none, offered, signed. Families who explicitly declined via email (Patrick Kirschman Mar 20, Stein Kunic Mar 22) and admin-excluded players (Boston Greenhalgh) have contract_status=none — indistinguishable from players who were never contacted. Future email blasts have no way to filter them out.

Repro Steps

  1. Query players with contract_status=none
  2. Observe: Boston Greenhalgh (id 98), Patrick Kirschman (id 94), Stein Kunic (id 134) all show none
  3. No way to distinguish "declined" from "never offered"

Expected Behavior

Declined players should have contract_status=declined so email blast logic can exclude them automatically.

Environment

  • Cluster/namespace: basketball-api (prod)
  • Service version/commit: current main
  • Related alerts: none

Acceptance Criteria

  • declined = "declined" added to ContractStatus enum
  • Alembic migration adds enum value to Postgres and updates 3 players (ids 98, 94, 134)
  • Email blast endpoints exclude contract_status=declined
  • No regression in contract signing flow
### Type Bug ### Lineage Standalone — discovered during email blast preparation session (2026-04-07). Three families declined via email but have no status to reflect it, risking future unwanted emails. ### Repo `forgejo_admin/basketball-api` ### What Broke `ContractStatus` enum only has `none`, `offered`, `signed`. Families who explicitly declined via email (Patrick Kirschman Mar 20, Stein Kunic Mar 22) and admin-excluded players (Boston Greenhalgh) have `contract_status=none` — indistinguishable from players who were never contacted. Future email blasts have no way to filter them out. ### Repro Steps 1. Query players with `contract_status=none` 2. Observe: Boston Greenhalgh (id 98), Patrick Kirschman (id 94), Stein Kunic (id 134) all show `none` 3. No way to distinguish "declined" from "never offered" ### Expected Behavior Declined players should have `contract_status=declined` so email blast logic can exclude them automatically. ### Environment - Cluster/namespace: basketball-api (prod) - Service version/commit: current main - Related alerts: none ### Acceptance Criteria - [ ] `declined = "declined"` added to `ContractStatus` enum - [ ] Alembic migration adds enum value to Postgres and updates 3 players (ids 98, 94, 134) - [ ] Email blast endpoints exclude `contract_status=declined` - [ ] No regression in contract signing flow ### Related - `westside` — project this affects - Email evidence in westsidebasktball@gmail.com inbox (threads with angiekunic@yahoo.com, andreakirschman@gmail.com)
forgejo_admin 2026-04-08 20:57:04 +00:00
Author
Owner

Validation: PASS

Tiers executed: Tier 1 (CI pipeline), Tier 3 (production)
Validation note: validation-379-2026-04-07
4 checks: 4 PASS, 0 FAIL

Evidence summary:

  • Pipeline #404: all 5 steps green (clone, postgres, test, build-and-push, update-kustomize-tag)
  • Pod basketball-api-868ffc7cbf-qzpz6 running, 0 restarts, image 7f4a9dbe
  • Python enum: ['none', 'offered', 'signed', 'declined']
  • Postgres enum: ['none', 'offered', 'signed', 'declined']
  • 5 players with declined status: ids 89, 94, 98, 134, 140
  • Email blast query excludes both signed and declined via .notin_()
  • Contract status distribution healthy: none=5, offered=26, signed=27, declined=5
## Validation: PASS Tiers executed: Tier 1 (CI pipeline), Tier 3 (production) Validation note: `validation-379-2026-04-07` 4 checks: 4 PASS, 0 FAIL **Evidence summary:** - Pipeline #404: all 5 steps green (clone, postgres, test, build-and-push, update-kustomize-tag) - Pod `basketball-api-868ffc7cbf-qzpz6` running, 0 restarts, image `7f4a9dbe` - Python enum: `['none', 'offered', 'signed', 'declined']` - Postgres enum: `['none', 'offered', 'signed', 'declined']` - 5 players with `declined` status: ids 89, 94, 98, 134, 140 - Email blast query excludes both `signed` and `declined` via `.notin_()` - Contract status distribution healthy: none=5, offered=26, signed=27, declined=5
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
forgejo_admin/basketball-api#379
No description provided.