Skip to content

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