E7-F5: Quota Claiming Process¶
Epic: E7: Quota Management
Size: M (Medium)
Problem / Outcome¶
Quota holders claim tickets via web or mobile.
Scope¶
In-Scope:
- Step 1: Select tickets (numbered) or quantity (non-numbered)
- Tickets displayed as cards in grid layout (no seat map)
- Each card shows sector, row, seat number
- Tap cards to select/deselect
- Step 2: Enter ticket holder info
- Step 3: Payment (if required) or skip if free
- Status transitions: ALLOCATED -> RESERVED -> SOLD
Out-of-Scope:
- Partial claiming validation
Acceptance Criteria¶
- AC1: Step 1 displays tickets as cards in grid layout (not seat map)
- AC2: Step 1 allows selecting tickets (numbered) or quantity (non-numbered)
- AC3: Step 2 saves ticket holder info, status becomes RESERVED
- AC4: Step 3 completes payment (or skip if free), status becomes SOLD
- AC5: Step 2 rejects duplicate OIB/passport within the form and against all existing tickets for the match
Data Model Impact¶
QuotaSeat table:
- status transitions: ALLOCATED -> RESERVED -> SOLD
QuotaTicketHolder table:
- id (UUID, PK)
- quota_seat_id (UUID, FK)
- full_name (VARCHAR)
- oib (VARCHAR, encrypted)
- email (VARCHAR)
- entered_at (TIMESTAMP)
QuotaClaim table:
- id (UUID, PK)
- quota_id (UUID, FK)
- step (INTEGER: 1, 2, 3)
- seats_selected (UUID[])
- ticket_holders_json (JSONB)
- payment_status (ENUM)
- completed_at (TIMESTAMP)
Permissions/Roles¶
- Quota Holder
How to Verify¶
npm test -- --grep "quota claiming"
Expected: 3-step flow works, statuses transition correctly.
Dependencies¶
Implementation Tasks¶
See E7: Quota Management Tasks
Doc References¶
Last Updated: January 2026