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);