-- AlterTable ALTER TABLE `orders` ADD COLUMN `contract_accepted_at` DATETIME(3) NULL; -- CreateTable CREATE TABLE `contract_parties` ( `id` VARCHAR(191) NOT NULL, `business_name` VARCHAR(100) NOT NULL DEFAULT '', `brand_name` VARCHAR(60) NOT NULL DEFAULT '', `credit_code` VARCHAR(18) NOT NULL DEFAULT '', `operator_name` VARCHAR(30) NOT NULL DEFAULT '', `phone` VARCHAR(20) NOT NULL DEFAULT '', `address` VARCHAR(200) NOT NULL DEFAULT '', `premises_type` VARCHAR(10) NOT NULL DEFAULT 'LEASED', `lease_end_date` DATE NULL, `standard_lesson_price` INTEGER NOT NULL DEFAULT 0, `signature_image` MEDIUMBLOB NULL, `signature_sha256` VARCHAR(64) NULL, `signature_updated_at` DATETIME(3) NULL, `updated_at` DATETIME(3) NOT NULL, PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `membership_contracts` ( `id` VARCHAR(191) NOT NULL, `contract_no` VARCHAR(32) NOT NULL, `user_id` VARCHAR(191) NOT NULL, `membership_id` VARCHAR(191) NOT NULL, `order_id` VARCHAR(191) NULL, `source` ENUM('PURCHASE', 'LEGACY') NOT NULL, `status` ENUM('PENDING_SIGN', 'SIGNED', 'VOIDED') NOT NULL DEFAULT 'PENDING_SIGN', `require_before_booking` BOOLEAN NOT NULL DEFAULT false, `template_version` VARCHAR(32) NOT NULL, `terms` JSON NOT NULL, `party_name` VARCHAR(30) NULL, `party_phone` VARCHAR(20) NULL, `document` JSON NULL, `content_sha256` VARCHAR(64) NULL, `signature_image` MEDIUMBLOB NULL, `signature_sha256` VARCHAR(64) NULL, `party_b_signature_image` MEDIUMBLOB NULL, `party_b_name` VARCHAR(100) NULL, `signed_at` DATETIME(3) NULL, `signer_ip` VARCHAR(64) NULL, `signer_user_agent` VARCHAR(300) NULL, `signer_device` VARCHAR(200) NULL, `voided_at` DATETIME(3) NULL, `voided_by` VARCHAR(191) NULL, `void_reason` VARCHAR(200) NULL, `created_by` VARCHAR(191) NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), `updated_at` DATETIME(3) NOT NULL, UNIQUE INDEX `membership_contracts_contract_no_key`(`contract_no`), UNIQUE INDEX `membership_contracts_order_id_key`(`order_id`), INDEX `membership_contracts_user_id_status_idx`(`user_id`, `status`), INDEX `membership_contracts_membership_id_status_idx`(`membership_id`, `status`), INDEX `membership_contracts_status_created_at_idx`(`status`, `created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- CreateTable CREATE TABLE `contract_events` ( `id` VARCHAR(191) NOT NULL, `contract_id` VARCHAR(191) NOT NULL, `action` VARCHAR(20) NOT NULL, `actor_id` VARCHAR(191) NULL, `ip` VARCHAR(64) NULL, `user_agent` VARCHAR(300) NULL, `detail` JSON NULL, `created_at` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3), INDEX `contract_events_contract_id_created_at_idx`(`contract_id`, `created_at`), PRIMARY KEY (`id`) ) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- AddForeignKey ALTER TABLE `membership_contracts` ADD CONSTRAINT `membership_contracts_user_id_fkey` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `membership_contracts` ADD CONSTRAINT `membership_contracts_membership_id_fkey` FOREIGN KEY (`membership_id`) REFERENCES `memberships`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `membership_contracts` ADD CONSTRAINT `membership_contracts_order_id_fkey` FOREIGN KEY (`order_id`) REFERENCES `orders`(`id`) ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE `contract_events` ADD CONSTRAINT `contract_events_contract_id_fkey` FOREIGN KEY (`contract_id`) REFERENCES `membership_contracts`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;