| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973 |
- -- Idempotent baseline migration: creates all tables, indexes, and foreign keys
- -- Safe to run on both fresh and existing databases
- CREATE SCHEMA IF NOT EXISTS "public";
- -- CreateTable
- CREATE TABLE IF NOT EXISTS "users" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "email" TEXT NOT NULL,
- "emailVerified" BOOLEAN NOT NULL DEFAULT false,
- "image" TEXT,
- "isSuperAdmin" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "twoFactorEnabled" BOOLEAN NOT NULL DEFAULT false,
- "termsAcceptedAt" TIMESTAMP(3),
- "lastLogin" TIMESTAMP(3),
- "lastSeen" TIMESTAMP(3),
- CONSTRAINT "users_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "app_settings" (
- "id" TEXT NOT NULL,
- "key" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "organizationId" TEXT,
- CONSTRAINT "app_settings_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "sessions" (
- "id" TEXT NOT NULL,
- "expiresAt" TIMESTAMP(3) NOT NULL,
- "token" TEXT NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "ipAddress" TEXT,
- "userAgent" TEXT,
- "userId" TEXT NOT NULL,
- CONSTRAINT "sessions_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "accounts" (
- "id" TEXT NOT NULL,
- "accountId" TEXT NOT NULL,
- "providerId" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "accessToken" TEXT,
- "refreshToken" TEXT,
- "idToken" TEXT,
- "accessTokenExpiresAt" TIMESTAMP(3),
- "refreshTokenExpiresAt" TIMESTAMP(3),
- "scope" TEXT,
- "password" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- CONSTRAINT "accounts_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "verifications" (
- "id" TEXT NOT NULL,
- "identifier" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "expiresAt" TIMESTAMP(3) NOT NULL,
- "createdAt" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3),
- CONSTRAINT "verifications_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "two_factor" (
- "id" TEXT NOT NULL,
- "secret" TEXT NOT NULL,
- "backupCodes" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- CONSTRAINT "two_factor_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "passkeys" (
- "id" TEXT NOT NULL,
- "name" TEXT,
- "publicKey" TEXT NOT NULL,
- "userId" TEXT NOT NULL,
- "credentialID" TEXT NOT NULL,
- "counter" INTEGER NOT NULL,
- "deviceType" TEXT NOT NULL,
- "backedUp" BOOLEAN NOT NULL,
- "transports" TEXT,
- "aaguid" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- CONSTRAINT "passkeys_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "vehicles" (
- "id" TEXT NOT NULL,
- "make" TEXT NOT NULL,
- "model" TEXT NOT NULL,
- "year" INTEGER NOT NULL,
- "vin" TEXT,
- "licensePlate" TEXT,
- "color" TEXT,
- "mileage" INTEGER NOT NULL DEFAULT 0,
- "fuelType" TEXT DEFAULT 'gasoline',
- "transmission" TEXT DEFAULT 'automatic',
- "engineSize" TEXT,
- "purchaseDate" TIMESTAMP(3),
- "purchasePrice" DOUBLE PRECISION,
- "imageUrl" TEXT,
- "isArchived" BOOLEAN NOT NULL DEFAULT false,
- "archiveReason" TEXT,
- "maintenanceDismissed" BOOLEAN NOT NULL DEFAULT false,
- "maintenanceDismissedAt" TIMESTAMP(3),
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "userId" TEXT NOT NULL,
- "organizationId" TEXT,
- "customerId" TEXT,
- CONSTRAINT "vehicles_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "service_records" (
- "id" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "description" TEXT,
- "type" TEXT NOT NULL DEFAULT 'maintenance',
- "status" TEXT NOT NULL DEFAULT 'completed',
- "cost" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "mileage" INTEGER,
- "serviceDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "shopName" TEXT,
- "techName" TEXT,
- "parts" TEXT,
- "laborHours" DOUBLE PRECISION,
- "diagnosticNotes" TEXT,
- "invoiceNotes" TEXT,
- "subtotal" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "taxRate" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "taxAmount" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "totalAmount" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "invoiceNumber" TEXT,
- "discountType" TEXT,
- "discountValue" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "discountAmount" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "manuallyPaid" BOOLEAN NOT NULL DEFAULT false,
- "publicToken" TEXT,
- "sharedAt" TIMESTAMP(3),
- "viewCount" INTEGER NOT NULL DEFAULT 0,
- "lastViewedAt" TIMESTAMP(3),
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "vehicleId" TEXT NOT NULL,
- CONSTRAINT "service_records_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "notes" (
- "id" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "content" TEXT NOT NULL,
- "isPinned" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "vehicleId" TEXT NOT NULL,
- CONSTRAINT "notes_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "fuel_logs" (
- "id" TEXT NOT NULL,
- "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "mileage" INTEGER NOT NULL,
- "gallons" DOUBLE PRECISION NOT NULL,
- "pricePerGallon" DOUBLE PRECISION NOT NULL,
- "totalCost" DOUBLE PRECISION NOT NULL,
- "isFillUp" BOOLEAN NOT NULL DEFAULT true,
- "station" TEXT,
- "notes" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "vehicleId" TEXT NOT NULL,
- CONSTRAINT "fuel_logs_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "reminders" (
- "id" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "description" TEXT,
- "dueDate" TIMESTAMP(3),
- "dueMileage" INTEGER,
- "isCompleted" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "vehicleId" TEXT NOT NULL,
- CONSTRAINT "reminders_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "customers" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "email" TEXT,
- "phone" TEXT,
- "address" TEXT,
- "company" TEXT,
- "notes" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "userId" TEXT NOT NULL,
- "organizationId" TEXT,
- CONSTRAINT "customers_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "payments" (
- "id" TEXT NOT NULL,
- "amount" DOUBLE PRECISION NOT NULL,
- "date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "method" TEXT NOT NULL DEFAULT 'other',
- "note" TEXT,
- "provider" TEXT,
- "externalId" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "serviceRecordId" TEXT NOT NULL,
- CONSTRAINT "payments_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "service_attachments" (
- "id" TEXT NOT NULL,
- "fileName" TEXT NOT NULL,
- "fileUrl" TEXT NOT NULL,
- "fileType" TEXT NOT NULL,
- "fileSize" INTEGER NOT NULL,
- "category" TEXT NOT NULL DEFAULT 'diagnostic',
- "description" TEXT,
- "includeInInvoice" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "serviceRecordId" TEXT NOT NULL,
- CONSTRAINT "service_attachments_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "service_parts" (
- "id" TEXT NOT NULL,
- "partNumber" TEXT,
- "name" TEXT NOT NULL,
- "quantity" DOUBLE PRECISION NOT NULL DEFAULT 1,
- "unitPrice" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "total" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "serviceRecordId" TEXT NOT NULL,
- CONSTRAINT "service_parts_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "service_labor" (
- "id" TEXT NOT NULL,
- "description" TEXT NOT NULL,
- "hours" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "rate" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "total" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "serviceRecordId" TEXT NOT NULL,
- CONSTRAINT "service_labor_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inventory_parts" (
- "id" TEXT NOT NULL,
- "partNumber" TEXT,
- "name" TEXT NOT NULL,
- "description" TEXT,
- "category" TEXT,
- "quantity" INTEGER NOT NULL DEFAULT 0,
- "minQuantity" INTEGER NOT NULL DEFAULT 0,
- "unitCost" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "sellPrice" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "supplier" TEXT,
- "supplierPhone" TEXT,
- "supplierEmail" TEXT,
- "supplierUrl" TEXT,
- "imageUrl" TEXT,
- "location" TEXT,
- "isArchived" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "userId" TEXT NOT NULL,
- "organizationId" TEXT,
- CONSTRAINT "inventory_parts_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "quotes" (
- "id" TEXT NOT NULL,
- "quoteNumber" TEXT,
- "title" TEXT NOT NULL,
- "description" TEXT,
- "status" TEXT NOT NULL DEFAULT 'draft',
- "validUntil" TIMESTAMP(3),
- "subtotal" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "taxRate" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "taxAmount" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "discountType" TEXT,
- "discountValue" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "discountAmount" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "totalAmount" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "notes" TEXT,
- "publicToken" TEXT,
- "sharedAt" TIMESTAMP(3),
- "viewCount" INTEGER NOT NULL DEFAULT 0,
- "lastViewedAt" TIMESTAMP(3),
- "customerMessage" TEXT,
- "convertedToId" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "userId" TEXT NOT NULL,
- "organizationId" TEXT,
- "customerId" TEXT,
- "vehicleId" TEXT,
- "inspectionId" TEXT,
- CONSTRAINT "quotes_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "quote_attachments" (
- "id" TEXT NOT NULL,
- "fileName" TEXT NOT NULL,
- "fileUrl" TEXT NOT NULL,
- "fileType" TEXT NOT NULL,
- "fileSize" INTEGER NOT NULL,
- "category" TEXT NOT NULL DEFAULT 'image',
- "description" TEXT,
- "includeInInvoice" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "quoteId" TEXT NOT NULL,
- CONSTRAINT "quote_attachments_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "quote_parts" (
- "id" TEXT NOT NULL,
- "partNumber" TEXT,
- "name" TEXT NOT NULL,
- "quantity" DOUBLE PRECISION NOT NULL DEFAULT 1,
- "unitPrice" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "total" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "excluded" BOOLEAN NOT NULL DEFAULT false,
- "quoteId" TEXT NOT NULL,
- CONSTRAINT "quote_parts_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "quote_labor" (
- "id" TEXT NOT NULL,
- "description" TEXT NOT NULL,
- "hours" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "rate" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "total" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "excluded" BOOLEAN NOT NULL DEFAULT false,
- "quoteId" TEXT NOT NULL,
- CONSTRAINT "quote_labor_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "custom_field_definitions" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "label" TEXT NOT NULL,
- "fieldType" TEXT NOT NULL DEFAULT 'text',
- "options" TEXT,
- "required" BOOLEAN NOT NULL DEFAULT false,
- "entityType" TEXT NOT NULL,
- "sortOrder" INTEGER NOT NULL DEFAULT 0,
- "isActive" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "userId" TEXT NOT NULL,
- "organizationId" TEXT,
- CONSTRAINT "custom_field_definitions_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "custom_field_values" (
- "id" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- "entityId" TEXT NOT NULL,
- "entityType" TEXT NOT NULL,
- "fieldId" TEXT NOT NULL,
- CONSTRAINT "custom_field_values_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "organizations" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "portalSlug" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- CONSTRAINT "organizations_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "organization_members" (
- "id" TEXT NOT NULL,
- "role" TEXT NOT NULL DEFAULT 'member',
- "userId" TEXT NOT NULL,
- "organizationId" TEXT NOT NULL,
- "roleId" TEXT,
- CONSTRAINT "organization_members_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "roles" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "isAdmin" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "organizationId" TEXT NOT NULL,
- CONSTRAINT "roles_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "permissions" (
- "id" TEXT NOT NULL,
- "action" TEXT NOT NULL,
- "subject" TEXT NOT NULL,
- "roleId" TEXT NOT NULL,
- CONSTRAINT "permissions_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "system_settings" (
- "id" TEXT NOT NULL,
- "key" TEXT NOT NULL,
- "value" TEXT NOT NULL,
- CONSTRAINT "system_settings_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "team_invitations" (
- "id" TEXT NOT NULL,
- "email" TEXT NOT NULL,
- "role" TEXT NOT NULL DEFAULT 'member',
- "token" TEXT NOT NULL,
- "status" TEXT NOT NULL DEFAULT 'pending',
- "expiresAt" TIMESTAMP(3) NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "organizationId" TEXT NOT NULL,
- "invitedById" TEXT NOT NULL,
- "roleId" TEXT,
- CONSTRAINT "team_invitations_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "subscription_plans" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "stripePriceId" TEXT,
- "price" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "interval" TEXT NOT NULL DEFAULT 'month',
- "maxMembers" INTEGER NOT NULL DEFAULT 1,
- "features" TEXT,
- "isActive" BOOLEAN NOT NULL DEFAULT true,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- CONSTRAINT "subscription_plans_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "subscriptions" (
- "id" TEXT NOT NULL,
- "status" TEXT NOT NULL DEFAULT 'active',
- "stripeSubscriptionId" TEXT,
- "stripeCustomerId" TEXT,
- "currentPeriodStart" TIMESTAMP(3),
- "currentPeriodEnd" TIMESTAMP(3),
- "cancelAtPeriodEnd" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "organizationId" TEXT NOT NULL,
- "planId" TEXT NOT NULL,
- CONSTRAINT "subscriptions_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "recurring_invoices" (
- "id" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "description" TEXT,
- "frequency" TEXT NOT NULL,
- "nextRunDate" TIMESTAMP(3) NOT NULL,
- "endDate" TIMESTAMP(3),
- "isActive" BOOLEAN NOT NULL DEFAULT true,
- "lastRunAt" TIMESTAMP(3),
- "runCount" INTEGER NOT NULL DEFAULT 0,
- "type" TEXT NOT NULL DEFAULT 'maintenance',
- "cost" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "taxRate" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "invoiceNotes" TEXT,
- "vehicleId" TEXT NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- CONSTRAINT "recurring_invoices_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "recurring_parts" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "partNumber" TEXT,
- "quantity" INTEGER NOT NULL DEFAULT 1,
- "unitPrice" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "recurringInvoiceId" TEXT NOT NULL,
- CONSTRAINT "recurring_parts_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "recurring_labor" (
- "id" TEXT NOT NULL,
- "description" TEXT NOT NULL,
- "hours" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "rate" DOUBLE PRECISION NOT NULL DEFAULT 0,
- "recurringInvoiceId" TEXT NOT NULL,
- CONSTRAINT "recurring_labor_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inspection_templates" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "description" TEXT,
- "isDefault" BOOLEAN NOT NULL DEFAULT false,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "organizationId" TEXT NOT NULL,
- CONSTRAINT "inspection_templates_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inspection_template_sections" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "sortOrder" INTEGER NOT NULL DEFAULT 0,
- "templateId" TEXT NOT NULL,
- CONSTRAINT "inspection_template_sections_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inspection_template_items" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "sortOrder" INTEGER NOT NULL DEFAULT 0,
- "sectionId" TEXT NOT NULL,
- CONSTRAINT "inspection_template_items_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inspections" (
- "id" TEXT NOT NULL,
- "status" TEXT NOT NULL DEFAULT 'in_progress',
- "mileage" INTEGER,
- "notes" TEXT,
- "publicToken" TEXT,
- "completedAt" TIMESTAMP(3),
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "vehicleId" TEXT NOT NULL,
- "templateId" TEXT NOT NULL,
- "technicianId" TEXT NOT NULL,
- "organizationId" TEXT NOT NULL,
- CONSTRAINT "inspections_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inspection_items" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "section" TEXT NOT NULL,
- "sortOrder" INTEGER NOT NULL DEFAULT 0,
- "condition" TEXT NOT NULL DEFAULT 'not_inspected',
- "notes" TEXT,
- "imageUrls" TEXT[] DEFAULT ARRAY[]::TEXT[],
- "inspectionId" TEXT NOT NULL,
- CONSTRAINT "inspection_items_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "inspection_quote_requests" (
- "id" TEXT NOT NULL,
- "status" TEXT NOT NULL DEFAULT 'pending',
- "message" TEXT,
- "selectedItemIds" TEXT[],
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "inspectionId" TEXT NOT NULL,
- "organizationId" TEXT NOT NULL,
- CONSTRAINT "inspection_quote_requests_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "notifications" (
- "id" TEXT NOT NULL,
- "type" TEXT NOT NULL,
- "title" TEXT NOT NULL,
- "message" TEXT NOT NULL,
- "entityType" TEXT NOT NULL,
- "entityId" TEXT NOT NULL,
- "entityUrl" TEXT NOT NULL,
- "read" BOOLEAN NOT NULL DEFAULT false,
- "organizationId" TEXT NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- CONSTRAINT "notifications_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "sms_messages" (
- "id" TEXT NOT NULL,
- "direction" TEXT NOT NULL,
- "fromNumber" TEXT NOT NULL,
- "toNumber" TEXT NOT NULL,
- "body" TEXT NOT NULL,
- "status" TEXT NOT NULL DEFAULT 'queued',
- "providerMsgId" TEXT,
- "errorMessage" TEXT,
- "relatedEntityType" TEXT,
- "relatedEntityId" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "organizationId" TEXT NOT NULL,
- "customerId" TEXT,
- CONSTRAINT "sms_messages_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "technicians" (
- "id" TEXT NOT NULL,
- "name" TEXT NOT NULL,
- "color" TEXT NOT NULL DEFAULT '#3b82f6',
- "isActive" BOOLEAN NOT NULL DEFAULT true,
- "sortOrder" INTEGER NOT NULL DEFAULT 0,
- "memberId" TEXT,
- "organizationId" TEXT NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- CONSTRAINT "technicians_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "board_assignments" (
- "id" TEXT NOT NULL,
- "date" DATE NOT NULL,
- "sortOrder" INTEGER NOT NULL DEFAULT 0,
- "notes" TEXT,
- "technicianId" TEXT NOT NULL,
- "serviceRecordId" TEXT,
- "inspectionId" TEXT,
- "organizationId" TEXT NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- CONSTRAINT "board_assignments_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "customer_sessions" (
- "id" TEXT NOT NULL,
- "token" TEXT NOT NULL,
- "expiresAt" TIMESTAMP(3) NOT NULL,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "customerId" TEXT NOT NULL,
- "organizationId" TEXT NOT NULL,
- CONSTRAINT "customer_sessions_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "customer_magic_links" (
- "id" TEXT NOT NULL,
- "token" TEXT NOT NULL,
- "email" TEXT NOT NULL,
- "organizationId" TEXT NOT NULL,
- "expiresAt" TIMESTAMP(3) NOT NULL,
- "usedAt" TIMESTAMP(3),
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- CONSTRAINT "customer_magic_links_pkey" PRIMARY KEY ("id")
- );
- CREATE TABLE IF NOT EXISTS "service_requests" (
- "id" TEXT NOT NULL,
- "description" TEXT NOT NULL,
- "preferredDate" TIMESTAMP(3),
- "status" TEXT NOT NULL DEFAULT 'pending',
- "adminNotes" TEXT,
- "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
- "updatedAt" TIMESTAMP(3) NOT NULL,
- "customerId" TEXT NOT NULL,
- "vehicleId" TEXT NOT NULL,
- "organizationId" TEXT NOT NULL,
- CONSTRAINT "service_requests_pkey" PRIMARY KEY ("id")
- );
- -- CreateIndex (idempotent)
- CREATE UNIQUE INDEX IF NOT EXISTS "users_email_key" ON "users"("email");
- CREATE INDEX IF NOT EXISTS "app_settings_organizationId_idx" ON "app_settings"("organizationId");
- CREATE UNIQUE INDEX IF NOT EXISTS "app_settings_organizationId_key_key" ON "app_settings"("organizationId", "key");
- CREATE UNIQUE INDEX IF NOT EXISTS "sessions_token_key" ON "sessions"("token");
- CREATE INDEX IF NOT EXISTS "sessions_userId_idx" ON "sessions"("userId");
- CREATE INDEX IF NOT EXISTS "accounts_userId_idx" ON "accounts"("userId");
- CREATE UNIQUE INDEX IF NOT EXISTS "verifications_identifier_key" ON "verifications"("identifier");
- CREATE UNIQUE INDEX IF NOT EXISTS "two_factor_userId_key" ON "two_factor"("userId");
- CREATE UNIQUE INDEX IF NOT EXISTS "passkeys_credentialID_key" ON "passkeys"("credentialID");
- CREATE INDEX IF NOT EXISTS "passkeys_userId_idx" ON "passkeys"("userId");
- CREATE INDEX IF NOT EXISTS "vehicles_organizationId_idx" ON "vehicles"("organizationId");
- CREATE UNIQUE INDEX IF NOT EXISTS "service_records_publicToken_key" ON "service_records"("publicToken");
- CREATE INDEX IF NOT EXISTS "service_records_vehicleId_idx" ON "service_records"("vehicleId");
- CREATE INDEX IF NOT EXISTS "notes_vehicleId_idx" ON "notes"("vehicleId");
- CREATE INDEX IF NOT EXISTS "fuel_logs_vehicleId_idx" ON "fuel_logs"("vehicleId");
- CREATE INDEX IF NOT EXISTS "reminders_vehicleId_idx" ON "reminders"("vehicleId");
- CREATE INDEX IF NOT EXISTS "customers_organizationId_idx" ON "customers"("organizationId");
- CREATE INDEX IF NOT EXISTS "payments_serviceRecordId_idx" ON "payments"("serviceRecordId");
- CREATE INDEX IF NOT EXISTS "service_attachments_serviceRecordId_idx" ON "service_attachments"("serviceRecordId");
- CREATE INDEX IF NOT EXISTS "service_parts_serviceRecordId_idx" ON "service_parts"("serviceRecordId");
- CREATE INDEX IF NOT EXISTS "service_labor_serviceRecordId_idx" ON "service_labor"("serviceRecordId");
- CREATE INDEX IF NOT EXISTS "inventory_parts_organizationId_idx" ON "inventory_parts"("organizationId");
- CREATE INDEX IF NOT EXISTS "quotes_organizationId_idx" ON "quotes"("organizationId");
- CREATE INDEX IF NOT EXISTS "quote_attachments_quoteId_idx" ON "quote_attachments"("quoteId");
- CREATE INDEX IF NOT EXISTS "quote_parts_quoteId_idx" ON "quote_parts"("quoteId");
- CREATE INDEX IF NOT EXISTS "quote_labor_quoteId_idx" ON "quote_labor"("quoteId");
- CREATE INDEX IF NOT EXISTS "custom_field_definitions_organizationId_idx" ON "custom_field_definitions"("organizationId");
- CREATE UNIQUE INDEX IF NOT EXISTS "custom_field_definitions_organizationId_name_entityType_key" ON "custom_field_definitions"("organizationId", "name", "entityType");
- CREATE INDEX IF NOT EXISTS "custom_field_values_fieldId_idx" ON "custom_field_values"("fieldId");
- CREATE UNIQUE INDEX IF NOT EXISTS "custom_field_values_fieldId_entityId_key" ON "custom_field_values"("fieldId", "entityId");
- CREATE UNIQUE INDEX IF NOT EXISTS "organizations_portalSlug_key" ON "organizations"("portalSlug");
- CREATE UNIQUE INDEX IF NOT EXISTS "organization_members_userId_organizationId_key" ON "organization_members"("userId", "organizationId");
- CREATE UNIQUE INDEX IF NOT EXISTS "roles_organizationId_name_key" ON "roles"("organizationId", "name");
- CREATE INDEX IF NOT EXISTS "permissions_roleId_idx" ON "permissions"("roleId");
- CREATE UNIQUE INDEX IF NOT EXISTS "permissions_roleId_action_subject_key" ON "permissions"("roleId", "action", "subject");
- CREATE UNIQUE INDEX IF NOT EXISTS "system_settings_key_key" ON "system_settings"("key");
- CREATE UNIQUE INDEX IF NOT EXISTS "team_invitations_token_key" ON "team_invitations"("token");
- CREATE INDEX IF NOT EXISTS "team_invitations_token_idx" ON "team_invitations"("token");
- CREATE UNIQUE INDEX IF NOT EXISTS "team_invitations_email_organizationId_key" ON "team_invitations"("email", "organizationId");
- CREATE UNIQUE INDEX IF NOT EXISTS "subscription_plans_stripePriceId_key" ON "subscription_plans"("stripePriceId");
- CREATE UNIQUE INDEX IF NOT EXISTS "subscriptions_stripeSubscriptionId_key" ON "subscriptions"("stripeSubscriptionId");
- CREATE UNIQUE INDEX IF NOT EXISTS "subscriptions_organizationId_key" ON "subscriptions"("organizationId");
- CREATE INDEX IF NOT EXISTS "recurring_invoices_vehicleId_idx" ON "recurring_invoices"("vehicleId");
- CREATE INDEX IF NOT EXISTS "recurring_invoices_nextRunDate_isActive_idx" ON "recurring_invoices"("nextRunDate", "isActive");
- CREATE INDEX IF NOT EXISTS "inspection_templates_organizationId_idx" ON "inspection_templates"("organizationId");
- CREATE INDEX IF NOT EXISTS "inspection_template_sections_templateId_idx" ON "inspection_template_sections"("templateId");
- CREATE INDEX IF NOT EXISTS "inspection_template_items_sectionId_idx" ON "inspection_template_items"("sectionId");
- CREATE UNIQUE INDEX IF NOT EXISTS "inspections_publicToken_key" ON "inspections"("publicToken");
- CREATE INDEX IF NOT EXISTS "inspections_vehicleId_idx" ON "inspections"("vehicleId");
- CREATE INDEX IF NOT EXISTS "inspections_organizationId_idx" ON "inspections"("organizationId");
- CREATE INDEX IF NOT EXISTS "inspection_items_inspectionId_idx" ON "inspection_items"("inspectionId");
- CREATE INDEX IF NOT EXISTS "inspection_quote_requests_organizationId_idx" ON "inspection_quote_requests"("organizationId");
- CREATE INDEX IF NOT EXISTS "inspection_quote_requests_inspectionId_idx" ON "inspection_quote_requests"("inspectionId");
- CREATE INDEX IF NOT EXISTS "notifications_organizationId_createdAt_idx" ON "notifications"("organizationId", "createdAt" DESC);
- CREATE INDEX IF NOT EXISTS "notifications_organizationId_read_idx" ON "notifications"("organizationId", "read");
- CREATE INDEX IF NOT EXISTS "sms_messages_organizationId_customerId_createdAt_idx" ON "sms_messages"("organizationId", "customerId", "createdAt" DESC);
- CREATE INDEX IF NOT EXISTS "sms_messages_organizationId_createdAt_idx" ON "sms_messages"("organizationId", "createdAt" DESC);
- CREATE INDEX IF NOT EXISTS "sms_messages_toNumber_organizationId_idx" ON "sms_messages"("toNumber", "organizationId");
- CREATE INDEX IF NOT EXISTS "technicians_organizationId_idx" ON "technicians"("organizationId");
- CREATE INDEX IF NOT EXISTS "board_assignments_organizationId_date_idx" ON "board_assignments"("organizationId", "date");
- CREATE INDEX IF NOT EXISTS "board_assignments_technicianId_date_idx" ON "board_assignments"("technicianId", "date");
- CREATE UNIQUE INDEX IF NOT EXISTS "board_assignments_serviceRecordId_date_key" ON "board_assignments"("serviceRecordId", "date");
- CREATE UNIQUE INDEX IF NOT EXISTS "board_assignments_inspectionId_date_key" ON "board_assignments"("inspectionId", "date");
- CREATE UNIQUE INDEX IF NOT EXISTS "customer_sessions_token_key" ON "customer_sessions"("token");
- CREATE INDEX IF NOT EXISTS "customer_sessions_token_idx" ON "customer_sessions"("token");
- CREATE INDEX IF NOT EXISTS "customer_sessions_customerId_organizationId_idx" ON "customer_sessions"("customerId", "organizationId");
- CREATE UNIQUE INDEX IF NOT EXISTS "customer_magic_links_token_key" ON "customer_magic_links"("token");
- CREATE INDEX IF NOT EXISTS "customer_magic_links_token_idx" ON "customer_magic_links"("token");
- CREATE INDEX IF NOT EXISTS "service_requests_organizationId_status_idx" ON "service_requests"("organizationId", "status");
- CREATE INDEX IF NOT EXISTS "service_requests_customerId_idx" ON "service_requests"("customerId");
- -- AddForeignKey (idempotent: drop if exists, then add)
- DO $$ BEGIN
- ALTER TABLE "app_settings" ADD CONSTRAINT "app_settings_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "app_settings" ADD CONSTRAINT "app_settings_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "sessions" ADD CONSTRAINT "sessions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "accounts" ADD CONSTRAINT "accounts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "two_factor" ADD CONSTRAINT "two_factor_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "passkeys" ADD CONSTRAINT "passkeys_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "vehicles" ADD CONSTRAINT "vehicles_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "vehicles" ADD CONSTRAINT "vehicles_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "vehicles" ADD CONSTRAINT "vehicles_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "customers"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "service_records" ADD CONSTRAINT "service_records_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "notes" ADD CONSTRAINT "notes_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "fuel_logs" ADD CONSTRAINT "fuel_logs_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "reminders" ADD CONSTRAINT "reminders_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "customers" ADD CONSTRAINT "customers_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "customers" ADD CONSTRAINT "customers_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "payments" ADD CONSTRAINT "payments_serviceRecordId_fkey" FOREIGN KEY ("serviceRecordId") REFERENCES "service_records"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "service_attachments" ADD CONSTRAINT "service_attachments_serviceRecordId_fkey" FOREIGN KEY ("serviceRecordId") REFERENCES "service_records"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "service_parts" ADD CONSTRAINT "service_parts_serviceRecordId_fkey" FOREIGN KEY ("serviceRecordId") REFERENCES "service_records"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "service_labor" ADD CONSTRAINT "service_labor_serviceRecordId_fkey" FOREIGN KEY ("serviceRecordId") REFERENCES "service_records"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inventory_parts" ADD CONSTRAINT "inventory_parts_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inventory_parts" ADD CONSTRAINT "inventory_parts_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quotes" ADD CONSTRAINT "quotes_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quotes" ADD CONSTRAINT "quotes_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quotes" ADD CONSTRAINT "quotes_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "customers"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quotes" ADD CONSTRAINT "quotes_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quotes" ADD CONSTRAINT "quotes_inspectionId_fkey" FOREIGN KEY ("inspectionId") REFERENCES "inspections"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quote_attachments" ADD CONSTRAINT "quote_attachments_quoteId_fkey" FOREIGN KEY ("quoteId") REFERENCES "quotes"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quote_parts" ADD CONSTRAINT "quote_parts_quoteId_fkey" FOREIGN KEY ("quoteId") REFERENCES "quotes"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "quote_labor" ADD CONSTRAINT "quote_labor_quoteId_fkey" FOREIGN KEY ("quoteId") REFERENCES "quotes"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "custom_field_definitions" ADD CONSTRAINT "custom_field_definitions_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "custom_field_definitions" ADD CONSTRAINT "custom_field_definitions_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "custom_field_values" ADD CONSTRAINT "custom_field_values_fieldId_fkey" FOREIGN KEY ("fieldId") REFERENCES "custom_field_definitions"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "organization_members" ADD CONSTRAINT "organization_members_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "organization_members" ADD CONSTRAINT "organization_members_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "organization_members" ADD CONSTRAINT "organization_members_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "roles"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "roles" ADD CONSTRAINT "roles_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "permissions" ADD CONSTRAINT "permissions_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "roles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "team_invitations" ADD CONSTRAINT "team_invitations_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "team_invitations" ADD CONSTRAINT "team_invitations_roleId_fkey" FOREIGN KEY ("roleId") REFERENCES "roles"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_planId_fkey" FOREIGN KEY ("planId") REFERENCES "subscription_plans"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "recurring_invoices" ADD CONSTRAINT "recurring_invoices_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "recurring_parts" ADD CONSTRAINT "recurring_parts_recurringInvoiceId_fkey" FOREIGN KEY ("recurringInvoiceId") REFERENCES "recurring_invoices"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "recurring_labor" ADD CONSTRAINT "recurring_labor_recurringInvoiceId_fkey" FOREIGN KEY ("recurringInvoiceId") REFERENCES "recurring_invoices"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspection_templates" ADD CONSTRAINT "inspection_templates_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspection_template_sections" ADD CONSTRAINT "inspection_template_sections_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "inspection_templates"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspection_template_items" ADD CONSTRAINT "inspection_template_items_sectionId_fkey" FOREIGN KEY ("sectionId") REFERENCES "inspection_template_sections"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspections" ADD CONSTRAINT "inspections_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspections" ADD CONSTRAINT "inspections_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "inspection_templates"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspection_items" ADD CONSTRAINT "inspection_items_inspectionId_fkey" FOREIGN KEY ("inspectionId") REFERENCES "inspections"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "inspection_quote_requests" ADD CONSTRAINT "inspection_quote_requests_inspectionId_fkey" FOREIGN KEY ("inspectionId") REFERENCES "inspections"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "sms_messages" ADD CONSTRAINT "sms_messages_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "sms_messages" ADD CONSTRAINT "sms_messages_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "customers"("id") ON DELETE SET NULL ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "technicians" ADD CONSTRAINT "technicians_organizationId_fkey" FOREIGN KEY ("organizationId") REFERENCES "organizations"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "board_assignments" ADD CONSTRAINT "board_assignments_technicianId_fkey" FOREIGN KEY ("technicianId") REFERENCES "technicians"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "board_assignments" ADD CONSTRAINT "board_assignments_serviceRecordId_fkey" FOREIGN KEY ("serviceRecordId") REFERENCES "service_records"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "board_assignments" ADD CONSTRAINT "board_assignments_inspectionId_fkey" FOREIGN KEY ("inspectionId") REFERENCES "inspections"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "customer_sessions" ADD CONSTRAINT "customer_sessions_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "customers"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "service_requests" ADD CONSTRAINT "service_requests_customerId_fkey" FOREIGN KEY ("customerId") REFERENCES "customers"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
- DO $$ BEGIN
- ALTER TABLE "service_requests" ADD CONSTRAINT "service_requests_vehicleId_fkey" FOREIGN KEY ("vehicleId") REFERENCES "vehicles"("id") ON DELETE CASCADE ON UPDATE CASCADE;
- EXCEPTION WHEN duplicate_object THEN NULL; END $$;
|