-- CreateTable CREATE TABLE `AuditLog` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `userId` INTEGER NULL, `userEmail` VARCHAR(191) NOT NULL, `userRole` VARCHAR(191) NULL, `customerId` INTEGER NULL, `isCustomerPortal` BOOLEAN NOT NULL DEFAULT false, `action` ENUM('CREATE', 'READ', 'UPDATE', 'DELETE', 'EXPORT', 'ANONYMIZE', 'LOGIN', 'LOGOUT', 'LOGIN_FAILED') NOT NULL, `sensitivity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NOT NULL DEFAULT 'MEDIUM', `resourceType` VARCHAR(191) NOT NULL, `resourceId` VARCHAR(191) NULL, `resourceLabel` VARCHAR(191) NULL, `endpoint` VARCHAR(191) NOT NULL, `httpMethod` VARCHAR(191) NOT NULL, `ipAddress` VARCHAR(191) NOT NULL, `userAgent` TEXT NULL, `changesBefore` LONGTEXT NULL, `changesAfter` LONGTEXT NULL, `changesEncrypted` BOOLEAN NOT NULL DEFAULT false, `dataSubjectId` INTEGER NULL, `legalBasis` VARCHAR(191) NULL, `success` BOOLEAN NOT NULL DEFAULT true, `errorMessage` TEXT NULL, `durationMs` INTEGER NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `hash` VARCHAR(191) NULL, `previousHash` VARCHAR(191) NULL, INDEX `AuditLog_userId_idx`(`userId`), INDEX `AuditLog_customerId_idx`(`customerId`), INDEX `AuditLog_resourceType_resourceId_idx`(`resourceType`, `resourceId`), INDEX `AuditLog_dataSubjectId_idx`(`dataSubjectId`), INDEX `AuditLog_action_idx`(`action`), INDEX `AuditLog_createdAt_idx`(`createdAt`), INDEX `AuditLog_sensitivity_idx`(`sensitivity`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `CustomerConsent` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `customerId` INTEGER NOT NULL, `consentType` ENUM('DATA_PROCESSING', 'MARKETING_EMAIL', 'MARKETING_PHONE', 'DATA_SHARING_PARTNER') NOT NULL, `status` ENUM('GRANTED', 'WITHDRAWN', 'PENDING') NOT NULL DEFAULT 'PENDING', `grantedAt` DATETIME(3) NULL, `withdrawnAt` DATETIME(3) NULL, `source` VARCHAR(191) NULL, `documentPath` VARCHAR(191) NULL, `version` VARCHAR(191) NULL, `ipAddress` VARCHAR(191) NULL, `createdBy` VARCHAR(191) NOT NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `CustomerConsent_customerId_idx`(`customerId`), INDEX `CustomerConsent_consentType_idx`(`consentType`), INDEX `CustomerConsent_status_idx`(`status`), UNIQUE INDEX `CustomerConsent_customerId_consentType_key`(`customerId`, `consentType`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `DataDeletionRequest` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `customerId` INTEGER NOT NULL, `status` ENUM('PENDING', 'IN_PROGRESS', 'COMPLETED', 'PARTIALLY_COMPLETED', 'REJECTED') NOT NULL DEFAULT 'PENDING', `requestedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `requestSource` VARCHAR(191) NOT NULL, `requestedBy` VARCHAR(191) NOT NULL, `processedAt` DATETIME(3) NULL, `processedBy` VARCHAR(191) NULL, `deletedData` LONGTEXT NULL, `retainedData` LONGTEXT NULL, `retentionReason` TEXT NULL, `proofDocument` VARCHAR(191) NULL, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, INDEX `DataDeletionRequest_customerId_idx`(`customerId`), INDEX `DataDeletionRequest_status_idx`(`status`), INDEX `DataDeletionRequest_requestedAt_idx`(`requestedAt`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `AuditRetentionPolicy` ( `id` INTEGER NOT NULL AUTO_INCREMENT, `resourceType` VARCHAR(191) NOT NULL, `sensitivity` ENUM('LOW', 'MEDIUM', 'HIGH', 'CRITICAL') NULL, `retentionDays` INTEGER NOT NULL, `description` VARCHAR(191) NULL, `legalBasis` VARCHAR(191) NULL, `isActive` BOOLEAN NOT NULL DEFAULT true, `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updatedAt` DATETIME(3) NOT NULL, UNIQUE INDEX `AuditRetentionPolicy_resourceType_sensitivity_key`(`resourceType`, `sensitivity`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- AddForeignKey ALTER TABLE `CustomerConsent` ADD CONSTRAINT `CustomerConsent_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `Customer`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;