omnichannel-deploy/database/migrations/006_whatsapp_assignment_queue.sql

42 lines
1.9 KiB
MySQL
Raw Normal View History

-- ============================================================
-- 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);