2025-09-17 20:56:32 -03:00
|
|
|
-- =============================================
|
|
|
|
|
-- BANCO DE DADOS: snglpi
|
|
|
|
|
-- DESCRIÇÃO: Sistema de integração entre ServiceNow e GLPI
|
|
|
|
|
-- OBS: Chamados sempre são abertos pelo ServiceNow
|
|
|
|
|
-- =============================================
|
|
|
|
|
|
2025-09-18 20:52:39 -03:00
|
|
|
CREATE DATABASE snglpi
|
|
|
|
|
WITH
|
|
|
|
|
OWNER = desenvolvimento
|
|
|
|
|
ENCODING = 'UTF8'
|
|
|
|
|
LC_COLLATE = 'en_US.UTF-8'
|
|
|
|
|
LC_CTYPE = 'en_US.UTF-8'
|
|
|
|
|
LOCALE_PROVIDER = 'libc'
|
|
|
|
|
TABLESPACE = pg_default
|
|
|
|
|
CONNECTION LIMIT = -1
|
|
|
|
|
IS_TEMPLATE = False;
|
|
|
|
|
|
|
|
|
|
|
2025-09-17 20:56:32 -03:00
|
|
|
-- =============================================
|
|
|
|
|
-- TABELA: tickets_sn
|
|
|
|
|
-- DESCRIÇÃO: Armazena tickets importados do ServiceNow
|
|
|
|
|
-- =============================================
|
|
|
|
|
CREATE TABLE tickets_sn (
|
|
|
|
|
id SERIAL PRIMARY KEY, -- ID único do registro no banco snglpi
|
|
|
|
|
ticket_number VARCHAR(32) NOT NULL UNIQUE, -- Número do ticket no ServiceNow (ex: INC0140378)
|
|
|
|
|
sys_id VARCHAR(64) NOT NULL UNIQUE, -- Identificador único do ticket no ServiceNow
|
|
|
|
|
short_description TEXT, -- Descrição resumida do ticket
|
|
|
|
|
tipo VARCHAR(10), -- Tipo do ticket: 'incidente' ou 'requisicao'
|
|
|
|
|
status VARCHAR(55), -- Status atual do ticket no ServiceNow
|
|
|
|
|
description TEXT, -- Descrição completa do ticket
|
|
|
|
|
caller_id VARCHAR(255), -- Nome do solicitante do ticket
|
|
|
|
|
caller_email VARCHAR(255), -- Email do solicitante
|
|
|
|
|
location_id VARCHAR(64), -- ID da localização no ServiceNow
|
|
|
|
|
location_name VARCHAR(255), -- Nome da localização no ServiceNow
|
|
|
|
|
ramal VARCHAR(100), -- Ramal do solicitante
|
|
|
|
|
telefone VARCHAR(100), -- Telefone do solicitante
|
|
|
|
|
opened_at TIMESTAMP, -- Data e hora de abertura no ServiceNow
|
|
|
|
|
created_at TIMESTAMP DEFAULT NOW(), -- Data e hora de criação do registro
|
|
|
|
|
updated_at TIMESTAMP DEFAULT NOW() -- Data e hora da última atualização do registro
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Índices para melhor performance nas consultas frequentes
|
|
|
|
|
CREATE INDEX idx_tickets_sn_status ON tickets_sn(status);
|
|
|
|
|
CREATE INDEX idx_tickets_sn_tipo ON tickets_sn(tipo);
|
|
|
|
|
CREATE INDEX idx_tickets_sn_opened_at ON tickets_sn(opened_at);
|
|
|
|
|
CREATE INDEX idx_tickets_sn_location_id ON tickets_sn(location_id);
|
|
|
|
|
CREATE INDEX idx_tickets_sn_location_name ON tickets_sn(location_name);
|
|
|
|
|
|
|
|
|
|
-- =============================================
|
|
|
|
|
-- TABELA: ticket_sync
|
|
|
|
|
-- DESCRIÇÃO: Controla o status de sincronização entre ServiceNow e GLPI
|
|
|
|
|
-- OBS: Chamados sempre são criados no ServiceNow primeiro
|
|
|
|
|
-- =============================================
|
|
|
|
|
CREATE TABLE ticket_sync (
|
|
|
|
|
id SERIAL PRIMARY KEY, -- ID único do registro de sincronização
|
|
|
|
|
sn_ticket_id INTEGER NOT NULL, -- Referência ao ticket na tabela tickets_sn
|
|
|
|
|
glpi_ticket_id INTEGER, -- ID do ticket correspondente no GLPI
|
|
|
|
|
last_sn_sync TIMESTAMP, -- Data e hora da última sincronização com ServiceNow
|
|
|
|
|
last_glpi_sync TIMESTAMP, -- Data e hora da última sincronização com GLPI
|
|
|
|
|
sn_sync_status VARCHAR(20) DEFAULT 'pending',-- Status da sincronização com ServiceNow: 'pending', 'completed', 'error'
|
|
|
|
|
glpi_sync_status VARCHAR(20) DEFAULT 'pending', -- Status da sincronização com GLPI: 'pending', 'completed', 'error'
|
|
|
|
|
created_at TIMESTAMP DEFAULT NOW(), -- Data e hora de criação do registro
|
|
|
|
|
updated_at TIMESTAMP DEFAULT NOW(), -- Data e hora da última atualização do registro
|
|
|
|
|
|
|
|
|
|
-- Chaves estrangeiras
|
|
|
|
|
CONSTRAINT fk_ticket_sync_sn_ticket
|
|
|
|
|
FOREIGN KEY (sn_ticket_id)
|
|
|
|
|
REFERENCES tickets_sn(id)
|
|
|
|
|
ON DELETE CASCADE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Índices para melhor performance nas consultas frequentes
|
|
|
|
|
CREATE INDEX idx_ticket_sync_sn_ticket ON ticket_sync(sn_ticket_id);
|
|
|
|
|
CREATE INDEX idx_ticket_sync_glpi_ticket ON ticket_sync(glpi_ticket_id);
|
|
|
|
|
CREATE INDEX idx_ticket_sync_status ON ticket_sync(sn_sync_status, glpi_sync_status);
|
|
|
|
|
|
|
|
|
|
-- =============================================
|
|
|
|
|
-- TABELA: ticket_updates
|
|
|
|
|
-- DESCRIÇÃO: Armazena as atualizações e tarefas relacionadas aos tickets
|
|
|
|
|
-- OBS: Atualizações podem vir de ambos os sistemas (ServiceNow e GLPI)
|
|
|
|
|
-- =============================================
|
|
|
|
|
CREATE TABLE ticket_updates (
|
|
|
|
|
id SERIAL PRIMARY KEY, -- ID único da atualização
|
|
|
|
|
ticket_sync_id INTEGER NOT NULL, -- Referência ao registro de sincronização
|
|
|
|
|
update_type VARCHAR(20) NOT NULL, -- Tipo de atualização: 'task', 'note', 'status_change'
|
|
|
|
|
source_system VARCHAR(10) NOT NULL, -- Sistema de origem: 'sn' (ServiceNow) ou 'glpi'
|
|
|
|
|
content TEXT, -- Conteúdo da atualização/tarefa
|
|
|
|
|
author VARCHAR(255), -- Autor da atualização
|
|
|
|
|
created_at_source TIMESTAMP, -- Data e hora de criação no sistema de origem
|
|
|
|
|
sync_status VARCHAR(20) DEFAULT 'pending', -- Status da sincronização: 'pending', 'completed', 'error'
|
|
|
|
|
sync_date TIMESTAMP, -- Data e hora da sincronização
|
|
|
|
|
created_at TIMESTAMP DEFAULT NOW(), -- Data e hora de criação do registro
|
|
|
|
|
updated_at TIMESTAMP DEFAULT NOW(), -- Data e hora da última atualização do registro
|
2025-09-23 21:01:01 -03:00
|
|
|
source_id VARCHAR(64), -- ID da atualização no sistema de origem (ex: sys_id no ServiceNow)
|
2025-09-17 20:56:32 -03:00
|
|
|
|
|
|
|
|
-- Chaves estrangeiras
|
|
|
|
|
CONSTRAINT fk_ticket_updates_sync
|
|
|
|
|
FOREIGN KEY (ticket_sync_id)
|
|
|
|
|
REFERENCES ticket_sync(id)
|
|
|
|
|
ON DELETE CASCADE
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Índices para melhor performance nas consultas frequentes
|
|
|
|
|
CREATE INDEX idx_ticket_updates_sync ON ticket_updates(ticket_sync_id);
|
|
|
|
|
CREATE INDEX idx_ticket_updates_status ON ticket_updates(sync_status);
|
|
|
|
|
CREATE INDEX idx_ticket_updates_source ON ticket_updates(source_system);
|
|
|
|
|
CREATE INDEX idx_ticket_updates_type ON ticket_updates(update_type);
|
|
|
|
|
CREATE INDEX idx_ticket_updates_created ON ticket_updates(created_at_source);
|
2025-09-23 21:01:01 -03:00
|
|
|
CREATE INDEX idx_ticket_updates_source_id ON ticket_updates(source_id);
|
|
|
|
|
|
2025-09-17 20:56:32 -03:00
|
|
|
|
|
|
|
|
-- =============================================
|
|
|
|
|
-- TABELA: location_mapping
|
|
|
|
|
-- DESCRIÇÃO: Mapeamento entre localizações do ServiceNow e entidades do GLPI
|
|
|
|
|
-- =============================================
|
|
|
|
|
CREATE TABLE location_mapping (
|
|
|
|
|
id SERIAL PRIMARY KEY, -- ID único do mapeamento
|
|
|
|
|
sn_location_id VARCHAR(255), -- ID da localização no ServiceNow
|
|
|
|
|
sn_location_name VARCHAR(255) NOT NULL, -- Nome da localização no ServiceNow
|
|
|
|
|
glpi_entity_id INTEGER NOT NULL, -- ID da entidade correspondente no GLPI
|
|
|
|
|
glpi_entity_name VARCHAR(255) NOT NULL, -- Nome da entidade no GLPI
|
|
|
|
|
created_at TIMESTAMP DEFAULT NOW(), -- Data e hora de criação do registro
|
|
|
|
|
updated_at TIMESTAMP DEFAULT NOW() -- Data e hora da última atualização do registro
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
-- Índices para melhor performance nas consultas frequentes
|
|
|
|
|
CREATE INDEX idx_location_mapping_sn_id ON location_mapping(sn_location_id);
|
|
|
|
|
CREATE INDEX idx_location_mapping_sn_name ON location_mapping(sn_location_name);
|
|
|
|
|
CREATE INDEX idx_location_mapping_glpi_id ON location_mapping(glpi_entity_id);
|
|
|
|
|
CREATE INDEX idx_location_mapping_glpi_name ON location_mapping(glpi_entity_name);
|
|
|
|
|
|
|
|
|
|
-- =============================================
|
|
|
|
|
-- TRIGGERS para atualizar automaticamente updated_at
|
|
|
|
|
-- =============================================
|
|
|
|
|
|
|
|
|
|
-- Função para atualizar o campo updated_at
|
|
|
|
|
CREATE OR REPLACE FUNCTION update_updated_at_column()
|
|
|
|
|
RETURNS TRIGGER AS $$
|
|
|
|
|
BEGIN
|
|
|
|
|
NEW.updated_at = NOW();
|
|
|
|
|
RETURN NEW;
|
|
|
|
|
END;
|
|
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
|
|
|
|
-- Trigger para tickets_sn
|
|
|
|
|
CREATE TRIGGER trigger_tickets_sn_updated_at
|
|
|
|
|
BEFORE UPDATE ON tickets_sn
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
|
|
|
|
|
|
-- Trigger para ticket_sync
|
|
|
|
|
CREATE TRIGGER trigger_ticket_sync_updated_at
|
|
|
|
|
BEFORE UPDATE ON ticket_sync
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
|
|
|
|
|
|
-- Trigger para ticket_updates
|
|
|
|
|
CREATE TRIGGER trigger_ticket_updates_updated_at
|
|
|
|
|
BEFORE UPDATE ON ticket_updates
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
|
|
|
|
|
|
-- Trigger para location_mapping
|
|
|
|
|
CREATE TRIGGER trigger_location_mapping_updated_at
|
|
|
|
|
BEFORE UPDATE ON location_mapping
|
|
|
|
|
FOR EACH ROW
|
|
|
|
|
EXECUTE FUNCTION update_updated_at_column();
|
|
|
|
|
|
|
|
|
|
-- =============================================
|
|
|
|
|
-- VIEWS para consultas úteis
|
|
|
|
|
-- =============================================
|
|
|
|
|
|
|
|
|
|
-- View para tickets pendentes de sincronização com GLPI
|
|
|
|
|
CREATE VIEW view_tickets_pending_glpi AS
|
|
|
|
|
SELECT
|
|
|
|
|
ts.ticket_number,
|
|
|
|
|
ts.short_description,
|
|
|
|
|
ts.status,
|
|
|
|
|
ts.tipo,
|
|
|
|
|
ts.opened_at,
|
|
|
|
|
tsync.created_at as sync_created
|
|
|
|
|
FROM tickets_sn ts
|
|
|
|
|
JOIN ticket_sync tsync ON ts.id = tsync.sn_ticket_id
|
|
|
|
|
WHERE tsync.glpi_sync_status = 'pending';
|
|
|
|
|
|
|
|
|
|
-- View para tickets pendentes de sincronização com ServiceNow
|
|
|
|
|
CREATE VIEW view_tickets_pending_sn AS
|
|
|
|
|
SELECT
|
|
|
|
|
ts.ticket_number,
|
|
|
|
|
ts.short_description,
|
|
|
|
|
ts.status,
|
|
|
|
|
ts.tipo,
|
|
|
|
|
ts.opened_at,
|
|
|
|
|
tsync.created_at as sync_created
|
|
|
|
|
FROM tickets_sn ts
|
|
|
|
|
JOIN ticket_sync tsync ON ts.id = tsync.sn_ticket_id
|
|
|
|
|
WHERE tsync.sn_sync_status = 'pending';
|
|
|
|
|
|
|
|
|
|
-- View para mapeamento de localizações completo
|
|
|
|
|
CREATE VIEW view_location_mapping_complete AS
|
|
|
|
|
SELECT
|
|
|
|
|
sn_location_id,
|
|
|
|
|
sn_location_name,
|
|
|
|
|
glpi_entity_id,
|
|
|
|
|
glpi_entity_name,
|
|
|
|
|
created_at,
|
|
|
|
|
updated_at
|
|
|
|
|
FROM location_mapping
|
|
|
|
|
ORDER BY sn_location_name;
|
|
|
|
|
|
|
|
|
|
-- =============================================
|
|
|
|
|
-- COMENTÁRIOS NAS TABELAS E COLUNAS
|
|
|
|
|
-- =============================================
|
|
|
|
|
|
|
|
|
|
COMMENT ON TABLE tickets_sn IS 'Armazena tickets importados do ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.id IS 'ID único do registro no banco snglpi';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.ticket_number IS 'Número do ticket no ServiceNow (ex: INC0140378)';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.sys_id IS 'Identificador único do ticket no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.short_description IS 'Descrição resumida do ticket';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.tipo IS 'Tipo do ticket: incidente ou requisicao';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.status IS 'Status atual do ticket no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.description IS 'Descrição completa do ticket';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.caller_id IS 'Nome do solicitante do ticket';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.caller_email IS 'Email do solicitante';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.location_id IS 'ID da localização no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.location_name IS 'Nome da localização no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.ramal IS 'Ramal do solicitante';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.telefone IS 'Telefone do solicitante';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.opened_at IS 'Data e hora de abertura no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.created_at IS 'Data e hora de criação do registro';
|
|
|
|
|
COMMENT ON COLUMN tickets_sn.updated_at IS 'Data e hora da última atualização do registro';
|
|
|
|
|
|
|
|
|
|
COMMENT ON TABLE ticket_sync IS 'Controla o status de sincronização entre ServiceNow e GLPI';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.id IS 'ID único do registro de sincronização';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.sn_ticket_id IS 'Referência ao ticket na tabela tickets_sn';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.glpi_ticket_id IS 'ID do ticket correspondente no GLPI';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.last_sn_sync IS 'Data e hora da última sincronização com ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.last_glpi_sync IS 'Data e hora da última sincronização com GLPI';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.sn_sync_status IS 'Status da sincronização com ServiceNow: pending, completed, error';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.glpi_sync_status IS 'Status da sincronização com GLPI: pending, completed, error';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.created_at IS 'Data e hora de criação do registro';
|
|
|
|
|
COMMENT ON COLUMN ticket_sync.updated_at IS 'Data e hora da última atualização do registro';
|
|
|
|
|
|
|
|
|
|
COMMENT ON TABLE ticket_updates IS 'Armazena as atualizações e tarefas relacionadas aos tickets';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.id IS 'ID único da atualização';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.ticket_sync_id IS 'Referência ao registro de sincronização';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.update_type IS 'Tipo de atualização: task, note, status_change';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.source_system IS 'Sistema de origem: sn (ServiceNow) ou glpi';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.content IS 'Conteúdo da atualização/tarefa';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.author IS 'Autor da atualização';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.created_at_source IS 'Data e hora de criação no sistema de origem';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.sync_status IS 'Status da sincronização: pending, completed, error';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.sync_date IS 'Data e hora da sincronização';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.created_at IS 'Data e hora de criação do registro';
|
|
|
|
|
COMMENT ON COLUMN ticket_updates.updated_at IS 'Data e hora da última atualização do registro';
|
|
|
|
|
|
|
|
|
|
COMMENT ON TABLE location_mapping IS 'Mapeamento entre localizações do ServiceNow e entidades do GLPI';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.id IS 'ID único do mapeamento';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.sn_location_id IS 'ID da localização no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.sn_location_name IS 'Nome da localização no ServiceNow';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.glpi_entity_id IS 'ID da entidade correspondente no GLPI';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.glpi_entity_name IS 'Nome da entidade no GLPI';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.created_at IS 'Data e hora de criação do registro';
|
|
|
|
|
COMMENT ON COLUMN location_mapping.updated_at IS 'Data e hora da última atualização do registro';
|