OrderItem (product_type, product_id): Orders can contain Plan models (subscriptions), or Trip models (agency packages).ItineraryItem (activity_type, activity_id): A trip's schedule can contain Hotel, Restaurant, or Attraction models uniformly.Review (reviewable_type, reviewable_id): Users can review both absolute Destination entities and curated Trip packages.AppServiceProvider::boot() via Relation::enforceMorphMap() to prevent tightly coupling the database rows to specific PHP class namespaces.orders.idempotency_key: Defined as a VARCHAR(64) with a UNIQUE index. This guarantees at the database level that no two identical intent requests from the client can result in duplicated orders.payments.paymob_transaction_id: Defined as a UNIQUE index to prevent the same Webhook payload from spawning multiple payment records.users table tracks ai_generations_count and ai_reset_at. Instead of building a massive, heavy ledger of every prompt to calculate usage on the fly, quota is calculated directly on the user row. The AI_GENERATION table is strictly for async telemetry/reporting, not synchronous quota blocking.