ALTER TABLE assignment_policies ADD COLUMN IF NOT EXISTS name VARCHAR(255), ADD COLUMN IF NOT EXISTS description TEXT NOT NULL DEFAULT '', ADD COLUMN IF NOT EXISTS assignment_order INTEGER NOT NULL DEFAULT 0, ADD COLUMN IF NOT EXISTS conversation_priority INTEGER NOT NULL DEFAULT 0, ADD COLUMN IF NOT EXISTS fair_distribution_limit INTEGER NOT NULL DEFAULT 100, ADD COLUMN IF NOT EXISTS fair_distribution_window INTEGER NOT NULL DEFAULT 3600; UPDATE assignment_policies SET name = COALESCE(NULLIF(policy_type, ''), 'Policy') || ' ' || id WHERE name IS NULL OR name = ''; ALTER TABLE assignment_policies ALTER COLUMN name SET NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS idx_account_policy_name ON assignment_policies(account_id, name); DO $$ BEGIN IF EXISTS ( SELECT 1 FROM assignment_policies WHERE inbox_id IS NOT NULL GROUP BY inbox_id HAVING COUNT(*) > 1 ) THEN RAISE EXCEPTION 'migration 000086: multiple legacy assignment policies target one inbox'; END IF; IF EXISTS ( SELECT 1 FROM assignment_policies JOIN inboxes ON inboxes.id = assignment_policies.inbox_id WHERE assignment_policies.inbox_id IS NOT NULL AND assignment_policies.account_id <> inboxes.account_id ) THEN RAISE EXCEPTION 'migration 000086: legacy assignment policy and inbox belong to different accounts'; END IF; END $$; CREATE TABLE IF NOT EXISTS inbox_assignment_policies ( id BIGSERIAL PRIMARY KEY, inbox_id BIGINT NOT NULL REFERENCES inboxes(id) ON DELETE CASCADE, assignment_policy_id BIGINT NOT NULL REFERENCES assignment_policies(id) ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ); INSERT INTO inbox_assignment_policies(inbox_id, assignment_policy_id, created_at, updated_at) SELECT assignment_policies.inbox_id, assignment_policies.id, assignment_policies.created_at, assignment_policies.updated_at FROM assignment_policies WHERE assignment_policies.inbox_id IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM inbox_assignment_policies WHERE inbox_assignment_policies.inbox_id = assignment_policies.inbox_id ); CREATE UNIQUE INDEX IF NOT EXISTS idx_inbox_assignment_policies_inbox_id ON inbox_assignment_policies(inbox_id); CREATE INDEX IF NOT EXISTS idx_inbox_assignment_policies_assignment_policy_id ON inbox_assignment_policies(assignment_policy_id);