omnichannel-deploy/database/migrations/005_whatsapp_assignment_queue.sql
Rafael Lopes c5ebbd50b5 REFACTOR: Estrutura de migrations com rastreamento e separação de seeds
- Introduz schema_migrations para controle de migrations já aplicadas:
  apenas arquivos novos rodam a cada deploy, eliminando re-execuções

- Renumera migrations de 001 a 026 sem lacunas (gaps em 013 e 024 fechados)

- Adiciona 008_mensagens.sql: CREATE TABLE que estava ausente do repositório

- Corrige idempotência de 015_configurable_triage_flow:
  adiciona UNIQUE (flow_id, label) e (audience_id, label) e targets
  explícitos no ON CONFLICT que antes duplicava dados a cada deploy

- Separa dados de demonstração em database/seeds/ (só roda em dev/uat)

- Remove seeds e migrations sem propósito:
  seeds/002 e 027 tornados obsoletos com a remoção dos opening templates

- Atualiza deploy-dev.yml: loop com checagem de tracking + passo de seeds
2026-07-24 15:22:26 -03:00

42 lines
1.9 KiB
SQL

-- ============================================================
-- Migration 006: Fila e controle de atribuicao do WhatsApp
-- Tabela: whatsapp_chat_atribuicoes
-- ============================================================
-- A atribuicao passa a representar dois estados principais:
-- 1. queued: conversa esta na fila de uma area, sem atendente definido
-- 2. assigned: conversa foi assumida ou transferida diretamente para um atendente
--
-- A janela de atendimento e controlada por expires_at. Ao expirar, a aplicacao
-- trata a proxima mensagem como um novo ciclo de conversa.
ALTER TABLE whatsapp_chat_atribuicoes
ALTER COLUMN user_id DROP NOT NULL,
ALTER COLUMN area_id DROP NOT NULL;
ALTER TABLE whatsapp_chat_atribuicoes
ADD COLUMN IF NOT EXISTS status VARCHAR(40) NOT NULL DEFAULT 'assigned',
ADD COLUMN IF NOT EXISTS conversation_started_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
ADD COLUMN IF NOT EXISTS expires_at TIMESTAMP WITH TIME ZONE DEFAULT (CURRENT_TIMESTAMP + INTERVAL '24 hours'),
ADD COLUMN IF NOT EXISTS transfer_note TEXT,
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP;
UPDATE whatsapp_chat_atribuicoes
SET
status = CASE
WHEN user_id IS NULL THEN 'queued'
ELSE 'assigned'
END,
conversation_started_at = COALESCE(conversation_started_at, assigned_at, CURRENT_TIMESTAMP),
expires_at = COALESCE(expires_at, assigned_at + INTERVAL '24 hours', CURRENT_TIMESTAMP + INTERVAL '24 hours'),
updated_at = COALESCE(updated_at, assigned_at, CURRENT_TIMESTAMP);
CREATE INDEX IF NOT EXISTS idx_whatsapp_atribuicoes_area_status
ON whatsapp_chat_atribuicoes (area_id, status);
CREATE INDEX IF NOT EXISTS idx_whatsapp_atribuicoes_user_status
ON whatsapp_chat_atribuicoes (user_id, status);
CREATE INDEX IF NOT EXISTS idx_whatsapp_atribuicoes_expires_at
ON whatsapp_chat_atribuicoes (expires_at);