omnichannel-deploy/database/migrations/014_hr_decision_tree_keywords.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

100 lines
4.1 KiB
SQL

-- ============================================================
-- Migration 016: Arvore de decisao por especialidade para RH
-- Tabelas:
-- area_routing_keywords
-- ============================================================
CREATE TABLE IF NOT EXISTS area_routing_keywords (
id SERIAL PRIMARY KEY,
area_id INTEGER NOT NULL REFERENCES areas(id) ON DELETE CASCADE,
keyword VARCHAR(160) NOT NULL,
active BOOLEAN NOT NULL DEFAULT TRUE,
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT uq_area_routing_keyword UNIQUE (area_id, keyword)
);
CREATE INDEX IF NOT EXISTS idx_area_routing_keywords_area
ON area_routing_keywords (area_id, active);
CREATE INDEX IF NOT EXISTS idx_area_routing_keywords_keyword
ON area_routing_keywords (keyword);
INSERT INTO areas (nome, descricao) VALUES
('Benefícios', 'Duvidas de RH sobre beneficios, convenios, vale transporte e vale refeicao'),
('Ponto', 'Ajustes de ponto, banco de horas, atrasos e jornada'),
('Holerite', 'Holerite, folha de pagamento, descontos e demonstrativos'),
('Férias', 'Ferias, abono, programacao e saldo de descanso'),
('Recrutamento', 'Vagas internas, candidatura, entrevista e processo seletivo')
ON CONFLICT (nome) DO UPDATE SET
descricao = EXCLUDED.descricao,
ativo = TRUE,
updated_at = NOW();
INSERT INTO area_routing_keywords (area_id, keyword)
SELECT a.id, keyword
FROM areas a
JOIN (
VALUES
('Benefícios', 'beneficio'),
('Benefícios', 'beneficios'),
('Benefícios', 'vale refeicao'),
('Benefícios', 'vale alimentacao'),
('Benefícios', 'vale transporte'),
('Benefícios', 'convenio'),
('Benefícios', 'plano de saude'),
('Benefícios', 'odonto'),
('Ponto', 'ponto'),
('Ponto', 'espelho de ponto'),
('Ponto', 'banco de horas'),
('Ponto', 'atraso'),
('Ponto', 'jornada'),
('Ponto', 'batida'),
('Ponto', 'marcacao'),
('Holerite', 'holerite'),
('Holerite', 'folha'),
('Holerite', 'pagamento'),
('Holerite', 'salario'),
('Holerite', 'desconto'),
('Holerite', 'demonstrativo'),
('Férias', 'ferias'),
('Férias', 'abono'),
('Férias', 'descanso'),
('Férias', 'saldo de ferias'),
('Férias', 'programar ferias'),
('Recrutamento', 'vaga'),
('Recrutamento', 'vagas'),
('Recrutamento', 'processo seletivo'),
('Recrutamento', 'entrevista'),
('Recrutamento', 'curriculo'),
('Recrutamento', 'candidatura')
) AS seed(area_nome, keyword) ON seed.area_nome = a.nome
ON CONFLICT (area_id, keyword) DO UPDATE SET
active = TRUE,
updated_at = CURRENT_TIMESTAMP;
INSERT INTO whatsapp_templates (name, content, area_id, status, requested_by_role, admin_approved_at, meta_submitted_at, meta_approved_at, updated_at)
SELECT template.name, template.content, a.id, 'approved', 'admin', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP
FROM areas a
JOIN (
VALUES
('rh_abertura_beneficios', 'Ola, {nome}. Aqui e o Atendimento Sothis RH. Recebemos sua solicitacao sobre beneficios e vamos te apoiar por aqui.'),
('rh_abertura_ponto', 'Ola, {nome}. Aqui e o Atendimento Sothis RH. Vamos te ajudar com sua solicitacao sobre ponto, jornada ou banco de horas.'),
('rh_abertura_holerite', 'Ola, {nome}. Aqui e o Atendimento Sothis RH. Vamos te ajudar com holerite, folha ou demonstrativo de pagamento.'),
('rh_abertura_ferias', 'Ola, {nome}. Aqui e o Atendimento Sothis RH. Vamos te apoiar com sua solicitacao sobre ferias.'),
('rh_abertura_recrutamento', 'Ola, {nome}. Aqui e o Atendimento Sothis RH. Vamos te orientar sobre vagas, candidatura ou processo seletivo.')
) AS template(name, content) ON template.name LIKE
CASE a.nome
WHEN 'Benefícios' THEN '%beneficios'
WHEN 'Ponto' THEN '%ponto'
WHEN 'Holerite' THEN '%holerite'
WHEN 'Férias' THEN '%ferias'
WHEN 'Recrutamento' THEN '%recrutamento'
END
ON CONFLICT (name) DO UPDATE SET
content = EXCLUDED.content,
area_id = EXCLUDED.area_id,
status = 'approved',
meta_approved_at = CURRENT_TIMESTAMP,
updated_at = CURRENT_TIMESTAMP;