-- CreateTable
CREATE TABLE `Asset` (
    `id` VARCHAR(30) NOT NULL,
    `code` VARCHAR(80) NOT NULL,
    `name` VARCHAR(191) NOT NULL,
    `level` ENUM('EQUIPMENT', 'SUB_ITEM') NOT NULL DEFAULT 'EQUIPMENT',
    `unitId` VARCHAR(30) NOT NULL,
    `parentId` VARCHAR(30) NULL,
    `manufacturer` VARCHAR(150) NULL,
    `serialNumber` VARCHAR(150) NULL,
    `photoUrl` VARCHAR(2048) NULL,
    `commissionedAt` DATE NULL,
    `archivedAt` DATETIME(3) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Asset_code_key`(`code`),
    INDEX `Asset_unitId_level_archivedAt_idx`(`unitId`, `level`, `archivedAt`),
    INDEX `Asset_parentId_idx`(`parentId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `AssetOperatingLog` (
    `id` VARCHAR(30) NOT NULL,
    `assetId` VARCHAR(30) NOT NULL,
    `periodStart` DATETIME(3) NOT NULL,
    `periodEnd` DATETIME(3) NOT NULL,
    `operatingMinutes` INTEGER UNSIGNED NOT NULL,

    UNIQUE INDEX `AssetOperatingLog_assetId_periodStart_key`(`assetId`, `periodStart`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `AssetPart` (
    `assetId` VARCHAR(30) NOT NULL,
    `partId` VARCHAR(30) NOT NULL,
    `requiredQuantity` INTEGER UNSIGNED NOT NULL DEFAULT 1,

    INDEX `AssetPart_partId_idx`(`partId`),
    PRIMARY KEY (`assetId`, `partId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `AuditLog` (
    `id` VARCHAR(30) NOT NULL,
    `actorId` VARCHAR(30) NULL,
    `action` VARCHAR(100) NOT NULL,
    `entityType` VARCHAR(100) NOT NULL,
    `entityId` VARCHAR(100) NOT NULL,
    `before` JSON NULL,
    `after` JSON NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `AuditLog_entityType_entityId_createdAt_idx`(`entityType`, `entityId`, `createdAt`),
    INDEX `AuditLog_actorId_createdAt_idx`(`actorId`, `createdAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `CalibrationRecord` (
    `id` VARCHAR(30) NOT NULL,
    `assetId` VARCHAR(30) NOT NULL,
    `workOrderId` VARCHAR(30) NULL,
    `performedById` VARCHAR(30) NOT NULL,
    `calibratedAt` DATETIME(3) NOT NULL,
    `nextDueAt` DATETIME(3) NOT NULL,
    `result` ENUM('PASS', 'FAIL', 'CONDITIONAL') NOT NULL,
    `certificateNumber` VARCHAR(150) NULL,
    `certificateUrl` VARCHAR(2048) NULL,
    `notes` TEXT NULL,

    UNIQUE INDEX `CalibrationRecord_workOrderId_key`(`workOrderId`),
    INDEX `CalibrationRecord_assetId_calibratedAt_idx`(`assetId`, `calibratedAt`),
    INDEX `CalibrationRecord_nextDueAt_idx`(`nextDueAt`),
    INDEX `CalibrationRecord_performedById_idx`(`performedById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `DamageReport` (
    `id` VARCHAR(30) NOT NULL,
    `assetId` VARCHAR(30) NOT NULL,
    `reporterId` VARCHAR(30) NOT NULL,
    `description` TEXT NOT NULL,
    `priority` ENUM('LOW', 'MEDIUM', 'HIGH', 'URGENT') NOT NULL DEFAULT 'MEDIUM',
    `status` ENUM('OPEN', 'IN_REPAIR', 'RESOLVED', 'DISMISSED') NOT NULL DEFAULT 'OPEN',
    `reportedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `resolvedAt` DATETIME(3) NULL,

    INDEX `DamageReport_assetId_status_reportedAt_idx`(`assetId`, `status`, `reportedAt`),
    INDEX `DamageReport_reporterId_idx`(`reporterId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `FailureEvent` (
    `id` VARCHAR(30) NOT NULL,
    `assetId` VARCHAR(30) NOT NULL,
    `workOrderId` VARCHAR(30) NOT NULL,
    `category` ENUM('MECHANICAL', 'ELECTRICAL', 'INSTRUMENT', 'OTHER') NOT NULL,
    `failedAt` DATETIME(3) NOT NULL,
    `restoredAt` DATETIME(3) NULL,
    `cause` TEXT NULL,

    UNIQUE INDEX `FailureEvent_workOrderId_key`(`workOrderId`),
    INDEX `FailureEvent_assetId_failedAt_idx`(`assetId`, `failedAt`),
    INDEX `FailureEvent_category_failedAt_idx`(`category`, `failedAt`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `MaintenancePlan` (
    `id` VARCHAR(30) NOT NULL,
    `code` VARCHAR(80) NOT NULL,
    `assetId` VARCHAR(30) NOT NULL,
    `title` VARCHAR(191) NOT NULL,
    `description` TEXT NOT NULL,
    `type` ENUM('PREVENTIVE', 'CORRECTIVE', 'CALIBRATION') NOT NULL DEFAULT 'PREVENTIVE',
    `priority` ENUM('LOW', 'MEDIUM', 'HIGH', 'URGENT') NOT NULL DEFAULT 'MEDIUM',
    `cycle` ENUM('ONCE', 'DAILY', 'WEEKLY', 'MONTHLY', 'YEARLY') NOT NULL DEFAULT 'ONCE',
    `startDate` DATE NOT NULL,
    `endDate` DATE NULL,
    `nextDueAt` DATETIME(3) NULL,
    `releaseLeadDays` INTEGER UNSIGNED NOT NULL DEFAULT 0,
    `technicianId` VARCHAR(30) NULL,
    `createdById` VARCHAR(30) NOT NULL,
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `MaintenancePlan_code_key`(`code`),
    INDEX `MaintenancePlan_isActive_nextDueAt_idx`(`isActive`, `nextDueAt`),
    INDEX `MaintenancePlan_assetId_idx`(`assetId`),
    INDEX `MaintenancePlan_technicianId_idx`(`technicianId`),
    INDEX `MaintenancePlan_createdById_idx`(`createdById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Notification` (
    `id` VARCHAR(30) NOT NULL,
    `kind` ENUM('OVERDUE', 'URGENT_WORK_ORDER', 'LOW_STOCK', 'PM_DUE', 'CALIBRATION_DUE', 'APPROVAL', 'SYSTEM') NOT NULL,
    `message` VARCHAR(500) NOT NULL,
    `details` TEXT NULL,
    `workOrderId` VARCHAR(30) NULL,
    `assetId` VARCHAR(30) NULL,
    `partId` VARCHAR(30) NULL,
    `movementId` VARCHAR(30) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `Notification_kind_createdAt_idx`(`kind`, `createdAt`),
    INDEX `Notification_workOrderId_idx`(`workOrderId`),
    INDEX `Notification_assetId_idx`(`assetId`),
    INDEX `Notification_partId_idx`(`partId`),
    INDEX `Notification_movementId_idx`(`movementId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `NotificationPreference` (
    `userId` VARCHAR(30) NOT NULL,
    `lowStockEmail` BOOLEAN NOT NULL DEFAULT true,
    `urgentWorkOrderInApp` BOOLEAN NOT NULL DEFAULT true,
    `calibrationDueEmail` BOOLEAN NOT NULL DEFAULT true,
    `updatedAt` DATETIME(3) NOT NULL,

    PRIMARY KEY (`userId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `NotificationRecipient` (
    `notificationId` VARCHAR(30) NOT NULL,
    `userId` VARCHAR(30) NOT NULL,
    `readAt` DATETIME(3) NULL,
    `deletedAt` DATETIME(3) NULL,

    INDEX `NotificationRecipient_userId_deletedAt_readAt_idx`(`userId`, `deletedAt`, `readAt`),
    PRIMARY KEY (`notificationId`, `userId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `Part` (
    `id` VARCHAR(30) NOT NULL,
    `productId` VARCHAR(80) NOT NULL,
    `partNumber` VARCHAR(150) NULL,
    `name` VARCHAR(191) NOT NULL,
    `groupId` VARCHAR(30) NOT NULL,
    `kindId` VARCHAR(30) NOT NULL,
    `manufacturer` VARCHAR(150) NOT NULL,
    `unit` VARCHAR(30) NOT NULL DEFAULT 'Pcs',
    `minimumStock` INTEGER UNSIGNED NOT NULL DEFAULT 0,
    `estimatedUnitCost` DECIMAL(18, 2) NOT NULL DEFAULT 0,
    `qrToken` VARCHAR(36) NOT NULL,
    `archivedAt` DATETIME(3) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `Part_productId_key`(`productId`),
    UNIQUE INDEX `Part_qrToken_key`(`qrToken`),
    INDEX `Part_groupId_kindId_idx`(`groupId`, `kindId`),
    INDEX `Part_kindId_idx`(`kindId`),
    INDEX `Part_partNumber_idx`(`partNumber`),
    INDEX `Part_name_idx`(`name`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `PartGroup` (
    `id` VARCHAR(30) NOT NULL,
    `name` VARCHAR(100) NOT NULL,

    UNIQUE INDEX `PartGroup_name_key`(`name`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `PartKind` (
    `id` VARCHAR(30) NOT NULL,
    `name` VARCHAR(100) NOT NULL,

    UNIQUE INDEX `PartKind_name_key`(`name`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `PlantUnit` (
    `id` VARCHAR(30) NOT NULL,
    `code` VARCHAR(50) NOT NULL,
    `name` VARCHAR(150) NOT NULL,
    `archivedAt` DATETIME(3) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `PlantUnit_code_key`(`code`),
    UNIQUE INDEX `PlantUnit_name_key`(`name`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `QuarantineCase` (
    `id` VARCHAR(30) NOT NULL,
    `balanceId` VARCHAR(30) NOT NULL,
    `reporterId` VARCHAR(30) NOT NULL,
    `quantity` INTEGER UNSIGNED NOT NULL,
    `reason` TEXT NOT NULL,
    `status` ENUM('HELD', 'IN_REPAIR', 'RELEASED', 'SCRAPPED') NOT NULL DEFAULT 'HELD',
    `reportedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `closedAt` DATETIME(3) NULL,

    INDEX `QuarantineCase_balanceId_status_idx`(`balanceId`, `status`),
    INDEX `QuarantineCase_reporterId_idx`(`reporterId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `StockBalance` (
    `id` VARCHAR(30) NOT NULL,
    `partId` VARCHAR(30) NOT NULL,
    `locationId` VARCHAR(30) NOT NULL,
    `physical` INTEGER UNSIGNED NOT NULL DEFAULT 0,
    `quarantined` INTEGER UNSIGNED NOT NULL DEFAULT 0,
    `version` INTEGER UNSIGNED NOT NULL DEFAULT 0,
    `updatedAt` DATETIME(3) NOT NULL,

    INDEX `StockBalance_locationId_idx`(`locationId`),
    UNIQUE INDEX `StockBalance_partId_locationId_key`(`partId`, `locationId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `StockLocation` (
    `id` VARCHAR(30) NOT NULL,
    `code` VARCHAR(50) NOT NULL,
    `name` VARCHAR(150) NOT NULL,
    `archivedAt` DATETIME(3) NULL,

    UNIQUE INDEX `StockLocation_code_key`(`code`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `StockMovement` (
    `id` VARCHAR(30) NOT NULL,
    `number` VARCHAR(80) NOT NULL,
    `idempotencyKey` VARCHAR(100) NOT NULL,
    `balanceId` VARCHAR(30) NOT NULL,
    `type` ENUM('RECEIPT', 'ISSUE', 'RETURN', 'QUARANTINE', 'RELEASE', 'SCRAP', 'ADJUSTMENT') NOT NULL,
    `source` ENUM('MANUAL', 'QR_CHECKOUT', 'WORK_ORDER', 'SYSTEM') NOT NULL DEFAULT 'MANUAL',
    `quantity` INTEGER UNSIGNED NOT NULL,
    `physicalDelta` INTEGER NOT NULL,
    `quarantineDelta` INTEGER NOT NULL DEFAULT 0,
    `unitCost` DECIMAL(18, 2) NOT NULL DEFAULT 0,
    `approval` ENUM('PENDING', 'APPROVED', 'AUTO_APPROVED', 'SYSTEM', 'REJECTED') NOT NULL DEFAULT 'PENDING',
    `actorId` VARCHAR(30) NULL,
    `approvedById` VARCHAR(30) NULL,
    `approvedAt` DATETIME(3) NULL,
    `postedAt` DATETIME(3) NULL,
    `occurredAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `workOrderId` VARCHAR(30) NULL,
    `quarantineId` VARCHAR(30) NULL,
    `externalReference` VARCHAR(191) NULL,
    `urgent` BOOLEAN NOT NULL DEFAULT false,
    `notes` TEXT NULL,
    `reversalOfId` VARCHAR(30) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    UNIQUE INDEX `StockMovement_number_key`(`number`),
    UNIQUE INDEX `StockMovement_idempotencyKey_key`(`idempotencyKey`),
    UNIQUE INDEX `StockMovement_reversalOfId_key`(`reversalOfId`),
    INDEX `StockMovement_balanceId_occurredAt_idx`(`balanceId`, `occurredAt`),
    INDEX `StockMovement_workOrderId_type_idx`(`workOrderId`, `type`),
    INDEX `StockMovement_approval_occurredAt_idx`(`approval`, `occurredAt`),
    INDEX `StockMovement_type_postedAt_idx`(`type`, `postedAt`),
    INDEX `StockMovement_actorId_idx`(`actorId`),
    INDEX `StockMovement_approvedById_idx`(`approvedById`),
    INDEX `StockMovement_quarantineId_idx`(`quarantineId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `StockoutEvent` (
    `id` VARCHAR(30) NOT NULL,
    `partId` VARCHAR(30) NOT NULL,
    `requestedById` VARCHAR(30) NOT NULL,
    `workOrderId` VARCHAR(30) NULL,
    `requestedQuantity` INTEGER UNSIGNED NOT NULL,
    `availableQuantity` INTEGER UNSIGNED NOT NULL,
    `occurredAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `StockoutEvent_partId_occurredAt_idx`(`partId`, `occurredAt`),
    INDEX `StockoutEvent_occurredAt_idx`(`occurredAt`),
    INDEX `StockoutEvent_requestedById_idx`(`requestedById`),
    INDEX `StockoutEvent_workOrderId_idx`(`workOrderId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `SystemSetting` (
    `id` INTEGER NOT NULL DEFAULT 1,
    `plantName` VARCHAR(150) NOT NULL,
    `timezone` VARCHAR(64) NOT NULL DEFAULT 'Asia/Jakarta',
    `currency` CHAR(3) NOT NULL DEFAULT 'IDR',
    `autoApprovalRule` ENUM('MANUAL', 'URGENT_AND_HIGH') NOT NULL DEFAULT 'MANUAL',
    `calibrationReminderDays` INTEGER UNSIGNED NOT NULL DEFAULT 30,
    `updatedAt` DATETIME(3) NOT NULL,

    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `User` (
    `id` VARCHAR(30) NOT NULL,
    `email` VARCHAR(191) NOT NULL,
    `name` VARCHAR(150) NOT NULL,
    `passwordHash` VARCHAR(255) NOT NULL,
    `position` VARCHAR(150) NULL,
    `role` ENUM('ADMIN', 'SUPERVISOR', 'TECHNICIAN', 'VIEWER') NOT NULL DEFAULT 'TECHNICIAN',
    `isActive` BOOLEAN NOT NULL DEFAULT true,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `User_email_key`(`email`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `WorkOrder` (
    `id` VARCHAR(30) NOT NULL,
    `number` VARCHAR(80) NOT NULL,
    `type` ENUM('PREVENTIVE', 'CORRECTIVE', 'CALIBRATION') NOT NULL,
    `source` ENUM('PILOT_PLANT', 'WAREHOUSE_QUARANTINE') NOT NULL,
    `status` ENUM('OPEN', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED') NOT NULL DEFAULT 'OPEN',
    `priority` ENUM('LOW', 'MEDIUM', 'HIGH', 'URGENT') NOT NULL DEFAULT 'MEDIUM',
    `description` TEXT NOT NULL,
    `resolution` TEXT NULL,
    `assetId` VARCHAR(30) NULL,
    `quarantineId` VARCHAR(30) NULL,
    `damageReportId` VARCHAR(30) NULL,
    `reporterId` VARCHAR(30) NOT NULL,
    `technicianId` VARCHAR(30) NULL,
    `planId` VARCHAR(30) NULL,
    `scheduledFor` DATETIME(3) NULL,
    `releaseAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `dueAt` DATETIME(3) NULL,
    `startedAt` DATETIME(3) NULL,
    `completedAt` DATETIME(3) NULL,
    `cancelledAt` DATETIME(3) NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
    `updatedAt` DATETIME(3) NOT NULL,

    UNIQUE INDEX `WorkOrder_number_key`(`number`),
    INDEX `WorkOrder_status_releaseAt_dueAt_idx`(`status`, `releaseAt`, `dueAt`),
    INDEX `WorkOrder_type_completedAt_idx`(`type`, `completedAt`),
    INDEX `WorkOrder_technicianId_status_idx`(`technicianId`, `status`),
    INDEX `WorkOrder_assetId_createdAt_idx`(`assetId`, `createdAt`),
    INDEX `WorkOrder_quarantineId_idx`(`quarantineId`),
    INDEX `WorkOrder_damageReportId_idx`(`damageReportId`),
    INDEX `WorkOrder_reporterId_idx`(`reporterId`),
    UNIQUE INDEX `WorkOrder_planId_scheduledFor_key`(`planId`, `scheduledFor`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `WorkOrderComment` (
    `id` VARCHAR(30) NOT NULL,
    `workOrderId` VARCHAR(30) NOT NULL,
    `authorId` VARCHAR(30) NOT NULL,
    `body` TEXT NOT NULL,
    `createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `WorkOrderComment_workOrderId_createdAt_idx`(`workOrderId`, `createdAt`),
    INDEX `WorkOrderComment_authorId_idx`(`authorId`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- CreateTable
CREATE TABLE `WorkOrderStatusHistory` (
    `id` VARCHAR(30) NOT NULL,
    `workOrderId` VARCHAR(30) NOT NULL,
    `changedById` VARCHAR(30) NOT NULL,
    `fromStatus` ENUM('OPEN', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED') NULL,
    `toStatus` ENUM('OPEN', 'IN_PROGRESS', 'COMPLETED', 'CANCELLED') NOT NULL,
    `note` TEXT NULL,
    `changedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),

    INDEX `WorkOrderStatusHistory_workOrderId_changedAt_idx`(`workOrderId`, `changedAt`),
    INDEX `WorkOrderStatusHistory_changedById_idx`(`changedById`),
    PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- AddForeignKey
ALTER TABLE `Asset` ADD CONSTRAINT `Asset_unitId_fkey` FOREIGN KEY (`unitId`) REFERENCES `PlantUnit`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Asset` ADD CONSTRAINT `Asset_parentId_fkey` FOREIGN KEY (`parentId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE NO ACTION;

-- AddForeignKey
ALTER TABLE `AssetOperatingLog` ADD CONSTRAINT `AssetOperatingLog_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `AssetPart` ADD CONSTRAINT `AssetPart_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `AssetPart` ADD CONSTRAINT `AssetPart_partId_fkey` FOREIGN KEY (`partId`) REFERENCES `Part`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `AuditLog` ADD CONSTRAINT `AuditLog_actorId_fkey` FOREIGN KEY (`actorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `CalibrationRecord` ADD CONSTRAINT `CalibrationRecord_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `CalibrationRecord` ADD CONSTRAINT `CalibrationRecord_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `CalibrationRecord` ADD CONSTRAINT `CalibrationRecord_performedById_fkey` FOREIGN KEY (`performedById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `DamageReport` ADD CONSTRAINT `DamageReport_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `DamageReport` ADD CONSTRAINT `DamageReport_reporterId_fkey` FOREIGN KEY (`reporterId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `FailureEvent` ADD CONSTRAINT `FailureEvent_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `FailureEvent` ADD CONSTRAINT `FailureEvent_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `MaintenancePlan` ADD CONSTRAINT `MaintenancePlan_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `MaintenancePlan` ADD CONSTRAINT `MaintenancePlan_technicianId_fkey` FOREIGN KEY (`technicianId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `MaintenancePlan` ADD CONSTRAINT `MaintenancePlan_createdById_fkey` FOREIGN KEY (`createdById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_partId_fkey` FOREIGN KEY (`partId`) REFERENCES `Part`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Notification` ADD CONSTRAINT `Notification_movementId_fkey` FOREIGN KEY (`movementId`) REFERENCES `StockMovement`(`id`) ON DELETE RESTRICT 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 `NotificationRecipient` ADD CONSTRAINT `NotificationRecipient_notificationId_fkey` FOREIGN KEY (`notificationId`) REFERENCES `Notification`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `NotificationRecipient` ADD CONSTRAINT `NotificationRecipient_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `User`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Part` ADD CONSTRAINT `Part_groupId_fkey` FOREIGN KEY (`groupId`) REFERENCES `PartGroup`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `Part` ADD CONSTRAINT `Part_kindId_fkey` FOREIGN KEY (`kindId`) REFERENCES `PartKind`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `QuarantineCase` ADD CONSTRAINT `QuarantineCase_balanceId_fkey` FOREIGN KEY (`balanceId`) REFERENCES `StockBalance`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `QuarantineCase` ADD CONSTRAINT `QuarantineCase_reporterId_fkey` FOREIGN KEY (`reporterId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockBalance` ADD CONSTRAINT `StockBalance_partId_fkey` FOREIGN KEY (`partId`) REFERENCES `Part`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockBalance` ADD CONSTRAINT `StockBalance_locationId_fkey` FOREIGN KEY (`locationId`) REFERENCES `StockLocation`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockMovement` ADD CONSTRAINT `StockMovement_balanceId_fkey` FOREIGN KEY (`balanceId`) REFERENCES `StockBalance`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockMovement` ADD CONSTRAINT `StockMovement_actorId_fkey` FOREIGN KEY (`actorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockMovement` ADD CONSTRAINT `StockMovement_approvedById_fkey` FOREIGN KEY (`approvedById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockMovement` ADD CONSTRAINT `StockMovement_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockMovement` ADD CONSTRAINT `StockMovement_quarantineId_fkey` FOREIGN KEY (`quarantineId`) REFERENCES `QuarantineCase`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockMovement` ADD CONSTRAINT `StockMovement_reversalOfId_fkey` FOREIGN KEY (`reversalOfId`) REFERENCES `StockMovement`(`id`) ON DELETE RESTRICT ON UPDATE NO ACTION;

-- AddForeignKey
ALTER TABLE `StockoutEvent` ADD CONSTRAINT `StockoutEvent_partId_fkey` FOREIGN KEY (`partId`) REFERENCES `Part`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockoutEvent` ADD CONSTRAINT `StockoutEvent_requestedById_fkey` FOREIGN KEY (`requestedById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `StockoutEvent` ADD CONSTRAINT `StockoutEvent_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrder` ADD CONSTRAINT `WorkOrder_assetId_fkey` FOREIGN KEY (`assetId`) REFERENCES `Asset`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrder` ADD CONSTRAINT `WorkOrder_quarantineId_fkey` FOREIGN KEY (`quarantineId`) REFERENCES `QuarantineCase`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrder` ADD CONSTRAINT `WorkOrder_damageReportId_fkey` FOREIGN KEY (`damageReportId`) REFERENCES `DamageReport`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrder` ADD CONSTRAINT `WorkOrder_reporterId_fkey` FOREIGN KEY (`reporterId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrder` ADD CONSTRAINT `WorkOrder_technicianId_fkey` FOREIGN KEY (`technicianId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrder` ADD CONSTRAINT `WorkOrder_planId_fkey` FOREIGN KEY (`planId`) REFERENCES `MaintenancePlan`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrderComment` ADD CONSTRAINT `WorkOrderComment_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrderComment` ADD CONSTRAINT `WorkOrderComment_authorId_fkey` FOREIGN KEY (`authorId`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrderStatusHistory` ADD CONSTRAINT `WorkOrderStatusHistory_workOrderId_fkey` FOREIGN KEY (`workOrderId`) REFERENCES `WorkOrder`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;

-- AddForeignKey
ALTER TABLE `WorkOrderStatusHistory` ADD CONSTRAINT `WorkOrderStatusHistory_changedById_fkey` FOREIGN KEY (`changedById`) REFERENCES `User`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
