omnichannel-deploy/database/migrations/013_agent_presence_pause.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

53 lines
1.8 KiB
SQL

-- ============================================================
-- Migration 015: Presenca do agente e reserva de chamados em pausa
-- Tabelas:
-- agent_presence
-- whatsapp_chat_atribuicoes
-- ============================================================
CREATE TABLE IF NOT EXISTS agent_presence (
user_id INTEGER PRIMARY KEY REFERENCES usuarios(id) ON DELETE CASCADE,
status VARCHAR(40) NOT NULL DEFAULT 'offline',
paused_at TIMESTAMP WITH TIME ZONE,
last_seen_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
);
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1
FROM pg_constraint
WHERE conname = 'chk_agent_presence_status'
) THEN
ALTER TABLE agent_presence
ADD CONSTRAINT chk_agent_presence_status
CHECK (status IN ('available', 'paused', 'offline'));
END IF;
END $$;
INSERT INTO agent_presence (user_id, status, last_seen_at, updated_at)
SELECT id, 'available', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
FROM usuarios
ON CONFLICT (user_id) DO NOTHING;
ALTER TABLE whatsapp_chat_atribuicoes
ADD COLUMN IF NOT EXISTS reserved_user_id INTEGER REFERENCES usuarios(id) ON DELETE SET NULL,
ADD COLUMN IF NOT EXISTS reserved_at TIMESTAMP WITH TIME ZONE,
ADD COLUMN IF NOT EXISTS pause_released_at TIMESTAMP WITH TIME ZONE;
CREATE INDEX IF NOT EXISTS idx_agent_presence_status
ON agent_presence (status);
CREATE INDEX IF NOT EXISTS idx_agent_presence_paused_at
ON agent_presence (paused_at)
WHERE status = 'paused';
CREATE INDEX IF NOT EXISTS idx_whatsapp_atribuicoes_reserved_user
ON whatsapp_chat_atribuicoes (reserved_user_id, status)
WHERE reserved_user_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_whatsapp_atribuicoes_reserved_queue
ON whatsapp_chat_atribuicoes (area_id, status, reserved_user_id)
WHERE status = 'queued';