-- CreateTable CREATE TABLE `Business` ( `id` VARCHAR(191) NOT NULL, `slug` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NOT NULL, `description` TEXT NULL, `logoUrl` VARCHAR(191) NULL, `phone` VARCHAR(191) NULL, `email` VARCHAR(191) NULL, `website` VARCHAR(191) NULL, `instagramUrl` VARCHAR(191) NULL, `facebookUrl` VARCHAR(191) NULL, `timezone` VARCHAR(191) NOT NULL DEFAULT 'Europe/London', `currency` VARCHAR(191) NOT NULL DEFAULT 'GBP', `locale` VARCHAR(191) NOT NULL DEFAULT 'en-GB', `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `Business_slug_key`(`slug`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `BusinessLocation` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NOT NULL DEFAULT 'Main Location', `addressLine1` VARCHAR(191) NOT NULL, `addressLine2` VARCHAR(191) NULL, `city` VARCHAR(191) NOT NULL, `region` VARCHAR(191) NULL, `postalCode` VARCHAR(191) NOT NULL, `country` VARCHAR(191) NOT NULL DEFAULT 'GB', `latitude` DECIMAL(9, 6) NULL, `longitude` DECIMAL(9, 6) NULL, `isPrimary` BOOLEAN NOT NULL DEFAULT true, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `BusinessLocation_businessId_idx`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `BusinessHours` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `dayOfWeek` ENUM('MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY') NOT NULL, `isClosed` BOOLEAN NOT NULL DEFAULT false, `opensAtMinutes` INTEGER NULL, `closesAtMinutes` INTEGER NULL, UNIQUE INDEX `BusinessHours_businessId_dayOfWeek_key`(`businessId`, `dayOfWeek`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `BusinessSettings` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `cancellationPolicy` TEXT NULL, `lateArrivalPolicy` TEXT NULL, `bookingTerms` TEXT NULL, `privacyPolicyUrl` VARCHAR(191) NULL, `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `BusinessSettings_businessId_key`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `BookingRule` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `minNoticeMinutes` INTEGER NOT NULL DEFAULT 120, `maxAdvanceDays` INTEGER NOT NULL DEFAULT 60, `cancellationWindowHours` INTEGER NOT NULL DEFAULT 24, `rescheduleWindowHours` INTEGER NOT NULL DEFAULT 24, `slotIntervalMinutes` INTEGER NOT NULL DEFAULT 30, `bufferBeforeMinutes` INTEGER NOT NULL DEFAULT 0, `bufferAfterMinutes` INTEGER NOT NULL DEFAULT 5, `maxAppointmentsPerDay` INTEGER NULL, `maxAppointmentsPerStaffPerDay` INTEGER NULL, `customerCanChooseStaff` BOOLEAN NOT NULL DEFAULT true, `allowGuestBooking` BOOLEAN NOT NULL DEFAULT true, `requireApproval` BOOLEAN NOT NULL DEFAULT false, `requireDeposit` BOOLEAN NOT NULL DEFAULT false, `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `BookingRule_businessId_key`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `User` ( `id` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NULL, `email` VARCHAR(191) NULL, `emailVerified` DATETIME(3) NULL, `phone` VARCHAR(191) NULL, `phoneVerified` DATETIME(3) NULL, `image` VARCHAR(191) NULL, `passwordHash` VARCHAR(191) NULL, `isSuperAdmin` BOOLEAN NOT NULL DEFAULT false, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `User_email_key`(`email`), UNIQUE INDEX `User_phone_key`(`phone`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Account` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `type` VARCHAR(191) NOT NULL, `provider` VARCHAR(191) NOT NULL, `providerAccountId` VARCHAR(191) NOT NULL, `refresh_token` TEXT NULL, `access_token` TEXT NULL, `expires_at` INTEGER NULL, `token_type` VARCHAR(191) NULL, `scope` VARCHAR(191) NULL, `id_token` TEXT NULL, `session_state` VARCHAR(191) NULL, UNIQUE INDEX `Account_provider_providerAccountId_key`(`provider`, `providerAccountId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Session` ( `id` VARCHAR(191) NOT NULL, `sessionToken` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `expires` DATETIME(3) NOT NULL, UNIQUE INDEX `Session_sessionToken_key`(`sessionToken`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `VerificationToken` ( `identifier` VARCHAR(191) NOT NULL, `token` VARCHAR(191) NOT NULL, `expires` DATETIME(3) NOT NULL, UNIQUE INDEX `VerificationToken_token_key`(`token`), UNIQUE INDEX `VerificationToken_identifier_token_key`(`identifier`, `token`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `CustomerProfile` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NULL, `firstName` VARCHAR(191) NOT NULL, `lastName` VARCHAR(191) NOT NULL, `email` VARCHAR(191) NOT NULL, `phone` VARCHAR(191) NULL, `isGuest` BOOLEAN NOT NULL DEFAULT true, `preferredBarberId` VARCHAR(191) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `CustomerProfile_userId_key`(`userId`), INDEX `CustomerProfile_email_idx`(`email`), INDEX `CustomerProfile_phone_idx`(`phone`), INDEX `CustomerProfile_preferredBarberId_idx`(`preferredBarberId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `StaffProfile` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `roleId` VARCHAR(191) NOT NULL, `bio` TEXT NULL, `status` ENUM('ACTIVE', 'ON_BREAK', 'INACTIVE') NOT NULL DEFAULT 'ACTIVE', `isBookableOnline` BOOLEAN NOT NULL DEFAULT true, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `StaffProfile_userId_key`(`userId`), INDEX `StaffProfile_businessId_idx`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Role` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NOT NULL, `isSystem` BOOLEAN NOT NULL DEFAULT true, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), UNIQUE INDEX `Role_businessId_name_key`(`businessId`, `name`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `RolePermission` ( `id` VARCHAR(191) NOT NULL, `roleId` VARCHAR(191) NOT NULL, `permission` ENUM('MANAGE_BUSINESS_PROFILE', 'MANAGE_BOOKING_RULES', 'MANAGE_SERVICES', 'MANAGE_STAFF', 'MANAGE_LOYALTY_PROGRAMME', 'MANAGE_NOTIFICATION_SETTINGS', 'VIEW_ALL_STAFF_APPOINTMENTS', 'MANAGE_ALL_APPOINTMENTS', 'MANAGE_OWN_APPOINTMENTS', 'CHECK_IN_CUSTOMERS', 'MANAGE_LOYALTY_STAMPS', 'MANAGE_OWN_AVAILABILITY', 'VIEW_CUSTOMER_DIRECTORY', 'BOOK_ON_BEHALF_OF_CUSTOMER', 'VIEW_REPORTING') NOT NULL, UNIQUE INDEX `RolePermission_roleId_permission_key`(`roleId`, `permission`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `StaffInvitation` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, `email` VARCHAR(191) NOT NULL, `token` VARCHAR(191) NOT NULL, `invitedByUserId` VARCHAR(191) NULL, `expiresAt` DATETIME(3) NOT NULL, `acceptedAt` DATETIME(3) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), UNIQUE INDEX `StaffInvitation_staffId_key`(`staffId`), UNIQUE INDEX `StaffInvitation_token_key`(`token`), INDEX `StaffInvitation_businessId_idx`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `ServiceCategory` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NOT NULL, `displayOrder` INTEGER NOT NULL DEFAULT 0, `isActive` BOOLEAN NOT NULL DEFAULT true, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `ServiceCategory_businessId_idx`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Service` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `categoryId` VARCHAR(191) NOT NULL, `name` VARCHAR(191) NOT NULL, `description` TEXT NULL, `durationMinutes` INTEGER NOT NULL, `price` DECIMAL(10, 2) NOT NULL, `bufferBeforeMinutes` INTEGER NOT NULL DEFAULT 0, `bufferAfterMinutes` INTEGER NOT NULL DEFAULT 0, `isActive` BOOLEAN NOT NULL DEFAULT true, `allowOnlineBooking` BOOLEAN NOT NULL DEFAULT true, `displayOrder` INTEGER NOT NULL DEFAULT 0, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `Service_businessId_idx`(`businessId`), INDEX `Service_categoryId_idx`(`categoryId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `StaffService` ( `id` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, `serviceId` VARCHAR(191) NOT NULL, `priceOverride` DECIMAL(10, 2) NULL, `durationOverrideMinutes` INTEGER NULL, UNIQUE INDEX `StaffService_staffId_serviceId_key`(`staffId`, `serviceId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `WorkingHours` ( `id` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, `dayOfWeek` ENUM('MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY') NOT NULL, `isOff` BOOLEAN NOT NULL DEFAULT false, `startMinutes` INTEGER NULL, `endMinutes` INTEGER NULL, UNIQUE INDEX `WorkingHours_staffId_dayOfWeek_key`(`staffId`, `dayOfWeek`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Break` ( `id` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, `label` VARCHAR(191) NOT NULL, `startMinutes` INTEGER NOT NULL, `endMinutes` INTEGER NOT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `BreakDay` ( `id` VARCHAR(191) NOT NULL, `breakId` VARCHAR(191) NOT NULL, `dayOfWeek` ENUM('MONDAY', 'TUESDAY', 'WEDNESDAY', 'THURSDAY', 'FRIDAY', 'SATURDAY', 'SUNDAY') NOT NULL, UNIQUE INDEX `BreakDay_breakId_dayOfWeek_key`(`breakId`, `dayOfWeek`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `TimeOff` ( `id` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, `startDate` DATE NOT NULL, `endDate` DATE NOT NULL, `reason` VARCHAR(191) NULL, `status` ENUM('PENDING', 'APPROVED', 'DECLINED') NOT NULL DEFAULT 'APPROVED', `startMinutes` INTEGER NULL, `endMinutes` INTEGER NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `TimeOff_staffId_startDate_endDate_idx`(`staffId`, `startDate`, `endDate`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Appointment` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `customerId` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, `status` ENUM('PENDING', 'CONFIRMED', 'CHECKED_IN', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED', 'NO_SHOW') NOT NULL DEFAULT 'CONFIRMED', `startAt` DATETIME(3) NOT NULL, `endAt` DATETIME(3) NOT NULL, `notes` TEXT NULL, `discountAmount` DECIMAL(10, 2) NULL, `cancellationReason` VARCHAR(191) NULL, `cancelledAt` DATETIME(3) NULL, `cancelledByUserId` VARCHAR(191) NULL, `createdByUserId` VARCHAR(191) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `Appointment_staffId_startAt_idx`(`staffId`, `startAt`), INDEX `Appointment_businessId_startAt_idx`(`businessId`, `startAt`), INDEX `Appointment_customerId_idx`(`customerId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `AppointmentService` ( `id` VARCHAR(191) NOT NULL, `appointmentId` VARCHAR(191) NOT NULL, `serviceId` VARCHAR(191) NOT NULL, `priceAtBooking` DECIMAL(10, 2) NOT NULL, `durationAtBookingMinutes` INTEGER NOT NULL, INDEX `AppointmentService_appointmentId_idx`(`appointmentId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `LoyaltyProgramme` ( `id` VARCHAR(191) NOT NULL, `businessId` VARCHAR(191) NOT NULL, `isEnabled` BOOLEAN NOT NULL DEFAULT false, `stampsRequired` INTEGER NOT NULL DEFAULT 10, `rewardType` ENUM('PERCENTAGE', 'FIXED_AMOUNT', 'FREE_SERVICE') NOT NULL DEFAULT 'PERCENTAGE', `rewardValue` DECIMAL(10, 2) NULL, `rewardLabel` VARCHAR(191) NULL, `maxRewardValue` DECIMAL(10, 2) NULL, `freeServiceId` VARCHAR(191) NULL, `autoApplyReward` BOOLEAN NOT NULL DEFAULT true, `requiresStaffApproval` BOOLEAN NOT NULL DEFAULT false, `stampsExpireAfterDays` INTEGER NULL, `rewardExpiresAfterDays` INTEGER NULL, `earnOnCancelled` BOOLEAN NOT NULL DEFAULT false, `earnOnNoShow` BOOLEAN NOT NULL DEFAULT false, `cardBackgroundColor` VARCHAR(191) NULL, `cardBackgroundImageUrl` VARCHAR(191) NULL, `stampIcon` VARCHAR(191) NULL, `termsLine` VARCHAR(191) NULL, `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `LoyaltyProgramme_businessId_key`(`businessId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `LoyaltyEligibleService` ( `id` VARCHAR(191) NOT NULL, `loyaltyProgrammeId` VARCHAR(191) NOT NULL, `serviceId` VARCHAR(191) NOT NULL, UNIQUE INDEX `LoyaltyEligibleService_loyaltyProgrammeId_serviceId_key`(`loyaltyProgrammeId`, `serviceId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `LoyaltyEligibleStaff` ( `id` VARCHAR(191) NOT NULL, `loyaltyProgrammeId` VARCHAR(191) NOT NULL, `staffId` VARCHAR(191) NOT NULL, UNIQUE INDEX `LoyaltyEligibleStaff_loyaltyProgrammeId_staffId_key`(`loyaltyProgrammeId`, `staffId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `LoyaltyAccount` ( `id` VARCHAR(191) NOT NULL, `customerId` VARCHAR(191) NOT NULL, `loyaltyProgrammeId` VARCHAR(191) NOT NULL, `currentStamps` INTEGER NOT NULL DEFAULT 0, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `LoyaltyAccount_customerId_loyaltyProgrammeId_key`(`customerId`, `loyaltyProgrammeId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `LoyaltyTransaction` ( `id` VARCHAR(191) NOT NULL, `loyaltyAccountId` VARCHAR(191) NOT NULL, `type` ENUM('STAMP_ADDED', 'STAMP_REMOVED', 'STAMP_EXPIRED', 'REWARD_REDEEMED') NOT NULL, `amount` INTEGER NOT NULL, `reason` VARCHAR(191) NULL, `appointmentId` VARCHAR(191) NULL, `authoredByStaffId` VARCHAR(191) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `LoyaltyTransaction_loyaltyAccountId_idx`(`loyaltyAccountId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `LoyaltyReward` ( `id` VARCHAR(191) NOT NULL, `loyaltyAccountId` VARCHAR(191) NOT NULL, `rewardType` ENUM('PERCENTAGE', 'FIXED_AMOUNT', 'FREE_SERVICE') NOT NULL, `value` DECIMAL(10, 2) NULL, `label` VARCHAR(191) NOT NULL, `status` ENUM('AVAILABLE', 'REDEEMED', 'EXPIRED') NOT NULL DEFAULT 'AVAILABLE', `appliedToAppointmentId` VARCHAR(191) NULL, `redeemedAt` DATETIME(3) NULL, `redeemedByStaffId` VARCHAR(191) NULL, `expiresAt` DATETIME(3) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `LoyaltyReward_loyaltyAccountId_idx`(`loyaltyAccountId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `Notification` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NULL, `appointmentId` VARCHAR(191) NULL, `category` ENUM('BOOKING_CONFIRMATION', 'BOOKING_REMINDER', 'BOOKING_CHANGED', 'BOOKING_CANCELLED', 'LOYALTY_REWARD_EARNED', 'LOYALTY_REWARD_AVAILABLE', 'MARKETING') NOT NULL, `channel` ENUM('EMAIL', 'SMS', 'PUSH') NOT NULL, `status` ENUM('PENDING', 'SENT', 'FAILED') NOT NULL DEFAULT 'PENDING', `subject` VARCHAR(191) NULL, `body` TEXT NOT NULL, `sentAt` DATETIME(3) NULL, `failureReason` VARCHAR(191) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `Notification_userId_idx`(`userId`), INDEX `Notification_appointmentId_idx`(`appointmentId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `NotificationPreference` ( `id` VARCHAR(191) NOT NULL, `userId` VARCHAR(191) NOT NULL, `category` ENUM('BOOKING_CONFIRMATION', 'BOOKING_REMINDER', 'BOOKING_CHANGED', 'BOOKING_CANCELLED', 'LOYALTY_REWARD_EARNED', 'LOYALTY_REWARD_AVAILABLE', 'MARKETING') NOT NULL, `channel` ENUM('EMAIL', 'SMS', 'PUSH') NOT NULL, `isEnabled` BOOLEAN NOT NULL DEFAULT true, UNIQUE INDEX `NotificationPreference_userId_category_channel_key`(`userId`, `category`, `channel`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `CustomerNote` ( `id` VARCHAR(191) NOT NULL, `customerId` VARCHAR(191) NOT NULL, `authorStaffId` VARCHAR(191) NOT NULL, `body` TEXT NOT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `CustomerNote_customerId_idx`(`customerId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- CreateTable CREATE TABLE `AuditLog` ( `id` VARCHAR(191) NOT NULL, `actorUserId` VARCHAR(191) NULL, `action` VARCHAR(191) NOT NULL, `entityType` VARCHAR(191) NOT NULL, `entityId` VARCHAR(191) NOT NULL, `metadata` JSON NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `AuditLog_entityType_entityId_idx`(`entityType`, `entityId`), INDEX `AuditLog_actorUserId_idx`(`actorUserId`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci; -- AddForeignKey ALTER TABLE `BusinessLocation` ADD CONSTRAINT `BusinessLocation_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `BusinessHours` ADD CONSTRAINT `BusinessHours_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `BusinessSettings` ADD CONSTRAINT `BusinessSettings_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `BookingRule` ADD CONSTRAINT `BookingRule_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Account` ADD CONSTRAINT `Account_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Session` ADD CONSTRAINT `Session_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `CustomerProfile` ADD CONSTRAINT `CustomerProfile_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `CustomerProfile` ADD CONSTRAINT `CustomerProfile_preferredBarberId_fkey` FOREIGN KEY (`preferredBarberId`) REFERENCES `StaffProfile`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffProfile` ADD CONSTRAINT `StaffProfile_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffProfile` ADD CONSTRAINT `StaffProfile_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffProfile` ADD CONSTRAINT `StaffProfile_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Role` ADD CONSTRAINT `Role_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `RolePermission` ADD CONSTRAINT `RolePermission_roleId_fkey` FOREIGN KEY (`roleId`) REFERENCES `Role`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffInvitation` ADD CONSTRAINT `StaffInvitation_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffInvitation` ADD CONSTRAINT `StaffInvitation_staffId_fkey` FOREIGN KEY (`staffId`) REFERENCES `StaffProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffInvitation` ADD CONSTRAINT `StaffInvitation_invitedByUserId_fkey` FOREIGN KEY (`invitedByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `ServiceCategory` ADD CONSTRAINT `ServiceCategory_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Service` ADD CONSTRAINT `Service_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Service` ADD CONSTRAINT `Service_categoryId_fkey` FOREIGN KEY (`categoryId`) REFERENCES `ServiceCategory`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffService` ADD CONSTRAINT `StaffService_staffId_fkey` FOREIGN KEY (`staffId`) REFERENCES `StaffProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `StaffService` ADD CONSTRAINT `StaffService_serviceId_fkey` FOREIGN KEY (`serviceId`) REFERENCES `Service`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `WorkingHours` ADD CONSTRAINT `WorkingHours_staffId_fkey` FOREIGN KEY (`staffId`) REFERENCES `StaffProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Break` ADD CONSTRAINT `Break_staffId_fkey` FOREIGN KEY (`staffId`) REFERENCES `StaffProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `BreakDay` ADD CONSTRAINT `BreakDay_breakId_fkey` FOREIGN KEY (`breakId`) REFERENCES `Break`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `TimeOff` ADD CONSTRAINT `TimeOff_staffId_fkey` FOREIGN KEY (`staffId`) REFERENCES `StaffProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Appointment` ADD CONSTRAINT `Appointment_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Appointment` ADD CONSTRAINT `Appointment_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `CustomerProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Appointment` ADD CONSTRAINT `Appointment_staffId_fkey` FOREIGN KEY (`staffId`) REFERENCES `StaffProfile`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Appointment` ADD CONSTRAINT `Appointment_cancelledByUserId_fkey` FOREIGN KEY (`cancelledByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Appointment` ADD CONSTRAINT `Appointment_createdByUserId_fkey` FOREIGN KEY (`createdByUserId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `AppointmentService` ADD CONSTRAINT `AppointmentService_appointmentId_fkey` FOREIGN KEY (`appointmentId`) REFERENCES `Appointment`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `AppointmentService` ADD CONSTRAINT `AppointmentService_serviceId_fkey` FOREIGN KEY (`serviceId`) REFERENCES `Service`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyProgramme` ADD CONSTRAINT `LoyaltyProgramme_businessId_fkey` FOREIGN KEY (`businessId`) REFERENCES `Business`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyProgramme` ADD CONSTRAINT `LoyaltyProgramme_freeServiceId_fkey` FOREIGN KEY (`freeServiceId`) REFERENCES `Service`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyEligibleService` ADD CONSTRAINT `LoyaltyEligibleService_loyaltyProgrammeId_fkey` FOREIGN KEY (`loyaltyProgrammeId`) REFERENCES `LoyaltyProgramme`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyEligibleService` ADD CONSTRAINT `LoyaltyEligibleService_serviceId_fkey` FOREIGN KEY (`serviceId`) REFERENCES `Service`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyEligibleStaff` ADD CONSTRAINT `LoyaltyEligibleStaff_loyaltyProgrammeId_fkey` FOREIGN KEY (`loyaltyProgrammeId`) REFERENCES `LoyaltyProgramme`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyAccount` ADD CONSTRAINT `LoyaltyAccount_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `CustomerProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyAccount` ADD CONSTRAINT `LoyaltyAccount_loyaltyProgrammeId_fkey` FOREIGN KEY (`loyaltyProgrammeId`) REFERENCES `LoyaltyProgramme`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyTransaction` ADD CONSTRAINT `LoyaltyTransaction_loyaltyAccountId_fkey` FOREIGN KEY (`loyaltyAccountId`) REFERENCES `LoyaltyAccount`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyTransaction` ADD CONSTRAINT `LoyaltyTransaction_appointmentId_fkey` FOREIGN KEY (`appointmentId`) REFERENCES `Appointment`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyTransaction` ADD CONSTRAINT `LoyaltyTransaction_authoredByStaffId_fkey` FOREIGN KEY (`authoredByStaffId`) REFERENCES `StaffProfile`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyReward` ADD CONSTRAINT `LoyaltyReward_loyaltyAccountId_fkey` FOREIGN KEY (`loyaltyAccountId`) REFERENCES `LoyaltyAccount`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyReward` ADD CONSTRAINT `LoyaltyReward_appliedToAppointmentId_fkey` FOREIGN KEY (`appliedToAppointmentId`) REFERENCES `Appointment`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `LoyaltyReward` ADD CONSTRAINT `LoyaltyReward_redeemedByStaffId_fkey` FOREIGN KEY (`redeemedByStaffId`) REFERENCES `StaffProfile`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Notification` ADD CONSTRAINT `Notification_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `Notification` ADD CONSTRAINT `Notification_appointmentId_fkey` FOREIGN KEY (`appointmentId`) REFERENCES `Appointment`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `NotificationPreference` ADD CONSTRAINT `NotificationPreference_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `CustomerNote` ADD CONSTRAINT `CustomerNote_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `CustomerProfile`(`id`) ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `CustomerNote` ADD CONSTRAINT `CustomerNote_authorStaffId_fkey` FOREIGN KEY (`authorStaffId`) REFERENCES `StaffProfile`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;