128 lines
4.1 KiB
MySQL
128 lines
4.1 KiB
MySQL
|
|
-- ============================================================
|
||
|
|
-- Migration 019: Flow Builder visual do bot
|
||
|
|
-- Tabelas:
|
||
|
|
-- bot_flow_versions
|
||
|
|
-- bot_flow_nodes
|
||
|
|
-- whatsapp_chat_atribuicoes
|
||
|
|
-- ============================================================
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS bot_flow_versions (
|
||
|
|
id SERIAL PRIMARY KEY,
|
||
|
|
name VARCHAR(160) NOT NULL DEFAULT 'Fluxo RH Sothis',
|
||
|
|
status VARCHAR(30) NOT NULL DEFAULT 'draft',
|
||
|
|
version_number INTEGER NOT NULL DEFAULT 0,
|
||
|
|
root_node_id INTEGER,
|
||
|
|
published_at TIMESTAMP WITH TIME ZONE,
|
||
|
|
snapshot JSONB,
|
||
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP
|
||
|
|
);
|
||
|
|
|
||
|
|
CREATE TABLE IF NOT EXISTS bot_flow_nodes (
|
||
|
|
id SERIAL PRIMARY KEY,
|
||
|
|
version_id INTEGER NOT NULL REFERENCES bot_flow_versions(id) ON DELETE CASCADE,
|
||
|
|
parent_id INTEGER REFERENCES bot_flow_nodes(id) ON DELETE CASCADE,
|
||
|
|
node_type VARCHAR(30) NOT NULL CHECK (node_type IN ('greeting', 'question', 'agent', 'close')),
|
||
|
|
title VARCHAR(160) NOT NULL,
|
||
|
|
message_text TEXT,
|
||
|
|
keywords TEXT,
|
||
|
|
fallback_message TEXT,
|
||
|
|
fallback_attempts INTEGER NOT NULL DEFAULT 2,
|
||
|
|
fallback_area_id INTEGER REFERENCES areas(id) ON DELETE SET NULL,
|
||
|
|
area_id INTEGER REFERENCES areas(id) ON DELETE SET NULL,
|
||
|
|
sort_order INTEGER NOT NULL DEFAULT 1,
|
||
|
|
position_x INTEGER NOT NULL DEFAULT 0,
|
||
|
|
position_y INTEGER NOT NULL DEFAULT 0,
|
||
|
|
created_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 = 'fk_bot_flow_versions_root'
|
||
|
|
) THEN
|
||
|
|
ALTER TABLE bot_flow_versions
|
||
|
|
ADD CONSTRAINT fk_bot_flow_versions_root
|
||
|
|
FOREIGN KEY (root_node_id) REFERENCES bot_flow_nodes(id) ON DELETE SET NULL;
|
||
|
|
END IF;
|
||
|
|
END $$;
|
||
|
|
|
||
|
|
ALTER TABLE whatsapp_chat_atribuicoes
|
||
|
|
ADD COLUMN IF NOT EXISTS triage_builder_version_id INTEGER REFERENCES bot_flow_versions(id) ON DELETE SET NULL,
|
||
|
|
ADD COLUMN IF NOT EXISTS triage_builder_node_id INTEGER REFERENCES bot_flow_nodes(id) ON DELETE SET NULL;
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_bot_flow_versions_status
|
||
|
|
ON bot_flow_versions (status, published_at DESC, id DESC);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_bot_flow_nodes_version_parent
|
||
|
|
ON bot_flow_nodes (version_id, parent_id, sort_order, id);
|
||
|
|
|
||
|
|
CREATE INDEX IF NOT EXISTS idx_whatsapp_atribuicoes_builder_node
|
||
|
|
ON whatsapp_chat_atribuicoes (triage_builder_version_id, triage_builder_node_id);
|
||
|
|
|
||
|
|
WITH inserted_version AS (
|
||
|
|
INSERT INTO bot_flow_versions (name, status, version_number, updated_at)
|
||
|
|
SELECT 'Fluxo RH Sothis', 'draft', 0, CURRENT_TIMESTAMP
|
||
|
|
WHERE NOT EXISTS (SELECT 1 FROM bot_flow_versions WHERE status = 'draft')
|
||
|
|
RETURNING id
|
||
|
|
),
|
||
|
|
draft_version AS (
|
||
|
|
SELECT id FROM inserted_version
|
||
|
|
UNION ALL
|
||
|
|
SELECT id
|
||
|
|
FROM (
|
||
|
|
SELECT id
|
||
|
|
FROM bot_flow_versions
|
||
|
|
WHERE status = 'draft'
|
||
|
|
AND NOT EXISTS (SELECT 1 FROM inserted_version)
|
||
|
|
ORDER BY id ASC
|
||
|
|
LIMIT 1
|
||
|
|
) existing_draft
|
||
|
|
),
|
||
|
|
inserted_root AS (
|
||
|
|
INSERT INTO bot_flow_nodes (
|
||
|
|
version_id,
|
||
|
|
parent_id,
|
||
|
|
node_type,
|
||
|
|
title,
|
||
|
|
message_text,
|
||
|
|
keywords,
|
||
|
|
fallback_message,
|
||
|
|
fallback_attempts,
|
||
|
|
sort_order,
|
||
|
|
position_x,
|
||
|
|
position_y,
|
||
|
|
updated_at
|
||
|
|
)
|
||
|
|
SELECT
|
||
|
|
draft_version.id,
|
||
|
|
NULL,
|
||
|
|
'greeting',
|
||
|
|
'Saudacao inicial',
|
||
|
|
'Ola! Sou o Agente Virtual Sothis. Vou te direcionar para o atendimento correto de RH. Digite o numero da opcao que melhor descreve voce:\n\n1 - Sou colaborador ativo\n2 - Sou ex-colaborador\n3 - Sou candidato a uma vaga',
|
||
|
|
NULL,
|
||
|
|
'Nao consegui identificar seu perfil. Digite 1 para colaborador ativo, 2 para ex-colaborador ou 3 para candidato.',
|
||
|
|
2,
|
||
|
|
1,
|
||
|
|
0,
|
||
|
|
0,
|
||
|
|
CURRENT_TIMESTAMP
|
||
|
|
FROM draft_version
|
||
|
|
WHERE NOT EXISTS (
|
||
|
|
SELECT 1
|
||
|
|
FROM bot_flow_nodes node
|
||
|
|
WHERE node.version_id = draft_version.id
|
||
|
|
AND node.node_type = 'greeting'
|
||
|
|
)
|
||
|
|
RETURNING id, version_id
|
||
|
|
)
|
||
|
|
UPDATE bot_flow_versions version
|
||
|
|
SET root_node_id = inserted_root.id,
|
||
|
|
updated_at = CURRENT_TIMESTAMP
|
||
|
|
FROM inserted_root
|
||
|
|
WHERE version.id = inserted_root.version_id
|
||
|
|
AND version.root_node_id IS NULL;
|