feat(deploy): prisma migration history, /version, galactus standalone deploy
Build and Push Images / Build jorgecuadros-web (push) Successful in 1m49s
Build and Push Images / Build jorgecuadros-api (push) Successful in 2m2s

Closes the gap between "what tag did I deploy" and "what is actually running",
and gives the schema a history that can be reasoned about across releases.

Migrations
- Baseline the existing schema as 0000_init (migrate diff --from-empty). The
  schema had only ever been applied with `prisma db push`, so no history
  existed and schema state was disconnected from app version. Existing
  databases must be baselined once with `migrate resolve --applied 0000_init`;
  the workflows print this remedy on P3005.
- Run `prisma migrate deploy` as a deploy STEP, not the container CMD — as a
  CMD, N replicas would race each other applying the same migration.

Version reporting
- GET /version on the API reports the APP_VERSION / GIT_SHA / BUILD_DATE that
  build.yml already baked into both images but nothing ever read.
- The web footer shows the web build and flags an api/web mismatch. The two
  cannot drift at build time (one matrix run) but can at deploy time.
- Both deploy workflows now fail if the running API does not report the tag
  that was dispatched — a stack naming a tag is not proof of what is running.
- scripts/set-version.mjs stamps every package.json, which had all sat at
  0.1.0 while real releases shipped as v1.x.

Pre-migrate backup
- deploy/scripts/pre-migrate-backup.mjs dumps the database from INSIDE the
  still-running old API container over Portainer's Docker API, so the file
  lands in the volume the Operaciones restore screen reads. A dump taken on
  the CI runner would be unreachable by the only restore path we have.
  Verifies the artefact with `gzip -t` before letting the migration proceed.

galactus
- deploy/galactus/*.compose.yml: standalone-Docker ports of the Swarm stacks.
  Plain compose silently ignores `deploy:`, so restart_policy becomes
  `restart: unless-stopped` — without it nothing returns after a host reboot.
- .gitea/workflows/deploy-galactus.yml drives endpoint 3 with its own secrets.

Fixes
- deploy.yml passed `endpoint_id` and `pull_image` to
  cssnr/portainer-stack-deploy-action, which has no such inputs (they are
  `endpoint` and `pull`). The endpoint was silently never set.

docs/DEPLOY_AND_MIGRATIONS.md documents expand/contract as the rule for schema
changes: Prisma has no down-migrations, so a code rollback never rolls the
schema back, and restoring the replication master from a dump diverges every
replica.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-30 11:41:12 -07:00
co-authored by Claude Opus 5
parent 9ba5d2d09a
commit 4ee7ec71f0
18 changed files with 1677 additions and 8 deletions
@@ -0,0 +1,538 @@
-- CreateTable
CREATE TABLE `customers` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`nameSource` VARCHAR(191) NULL,
`nameMissing` BOOLEAN NOT NULL DEFAULT false,
`addressLine1` VARCHAR(191) NULL,
`addressLine2` VARCHAR(191) NULL,
`city` VARCHAR(191) NULL,
`state` VARCHAR(191) NULL,
`zipCode` VARCHAR(191) NULL,
`country` VARCHAR(191) NULL,
`phone` VARCHAR(191) NULL,
`mobile` VARCHAR(191) NULL,
`fax` VARCHAR(191) NULL,
`email` VARCHAR(191) NULL,
`notes` TEXT NULL,
`identificationType` VARCHAR(191) NULL,
`identificationNumber` VARCHAR(191) NULL,
`identificationExpiration` DATETIME(3) NULL,
`customerSince` DATETIME(3) NULL,
`status` BOOLEAN NOT NULL DEFAULT true,
`minimumBalance` DECIMAL(12, 2) NULL,
`feeAmount` DECIMAL(12, 2) NULL,
`preferredCurrency` ENUM('USD', 'MXN') NOT NULL DEFAULT 'USD',
`archivedAt` DATETIME(3) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `customer_legacy_refs` (
`id` VARCHAR(191) NOT NULL,
`customerId` VARCHAR(191) NOT NULL,
`sourceSystem` VARCHAR(191) NOT NULL,
`sourceTable` VARCHAR(191) NOT NULL,
`legacyId` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `customer_legacy_refs_sourceSystem_sourceTable_legacyId_key`(`sourceSystem`, `sourceTable`, `legacyId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `insurance_providers` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
UNIQUE INDEX `insurance_providers_name_key`(`name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `policy_types` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`shortDescription` VARCHAR(191) NULL,
UNIQUE INDEX `policy_types_name_key`(`name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `policies` (
`id` VARCHAR(191) NOT NULL,
`policyNumber` VARCHAR(191) NOT NULL,
`customerId` VARCHAR(191) NOT NULL,
`policyTypeId` VARCHAR(191) NULL,
`insuranceProviderId` VARCHAR(191) NULL,
`agentName` VARCHAR(191) NULL,
`policyDate` DATETIME(3) NULL,
`policyFrom` DATETIME(3) NULL,
`policyTo` DATETIME(3) NULL,
`coveragePeriodDays` INTEGER NULL DEFAULT 365,
`netPremium` DECIMAL(12, 2) NULL,
`policyFee` DECIMAL(12, 2) NULL,
`brokerFee` DECIMAL(12, 2) NULL,
`commission` DECIMAL(12, 2) NULL,
`total` DECIMAL(12, 2) NULL,
`currency` ENUM('USD', 'MXN') NOT NULL DEFAULT 'MXN',
`observations` TEXT NULL,
`notes` TEXT NULL,
`coveragesJson` JSON NULL,
`endorsement` BOOLEAN NOT NULL DEFAULT false,
`liquidated` BOOLEAN NOT NULL DEFAULT false,
`liquidationNumber` VARCHAR(191) NULL,
`liquidationDate` DATETIME(3) NULL,
`archivedAt` DATETIME(3) NULL,
`legacySourceDb` VARCHAR(191) NULL,
`legacySourceTable` VARCHAR(191) NULL,
`legacyId` VARCHAR(191) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
INDEX `policies_policyNumber_idx`(`policyNumber`),
UNIQUE INDEX `policies_legacySourceDb_legacySourceTable_legacyId_key`(`legacySourceDb`, `legacySourceTable`, `legacyId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `renewal_notices` (
`id` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NOT NULL,
`generation` INTEGER NOT NULL,
`channel` ENUM('MAIL', 'EMAIL') NOT NULL DEFAULT 'MAIL',
`sentAt` DATETIME(3) NULL,
`sentById` VARCHAR(191) NULL,
`notes` TEXT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `renewal_notices_policyId_generation_key`(`policyId`, `generation`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `policy_payment_installments` (
`id` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NOT NULL,
`sequence` INTEGER NOT NULL,
`amount` DECIMAL(12, 2) NULL,
`currency` ENUM('USD', 'MXN') NOT NULL DEFAULT 'MXN',
`dueDate` DATETIME(3) NULL,
`paidDate` DATETIME(3) NULL,
`checkNumber` VARCHAR(191) NULL,
`isCash` BOOLEAN NOT NULL DEFAULT false,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `vehicles` (
`id` VARCHAR(191) NOT NULL,
`customerId` VARCHAR(191) NULL,
`policyId` VARCHAR(191) NULL,
`make` VARCHAR(191) NULL,
`model` VARCHAR(191) NULL,
`modelYear` VARCHAR(191) NULL,
`bodyType` VARCHAR(191) NULL,
`engineNumber` VARCHAR(191) NULL,
`licensePlate` VARCHAR(191) NULL,
`vinNumber` VARCHAR(191) NULL,
`stateCode` VARCHAR(191) NULL,
`notes` TEXT NULL,
`legacySourceTable` VARCHAR(191) NULL,
`legacyId` VARCHAR(191) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `insured_drivers` (
`id` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NOT NULL,
`fullName` VARCHAR(191) NULL,
`birthDate` DATETIME(3) NULL,
`sex` VARCHAR(191) NULL,
`occupation` VARCHAR(191) NULL,
`licenseNumber` VARCHAR(191) NULL,
`licenseState` VARCHAR(191) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `policy_beneficiaries` (
`id` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NULL,
`address` VARCHAR(191) NULL,
`phone` VARCHAR(191) NULL,
`email` VARCHAR(191) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `claims` (
`id` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NOT NULL,
`claimType` VARCHAR(191) NULL,
`incidentDate` DATETIME(3) NULL,
`reportedDate` DATETIME(3) NULL,
`description` TEXT NULL,
`adjusterId` VARCHAR(191) NULL,
`claimedAmount` DECIMAL(12, 2) NULL,
`settledAmount` DECIMAL(12, 2) NULL,
`settlementDate` DATETIME(3) NULL,
`checkNumber` VARCHAR(191) NULL,
`resolved` BOOLEAN NOT NULL DEFAULT false,
`resolutionNotes` TEXT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `adjusters` (
`id` VARCHAR(191) NOT NULL,
`company` VARCHAR(191) NULL,
`city` VARCHAR(191) NULL,
`name` VARCHAR(191) NULL,
`phone` VARCHAR(191) NULL,
`beeper` VARCHAR(191) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `policy_documents` (
`id` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NOT NULL,
`documentType` VARCHAR(191) NOT NULL,
`storageKey` VARCHAR(191) NOT NULL,
`originalColumn` VARCHAR(191) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `properties` (
`id` VARCHAR(191) NOT NULL,
`customerId` VARCHAR(191) NOT NULL,
`policyId` VARCHAR(191) NULL,
`addressLine1` VARCHAR(191) NULL,
`addressLine2` VARCHAR(191) NULL,
`phone1` VARCHAR(191) NULL,
`phone2` VARCHAR(191) NULL,
`phone3` VARCHAR(191) NULL,
`zone` VARCHAR(191) NULL,
`archivedAt` DATETIME(3) NULL,
`legacySourceTable` VARCHAR(191) NULL,
`legacyId` VARCHAR(191) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `properties_legacySourceTable_legacyId_key`(`legacySourceTable`, `legacyId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `property_services` (
`id` VARCHAR(191) NOT NULL,
`propertyId` VARCHAR(191) NOT NULL,
`kind` ENUM('WATER', 'ELECTRIC', 'GAS', 'CABLE', 'PROPERTY_TAX', 'FEDERAL_ZONE', 'ALARM', 'OTHER') NOT NULL,
`accountNumber` VARCHAR(191) NULL,
`meterNumber` VARCHAR(191) NULL,
`route` VARCHAR(191) NULL,
`dueDay` VARCHAR(191) NULL,
`active` BOOLEAN NOT NULL DEFAULT true,
`notes` TEXT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `service_documents` (
`id` VARCHAR(191) NOT NULL,
`propertyId` VARCHAR(191) NOT NULL,
`documentType` VARCHAR(191) NOT NULL,
`storageKey` VARCHAR(191) NOT NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `trust_accounts` (
`id` VARCHAR(191) NOT NULL,
`propertyId` VARCHAR(191) NOT NULL,
`bankName` VARCHAR(191) NULL,
`trustNumber` VARCHAR(191) NULL,
`bankFee` DECIMAL(12, 2) NULL,
`dueDate1` DATETIME(3) NULL,
`dueDate2` DATETIME(3) NULL,
UNIQUE INDEX `trust_accounts_propertyId_key`(`propertyId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `type_transactions` (
`id` VARCHAR(191) NOT NULL,
`nameEn` VARCHAR(191) NOT NULL,
`nameEs` VARCHAR(191) NULL,
`isService` BOOLEAN NOT NULL DEFAULT false,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `transactions` (
`id` VARCHAR(191) NOT NULL,
`customerId` VARCHAR(191) NOT NULL,
`domain` ENUM('UTILITY', 'INSURANCE', 'TRUST') NOT NULL,
`typeId` VARCHAR(191) NULL,
`transactionDate` DATETIME(3) NOT NULL,
`period` VARCHAR(191) NULL,
`reference` VARCHAR(191) NULL,
`amount` DECIMAL(12, 2) NOT NULL,
`currency` ENUM('USD', 'MXN') NOT NULL DEFAULT 'MXN',
`exchangeRate` DECIMAL(10, 4) NULL,
`checkNumber` VARCHAR(191) NULL,
`message` TEXT NULL,
`outstanding` BOOLEAN NOT NULL DEFAULT false,
`captureSource` ENUM('MANUAL', 'BATCH', 'OCR') NULL,
`captureRef` VARCHAR(191) NULL,
`voidedAt` DATETIME(3) NULL,
`voidedById` VARCHAR(191) NULL,
`legacySourceDb` VARCHAR(191) NULL,
`legacySourceTable` VARCHAR(191) NULL,
`legacyId` VARCHAR(191) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `transactions_customerId_transactionDate_idx`(`customerId`, `transactionDate`),
INDEX `transactions_checkNumber_idx`(`checkNumber`),
INDEX `transactions_captureRef_idx`(`captureRef`),
UNIQUE INDEX `transactions_legacySourceDb_legacySourceTable_legacyId_key`(`legacySourceDb`, `legacySourceTable`, `legacyId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `exchange_rates` (
`id` VARCHAR(191) NOT NULL,
`rate` DECIMAL(10, 4) NOT NULL,
`effectiveDate` DATETIME(3) NOT NULL,
`effectiveHour` DATETIME(3) NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `business_line_categories` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
UNIQUE INDEX `business_line_categories_name_key`(`name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `banks` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`country` VARCHAR(191) NULL,
UNIQUE INDEX `banks_name_key`(`name`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `bank_accounts` (
`id` VARCHAR(191) NOT NULL,
`bankId` VARCHAR(191) NOT NULL,
`label` VARCHAR(191) NOT NULL,
`currency` ENUM('USD', 'MXN') NOT NULL,
`businessLine` ENUM('UTILITY', 'INSURANCE', 'TRUST') NULL,
`active` BOOLEAN NOT NULL DEFAULT true,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `bank_transactions` (
`id` VARCHAR(191) NOT NULL,
`bankAccountId` VARCHAR(191) NOT NULL,
`transactionDate` DATETIME(3) NOT NULL,
`transactionType` VARCHAR(191) NULL,
`reference` VARCHAR(191) NULL,
`concept` VARCHAR(191) NULL,
`amount` DECIMAL(12, 2) NOT NULL,
`categoryId` VARCHAR(191) NULL,
`cleared` BOOLEAN NOT NULL DEFAULT false,
`transferred` BOOLEAN NOT NULL DEFAULT false,
`notes` TEXT NULL,
`amountInWords` VARCHAR(191) NULL,
`voidedAt` DATETIME(3) NULL,
`voidedById` VARCHAR(191) NULL,
`legacySourceTable` VARCHAR(191) NULL,
`legacyId` VARCHAR(191) NULL,
INDEX `bank_transactions_bankAccountId_transactionDate_idx`(`bankAccountId`, `transactionDate`),
UNIQUE INDEX `bank_transactions_legacySourceTable_legacyId_key`(`legacySourceTable`, `legacyId`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `users` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`email` VARCHAR(191) NOT NULL,
`passwordHash` VARCHAR(191) NOT NULL,
`role` ENUM('ADMIN', 'MANAGER', 'STAFF', 'VIEWER') NOT NULL DEFAULT 'STAFF',
`active` BOOLEAN NOT NULL DEFAULT true,
`uiScale` DOUBLE NOT NULL DEFAULT 1,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`updatedAt` DATETIME(3) NOT NULL,
UNIQUE INDEX `users_email_key`(`email`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `activity_logs` (
`id` VARCHAR(191) NOT NULL,
`userId` VARCHAR(191) NULL,
`event` VARCHAR(191) NOT NULL,
`level` VARCHAR(191) NOT NULL,
`message` JSON NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `email_templates` (
`id` VARCHAR(191) NOT NULL,
`name` VARCHAR(191) NOT NULL,
`subject` VARCHAR(191) NOT NULL,
`templateSource` TEXT NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `email_campaigns` (
`id` VARCHAR(191) NOT NULL,
`campaignName` VARCHAR(191) NOT NULL,
`subject` VARCHAR(191) NULL,
`body` TEXT NULL,
`status` VARCHAR(191) NOT NULL DEFAULT 'in_progress',
`emailSentCount` INTEGER NOT NULL DEFAULT 0,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `email_log` (
`id` VARCHAR(191) NOT NULL,
`customerId` VARCHAR(191) NULL,
`emailAddress` VARCHAR(191) NULL,
`emailType` VARCHAR(191) NULL,
`requestBody` TEXT NULL,
`responseBody` TEXT NULL,
`sentAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `ops_jobs` (
`id` VARCHAR(191) NOT NULL,
`kind` ENUM('BACKUP', 'RESTORE', 'REIMPORT', 'SYNC') NOT NULL,
`status` ENUM('RUNNING', 'SUCCESS', 'FAILED') NOT NULL DEFAULT 'RUNNING',
`log` LONGTEXT NOT NULL,
`params` JSON NULL,
`createdById` VARCHAR(191) NULL,
`startedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`finishedAt` DATETIME(3) NULL,
INDEX `ops_jobs_status_idx`(`status`),
INDEX `ops_jobs_startedAt_idx`(`startedAt`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `customer_legacy_refs` ADD CONSTRAINT `customer_legacy_refs_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `customers`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `policies` ADD CONSTRAINT `policies_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `customers`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `policies` ADD CONSTRAINT `policies_policyTypeId_fkey` FOREIGN KEY (`policyTypeId`) REFERENCES `policy_types`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `policies` ADD CONSTRAINT `policies_insuranceProviderId_fkey` FOREIGN KEY (`insuranceProviderId`) REFERENCES `insurance_providers`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `renewal_notices` ADD CONSTRAINT `renewal_notices_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `policy_payment_installments` ADD CONSTRAINT `policy_payment_installments_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `vehicles` ADD CONSTRAINT `vehicles_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `customers`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `vehicles` ADD CONSTRAINT `vehicles_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `insured_drivers` ADD CONSTRAINT `insured_drivers_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `policy_beneficiaries` ADD CONSTRAINT `policy_beneficiaries_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `claims` ADD CONSTRAINT `claims_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `claims` ADD CONSTRAINT `claims_adjusterId_fkey` FOREIGN KEY (`adjusterId`) REFERENCES `adjusters`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `policy_documents` ADD CONSTRAINT `policy_documents_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `properties` ADD CONSTRAINT `properties_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `customers`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `properties` ADD CONSTRAINT `properties_policyId_fkey` FOREIGN KEY (`policyId`) REFERENCES `policies`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `property_services` ADD CONSTRAINT `property_services_propertyId_fkey` FOREIGN KEY (`propertyId`) REFERENCES `properties`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `service_documents` ADD CONSTRAINT `service_documents_propertyId_fkey` FOREIGN KEY (`propertyId`) REFERENCES `properties`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `trust_accounts` ADD CONSTRAINT `trust_accounts_propertyId_fkey` FOREIGN KEY (`propertyId`) REFERENCES `properties`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `transactions` ADD CONSTRAINT `transactions_customerId_fkey` FOREIGN KEY (`customerId`) REFERENCES `customers`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `transactions` ADD CONSTRAINT `transactions_typeId_fkey` FOREIGN KEY (`typeId`) REFERENCES `type_transactions`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `bank_accounts` ADD CONSTRAINT `bank_accounts_bankId_fkey` FOREIGN KEY (`bankId`) REFERENCES `banks`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `bank_transactions` ADD CONSTRAINT `bank_transactions_bankAccountId_fkey` FOREIGN KEY (`bankAccountId`) REFERENCES `bank_accounts`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `bank_transactions` ADD CONSTRAINT `bank_transactions_categoryId_fkey` FOREIGN KEY (`categoryId`) REFERENCES `business_line_categories`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `activity_logs` ADD CONSTRAINT `activity_logs_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;