2026-07-14 10:43:46 +05:30
|
|
|
-- =============================================================================
|
|
|
|
|
-- AeroResolve Database Schema
|
|
|
|
|
-- PostgreSQL 14+
|
|
|
|
|
-- Generated from TypeORM entities (aeroresolve_backend)
|
|
|
|
|
-- =============================================================================
|
|
|
|
|
--
|
|
|
|
|
-- Usage:
|
|
|
|
|
-- psql -h <host> -U <user> -d <database> -f database/schema.sql
|
|
|
|
|
--
|
|
|
|
|
-- Notes:
|
|
|
|
|
-- - Column names use camelCase to match TypeORM entity field names.
|
|
|
|
|
-- - In local/dev, TypeORM can also sync via DB_SYNCHRONIZE=true.
|
|
|
|
|
-- - Run scripts/seed-master-data.ts after schema creation for demo data.
|
|
|
|
|
-- =============================================================================
|
|
|
|
|
|
|
|
|
|
CREATE EXTENSION IF NOT EXISTS "pgcrypto";
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
-- ─── Schemas ────────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
CREATE SCHEMA IF NOT EXISTS tenant;
|
|
|
|
|
CREATE SCHEMA IF NOT EXISTS masters;
|
|
|
|
|
CREATE SCHEMA IF NOT EXISTS cohort;
|
|
|
|
|
|
2026-07-14 10:43:46 +05:30
|
|
|
-- ─── Enum Types ─────────────────────────────────────────────────────────────
|
|
|
|
|
|
|
|
|
|
DO $$ BEGIN
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TYPE cohort.cohort_high_value_passenger_enum AS ENUM (
|
2026-07-14 10:43:46 +05:30
|
|
|
'Any',
|
|
|
|
|
'Yes(VIP/Strategic)',
|
|
|
|
|
'No'
|
|
|
|
|
);
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN duplicate_object THEN NULL;
|
|
|
|
|
END $$;
|
|
|
|
|
|
|
|
|
|
DO $$ BEGIN
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TYPE cohort.cohort_flight_type_enum AS ENUM (
|
2026-07-14 10:43:46 +05:30
|
|
|
'Domestic Only',
|
|
|
|
|
'International Only',
|
|
|
|
|
'Both (All)'
|
|
|
|
|
);
|
|
|
|
|
EXCEPTION
|
|
|
|
|
WHEN duplicate_object THEN NULL;
|
|
|
|
|
END $$;
|
|
|
|
|
|
|
|
|
|
-- ─── Tenants ────────────────────────────────────────────────────────────────
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS tenant.tbl_tenants (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
|
|
|
slug VARCHAR NOT NULL,
|
|
|
|
|
name VARCHAR NOT NULL,
|
|
|
|
|
tier VARCHAR NOT NULL DEFAULT 'standard',
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
CONSTRAINT uq_tbl_tenants_slug UNIQUE (slug)
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- ─── Master Data ────────────────────────────────────────────────────────────
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_membership_tiers (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_membership_tiers_tenant ON masters.tbl_membership_tiers("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_customer_values (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_customer_values_tenant ON masters.tbl_customer_values("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_regions (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_regions_tenant ON masters.tbl_regions("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_trip_purposes (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_trip_purposes_tenant ON masters.tbl_trip_purposes("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_cabin_classes (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_cabin_classes_tenant ON masters.tbl_cabin_classes("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_passenger_types (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_passenger_types_tenant ON masters.tbl_passenger_types("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_ancillary_purchases (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_ancillary_purchases_tenant ON masters.tbl_ancillary_purchases("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS masters.tbl_revenue_segments (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
label VARCHAR NOT NULL,
|
|
|
|
|
value VARCHAR NOT NULL,
|
|
|
|
|
"isActive" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_revenue_segments_tenant ON masters.tbl_revenue_segments("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
|
|
|
|
-- ─── Cohorts ────────────────────────────────────────────────────────────────
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohorts (
|
2026-07-14 10:43:46 +05:30
|
|
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
2026-07-15 13:06:03 +05:30
|
|
|
"tenantId" UUID NOT NULL REFERENCES tenant.tbl_tenants(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
"scopeType" VARCHAR,
|
|
|
|
|
name VARCHAR NOT NULL,
|
|
|
|
|
description VARCHAR,
|
|
|
|
|
status VARCHAR NOT NULL DEFAULT 'Draft',
|
2026-07-15 13:06:03 +05:30
|
|
|
"highValuePassenger" cohort.cohort_high_value_passenger_enum NOT NULL DEFAULT 'Any',
|
|
|
|
|
"flightType" cohort.cohort_flight_type_enum,
|
2026-07-14 10:43:46 +05:30
|
|
|
"originAirport" TEXT,
|
|
|
|
|
"destinationAirport" TEXT,
|
|
|
|
|
"createdAt" TIMESTAMP NOT NULL DEFAULT now(),
|
|
|
|
|
"updatedAt" TIMESTAMP NOT NULL DEFAULT now()
|
|
|
|
|
);
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE INDEX IF NOT EXISTS idx_tbl_cohorts_tenant ON cohort.tbl_cohorts("tenantId");
|
2026-07-14 10:43:46 +05:30
|
|
|
|
|
|
|
|
-- ─── Cohort Join Tables (Many-to-Many) ──────────────────────────────────────
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_cabin_classes (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"cabinClassId" UUID NOT NULL REFERENCES masters.tbl_cabin_classes(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "cabinClassId")
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_passenger_types (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"passengerTypeId" UUID NOT NULL REFERENCES masters.tbl_passenger_types(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "passengerTypeId")
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_ancillary_purchases (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"ancillaryPurchaseId" UUID NOT NULL REFERENCES masters.tbl_ancillary_purchases(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "ancillaryPurchaseId")
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_loyalty_tiers (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"membershipTierId" UUID NOT NULL REFERENCES masters.tbl_membership_tiers(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "membershipTierId")
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_revenue_segments (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"revenueSegmentId" UUID NOT NULL REFERENCES masters.tbl_revenue_segments(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "revenueSegmentId")
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_regions (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"regionId" UUID NOT NULL REFERENCES masters.tbl_regions(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "regionId")
|
|
|
|
|
);
|
|
|
|
|
|
2026-07-15 13:06:03 +05:30
|
|
|
CREATE TABLE IF NOT EXISTS cohort.tbl_cohort_trip_purposes (
|
|
|
|
|
"cohortId" UUID NOT NULL REFERENCES cohort.tbl_cohorts(id) ON DELETE CASCADE,
|
|
|
|
|
"tripPurposeId" UUID NOT NULL REFERENCES masters.tbl_trip_purposes(id) ON DELETE CASCADE,
|
2026-07-14 10:43:46 +05:30
|
|
|
PRIMARY KEY ("cohortId", "tripPurposeId")
|
|
|
|
|
);
|