548 lines
23 KiB
SQL
548 lines
23 KiB
SQL
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
|
|
|
|
CREATE TABLE IF NOT EXISTS usuarios (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
email VARCHAR(255) UNIQUE NOT NULL,
|
|
senha_hash VARCHAR(255) NOT NULL,
|
|
role VARCHAR(50) NOT NULL DEFAULT 'profissional',
|
|
tipo_profissional VARCHAR(50),
|
|
ativo BOOLEAN NOT NULL DEFAULT FALSE,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regioes_permitidas TEXT[] DEFAULT ARRAY['SP']
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS funcoes_profissionais (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
nome VARCHAR(50) UNIQUE NOT NULL,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
INSERT INTO funcoes_profissionais (nome) VALUES
|
|
('Fotógrafo'),
|
|
('Cinegrafista'),
|
|
('Recepcionista'),
|
|
('Fixo Photum'),
|
|
('Controle'),
|
|
('Pesquisa')
|
|
ON CONFLICT (nome) DO NOTHING;
|
|
|
|
CREATE TABLE IF NOT EXISTS cadastro_profissionais (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
usuario_id UUID REFERENCES usuarios(id) ON DELETE SET NULL,
|
|
nome VARCHAR(255) NOT NULL,
|
|
funcao_profissional_id UUID REFERENCES funcoes_profissionais(id) ON DELETE SET NULL,
|
|
endereco VARCHAR(255),
|
|
cidade VARCHAR(100),
|
|
uf CHAR(2),
|
|
whatsapp VARCHAR(20),
|
|
cep VARCHAR(10),
|
|
numero VARCHAR(20),
|
|
complemento VARCHAR(100),
|
|
bairro VARCHAR(100),
|
|
cpf_cnpj_titular VARCHAR(20) UNIQUE,
|
|
banco VARCHAR(100),
|
|
agencia VARCHAR(20),
|
|
conta VARCHAR(20),
|
|
conta_pix VARCHAR(120),
|
|
carro_disponivel BOOLEAN DEFAULT FALSE,
|
|
tem_estudio BOOLEAN DEFAULT FALSE,
|
|
qtd_estudio INT,
|
|
tipo_cartao VARCHAR(50),
|
|
observacao TEXT,
|
|
qual_tec INT,
|
|
educacao_simpatia INT,
|
|
desempenho_evento INT,
|
|
disp_horario INT,
|
|
media NUMERIC(3,2),
|
|
tabela_free VARCHAR(50),
|
|
extra_por_equipamento BOOLEAN DEFAULT FALSE,
|
|
equipamentos TEXT,
|
|
email VARCHAR(255) UNIQUE,
|
|
avatar_url VARCHAR(255),
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regiao CHAR(2) DEFAULT 'SP'
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS profissionais_funcoes_junction (
|
|
profissional_id UUID NOT NULL REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
|
|
funcao_id UUID NOT NULL REFERENCES funcoes_profissionais(id) ON DELETE CASCADE,
|
|
PRIMARY KEY (profissional_id, funcao_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS refresh_tokens (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
usuario_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
|
|
token_hash VARCHAR(255) NOT NULL,
|
|
user_agent VARCHAR(255),
|
|
ip VARCHAR(45),
|
|
expira_em TIMESTAMPTZ NOT NULL,
|
|
revogado BOOLEAN NOT NULL DEFAULT FALSE,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Cursos Table
|
|
CREATE TABLE IF NOT EXISTS cursos (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
nome VARCHAR(100) NOT NULL,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
UNIQUE(nome, regiao)
|
|
);
|
|
|
|
INSERT INTO cursos (nome) VALUES
|
|
('Administração Empresas'), ('Agronomia'), ('Arquitetura / Urbanismo'), ('Biomedicina'), ('Comunicação'), ('Contábeis'),
|
|
('Direito'), ('Economia'), ('Educação Física'), ('EFI I/EFI II'), ('EI/EFI'), ('EF II/EM'), ('EFI(5º ano)'), ('EFII'),
|
|
('EI'), ('EM'), ('EM / TEC'), ('Enfermagem'), ('Eng. Ambiental'), ('Eng. Elétrica'), ('Engenharia'), ('Estética'),
|
|
('Farmácia'), ('Fisioterapia'), ('Gastronomia'), ('Historia'), ('Jornalismo'), ('Med. Veterinária'), ('Medicina'),
|
|
('Nutrição'), ('Odontologia'), ('Outro'), ('Pedagogia'), ('Publicidade'), ('Superior Diversos'), ('Tec. Diversos'),
|
|
('Termomecânica'), ('Unificados'), ('Tec. Enfermagem'), ('Quimica'), ('EFI / EF II / EM'), ('Psicologia'),
|
|
('Terapia Ocupacinal'), ('R.I')
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Empresas Table
|
|
CREATE TABLE IF NOT EXISTS empresas (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
nome VARCHAR(100) NOT NULL,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
UNIQUE(nome, regiao)
|
|
);
|
|
|
|
INSERT INTO empresas (nome) VALUES
|
|
('Arte Formaturas'), ('JR Formaturas'), ('Perfil'), ('Photum'), ('Populi Formaturas'), ('Prime'), ('Smart'), ('Viva SP'),
|
|
('Antares'), ('Forcamp'), ('PNI'), ('Fábio Ribeiro'), ('Told - B2_(CAMPINAS)'), ('Told - B2_(RECIFE)'),
|
|
('NOVO - Told - B2_(SP)'), ('NOVO - Told - RUB_(SP)'), ('NOVO - TOLD'), ('Alpha Digital'), ('Golden'), ('Festa da Beca'),
|
|
('Ponta Eventos'), ('Toy SP'), ('MVP Formaturas'), ('RUB')
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Anos Formaturas Table
|
|
CREATE TABLE IF NOT EXISTS anos_formaturas (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
ano_semestre VARCHAR(20) NOT NULL, -- Ex: 2019.2
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
UNIQUE(ano_semestre, regiao)
|
|
);
|
|
|
|
INSERT INTO anos_formaturas (ano_semestre) VALUES
|
|
('2019.2'), ('2020.1'), ('2020.2'), ('2021.1'), ('2021.2'), ('2022.1'), ('2022.2'), ('2023.1'), ('2023.2'),
|
|
('2024.1'), ('2024.2'), ('2025.1'), ('2025.2'), ('2026.1'), ('2026.2'), ('2027.1'), ('2027.2'), ('2028.1'),
|
|
('2028.2'), ('2029.1'), ('2029.2')
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Tipos Servicos Table
|
|
CREATE TABLE IF NOT EXISTS tipos_servicos (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
nome VARCHAR(50) NOT NULL,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
UNIQUE(nome, regiao)
|
|
);
|
|
|
|
INSERT INTO tipos_servicos (nome) VALUES
|
|
('Fotógrafo'), ('Recepcionista'), ('Cinegrafista'), ('Coordenação'), ('Ponto de Foto'), ('Ponto de ID'), ('Estúdio'),
|
|
('Outro'), ('Controle')
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Tipos Eventos Table
|
|
CREATE TABLE IF NOT EXISTS tipos_eventos (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
nome VARCHAR(100) NOT NULL,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
UNIQUE(nome, regiao)
|
|
);
|
|
|
|
INSERT INTO tipos_eventos (nome) VALUES
|
|
('Identificação'), ('Baile'), ('Colação'), ('Col/Baile (mesmo local)'), ('Col/Baile (local diferente)'), ('Missa / Culto'),
|
|
('Churrasco'), ('Trote'), ('Outro'), ('Balada'), ('Jantar'), ('Festa Junina'), ('Colação Oficial'), ('Family Day'),
|
|
('Refeição'), ('Estudio ID e Family Day'), ('Estudio Colação / Baile')
|
|
ON CONFLICT DO NOTHING;
|
|
|
|
-- Precos Tipos Eventos Table (Junction Table for Pricing)
|
|
CREATE TABLE IF NOT EXISTS precos_tipos_eventos (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
tipo_evento_id UUID REFERENCES tipos_eventos(id) ON DELETE CASCADE,
|
|
funcao_profissional_id UUID REFERENCES funcoes_profissionais(id) ON DELETE CASCADE,
|
|
valor NUMERIC(10,2) NOT NULL DEFAULT 0.00,
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(tipo_evento_id, funcao_profissional_id, regiao)
|
|
);
|
|
|
|
-- Cadastro FOT
|
|
CREATE TABLE IF NOT EXISTS cadastro_fot (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
fot VARCHAR(50) NOT NULL UNIQUE,
|
|
empresa_id UUID NOT NULL REFERENCES empresas(id),
|
|
curso_id UUID NOT NULL REFERENCES cursos(id),
|
|
ano_formatura_id UUID NOT NULL REFERENCES anos_formaturas(id),
|
|
instituicao VARCHAR(255),
|
|
cidade VARCHAR(255),
|
|
estado VARCHAR(2),
|
|
observacoes TEXT,
|
|
gastos_captacao NUMERIC(20, 2),
|
|
pre_venda BOOLEAN,
|
|
created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP,
|
|
regiao CHAR(2) DEFAULT 'SP'
|
|
);
|
|
|
|
-- Seed Pricing Data (Simplified - user can re-run seeds if needed, or rely on existing data in prod)
|
|
-- Removing lengthy imperative seeds for now to keep schema clean, unless sqlc needs them? sqlc doesn't need data.
|
|
|
|
-- Cadastro Clientes (Representatives of Companies)
|
|
CREATE TABLE IF NOT EXISTS cadastro_clientes (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
usuario_id UUID REFERENCES usuarios(id) ON DELETE CASCADE,
|
|
empresa_id UUID REFERENCES empresas(id) ON DELETE SET NULL,
|
|
nome VARCHAR(255), -- Name of the representative
|
|
telefone VARCHAR(20),
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(usuario_id)
|
|
);
|
|
|
|
-- Migrations (Appended for Idempotency)
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS cpf_cnpj VARCHAR(20);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS cep VARCHAR(10);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS endereco VARCHAR(255);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS numero VARCHAR(20);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS complemento VARCHAR(100);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS bairro VARCHAR(100);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS cidade VARCHAR(100);
|
|
ALTER TABLE cadastro_clientes ADD COLUMN IF NOT EXISTS estado CHAR(2);
|
|
-- Agenda Table
|
|
CREATE TABLE IF NOT EXISTS agenda (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
user_id UUID REFERENCES usuarios(id) ON DELETE CASCADE, -- User who created the event (Client/Owner)
|
|
fot_id UUID NOT NULL REFERENCES cadastro_fot(id) ON DELETE CASCADE,
|
|
data_evento DATE NOT NULL,
|
|
tipo_evento_id UUID NOT NULL REFERENCES tipos_eventos(id),
|
|
observacoes_evento TEXT,
|
|
local_evento VARCHAR(255),
|
|
endereco VARCHAR(255),
|
|
horario VARCHAR(20),
|
|
horario_fim VARCHAR(20),
|
|
qtd_formandos INTEGER DEFAULT 0,
|
|
qtd_fotografos INTEGER DEFAULT 0,
|
|
qtd_recepcionistas INTEGER DEFAULT 0,
|
|
qtd_cinegrafistas INTEGER DEFAULT 0,
|
|
qtd_estudios INTEGER DEFAULT 0,
|
|
qtd_ponto_foto INTEGER DEFAULT 0,
|
|
qtd_ponto_id INTEGER DEFAULT 0,
|
|
qtd_ponto_decorado INTEGER DEFAULT 0,
|
|
qtd_pontos_led INTEGER DEFAULT 0,
|
|
qtd_plataforma_360 INTEGER DEFAULT 0,
|
|
status_profissionais VARCHAR(20) DEFAULT 'OK', -- OK, FALTA, ERRO
|
|
foto_faltante INTEGER DEFAULT 0,
|
|
recep_faltante INTEGER DEFAULT 0,
|
|
cine_faltante INTEGER DEFAULT 0,
|
|
logistica_observacoes TEXT,
|
|
pre_venda BOOLEAN DEFAULT FALSE,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
status VARCHAR(50) DEFAULT 'Pendente', -- Pendente, Aprovado, Arquivado
|
|
logistica_notificacao_enviada_em TIMESTAMP,
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
contatos JSONB DEFAULT '[]'::jsonb
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS agenda_profissionais (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
agenda_id UUID NOT NULL REFERENCES agenda(id) ON DELETE CASCADE,
|
|
profissional_id UUID NOT NULL REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
|
|
status VARCHAR(20) DEFAULT 'PENDENTE', -- PENDENTE, ACEITO, REJEITADO
|
|
motivo_rejeicao TEXT,
|
|
funcao_id UUID REFERENCES funcoes_profissionais(id),
|
|
posicao VARCHAR(100),
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(agenda_id, profissional_id)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS convites_diarios (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
profissional_id UUID NOT NULL REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
|
|
data DATE NOT NULL,
|
|
status VARCHAR(20) DEFAULT 'PENDENTE', -- PENDENTE, ACEITO, REJEITADO
|
|
motivo_rejeicao TEXT,
|
|
regiao CHAR(2) DEFAULT 'SP',
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(profissional_id, data)
|
|
);
|
|
|
|
CREATE TABLE IF NOT EXISTS disponibilidade_profissionais (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
usuario_id UUID NOT NULL REFERENCES usuarios(id) ON DELETE CASCADE,
|
|
data DATE NOT NULL,
|
|
status VARCHAR(20) NOT NULL DEFAULT 'DISPONIVEL', -- DISPONIVEL, INDISPONIVEL
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(usuario_id, data)
|
|
);
|
|
|
|
-- Agenda Escalas (Time blocks for professionals in an event)
|
|
CREATE TABLE IF NOT EXISTS agenda_escalas (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
agenda_id UUID NOT NULL REFERENCES agenda(id) ON DELETE CASCADE,
|
|
profissional_id UUID NOT NULL REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
|
|
data_hora_inicio TIMESTAMPTZ NOT NULL,
|
|
data_hora_fim TIMESTAMPTZ NOT NULL,
|
|
funcao_especifica VARCHAR(100), -- e.g. "PalcoDireito", "Entrada"
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Mapas de Eventos (Floor plans)
|
|
CREATE TABLE IF NOT EXISTS mapas_eventos (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
agenda_id UUID NOT NULL REFERENCES agenda(id) ON DELETE CASCADE,
|
|
nome VARCHAR(100), -- e.g. "Salão Principal"
|
|
imagem_url TEXT,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Marcadores no Mapa (Pins)
|
|
CREATE TABLE IF NOT EXISTS marcadores_mapa (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
mapa_id UUID NOT NULL REFERENCES mapas_eventos(id) ON DELETE CASCADE,
|
|
profissional_id UUID REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
|
|
pos_x NUMERIC(5,2), -- Percentage 0-100
|
|
pos_y NUMERIC(5,2),
|
|
rotulo VARCHAR(50),
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Logística de Transporte (Cars)
|
|
CREATE TABLE IF NOT EXISTS logistica_carros (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
agenda_id UUID NOT NULL REFERENCES agenda(id) ON DELETE CASCADE,
|
|
motorista_id UUID REFERENCES cadastro_profissionais(id) ON DELETE SET NULL, -- Driver is usually a professional
|
|
nome_motorista VARCHAR(255), -- Fallback if not a system professional or just custom name
|
|
horario_chegada VARCHAR(20), -- e.g. "7h00"
|
|
observacoes TEXT,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
|
);
|
|
|
|
-- Passageiros (Passengers in the car)
|
|
CREATE TABLE IF NOT EXISTS logistica_passageiros (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
carro_id UUID NOT NULL REFERENCES logistica_carros(id) ON DELETE CASCADE,
|
|
profissional_id UUID NOT NULL REFERENCES cadastro_profissionais(id) ON DELETE CASCADE,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
UNIQUE(carro_id, profissional_id)
|
|
);
|
|
|
|
-- Codigos de Acesso Table
|
|
CREATE TABLE IF NOT EXISTS codigos_acesso (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
codigo VARCHAR(50) UNIQUE NOT NULL,
|
|
descricao VARCHAR(255),
|
|
validade_dias INT NOT NULL DEFAULT 30,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
expira_em TIMESTAMPTZ NOT NULL,
|
|
ativo BOOLEAN NOT NULL DEFAULT TRUE,
|
|
usos INT NOT NULL DEFAULT 0,
|
|
empresa_id UUID REFERENCES empresas(id) ON DELETE SET NULL,
|
|
regiao CHAR(2) DEFAULT 'SP'
|
|
);
|
|
|
|
-- Financeiro Extrato
|
|
CREATE TABLE IF NOT EXISTS financial_transactions (
|
|
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
|
|
fot_id UUID REFERENCES cadastro_fot(id) ON DELETE SET NULL,
|
|
data_cobranca DATE,
|
|
tipo_evento VARCHAR(100),
|
|
tipo_servico VARCHAR(100),
|
|
professional_name VARCHAR(255),
|
|
whatsapp VARCHAR(50),
|
|
cpf VARCHAR(20),
|
|
tabela_free VARCHAR(50),
|
|
valor_free NUMERIC(10,2) DEFAULT 0,
|
|
valor_extra NUMERIC(10,2) DEFAULT 0,
|
|
descricao_extra TEXT,
|
|
total_pagar NUMERIC(10,2) DEFAULT 0,
|
|
data_pagamento DATE,
|
|
pgto_ok BOOLEAN DEFAULT FALSE,
|
|
criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
profissional_id UUID REFERENCES cadastro_profissionais(id),
|
|
regiao CHAR(2) DEFAULT 'SP'
|
|
);
|
|
|
|
-- Migrations (Idempotent)
|
|
DO $$
|
|
BEGIN
|
|
ALTER TABLE usuarios ADD COLUMN IF NOT EXISTS regioes_permitidas TEXT[] DEFAULT ARRAY['SP'];
|
|
ALTER TABLE cadastro_profissionais ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE cursos ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE empresas ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE anos_formaturas ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE tipos_servicos ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE tipos_eventos ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE precos_tipos_eventos ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE cadastro_fot ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE agenda ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE agenda ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE financial_transactions ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE codigos_acesso ADD COLUMN IF NOT EXISTS regiao CHAR(2) DEFAULT 'SP';
|
|
ALTER TABLE agenda ADD COLUMN IF NOT EXISTS contatos JSONB DEFAULT '[]'::jsonb;
|
|
ALTER TABLE cadastro_profissionais ADD COLUMN IF NOT EXISTS conta VARCHAR(20);
|
|
-- Update permissions for Admins (SuperAdmin and BusinessOwner should see all regions)
|
|
UPDATE usuarios
|
|
SET regioes_permitidas = ARRAY['SP', 'MG']
|
|
WHERE role IN ('SUPERADMIN', 'BUSINESS_OWNER');
|
|
|
|
-- Sanitize data: Ensure no FOT records have empty regions (fixes legacy/bugged data)
|
|
UPDATE cadastro_fot SET regiao = 'SP' WHERE regiao IS NULL OR regiao = '' OR regiao = ' ';
|
|
|
|
EXCEPTION
|
|
WHEN duplicate_column THEN RAISE NOTICE 'column already exists';
|
|
END $$;
|
|
|
|
-- Fix naming constraints for multi-region support (Post-Migration Fixes)
|
|
-- Explicitly drop potentially remaining single-column constraints causing "duplicate key" errors across regions
|
|
|
|
DO $$
|
|
BEGIN
|
|
-- Cursos
|
|
BEGIN
|
|
ALTER TABLE cursos DROP CONSTRAINT IF EXISTS cursos_nome_key;
|
|
ALTER TABLE cursos DROP CONSTRAINT IF EXISTS cursos_nome_regiao_key;
|
|
ALTER TABLE cursos ADD CONSTRAINT cursos_nome_regiao_key UNIQUE (nome, regiao);
|
|
EXCEPTION WHEN others THEN RAISE NOTICE 'Error updating cursos constraints: %', SQLERRM; END;
|
|
|
|
-- Empresas
|
|
BEGIN
|
|
ALTER TABLE empresas DROP CONSTRAINT IF EXISTS empresas_nome_key;
|
|
ALTER TABLE empresas DROP CONSTRAINT IF EXISTS empresas_nome_regiao_key;
|
|
ALTER TABLE empresas ADD CONSTRAINT empresas_nome_regiao_key UNIQUE (nome, regiao);
|
|
EXCEPTION WHEN others THEN RAISE NOTICE 'Error updating empresas constraints: %', SQLERRM; END;
|
|
|
|
-- Anos Formaturas
|
|
BEGIN
|
|
ALTER TABLE anos_formaturas DROP CONSTRAINT IF EXISTS anos_formaturas_ano_semestre_key;
|
|
ALTER TABLE anos_formaturas DROP CONSTRAINT IF EXISTS anos_formaturas_ano_regiao_key;
|
|
ALTER TABLE anos_formaturas ADD CONSTRAINT anos_formaturas_ano_regiao_key UNIQUE (ano_semestre, regiao);
|
|
EXCEPTION WHEN others THEN RAISE NOTICE 'Error updating anos_formaturas constraints: %', SQLERRM; END;
|
|
|
|
-- Tipos Eventos
|
|
BEGIN
|
|
ALTER TABLE tipos_eventos DROP CONSTRAINT IF EXISTS tipos_eventos_nome_key;
|
|
ALTER TABLE tipos_eventos DROP CONSTRAINT IF EXISTS tipos_eventos_nome_regiao_key;
|
|
ALTER TABLE tipos_eventos ADD CONSTRAINT tipos_eventos_nome_regiao_key UNIQUE (nome, regiao);
|
|
EXCEPTION WHEN others THEN RAISE NOTICE 'Error updating tipos_eventos constraints: %', SQLERRM; END;
|
|
|
|
-- Tipos Servicos
|
|
BEGIN
|
|
ALTER TABLE tipos_servicos DROP CONSTRAINT IF EXISTS tipos_servicos_nome_key;
|
|
ALTER TABLE tipos_servicos DROP CONSTRAINT IF EXISTS tipos_servicos_nome_regiao_key;
|
|
ALTER TABLE tipos_servicos ADD CONSTRAINT tipos_servicos_nome_regiao_key UNIQUE (nome, regiao);
|
|
EXCEPTION WHEN others THEN RAISE NOTICE 'Error updating tipos_servicos constraints: %', SQLERRM; END;
|
|
|
|
-- Precos Tipos Eventos (Fix Missing Constraint)
|
|
BEGIN
|
|
ALTER TABLE precos_tipos_eventos DROP CONSTRAINT IF EXISTS precos_tipos_eventos_tipo_evento_id_funcao_profissional_id_key;
|
|
ALTER TABLE precos_tipos_eventos DROP CONSTRAINT IF EXISTS precos_tipos_eventos_unique_regiao;
|
|
ALTER TABLE precos_tipos_eventos ADD CONSTRAINT precos_tipos_eventos_unique_regiao UNIQUE (tipo_evento_id, funcao_profissional_id, regiao);
|
|
EXCEPTION WHEN others THEN RAISE NOTICE 'Error updating precos constraints: %', SQLERRM; END;
|
|
|
|
END $$;
|
|
|
|
-- SEED MG DATA (Clone from SP)
|
|
-- Ensures MG has the same base catalogs as SP
|
|
INSERT INTO cursos (nome, regiao) SELECT nome, 'MG' FROM cursos WHERE regiao = 'SP' ON CONFLICT (nome, regiao) DO NOTHING;
|
|
INSERT INTO anos_formaturas (ano_semestre, regiao) SELECT ano_semestre, 'MG' FROM anos_formaturas WHERE regiao = 'SP' ON CONFLICT (ano_semestre, regiao) DO NOTHING;
|
|
INSERT INTO tipos_eventos (nome, regiao) SELECT nome, 'MG' FROM tipos_eventos WHERE regiao = 'SP' ON CONFLICT (nome, regiao) DO NOTHING;
|
|
INSERT INTO tipos_servicos (nome, regiao) SELECT nome, 'MG' FROM tipos_servicos WHERE regiao = 'SP' ON CONFLICT (nome, regiao) DO NOTHING;
|
|
|
|
-- Seed MG Prices (Specific Values from Spreadsheet)
|
|
DO $$
|
|
DECLARE
|
|
r_mg char(2) := 'MG';
|
|
-- Function IDs
|
|
id_foto uuid;
|
|
id_cine uuid;
|
|
id_recep uuid;
|
|
-- Event IDs
|
|
id_evt uuid;
|
|
BEGIN
|
|
-- Get Function IDs (Assuming they are global/shared or same name)
|
|
SELECT id INTO id_foto FROM funcoes_profissionais WHERE nome = 'Fotógrafo';
|
|
SELECT id INTO id_cine FROM funcoes_profissionais WHERE nome = 'Cinegrafista';
|
|
SELECT id INTO id_recep FROM funcoes_profissionais WHERE nome = 'Recepcionista';
|
|
|
|
-- Helper temp table for data
|
|
CREATE TEMP TABLE tmp_prices (
|
|
evento text,
|
|
p_recep numeric,
|
|
p_cine numeric,
|
|
p_foto numeric
|
|
) ON COMMIT DROP;
|
|
|
|
INSERT INTO tmp_prices VALUES
|
|
('Identificação', 120, 0, 250),
|
|
('Baile', 150, 450, 350),
|
|
('Colação', 150, 380, 280),
|
|
('Col/Baile (mesmo local)', 130, 500, 350),
|
|
('Col/Baile (local diferente)', 140, 600, 400),
|
|
('Missa / Culto', 110, 380, 230),
|
|
('Churrasco', 90, 450, 200),
|
|
('Trote', 60, 380, 200),
|
|
('Outro', 0, 0, 300),
|
|
('Balada', 110, 440, 250),
|
|
('Jantar', 110, 440, 300),
|
|
('Festa Junina', 0, 0, 200),
|
|
('Colação Oficial', 110, 440, 270),
|
|
('Family Day', 210, 800, 700);
|
|
|
|
-- Insert/Update Prices
|
|
FOR id_evt, id_foto, id_cine, id_recep IN
|
|
SELECT te.id, id_foto, id_cine, id_recep
|
|
FROM tipos_eventos te
|
|
WHERE te.regiao = r_mg
|
|
LOOP
|
|
-- Logic to insert per event type matches
|
|
END LOOP;
|
|
|
|
-- Better approach: Loop through temp table
|
|
FOR id_evt IN SELECT id FROM tipos_eventos WHERE regiao = r_mg LOOP
|
|
-- We need to join with tmp_prices based on name
|
|
END LOOP;
|
|
|
|
-- Direct Insert
|
|
INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor, regiao)
|
|
SELECT te.id, id_recep, tp.p_recep, r_mg
|
|
FROM tmp_prices tp
|
|
JOIN tipos_eventos te ON te.nome = tp.evento AND te.regiao = r_mg
|
|
ON CONFLICT (tipo_evento_id, funcao_profissional_id, regiao)
|
|
DO UPDATE SET valor = EXCLUDED.valor;
|
|
|
|
INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor, regiao)
|
|
SELECT te.id, id_cine, tp.p_cine, r_mg
|
|
FROM tmp_prices tp
|
|
JOIN tipos_eventos te ON te.nome = tp.evento AND te.regiao = r_mg
|
|
ON CONFLICT (tipo_evento_id, funcao_profissional_id, regiao)
|
|
DO UPDATE SET valor = EXCLUDED.valor;
|
|
|
|
INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor, regiao)
|
|
SELECT te.id, id_foto, tp.p_foto, r_mg
|
|
FROM tmp_prices tp
|
|
JOIN tipos_eventos te ON te.nome = tp.evento AND te.regiao = r_mg
|
|
ON CONFLICT (tipo_evento_id, funcao_profissional_id, regiao)
|
|
DO UPDATE SET valor = EXCLUDED.valor;
|
|
|
|
END $$;
|
|
|
|
-- Migration 019: Add Coordinator Column
|
|
ALTER TABLE agenda_profissionais ADD COLUMN IF NOT EXISTS is_coordinator BOOLEAN DEFAULT FALSE;
|
|
|
|
-- Migration 020: Add Finalizada Column to FOT
|
|
ALTER TABLE cadastro_fot ADD COLUMN IF NOT EXISTS finalizada BOOLEAN DEFAULT FALSE;
|
|
|
|
-- Migration 021: Add Horario Fim
|
|
ALTER TABLE agenda ADD COLUMN IF NOT EXISTS horario_fim VARCHAR(20);
|