E9: Ticket Management & Delivery - Tasks¶
Epic: E9: Ticket Management & Delivery
E9-F1: Ticket Generation & QR Code¶
Feature: E9-F1: Ticket Generation & QR Code
| Status | Task | Verification |
|---|---|---|
| Create Ticket database migration (id, order_id, match_id, seat_id, qr_code, status, holder_name, holder_oib, holder_email) | Run migrations | |
| Generate unique ticket ID | IDs are unique | |
| Generate QR code with ticket ID encoded | QR code scannable | |
| Store QR code as base64 or file path | QR retrievable |
E9-F2: Tiered Ticket Visibility¶
Feature: E9-F2: Tiered Ticket Visibility
| Status | Task | Verification |
|---|---|---|
| Implement GET /tickets/{id} with conditional fields based on time | Fields vary by time | |
| >4 days: return order info only (no seat, no QR) | Seat/QR hidden | |
| 4 days to 5 hours: return seat details (no QR) | QR hidden | |
| <5 hours: return full ticket with QR | QR visible |
E9-F3: Anti-Screenshot Protection¶
Feature: E9-F3: Anti-Screenshot Protection
Implementation Note
QR code itself is static. Protection comes from animation and rotating verification images.
| Status | Task | Verification |
|---|---|---|
| Implement snake animation component around QR code | Animation renders | |
| Implement rotating verification images (3 images) | Images rotate | |
| Disable screenshot on QR screen (iOS/Android native) | Screenshot blocked |
E9-F4: Digital Wallet Integration¶
Feature: E9-F4: Digital Wallet Integration
| Status | Task | Verification |
|---|---|---|
| Install PassKit SDK for Apple Wallet | SDK imported | |
| Implement .pkpass file generation | File generated | |
| Implement Google Passes API integration | Pass added | |
| Include QR code, match details, seat info in pass | Pass shows correct info |
E9-F5: Ticket Transfer Self-Service¶
Feature: E9-F5: Ticket Transfer Self-Service
| Status | Task | Verification |
|---|---|---|
| Check ticket.transfer_permission before showing transfer button | Button visibility correct | |
| Implement POST /tickets/{id}/transfer endpoint | Accepts new holder data | |
| Validate new holder against blacklist | Blacklisted blocked | |
| Update ticket holder fields | Holder info changed | |
| Send notification to original and new holder | Both notified |
E9-F6: Away Match PDF Ticket Handling¶
Feature: E9-F6: Away Match PDF Ticket Handling
| Status | Task | Verification |
|---|---|---|
| Implement POST /admin/matches/{id}/upload-pdf-tickets endpoint | Accepts files | |
| Match PDFs to orders by attendee name or seat | Matching works | |
| Store PDF URL in ticket record | URL saved | |
| Implement mass email distribution of PDFs | Emails sent | |
| Set external_ticket_required flag on tickets | Flag set | |
| Hide QR code in app for external ticket matches | QR not shown |
E9-F7: View Order Details¶
Feature: E9-F7: View Order Details
| Status | Task | Verification |
|---|---|---|
| Implement GET /orders/{id} endpoint with order summary, tickets, payment info | Returns full order data | |
| Add refund_status and refunded_amount fields to Order table | Migration successful | |
| Implement buyer-only access check (403 for non-buyers) | Recipients cannot access | |
| Add "View Order" button only visible to buyers in ticket details | Button visibility correct | |
| Implement order summary with line items and service fees | Summary displays correctly | |
| Implement payment information display (masked card, transaction ID) | Payment info shows | |
| Implement tickets list with status badges | All tickets visible | |
| Integrate invoice viewing (PDF viewer in-app) | PDF opens | |
| Implement invoice download functionality | Download works | |
| Implement "Send to Email" for invoice | Email received |
E9-F8: Self-Service Ticket Cancellation¶
Feature: E9-F8: Self-Service Ticket Cancellation
| Status | Task | Verification |
|---|---|---|
| Implement POST /orders/{id}/cancel-tickets endpoint | Accepts ticket IDs | |
| Add 48-hour rule validation (block if <48h before match) | Error returned if too late | |
| Add buyer-only authorization check | Non-buyers get 403 | |
| Add validation for transferred/cancelled tickets | Cannot cancel invalid tickets | |
| Implement ticket selection UI with checkboxes | Selection works | |
| Implement "Select All" toggle functionality | Toggle works correctly | |
| Implement refund amount calculation (ticket price + service fee) | Calculation correct | |
| Implement cancellation confirmation screen with refund summary | Screen displays correctly | |
| Implement cancellation reason dropdown (required) | Reason required | |
| Update ticket status to CANCELLED on confirmation | Status changes | |
| Release cancelled seats back to inventory | Seats available again | |
| Trigger Stripe refund via E8-F3 | Refund initiated | |
| Send confirmation email to buyer | Email received | |
| Send notification to affected ticket holders | All parties notified | |
| Update order refund_status (partial/full) | Status updates correctly | |
| Generate refund document for download | Document available |
Last Updated: January 2026