\set ON_ERROR_STOP on BEGIN; CREATE TEMP TABLE expense_dedup_map ( old_id text PRIMARY KEY, new_id text NOT NULL UNIQUE ) ON COMMIT DROP; INSERT INTO expense_dedup_map (old_id, new_id) SELECT old_claim.id, formal_claim.id FROM "ExpenseClaim" old_claim JOIN "ExpenseClaim" formal_claim ON formal_claim."claimNo" ~ '^BX-[0-9]{8}-[0-9]{3}$' AND formal_claim."applicantId" = old_claim."applicantId" AND formal_claim.amount = old_claim.amount AND formal_claim."projectId" IS NOT DISTINCT FROM old_claim."projectId" AND formal_claim."bidCaseId" IS NOT DISTINCT FROM old_claim."bidCaseId" WHERE old_claim."createdAt" >= TIMESTAMP '2026-08-29 11:00:30' AND old_claim."createdAt" < TIMESTAMP '2026-08-29 11:00:31'; INSERT INTO expense_dedup_map (old_id, new_id) SELECT old_claim.id, formal_claim.id FROM "ExpenseClaim" old_claim JOIN "ExpenseClaim" formal_claim ON formal_claim."claimNo" = CASE old_claim."claimNo" WHEN 'BX-2026-00043' THEN 'BX-20260617-004' WHEN 'BX-2026-00044' THEN 'BX-20260617-005' END WHERE old_claim."claimNo" IN ('BX-2026-00043', 'BX-2026-00044'); DO $$ BEGIN IF (SELECT count(*) FROM expense_dedup_map) <> 83 THEN RAISE EXCEPTION 'Expense dedup mapping is incomplete: expected 83, got %', (SELECT count(*) FROM expense_dedup_map); END IF; END $$; -- FileAsset is intentionally reassigned before duplicate claims are removed. UPDATE "FileAsset" file SET "bizId" = mapping.new_id FROM expense_dedup_map mapping WHERE file."bizType" = 'EXPENSE' AND file."bizId" = mapping.old_id; DELETE FROM "ApprovalTask" task USING expense_dedup_map mapping WHERE task."bizId" = mapping.old_id; DELETE FROM "TodoTask" task USING expense_dedup_map mapping WHERE task."bizId" = mapping.old_id; DELETE FROM "ExpenseClaim" claim USING expense_dedup_map mapping WHERE claim.id = mapping.old_id; CREATE TEMP TABLE loan_dedup_map ( old_id text PRIMARY KEY, new_id text NOT NULL UNIQUE, new_status text NOT NULL ) ON COMMIT DROP; INSERT INTO loan_dedup_map (old_id, new_id, new_status) SELECT old_loan.id, formal_loan.id, formal_loan.status FROM "LoanRecord" old_loan JOIN "LoanRecord" formal_loan ON formal_loan."loanNo" ~ '^JZ-[0-9]{8}-[0-9]{3}$' AND formal_loan."applicantId" = old_loan."applicantId" AND formal_loan.amount = old_loan.amount AND formal_loan."projectId" IS NOT DISTINCT FROM old_loan."projectId" AND formal_loan.purpose = old_loan.purpose WHERE old_loan."loanNo" ~ '^JK-2026-[0-9]{5}$' AND old_loan."createdAt" >= TIMESTAMP '2026-08-29 11:00:30' AND old_loan."createdAt" < TIMESTAMP '2026-08-29 11:00:31'; DO $$ BEGIN IF (SELECT count(*) FROM loan_dedup_map) <> 9 THEN RAISE EXCEPTION 'Loan dedup mapping is incomplete: expected 9, got %', (SELECT count(*) FROM loan_dedup_map); END IF; END $$; -- Keep approval tasks only when the surviving formal loan is still pending. UPDATE "ApprovalTask" task SET "bizId" = mapping.new_id FROM loan_dedup_map mapping WHERE task."bizId" = mapping.old_id AND mapping.new_status = 'PENDING'; DELETE FROM "ApprovalTask" task USING loan_dedup_map mapping WHERE task."bizId" = mapping.old_id; DELETE FROM "TodoTask" task USING loan_dedup_map mapping WHERE task."bizId" = mapping.old_id; UPDATE "FileAsset" file SET "bizId" = mapping.new_id FROM loan_dedup_map mapping WHERE file."bizType" = 'LOAN' AND file."bizId" = mapping.old_id; DELETE FROM "LoanRecord" loan USING loan_dedup_map mapping WHERE loan.id = mapping.old_id; COMMIT;