From 92fb6e3cc3059495656381d75e2a849b60c51348 Mon Sep 17 00:00:00 2001 From: Stephanos A Date: Fri, 22 May 2026 15:05:20 +0300 Subject: [PATCH] Migrations update --- .../20260522115951_initial/migration.sql | 1352 +++++++++++++++++ apps/edr-passenger-api/prisma/schema.prisma | 1 - 2 files changed, 1352 insertions(+), 1 deletion(-) create mode 100644 apps/edr-passenger-api/prisma/migrations/20260522115951_initial/migration.sql diff --git a/apps/edr-passenger-api/prisma/migrations/20260522115951_initial/migration.sql b/apps/edr-passenger-api/prisma/migrations/20260522115951_initial/migration.sql new file mode 100644 index 000000000..cb6c033f5 --- /dev/null +++ b/apps/edr-passenger-api/prisma/migrations/20260522115951_initial/migration.sql @@ -0,0 +1,1352 @@ +-- CreateEnum +CREATE TYPE "UserRole" AS ENUM ('PASSENGER', 'AGENT', 'SUPERVISOR', 'ADMIN', 'STAFF'); + +-- CreateEnum +CREATE TYPE "TripStatus" AS ENUM ('SCHEDULED', 'BOARDING', 'EN_ROUTE', 'ARRIVED', 'CANCELLED', 'DELAYED'); + +-- CreateEnum +CREATE TYPE "SeatKind" AS ENUM ('STANDARD', 'PREMIUM', 'ACCESSIBLE'); + +-- CreateEnum +CREATE TYPE "SeatStatus" AS ENUM ('AVAILABLE', 'HELD', 'BOOKED', 'BLOCKED'); + +-- CreateEnum +CREATE TYPE "PassengerCategory" AS ENUM ('ADULT', 'CHILD'); + +-- CreateEnum +CREATE TYPE "IdDocumentType" AS ENUM ('NATIONAL_ID', 'PASSPORT', 'DRIVING_LICENSE', 'OTHER'); + +-- CreateEnum +CREATE TYPE "Currency" AS ENUM ('ETB', 'DJF', 'USD'); + +-- CreateEnum +CREATE TYPE "BookingStatus" AS ENUM ('DRAFT', 'PENDING_PAYMENT', 'CONFIRMED', 'CANCELLED', 'COMPLETED', 'NO_SHOW', 'REFUNDED'); + +-- CreateEnum +CREATE TYPE "PaymentMethodType" AS ENUM ('TELEBIRR', 'CBE_BIRR', 'EBIRR', 'CARD', 'WALLET'); + +-- CreateEnum +CREATE TYPE "PaymentIntentStatus" AS ENUM ('REQUIRES_ACTION', 'PROCESSING', 'SUCCEEDED', 'FAILED', 'CANCELLED', 'REFUNDED'); + +-- CreateEnum +CREATE TYPE "WalletLedgerType" AS ENUM ('CREDIT', 'DEBIT'); + +-- CreateEnum +CREATE TYPE "NotificationCategory" AS ENUM ('BOOKING', 'PAYMENT', 'DISRUPTION', 'PROMOTION', 'SYSTEM'); + +-- CreateEnum +CREATE TYPE "StopStatus" AS ENUM ('COMPLETED', 'APPROACHING', 'CURRENT', 'UPCOMING'); + +-- CreateEnum +CREATE TYPE "SupportConversationStatus" AS ENUM ('OPEN', 'RESOLVED', 'CLOSED'); + +-- CreateEnum +CREATE TYPE "SupportSender" AS ENUM ('USER', 'BOT', 'AGENT'); + +-- CreateEnum +CREATE TYPE "LoyaltyTier" AS ENUM ('BRONZE', 'SILVER', 'GOLD', 'PLATINUM'); + +-- CreateEnum +CREATE TYPE "LoyaltyLedgerReason" AS ENUM ('TRIP_COMPLETED', 'REWARD_REDEEMED', 'PROMO_BONUS', 'MANUAL_ADJUSTMENT', 'EXPIRY'); + +-- CreateEnum +CREATE TYPE "FoodOrderStatus" AS ENUM ('PENDING', 'PREPARING', 'READY', 'DELIVERED', 'CANCELLED'); + +-- CreateEnum +CREATE TYPE "DevicePlatform" AS ENUM ('IOS', 'ANDROID', 'WEB'); + +-- AlterTable +ALTER TABLE "SeatClass" ALTER COLUMN "updatedAt" DROP DEFAULT; + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "phone" TEXT NOT NULL, + "fullName" TEXT NOT NULL, + "passwordHash" TEXT NOT NULL, + "role" "UserRole" NOT NULL DEFAULT 'PASSENGER', + "nationality" TEXT, + "nationalityCode" TEXT, + "passportNumber" TEXT, + "nationalId" TEXT, + "failedLoginAttempts" INTEGER NOT NULL DEFAULT 0, + "lockedUntil" TIMESTAMP(3), + "blockedUntil" TIMESTAMP(3), + "lastLoginAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Session" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "ipAddress" TEXT, + "userAgent" TEXT, + "lastActivityAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Session_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Passenger" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "defaultTravelerProfileId" TEXT, + "preferredLanguage" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Passenger_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TravelerProfile" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "fullName" TEXT NOT NULL, + "relationship" TEXT NOT NULL, + "dateOfBirth" TIMESTAMP(3), + "nationalId" TEXT, + "notes" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "TravelerProfile_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Station" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "city" TEXT NOT NULL, + "countryCode" TEXT, + "isOperational" BOOLEAN NOT NULL DEFAULT true, + "timezone" TEXT NOT NULL DEFAULT 'Africa/Addis_Ababa', + "lat" DECIMAL(9,6) NOT NULL, + "lng" DECIMAL(9,6) NOT NULL, + + CONSTRAINT "Station_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Train" ( + "id" TEXT NOT NULL, + "number" TEXT NOT NULL, + "name" TEXT NOT NULL, + "operatorId" TEXT NOT NULL DEFAULT 'op_edr', + "operatorName" TEXT, + "description" TEXT, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Train_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TrainSchedule" ( + "id" TEXT NOT NULL, + "trainId" TEXT NOT NULL, + "routeId" TEXT, + "originStationId" TEXT NOT NULL, + "destinationStationId" TEXT NOT NULL, + "departureAt" TIMESTAMP(3) NOT NULL, + "arrivalAt" TIMESTAMP(3) NOT NULL, + "durationMinutes" INTEGER NOT NULL, + "status" "TripStatus" NOT NULL DEFAULT 'SCHEDULED', + "stopsCount" INTEGER NOT NULL DEFAULT 0, + "reservedCount" INTEGER NOT NULL DEFAULT 0, + "onTimePercent" INTEGER NOT NULL DEFAULT 100, + "carbonRating" TEXT NOT NULL DEFAULT 'A', + "notes" TEXT, + + CONSTRAINT "TrainSchedule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TripStopTime" ( + "id" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "stationId" TEXT NOT NULL, + "sequence" INTEGER NOT NULL, + "plannedArrivalAt" TIMESTAMP(3), + "plannedDepartureAt" TIMESTAMP(3), + "actualArrivalAt" TIMESTAMP(3), + "status" "StopStatus" NOT NULL DEFAULT 'UPCOMING', + + CONSTRAINT "TripStopTime_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "TripLiveStatus" ( + "id" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "state" TEXT NOT NULL, + "currentLocationLabel" TEXT, + "progressPercent" INTEGER NOT NULL DEFAULT 0, + "delayMinutes" INTEGER NOT NULL DEFAULT 0, + "currentSpeedKph" INTEGER, + "platformLabel" TEXT, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "TripLiveStatus_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Coach" ( + "id" TEXT NOT NULL, + "coachNumber" TEXT NOT NULL, + "label" TEXT NOT NULL, + "seatClassId" TEXT NOT NULL, + "coachType" TEXT, + "mode" TEXT NOT NULL DEFAULT 'seat', + "seatArrangement" TEXT, + "bedArrangement" TEXT, + "amenities" JSONB, + "totalUnits" INTEGER NOT NULL DEFAULT 0, + "isActive" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Coach_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CoachAssignment" ( + "id" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "coachId" TEXT NOT NULL, + "positionNumber" INTEGER NOT NULL, + "isOperational" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CoachAssignment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Seat" ( + "id" TEXT NOT NULL, + "coachId" TEXT NOT NULL, + "row" INTEGER NOT NULL, + "col" TEXT NOT NULL, + "label" TEXT NOT NULL, + "seatNumber" TEXT, + "kind" "SeatKind" NOT NULL DEFAULT 'STANDARD', + "status" "SeatStatus" NOT NULL DEFAULT 'AVAILABLE', + "heldUntil" TIMESTAMP(3), + "isWindow" BOOLEAN NOT NULL DEFAULT false, + "isAisle" BOOLEAN NOT NULL DEFAULT false, + "bedPosition" TEXT, + "premiumFeeMinor" INTEGER NOT NULL DEFAULT 0, + "eligibility" TEXT, + + CONSTRAINT "Seat_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SeatHold" ( + "id" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "seatIds" TEXT[], + "fareQuoteId" TEXT, + "passengerId" TEXT NOT NULL, + "createdBy" TEXT, + "expiresAt" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "SeatHold_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FareRule" ( + "id" TEXT NOT NULL, + "tripId" TEXT, + "route" TEXT, + "seatClassId" TEXT NOT NULL, + "baseFareMinor" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "refundable" BOOLEAN NOT NULL DEFAULT true, + "validFrom" TIMESTAMP(3) NOT NULL, + "validUntil" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "FareRule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Booking" ( + "id" TEXT NOT NULL, + "bookingRef" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "status" "BookingStatus" NOT NULL DEFAULT 'DRAFT', + "currency" TEXT NOT NULL DEFAULT 'ETB', + "totalMinor" INTEGER NOT NULL, + "adultCount" INTEGER NOT NULL DEFAULT 1, + "childCount" INTEGER NOT NULL DEFAULT 0, + "displayCurrency" "Currency", + "displayTotalMinor" INTEGER, + "bookingType" TEXT NOT NULL DEFAULT 'ONE_WAY', + "userAgent" TEXT, + "source" TEXT NOT NULL DEFAULT 'WEB', + "promoCode" TEXT, + "paidAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Booking_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BookingSeat" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "seatId" TEXT NOT NULL, + "passengerName" TEXT NOT NULL, + "dateOfBirth" TIMESTAMP(3), + "passengerCategory" "PassengerCategory" NOT NULL DEFAULT 'ADULT', + "idDocumentType" "IdDocumentType", + "idDocumentNumber" TEXT, + "passportNumber" TEXT, + "passportCountry" TEXT, + "verifaydaVerified" BOOLEAN NOT NULL DEFAULT false, + "verifaydaData" JSONB, + "seatLabelSnapshot" TEXT, + "fareMinor" INTEGER, + "displayCurrency" "Currency", + "displayFareMinor" INTEGER, + + CONSTRAINT "BookingSeat_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PaymentMethod" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "type" "PaymentMethodType" NOT NULL, + "displayName" TEXT NOT NULL, + "maskedHint" TEXT, + "providerId" TEXT, + "isDefault" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PaymentMethod_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PaymentIntent" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "amountMinor" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "method" "PaymentMethodType" NOT NULL, + "provider" TEXT, + "status" "PaymentIntentStatus" NOT NULL DEFAULT 'REQUIRES_ACTION', + "providerRef" TEXT, + "clientAction" JSONB, + "merchantOrderId" TEXT, + "providerOrderId" TEXT, + "providerTxnId" TEXT, + "rawInitiation" JSONB, + "paidAt" TIMESTAMP(3), + "refundedAt" TIMESTAMP(3), + "captureMethod" TEXT, + "failureCode" TEXT, + "failureMessage" TEXT, + "expiresAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "PaymentIntent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PaymentWebhookEvent" ( + "id" TEXT NOT NULL, + "provider" "PaymentMethodType" NOT NULL, + "externalEventId" TEXT NOT NULL, + "merchantOrderId" TEXT, + "providerTxnId" TEXT, + "signatureValid" BOOLEAN NOT NULL, + "status" TEXT NOT NULL, + "payload" JSONB NOT NULL, + "receivedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "processedAt" TIMESTAMP(3), + "processingError" TEXT, + + CONSTRAINT "PaymentWebhookEvent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PaymentRefund" ( + "id" TEXT NOT NULL, + "paymentIntentId" TEXT NOT NULL, + "amountMinor" INTEGER NOT NULL, + "reason" TEXT, + "providerRefundId" TEXT, + "status" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PaymentRefund_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Ticket" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "bookingRef" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'CONFIRMED', + "qrPayload" TEXT NOT NULL, + "barcodePayload" TEXT, + "pdfUrl" TEXT, + "deliveryChannel" TEXT NOT NULL DEFAULT 'EMAIL', + "issuedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "validatedAt" TIMESTAMP(3), + "validatorId" TEXT, + + CONSTRAINT "Ticket_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LoyaltyAccount" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "pointsBalance" INTEGER NOT NULL DEFAULT 0, + "lifetimePoints" INTEGER NOT NULL DEFAULT 0, + "tier" "LoyaltyTier" NOT NULL DEFAULT 'BRONZE', + "tierUpdatedAt" TIMESTAMP(3), + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "LoyaltyAccount_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LoyaltyLedgerEntry" ( + "id" TEXT NOT NULL, + "accountId" TEXT NOT NULL, + "delta" INTEGER NOT NULL, + "reason" "LoyaltyLedgerReason" NOT NULL, + "bookingId" TEXT, + "balanceAfter" INTEGER NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "LoyaltyLedgerEntry_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "LoyaltyReward" ( + "id" TEXT NOT NULL, + "accountId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "costPoints" INTEGER NOT NULL, + "available" BOOLEAN NOT NULL DEFAULT true, + "description" TEXT, + + CONSTRAINT "LoyaltyReward_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "WalletAccount" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "balanceMinor" INTEGER NOT NULL DEFAULT 0, + "status" TEXT NOT NULL DEFAULT 'ACTIVE', + "holdMinor" INTEGER NOT NULL DEFAULT 0, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "WalletAccount_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "WalletLedgerEntry" ( + "id" TEXT NOT NULL, + "walletId" TEXT NOT NULL, + "type" "WalletLedgerType" NOT NULL, + "amountMinor" INTEGER NOT NULL, + "balanceAfterMinor" INTEGER NOT NULL, + "description" TEXT NOT NULL, + "relatedBookingId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "WalletLedgerEntry_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Notification" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "body" TEXT NOT NULL, + "category" "NotificationCategory" NOT NULL, + "read" BOOLEAN NOT NULL DEFAULT false, + "deepLink" TEXT, + "metadata" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Notification_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Promotion" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "subtitle" TEXT, + "code" TEXT NOT NULL, + "percentOff" INTEGER, + "amountOffMinor" INTEGER, + "validUntil" TIMESTAMP(3) NOT NULL, + "ctaLabel" TEXT, + "deepLink" TEXT, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Promotion_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "StationCrowdSignal" ( + "id" TEXT NOT NULL, + "stationId" TEXT NOT NULL, + "level" TEXT NOT NULL, + "label" TEXT NOT NULL, + "statusLabel" TEXT NOT NULL, + "confidence" INTEGER, + "observedAt" TIMESTAMP(3), + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "StationCrowdSignal_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "WeatherAlert" ( + "id" TEXT NOT NULL, + "region" TEXT NOT NULL, + "severity" TEXT NOT NULL, + "title" TEXT NOT NULL, + "message" TEXT NOT NULL, + "validUntil" TIMESTAMP(3) NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "WeatherAlert_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MenuCategory" ( + "id" TEXT NOT NULL, + "name" TEXT NOT NULL, + + CONSTRAINT "MenuCategory_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "MenuItem" ( + "id" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "categoryId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "priceMinor" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "available" BOOLEAN NOT NULL DEFAULT true, + "availableUntil" TIMESTAMP(3), + + CONSTRAINT "MenuItem_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FoodOrder" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "status" "FoodOrderStatus" NOT NULL DEFAULT 'PENDING', + "totalMinor" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "specialInstructions" TEXT, + "estimatedReadyAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "FoodOrder_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FoodOrderItem" ( + "id" TEXT NOT NULL, + "orderId" TEXT NOT NULL, + "menuItemId" TEXT NOT NULL, + "name" TEXT NOT NULL, + "quantity" INTEGER NOT NULL, + "unitPriceMinor" INTEGER, + "lineTotalMinor" INTEGER NOT NULL, + + CONSTRAINT "FoodOrderItem_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FaqCategory" ( + "id" TEXT NOT NULL, + "title" TEXT NOT NULL, + "iconKey" TEXT, + + CONSTRAINT "FaqCategory_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FaqArticle" ( + "id" TEXT NOT NULL, + "categoryId" TEXT NOT NULL, + "question" TEXT NOT NULL, + "answerMarkdown" TEXT NOT NULL, + "rank" INTEGER NOT NULL DEFAULT 0, + + CONSTRAINT "FaqArticle_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SupportConversation" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "assignedAgentId" TEXT, + "status" "SupportConversationStatus" NOT NULL DEFAULT 'OPEN', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "SupportConversation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SupportMessage" ( + "id" TEXT NOT NULL, + "conversationId" TEXT NOT NULL, + "sender" "SupportSender" NOT NULL, + "text" TEXT NOT NULL, + "attachments" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "SupportMessage_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "UserPreferences" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "pushEnabled" BOOLEAN NOT NULL DEFAULT true, + "emailEnabled" BOOLEAN NOT NULL DEFAULT true, + "smsEnabled" BOOLEAN NOT NULL DEFAULT false, + "promosEnabled" BOOLEAN NOT NULL DEFAULT true, + "biometricEnabled" BOOLEAN NOT NULL DEFAULT false, + "twoFactorEnabled" BOOLEAN NOT NULL DEFAULT false, + "defaultPaymentMethodId" TEXT, + "autoDownloadTickets" BOOLEAN NOT NULL DEFAULT true, + "dataSharing" BOOLEAN NOT NULL DEFAULT false, + "locale" TEXT NOT NULL DEFAULT 'en', + "darkMode" BOOLEAN NOT NULL DEFAULT false, + "language" TEXT NOT NULL DEFAULT 'en', + + CONSTRAINT "UserPreferences_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Device" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "platform" "DevicePlatform" NOT NULL, + "name" TEXT NOT NULL, + "pushToken" TEXT, + "trusted" BOOLEAN NOT NULL DEFAULT false, + "lastSeenAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Device_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SavedRoute" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "fromStationId" TEXT NOT NULL, + "toStationId" TEXT NOT NULL, + "fromName" TEXT NOT NULL, + "toName" TEXT NOT NULL, + "tripCount" INTEGER NOT NULL DEFAULT 0, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "SavedRoute_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Journey" ( + "id" TEXT NOT NULL, + "passengerId" TEXT NOT NULL, + "status" TEXT NOT NULL, + "totalMinor" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Journey_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "JourneySegment" ( + "id" TEXT NOT NULL, + "journeyId" TEXT NOT NULL, + "scheduleId" TEXT NOT NULL, + "segmentOrder" INTEGER NOT NULL, + "seatId" TEXT, + "coachId" TEXT, + "departureStationId" TEXT NOT NULL, + "arrivalStationId" TEXT NOT NULL, + + CONSTRAINT "JourneySegment_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OtpCode" ( + "id" TEXT NOT NULL, + "userId" TEXT, + "email" TEXT, + "phone" TEXT, + "code" TEXT NOT NULL, + "purpose" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "verified" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OtpCode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "PasswordResetToken" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expiresAt" TIMESTAMP(3) NOT NULL, + "used" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "PasswordResetToken_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Route" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "effectiveFrom" TIMESTAMP(3) NOT NULL, + "effectiveUntil" TIMESTAMP(3), + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Route_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RouteStop" ( + "id" TEXT NOT NULL, + "routeId" TEXT NOT NULL, + "stationId" TEXT NOT NULL, + "sequence" INTEGER NOT NULL, + "distanceKm" INTEGER, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "RouteStop_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "RouteFareRule" ( + "id" TEXT NOT NULL, + "routeId" TEXT NOT NULL, + "seatClassId" TEXT NOT NULL, + "passengerCategory" "PassengerCategory" NOT NULL DEFAULT 'ADULT', + "baseFareMinor" INTEGER NOT NULL, + "discountPercent" INTEGER, + "taxPercent" INTEGER, + "surchargeMinor" INTEGER, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "validFrom" TIMESTAMP(3) NOT NULL, + "validUntil" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "RouteFareRule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Agent" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "agentCode" TEXT NOT NULL, + "stationId" TEXT, + "commissionRate" INTEGER NOT NULL DEFAULT 5, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Agent_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentBooking" ( + "id" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "paymentMethod" TEXT NOT NULL, + "cashReceived" INTEGER, + "changeGiven" INTEGER, + "paperTicket" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AgentBooking_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentShift" ( + "id" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "openedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "closedAt" TIMESTAMP(3), + "openingBalance" INTEGER NOT NULL DEFAULT 0, + "closingBalance" INTEGER, + "reconciled" BOOLEAN NOT NULL DEFAULT false, + "notes" TEXT, + + CONSTRAINT "AgentShift_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AgentCommission" ( + "id" TEXT NOT NULL, + "agentId" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "amountMinor" INTEGER NOT NULL, + "rate" INTEGER NOT NULL, + "paidAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AgentCommission_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BookingModification" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "modifiedBy" TEXT NOT NULL, + "modificationType" TEXT NOT NULL, + "oldData" JSONB NOT NULL, + "newData" JSONB NOT NULL, + "fareAdjustment" INTEGER NOT NULL DEFAULT 0, + "reason" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BookingModification_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BookingCancellation" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "cancelledBy" TEXT NOT NULL, + "reason" TEXT, + "refundAmount" INTEGER NOT NULL, + "refundMethod" TEXT NOT NULL, + "refundStatus" TEXT NOT NULL, + "processedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BookingCancellation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "GateValidationLog" ( + "id" TEXT NOT NULL, + "ticketId" TEXT NOT NULL, + "validatorId" TEXT NOT NULL, + "gateId" TEXT, + "status" TEXT NOT NULL, + "reason" TEXT, + "validatedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "GateValidationLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BaggageAllowance" ( + "id" TEXT NOT NULL, + "seatClassId" TEXT NOT NULL, + "maxWeightKg" INTEGER NOT NULL, + "maxPiecesCount" INTEGER NOT NULL, + "excessFeePerKg" INTEGER NOT NULL, + "currency" TEXT NOT NULL DEFAULT 'ETB', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BaggageAllowance_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "BaggageBooking" ( + "id" TEXT NOT NULL, + "bookingId" TEXT NOT NULL, + "weightKg" INTEGER NOT NULL, + "piecesCount" INTEGER NOT NULL, + "excessFeeMinor" INTEGER NOT NULL DEFAULT 0, + "paid" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "BaggageBooking_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "AuditLog" ( + "id" TEXT NOT NULL, + "userId" TEXT, + "action" TEXT NOT NULL, + "entityType" TEXT NOT NULL, + "entityId" TEXT, + "oldData" JSONB, + "newData" JSONB, + "ipAddress" TEXT, + "userAgent" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "NotificationTemplate" ( + "id" TEXT NOT NULL, + "code" TEXT NOT NULL, + "channel" TEXT NOT NULL, + "subject" TEXT, + "bodyTemplate" TEXT NOT NULL, + "active" BOOLEAN NOT NULL DEFAULT true, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "NotificationTemplate_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "SeatBlock" ( + "id" TEXT NOT NULL, + "seatId" TEXT NOT NULL, + "reason" TEXT NOT NULL, + "blockedBy" TEXT NOT NULL, + "approvedBy" TEXT, + "blockedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "unblockAt" TIMESTAMP(3), + + CONSTRAINT "SeatBlock_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "OperationalReport" ( + "id" TEXT NOT NULL, + "reportType" TEXT NOT NULL, + "dateFrom" TIMESTAMP(3) NOT NULL, + "dateTo" TIMESTAMP(3) NOT NULL, + "data" JSONB NOT NULL, + "generatedBy" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "OperationalReport_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FraudRule" ( + "id" TEXT NOT NULL, + "type" TEXT NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "threshold" DOUBLE PRECISION NOT NULL, + "config" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "FraudRule_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "FraudAlert" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "eventType" TEXT NOT NULL, + "triggeredRules" TEXT[], + "context" JSONB NOT NULL, + "severity" TEXT NOT NULL DEFAULT 'MEDIUM', + "acknowledged" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "FraudAlert_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "CurrencyExchangeRate" ( + "id" TEXT NOT NULL, + "fromCurrency" "Currency" NOT NULL, + "toCurrency" "Currency" NOT NULL, + "rate" DECIMAL(18,6) NOT NULL, + "effectiveDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "source" TEXT NOT NULL DEFAULT 'MANUAL', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "CurrencyExchangeRate_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "VerifaydaVerification" ( + "id" TEXT NOT NULL, + "bookingId" TEXT, + "nationalId" TEXT NOT NULL, + "requestPayload" JSONB NOT NULL, + "responsePayload" JSONB, + "verified" BOOLEAN NOT NULL DEFAULT false, + "failureReason" TEXT, + "verifiedAt" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "VerifaydaVerification_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_phone_key" ON "User"("phone"); + +-- CreateIndex +CREATE UNIQUE INDEX "Session_token_key" ON "Session"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "Passenger_userId_key" ON "Passenger"("userId"); + +-- CreateIndex +CREATE INDEX "Passenger_userId_idx" ON "Passenger"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Station_code_key" ON "Station"("code"); + +-- CreateIndex +CREATE INDEX "Station_city_countryCode_idx" ON "Station"("city", "countryCode"); + +-- CreateIndex +CREATE UNIQUE INDEX "Train_number_key" ON "Train"("number"); + +-- CreateIndex +CREATE INDEX "TrainSchedule_departureAt_originStationId_idx" ON "TrainSchedule"("departureAt", "originStationId"); + +-- CreateIndex +CREATE UNIQUE INDEX "TripStopTime_scheduleId_sequence_key" ON "TripStopTime"("scheduleId", "sequence"); + +-- CreateIndex +CREATE UNIQUE INDEX "TripLiveStatus_scheduleId_key" ON "TripLiveStatus"("scheduleId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Coach_coachNumber_key" ON "Coach"("coachNumber"); + +-- CreateIndex +CREATE INDEX "CoachAssignment_scheduleId_idx" ON "CoachAssignment"("scheduleId"); + +-- CreateIndex +CREATE UNIQUE INDEX "CoachAssignment_scheduleId_positionNumber_key" ON "CoachAssignment"("scheduleId", "positionNumber"); + +-- CreateIndex +CREATE UNIQUE INDEX "Seat_coachId_row_col_key" ON "Seat"("coachId", "row", "col"); + +-- CreateIndex +CREATE UNIQUE INDEX "Seat_coachId_seatNumber_key" ON "Seat"("coachId", "seatNumber"); + +-- CreateIndex +CREATE INDEX "SeatHold_expiresAt_idx" ON "SeatHold"("expiresAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "Booking_bookingRef_key" ON "Booking"("bookingRef"); + +-- CreateIndex +CREATE INDEX "Booking_passengerId_status_idx" ON "Booking"("passengerId", "status"); + +-- CreateIndex +CREATE INDEX "PaymentMethod_userId_isDefault_idx" ON "PaymentMethod"("userId", "isDefault"); + +-- CreateIndex +CREATE UNIQUE INDEX "PaymentIntent_bookingId_key" ON "PaymentIntent"("bookingId"); + +-- CreateIndex +CREATE UNIQUE INDEX "PaymentIntent_merchantOrderId_key" ON "PaymentIntent"("merchantOrderId"); + +-- CreateIndex +CREATE INDEX "PaymentIntent_providerOrderId_idx" ON "PaymentIntent"("providerOrderId"); + +-- CreateIndex +CREATE INDEX "PaymentIntent_providerTxnId_idx" ON "PaymentIntent"("providerTxnId"); + +-- CreateIndex +CREATE INDEX "PaymentWebhookEvent_merchantOrderId_idx" ON "PaymentWebhookEvent"("merchantOrderId"); + +-- CreateIndex +CREATE UNIQUE INDEX "PaymentWebhookEvent_provider_externalEventId_key" ON "PaymentWebhookEvent"("provider", "externalEventId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Ticket_bookingId_key" ON "Ticket"("bookingId"); + +-- CreateIndex +CREATE UNIQUE INDEX "LoyaltyAccount_passengerId_key" ON "LoyaltyAccount"("passengerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "WalletAccount_passengerId_key" ON "WalletAccount"("passengerId"); + +-- CreateIndex +CREATE INDEX "WalletAccount_passengerId_idx" ON "WalletAccount"("passengerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Promotion_code_key" ON "Promotion"("code"); + +-- CreateIndex +CREATE UNIQUE INDEX "UserPreferences_userId_key" ON "UserPreferences"("userId"); + +-- CreateIndex +CREATE INDEX "OtpCode_email_phone_idx" ON "OtpCode"("email", "phone"); + +-- CreateIndex +CREATE UNIQUE INDEX "PasswordResetToken_token_key" ON "PasswordResetToken"("token"); + +-- CreateIndex +CREATE INDEX "PasswordResetToken_userId_idx" ON "PasswordResetToken"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Route_code_key" ON "Route"("code"); + +-- CreateIndex +CREATE INDEX "RouteStop_routeId_stationId_idx" ON "RouteStop"("routeId", "stationId"); + +-- CreateIndex +CREATE UNIQUE INDEX "RouteStop_routeId_sequence_key" ON "RouteStop"("routeId", "sequence"); + +-- CreateIndex +CREATE INDEX "RouteFareRule_routeId_seatClassId_idx" ON "RouteFareRule"("routeId", "seatClassId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Agent_userId_key" ON "Agent"("userId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Agent_agentCode_key" ON "Agent"("agentCode"); + +-- CreateIndex +CREATE UNIQUE INDEX "AgentBooking_bookingId_key" ON "AgentBooking"("bookingId"); + +-- CreateIndex +CREATE INDEX "AgentShift_agentId_openedAt_idx" ON "AgentShift"("agentId", "openedAt"); + +-- CreateIndex +CREATE INDEX "AgentCommission_agentId_paidAt_idx" ON "AgentCommission"("agentId", "paidAt"); + +-- CreateIndex +CREATE INDEX "BookingModification_bookingId_idx" ON "BookingModification"("bookingId"); + +-- CreateIndex +CREATE UNIQUE INDEX "BookingCancellation_bookingId_key" ON "BookingCancellation"("bookingId"); + +-- CreateIndex +CREATE INDEX "GateValidationLog_ticketId_idx" ON "GateValidationLog"("ticketId"); + +-- CreateIndex +CREATE INDEX "GateValidationLog_validatorId_idx" ON "GateValidationLog"("validatorId"); + +-- CreateIndex +CREATE INDEX "BaggageBooking_bookingId_idx" ON "BaggageBooking"("bookingId"); + +-- CreateIndex +CREATE INDEX "AuditLog_userId_createdAt_idx" ON "AuditLog"("userId", "createdAt"); + +-- CreateIndex +CREATE INDEX "AuditLog_entityType_entityId_idx" ON "AuditLog"("entityType", "entityId"); + +-- CreateIndex +CREATE UNIQUE INDEX "NotificationTemplate_code_key" ON "NotificationTemplate"("code"); + +-- CreateIndex +CREATE INDEX "SeatBlock_seatId_idx" ON "SeatBlock"("seatId"); + +-- CreateIndex +CREATE INDEX "OperationalReport_reportType_dateFrom_idx" ON "OperationalReport"("reportType", "dateFrom"); + +-- CreateIndex +CREATE UNIQUE INDEX "FraudRule_type_key" ON "FraudRule"("type"); + +-- CreateIndex +CREATE INDEX "FraudAlert_userId_createdAt_idx" ON "FraudAlert"("userId", "createdAt"); + +-- CreateIndex +CREATE INDEX "FraudAlert_acknowledged_idx" ON "FraudAlert"("acknowledged"); + +-- CreateIndex +CREATE INDEX "CurrencyExchangeRate_fromCurrency_toCurrency_idx" ON "CurrencyExchangeRate"("fromCurrency", "toCurrency"); + +-- CreateIndex +CREATE UNIQUE INDEX "CurrencyExchangeRate_fromCurrency_toCurrency_effectiveDate_key" ON "CurrencyExchangeRate"("fromCurrency", "toCurrency", "effectiveDate"); + +-- CreateIndex +CREATE INDEX "VerifaydaVerification_nationalId_idx" ON "VerifaydaVerification"("nationalId"); + +-- CreateIndex +CREATE INDEX "VerifaydaVerification_bookingId_idx" ON "VerifaydaVerification"("bookingId"); + +-- AddForeignKey +ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Passenger" ADD CONSTRAINT "Passenger_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TravelerProfile" ADD CONSTRAINT "TravelerProfile_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TrainSchedule" ADD CONSTRAINT "TrainSchedule_trainId_fkey" FOREIGN KEY ("trainId") REFERENCES "Train"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TrainSchedule" ADD CONSTRAINT "TrainSchedule_originStationId_fkey" FOREIGN KEY ("originStationId") REFERENCES "Station"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TrainSchedule" ADD CONSTRAINT "TrainSchedule_destinationStationId_fkey" FOREIGN KEY ("destinationStationId") REFERENCES "Station"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TripStopTime" ADD CONSTRAINT "TripStopTime_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "TrainSchedule"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TripStopTime" ADD CONSTRAINT "TripStopTime_stationId_fkey" FOREIGN KEY ("stationId") REFERENCES "Station"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "TripLiveStatus" ADD CONSTRAINT "TripLiveStatus_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "TrainSchedule"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Coach" ADD CONSTRAINT "Coach_seatClassId_fkey" FOREIGN KEY ("seatClassId") REFERENCES "SeatClass"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CoachAssignment" ADD CONSTRAINT "CoachAssignment_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "TrainSchedule"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "CoachAssignment" ADD CONSTRAINT "CoachAssignment_coachId_fkey" FOREIGN KEY ("coachId") REFERENCES "Coach"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Seat" ADD CONSTRAINT "Seat_coachId_fkey" FOREIGN KEY ("coachId") REFERENCES "Coach"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FareRule" ADD CONSTRAINT "FareRule_seatClassId_fkey" FOREIGN KEY ("seatClassId") REFERENCES "SeatClass"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Booking" ADD CONSTRAINT "Booking_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Booking" ADD CONSTRAINT "Booking_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "TrainSchedule"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BookingSeat" ADD CONSTRAINT "BookingSeat_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BookingSeat" ADD CONSTRAINT "BookingSeat_seatId_fkey" FOREIGN KEY ("seatId") REFERENCES "Seat"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PaymentIntent" ADD CONSTRAINT "PaymentIntent_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "PaymentRefund" ADD CONSTRAINT "PaymentRefund_paymentIntentId_fkey" FOREIGN KEY ("paymentIntentId") REFERENCES "PaymentIntent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Ticket" ADD CONSTRAINT "Ticket_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LoyaltyAccount" ADD CONSTRAINT "LoyaltyAccount_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LoyaltyLedgerEntry" ADD CONSTRAINT "LoyaltyLedgerEntry_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "LoyaltyAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "LoyaltyReward" ADD CONSTRAINT "LoyaltyReward_accountId_fkey" FOREIGN KEY ("accountId") REFERENCES "LoyaltyAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "WalletAccount" ADD CONSTRAINT "WalletAccount_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "WalletLedgerEntry" ADD CONSTRAINT "WalletLedgerEntry_walletId_fkey" FOREIGN KEY ("walletId") REFERENCES "WalletAccount"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Notification" ADD CONSTRAINT "Notification_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "StationCrowdSignal" ADD CONSTRAINT "StationCrowdSignal_stationId_fkey" FOREIGN KEY ("stationId") REFERENCES "Station"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MenuItem" ADD CONSTRAINT "MenuItem_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "TrainSchedule"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "MenuItem" ADD CONSTRAINT "MenuItem_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "MenuCategory"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FoodOrder" ADD CONSTRAINT "FoodOrder_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FoodOrderItem" ADD CONSTRAINT "FoodOrderItem_orderId_fkey" FOREIGN KEY ("orderId") REFERENCES "FoodOrder"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FaqArticle" ADD CONSTRAINT "FaqArticle_categoryId_fkey" FOREIGN KEY ("categoryId") REFERENCES "FaqCategory"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SupportMessage" ADD CONSTRAINT "SupportMessage_conversationId_fkey" FOREIGN KEY ("conversationId") REFERENCES "SupportConversation"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "UserPreferences" ADD CONSTRAINT "UserPreferences_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Device" ADD CONSTRAINT "Device_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SavedRoute" ADD CONSTRAINT "SavedRoute_passengerId_fkey" FOREIGN KEY ("passengerId") REFERENCES "Passenger"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JourneySegment" ADD CONSTRAINT "JourneySegment_journeyId_fkey" FOREIGN KEY ("journeyId") REFERENCES "Journey"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "JourneySegment" ADD CONSTRAINT "JourneySegment_scheduleId_fkey" FOREIGN KEY ("scheduleId") REFERENCES "TrainSchedule"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RouteStop" ADD CONSTRAINT "RouteStop_routeId_fkey" FOREIGN KEY ("routeId") REFERENCES "Route"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RouteFareRule" ADD CONSTRAINT "RouteFareRule_routeId_fkey" FOREIGN KEY ("routeId") REFERENCES "Route"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "RouteFareRule" ADD CONSTRAINT "RouteFareRule_seatClassId_fkey" FOREIGN KEY ("seatClassId") REFERENCES "SeatClass"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Agent" ADD CONSTRAINT "Agent_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentBooking" ADD CONSTRAINT "AgentBooking_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentBooking" ADD CONSTRAINT "AgentBooking_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentShift" ADD CONSTRAINT "AgentShift_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AgentCommission" ADD CONSTRAINT "AgentCommission_agentId_fkey" FOREIGN KEY ("agentId") REFERENCES "Agent"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BookingModification" ADD CONSTRAINT "BookingModification_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BookingCancellation" ADD CONSTRAINT "BookingCancellation_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "GateValidationLog" ADD CONSTRAINT "GateValidationLog_ticketId_fkey" FOREIGN KEY ("ticketId") REFERENCES "Ticket"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "BaggageBooking" ADD CONSTRAINT "BaggageBooking_bookingId_fkey" FOREIGN KEY ("bookingId") REFERENCES "Booking"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "AuditLog" ADD CONSTRAINT "AuditLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "SeatBlock" ADD CONSTRAINT "SeatBlock_seatId_fkey" FOREIGN KEY ("seatId") REFERENCES "Seat"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "FraudAlert" ADD CONSTRAINT "FraudAlert_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/apps/edr-passenger-api/prisma/schema.prisma b/apps/edr-passenger-api/prisma/schema.prisma index 7b2df1e81..e8d4f5f72 100644 --- a/apps/edr-passenger-api/prisma/schema.prisma +++ b/apps/edr-passenger-api/prisma/schema.prisma @@ -5,7 +5,6 @@ generator client { datasource db { provider = "postgresql" url = env("DATABASE_URL") - schemas = ["edr_passenger"] } enum UserRole {