Updated seat class and coach mangement

This commit is contained in:
Roba Boru
2026-05-19 16:49:22 +03:00
parent 071a57a668
commit a73277ae38
23 changed files with 310 additions and 61 deletions

View File

@@ -0,0 +1,52 @@
-- CreateTable
CREATE TABLE "SeatClass" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"basePrice" INTEGER NOT NULL,
"isActive" BOOLEAN NOT NULL DEFAULT true,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "SeatClass_pkey" PRIMARY KEY ("id")
);
CREATE UNIQUE INDEX "SeatClass_name_key" ON "SeatClass"("name");
-- Seed default seat classes so existing coaches can be migrated
INSERT INTO "SeatClass" ("id", "name", "description", "basePrice", "isActive", "createdAt", "updatedAt")
VALUES
('sc_economy', 'Economy Seat', 'Standard economy seating', 45000, true, NOW(), NOW()),
('sc_business', 'Business Seat','Comfortable business class', 90000, true, NOW(), NOW()),
('sc_first', 'VIP Bed', 'First class VIP bed', 135000, true, NOW(), NOW());
-- Add seatClassId column to Coach (nullable first for migration safety)
ALTER TABLE "Coach" ADD COLUMN "seatClassId" TEXT;
-- Map existing serviceClass enum values to new SeatClass ids
UPDATE "Coach" SET "seatClassId" = 'sc_economy' WHERE "serviceClass" = 'ECONOMY';
UPDATE "Coach" SET "seatClassId" = 'sc_business' WHERE "serviceClass" = 'BUSINESS';
UPDATE "Coach" SET "seatClassId" = 'sc_first' WHERE "serviceClass" = 'FIRST';
-- Make seatClassId NOT NULL now that all rows are populated
ALTER TABLE "Coach" ALTER COLUMN "seatClassId" SET NOT NULL;
-- Drop old serviceClass column
ALTER TABLE "Coach" DROP COLUMN "serviceClass";
-- Add seatClassId to FareRule
ALTER TABLE "FareRule" ADD COLUMN "seatClassId" TEXT;
UPDATE "FareRule" SET "seatClassId" = 'sc_economy' WHERE "serviceClass" = 'ECONOMY';
UPDATE "FareRule" SET "seatClassId" = 'sc_business' WHERE "serviceClass" = 'BUSINESS';
UPDATE "FareRule" SET "seatClassId" = 'sc_first' WHERE "serviceClass" = 'FIRST';
ALTER TABLE "FareRule" ALTER COLUMN "seatClassId" SET NOT NULL;
ALTER TABLE "FareRule" DROP COLUMN "serviceClass";
-- AddForeignKey
ALTER TABLE "Coach" ADD CONSTRAINT "Coach_seatClassId_fkey"
FOREIGN KEY ("seatClassId") REFERENCES "SeatClass"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
ALTER TABLE "FareRule" ADD CONSTRAINT "FareRule_seatClassId_fkey"
FOREIGN KEY ("seatClassId") REFERENCES "SeatClass"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@@ -0,0 +1 @@
ALTER TABLE "SeatClass" ALTER COLUMN "updatedAt" SET DEFAULT NOW();

View File

@@ -35,10 +35,16 @@ enum SeatStatus {
BLOCKED
}
enum ServiceClass {
ECONOMY
BUSINESS
FIRST
model SeatClass {
id String @id @default(uuid())
name String @unique
description String?
basePrice Int
isActive Boolean @default(true)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
coaches Coach[]
fareRules FareRule[]
}
enum BookingStatus {
@@ -249,12 +255,13 @@ model TripLiveStatus {
}
model Coach {
id String @id @default(uuid())
id String @id @default(uuid())
tripId String
label String
serviceClass ServiceClass
trip Trip @relation(fields: [tripId], references: [id])
seats Seat[]
seatClassId String
trip Trip @relation(fields: [tripId], references: [id])
seatClass SeatClass @relation(fields: [seatClassId], references: [id])
seats Seat[]
@@unique([tripId, label])
}
@@ -283,11 +290,12 @@ model SeatHold {
}
model FareRule {
id String @id @default(uuid())
id String @id @default(uuid())
tripId String?
route String?
serviceClass ServiceClass
seatClassId String
baseFareMinor Int
seatClass SeatClass @relation(fields: [seatClassId], references: [id])
currency String @default("ETB")
refundable Boolean @default(true)
validFrom DateTime