# gngtickets Project TODO

- [x] Apply gngtickets branding consistently across navigation, metadata, and UI copy
- [x] Create the premium visual system with refined typography, color palette, spacing, surfaces, and responsive behavior
- [x] Build the public event discovery page with upcoming events, search, category filtering, and date filtering
- [x] Build the event details experience with event information, ticket options, availability, and registration CTA
- [x] Build the organizer event creation form with title, description, date/time, location, banner image, and category
- [x] Add ticket configuration per event with free or paid types, price, and quantity limits
- [x] Add attendee registration and checkout flow with ticket quantity and attendee details
- [x] Add paid checkout integration and payment status handling through manual MTN Mobile Money transaction verification
- [x] Add organizer dashboard with created events, attendee lists, ticket sales statistics, and revenue summary
- [x] Add organizer complimentary-ticket invitation recording with attendee email capture
- [x] Add attendee ticket management with purchased and complimentary tickets
- [x] Add real QR code rendering for attendee ticket access
- [x] Add organizer QR-token event check-in validation workflow
- [x] Add organizer event cancellation control
- [x] Add organizer event editing controls
- [x] Add database schema, queries, and API procedures for events, ticket types, orders, tickets, and complimentary invitations
- [x] Add initial unit tests for event discovery and organizer authorization behavior
- [x] Run type checks, tests, and responsive visual verification

## Follow-up implementation gaps

- [x] Update metadata and page title to use gngtickets consistently
- [x] Replace remaining native-looking controls with the branded design system in the key user flows
- [x] Connect discovery, event details, create-event, dashboard, and tickets pages to real tRPC data with loading, empty, and error states
- [x] Implement real event creation with validation, ticket-type configuration, free/paid handling, and quantity limits
- [x] Implement persisted attendee orders and MTN Mobile Money payment submissions with approval status
- [x] Add complimentary invitation UI with event and ticket-type selection, validation, loading, success, and error feedback
- [x] Add organizer-controlled complimentary invitation email handoff through a prefilled mail draft
- [x] Generate real QR payloads and implement organizer event check-in access
- [x] Add event cancellation procedure and dashboard control
- [x] Add owner-authorized event editing procedure and dashboard-to-form UI
- [x] Fix organizer summary multi-event order query and add initial authorization tests
- [x] Add expanded payment-release and organizer-authorization predicate tests
- [x] Verify event-management authorization is enforced by the owner-scoped persistence helper; database-backed integration fixtures remain environment-dependent

## Launch revision: real events and MTN Mobile Money

- [x] Remove all seeded/demo event listings, attendee counts, ratings, testimonials, and AI/generic product language from the public experience
- [x] Replace the public discovery page with a professional empty state that explains events will appear after organizers publish them
- [x] Update organizer flows so only real organizer-created events become publicly discoverable after publishing
- [x] Add MTN Mobile Money payment instructions for paid tickets using recipient number 0552250838
- [x] Add transaction-ID submission and pending-verification state before revealing paid tickets
- [x] Add organizer/admin transaction verification controls and ticket reveal authorization
- [x] Update database and procedures for payment submissions, verification status, and secure ticket release
- [x] Add tests for transaction submission validation and organizer-only approval before ticket reveal
- [x] Remove remaining AI-generated or generic feature copy and validate the human-designed visual language

## Validation follow-ups

- [x] Implement the real organizer create/publish event UI with validation, ticket-type setup, and published/draft controls wired to tRPC
- [x] Add an attendee order-status screen showing payment submitted, pending verification, approved, or rejected before ticket reveal
- [x] Add unit coverage for transaction validation and organizer-only approval before ticket reveal
- [x] Replace remaining native-looking controls in the key flows and visually verify the main launch routes

## Final launch hardening

- [x] Add explicit error states and retry messaging for discovery, event, dashboard, ticket-wallet, and create-event tRPC flows
- [x] Expand organizer event creation to support a primary ticket plus one optional second tier with validation and a real banner URL field
- [x] Create a durable attendee order-status route keyed by order ID with pending, approved, and rejected states and refresh support
- [x] Add predicate tests for payment release and organizer authorization
- [x] Add executable release-predicate coverage for ticket absence before approval and issuance after approval

## Production-quality follow-ups

- [x] Build a real complimentary-ticket form with event selection, email validation, loading/success/error states, and refresh
- [x] Finish verifiable retry/error handling for discovery and create-event mutation failure flows
- [x] Support multiple ticket tiers at publish time through the primary and optional second ticket configuration
- [x] Verify the order-status page implementation with order-ID lookup, pending/approved/rejected UI, and refresh support
- [x] Add executable coverage for no ticket reveal before approval and authenticated non-owner approval rejection

## Final polish verification

- [x] Replace remaining plain HTML selects and inputs in dashboard invite controls with branded UI components
- [x] Add explicit retry action and mutation-state recovery to create-event failure handling
- [x] Verify and document the discovery-page error-state implementation alongside the reviewed route screenshots

## Error-state evidence

- [x] Force or simulate the discovery query failure, verify the homepage retry state, and record the verification evidence in project notes

## Final bug fixes

- [x] Preserve the submitted complimentary-ticket recipient email after mutation success so the prefilled mail draft works
- [x] Add explicit organizer event edit/cancel authorization tests for owner, non-owner, and admin users

## Authorization correction

- [x] Pass actor role through event edit/cancel persistence and procedures so the intended owner/admin policy is enforced consistently
- [x] Add executable owner, non-owner, and admin authorization coverage for event edit/cancel policy

## Theme mode enhancement

- [x] Add a persistent accessible dark/light mode switch to gngtickets navigation
- [x] Define coordinated light and dark theme tokens for the premium visual system
- [x] Validate theme switching and readability across the discovery, dashboard, event, and ticket routes through shared provider wiring, dark token review, and route screenshots
- [x] Add theme-mode coverage to the final verification checkpoint

## Theme validation follow-up

- [x] Update the event-list availability test so it remains valid when the configured database contains real organizer-published events

## Theme verification follow-ups

- [x] Visually verify theme switching in both light and dark modes on discovery, event details, dashboard, and tickets routes
- [x] Capture event-details screenshot evidence and confirm dark-mode readability after toggling
- [x] Save a new checkpoint containing the dark/light mode implementation and verification evidence

## Responsive design enhancement

- [x] Make gngtickets navigation adapt cleanly to phone, tablet, desktop, and wide-screen widths
- [x] Refine responsive typography, grids, forms, cards, dashboard panels, and ticket surfaces
- [x] Verify key routes at phone, tablet, desktop, and wide desktop viewports
- [x] Save a responsive-layout checkpoint with visual verification evidence

## Responsive verification follow-ups

- [x] Verify event details, dashboard, and order-status routes at phone, tablet, standard desktop, and wide desktop sizes
- [x] Document responsive behavior for dashboard panels and attendee ticket surfaces in verification notes
- [x] Save a responsive checkpoint after full multi-route viewport verification

## Wide desktop verification

- [x] Capture event-details, dashboard, and order-status routes at 1440×900 and confirm no new overflow or spacing issues

## Responsive checkpoint evidence

- [x] Review the 1440×900 screenshots and document that event-details, dashboard, and order-status have no overflow or spacing regressions
- [x] Save the responsive verification checkpoint after the evidence review

## Dark-mode contrast fix

- [x] Fix dark dashboard metric-card foreground contrast so values and labels remain readable on dark surfaces
- [x] Re-run dark-mode route screenshots after the contrast fix

## Theme evidence completeness

- [x] Capture and document explicit light-mode and dark-mode screenshots for discovery, event details, dashboard, and tickets routes

## Theme visibility and mNotify SMS

- [x] Make the light/dark mode control clearly visible and accessible on every primary route at desktop, tablet, and phone widths
- [x] Request and configure the mNotify API credential for server-side SMS delivery
- [x] Add attendee phone capture and validation to the registration and complimentary-ticket flows
- [x] Send an SMS confirmation after free-ticket issuance or approved paid-ticket release
- [x] Show SMS delivery status and safe retry/error feedback without blocking ticket issuance
- [x] Add tests for phone normalization, SMS payload construction, and ticket-flow SMS behavior

## SMS reliability test follow-ups

- [x] Add a safe manual SMS retry path for failed ticket confirmations
- [x] Add executable tests proving free issuance and approved payment trigger SMS and persist smsStatus

## End-to-end SMS flow coverage

- [x] Add a create-order test proving free-ticket issuance triggers SMS and persists smsStatus
- [x] Add an MTN approval test proving approved paid-ticket release triggers SMS and persists smsStatus

## Templated SMS ticket links

- [x] Confirm the user's mNotify sender ID and exact message template, including supported placeholders
- [x] Define a secure browser-accessible ticket link that opens the correct attendee wallet or ticket view
- [x] Include the direct ticket link in free and approved-paid SMS confirmations
- [x] Add tests for sender/template substitution, link generation, and ticket-link access behavior

## Ticket-link access coverage

- [x] Add an executable getTicketByToken/tickets.byToken test for valid QR-token lookup
- [x] Add route-level coverage for successful ticket-link access and invalid-token fallback

## Ticket-link UI coverage

- [x] Add a client-side TicketAccess test for successful valid-token rendering
- [x] Add a client-side TicketAccess test for the invalid-token fallback UI

## SMS delivery and dark-mode contrast fixes

- [x] Diagnose why mNotify delivery is failing and expose actionable provider errors
- [x] Verify the configured sender ID, endpoint response handling, and SMS link payload
- [x] Audit dark-mode text and muted-text contrast across primary routes and shared components
- [x] Fix unreadable dark-mode text while preserving the editorial light theme
- [x] Add regression tests for SMS failure diagnostics and dark-mode contrast-sensitive classes
- [x] Verify the fixes visually and publish a new checkpoint

## Final verification gaps

- [x] Ensure the dark-mode CSS regression test is discovered and executed by Vitest
- [x] Save a new checkpoint after the SMS diagnostics and dark-mode contrast fixes

## Ticket link, ticket-page contrast, and support

- [x] Fix SMS ticket links so recipients reliably reach their received-ticket view
- [x] Add a safe fallback from token ticket access to the received-ticket wallet or support contact
- [x] Improve dark-mode contrast for all ticket-page text, labels, metadata, and QR-card surfaces
- [x] Add gngticketing1@gmail.com as the support contact in ticket-access and relevant attendee flows
- [x] Add regression tests for ticket-link redirect behavior, ticket-page dark-mode classes, and support links
- [x] Verify the updated flows visually and publish a checkpoint

## Ticket link regression coverage

- [x] Add a regression test proving the issued GNG-XXXXXXXX token is accepted by the public ticket route
- [x] Verify dark-mode ticket content and support contact in the rendered ticket-access page
- [x] Save and publish the repaired ticket-link and support-contact milestone

## Final ticket-link verification gaps

- [x] Assert the support email and semantic dark-mode classes in valid and fallback TicketAccess UI tests
- [x] Capture explicit dark-mode visual evidence for the valid ticket-access state
- [x] Save and publish a checkpoint after the final ticket-link repair

## Complimentary delivery, guest visibility, and gngpasse rebrand

- [x] Capture and validate complimentary-ticket recipient phone numbers
- [x] Issue complimentary tickets with both EmailJS handoff and mNotify SMS confirmation
- [x] Show organizers names and contact/payment details for paid and complimentary guests
- [x] Rename visible gng event pass services branding to gngpasse across navigation, metadata, and auth copy
- [x] Replace the cart-style auth logo with a distinctive ticket/pass mark
- [x] Add tests for complimentary SMS payloads, guest-detail queries, branding, and auth-logo rendering
- [x] Verify responsive invite, attendee, and auth surfaces and publish the update

## Final complimentary-delivery verification gaps

- [x] Add and run a dedicated complimentary-delivery test proving EmailJS and mNotify are both triggered with delivery-status persistence
- [x] Add an explicit auth-entry logo and branding regression test
- [x] Save and publish a checkpoint after the complimentary-delivery and gngpasse rebrand changes

## Final publication checkpoint

- [x] Save and auto-publish a new checkpoint containing the complimentary-delivery and auth-branding regression tests

## Dashboard responsiveness and organizer export

- [x] Make organizer dashboard panels, tables, forms, and navigation fit phone, tablet, desktop, and wide screens
- [x] Add organizer-authorized export of event, guest, ticket, payment, and delivery details
- [x] Add export controls with clear loading, success, and error feedback
- [x] Add tests for export authorization, row contents, and responsive dashboard behavior
- [x] Verify the updated dashboard visually and publish a checkpoint

## Dashboard export verification gaps

- [x] Verify dashboard at tablet and standard desktop widths
- [x] Expand export with ticket-level identifiers, types, and statuses
- [x] Add visible export success and error feedback
- [x] Add explicit export authorization/source and responsive layout regression coverage
- [x] Save and publish a checkpoint after the completed dashboard/export verification

## Final dashboard publication

- [x] Save and auto-publish a checkpoint containing the responsive dashboard and organizer export changes

## Paystack payment migration

- [x] Audit and remove manual MTN payment instructions and transaction-ID submission from paid checkout
- [x] Configure the verified Paystack secret credential through project secrets; hosted checkout does not require a browser-exposed public key
- [x] Implement server-side Paystack transaction initialization and verification with amount/reference validation
- [x] Replace paid checkout UI with Paystack redirect/callback handling
- [x] Preserve paid ticket issuance, organizer payment reporting, SMS confirmations, and free tickets
- [x] Add Paystack security, callback, error-state, and regression tests
- [x] Verify responsive paid checkout and publish the Paystack migration

## Paystack migration

- [x] Add nullable Paystack reference persistence to paid orders without destroying legacy payment history
- [x] Implement server-side Paystack transaction initialization with amount/currency/order metadata validation
- [x] Implement server-side Paystack verification with idempotent paid-ticket fulfillment
- [x] Register and secure the Paystack webhook endpoint with signature validation and event handling
- [x] Replace manual MTN checkout submission with Paystack redirect and callback verification
- [x] Update attendee order status messaging for automated Paystack payment states
- [x] Remove manual MTN organizer review controls and expose Paystack payment status in organizer data
- [x] Add unit and integration-style coverage for Paystack API auth, signature validation, amount/reference checks, and idempotent fulfillment
- [x] Run type checks, Vitest, and responsive route verification for the Paystack flow
- [x] Save and publish the validated Paystack migration checkpoint

## Paystack final verification gaps

- [x] Capture the real event checkout route at phone, tablet, and desktop widths; the live published data available for verification was free-ticket inventory, while Paystack payment-step rendering is covered by the reviewed EventDetails implementation
- [x] Confirm a separate payment-provider field is not required because Paystack orders are identified by their persisted unique reference while legacy MTN records remain intact
- [x] Re-read and verify the signature-checked webhook handler and raw-body Express registration before JSON parsing
- [x] Add executable coverage for repeated Paystack fulfillment and idempotent ticket issuance
- [x] Save and publish the final Paystack migration checkpoint after all evidence is complete

## Namecheap full-feature deployment

- [ ] Assess Namecheap Shared Hosting versus VPS/cPanel compatibility for the full Node.js application
- [ ] Prepare a portable production start/build configuration without removing current platform features
- [ ] Validate production build, startup entry point, environment variables, database, Paystack webhook, SMS, and email requirements
- [ ] Write Namecheap VPS/cPanel deployment and gngpasse.online DNS/SSL cutover instructions
- [ ] Save and publish a deployment-ready checkpoint

## Namecheap portability blockers

- [ ] Decide whether to retain Manus OAuth or replace it with portable authentication for Namecheap
- [ ] Decide whether to retain Manus Forge storage or migrate event banners and storage routes to portable S3/object storage
- [ ] Configure PUBLIC_APP_URL so ticket SMS links use gngpasse.online after cutover
- [ ] Confirm whether Namecheap deployment should be a separate portable release or remain on Manus with Namecheap as a custom domain

## Namecheap custom-domain connection

- [ ] Connect gngpasse.online to the existing Manus deployment instead of migrating the application runtime
- [ ] Obtain the exact Manus custom-domain DNS records and apply them in Namecheap Advanced DNS
- [ ] Verify DNS propagation, HTTPS certificate issuance, and the live gngpasse.online route
- [ ] Confirm Paystack callbacks, webhook URL, SMS ticket links, and email links use the custom domain
- [ ] Save and publish the verified custom-domain checkpoint

## Full Namecheap VPS migration

- [x] Audit Manus OAuth, Forge storage, runtime proxy, public URL, database, and secret dependencies
- [ ] Choose and configure portable authentication for Namecheap while preserving organizer and attendee access controls
- [ ] Replace Forge-backed event-banner storage and `/manus-storage` serving with portable object storage
- [ ] Preserve Paystack checkout, webhook, SMS, EmailJS, QR, dashboard, and ticket-wallet behavior on the new hostname
- [x] Prepare VPS build/startup configuration and cPanel/Node.js deployment artifacts
- [ ] Define database migration/backup and data-integrity procedure before cutover
- [x] Define DNS, HTTPS, Paystack webhook, SMS-link, and email-link cutover steps for gngpasse.online
- [x] Validate the current production build and test baseline; preserve Manus as rollback until VPS verification passes
- [ ] Save and publish the Namecheap migration checkpoint and runbook
