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() ); 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') 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), cpf_cnpj_titular VARCHAR(20), banco VARCHAR(100), agencia 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), avatar_url VARCHAR(255), criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(), atualizado_em TIMESTAMPTZ NOT NULL DEFAULT NOW() ); 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) UNIQUE NOT NULL, criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW() ); 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 (nome) DO NOTHING; -- Empresas Table CREATE TABLE IF NOT EXISTS empresas ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), nome VARCHAR(100) UNIQUE NOT NULL, criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW() ); 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 (nome) DO NOTHING; -- Anos Formaturas Table CREATE TABLE IF NOT EXISTS anos_formaturas ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), ano_semestre VARCHAR(20) UNIQUE NOT NULL, -- Ex: 2019.2 criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW() ); 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 (ano_semestre) DO NOTHING; -- Tipos Servicos Table CREATE TABLE IF NOT EXISTS tipos_servicos ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), nome VARCHAR(50) UNIQUE NOT NULL, criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW() ); INSERT INTO tipos_servicos (nome) VALUES ('Fotógrafo'), ('Recepcionista'), ('Cinegrafista'), ('Coordenação'), ('Ponto de Foto'), ('Ponto de ID'), ('Estúdio'), ('Outro'), ('Controle') ON CONFLICT (nome) DO NOTHING; -- Tipos Eventos Table CREATE TABLE IF NOT EXISTS tipos_eventos ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), nome VARCHAR(100) UNIQUE NOT NULL, criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW() ); 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 (nome) 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, criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(tipo_evento_id, funcao_profissional_id) ); -- Cadastro FOT CREATE TABLE IF NOT EXISTS cadastro_fot ( id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), fot INTEGER 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(10, 2), pre_venda BOOLEAN, created_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP WITH TIME ZONE DEFAULT CURRENT_TIMESTAMP ); -- Seed Pricing Data DO $$ DECLARE -- IDs for Functions id_foto UUID; id_cine UUID; id_recep UUID; -- IDs for Events id_identificacao UUID; id_baile UUID; id_colacao UUID; id_col_baile_mesmo UUID; id_col_baile_dif UUID; id_missa UUID; id_churrasco UUID; id_trote UUID; id_outro UUID; id_balada UUID; id_jantar UUID; id_festa_junina UUID; id_colacao_oficial UUID; id_family_day UUID; id_refeicao UUID; id_estudio_id UUID; id_estudio_col UUID; BEGIN -- Fetch Function IDs 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'; -- Fetch Event IDs SELECT id INTO id_identificacao FROM tipos_eventos WHERE nome = 'Identificação'; SELECT id INTO id_baile FROM tipos_eventos WHERE nome = 'Baile'; SELECT id INTO id_colacao FROM tipos_eventos WHERE nome = 'Colação'; SELECT id INTO id_col_baile_mesmo FROM tipos_eventos WHERE nome = 'Col/Baile (mesmo local)'; SELECT id INTO id_col_baile_dif FROM tipos_eventos WHERE nome = 'Col/Baile (local diferente)'; SELECT id INTO id_missa FROM tipos_eventos WHERE nome = 'Missa / Culto'; SELECT id INTO id_churrasco FROM tipos_eventos WHERE nome = 'Churrasco'; SELECT id INTO id_trote FROM tipos_eventos WHERE nome = 'Trote'; SELECT id INTO id_outro FROM tipos_eventos WHERE nome = 'Outro'; SELECT id INTO id_balada FROM tipos_eventos WHERE nome = 'Balada'; SELECT id INTO id_jantar FROM tipos_eventos WHERE nome = 'Jantar'; SELECT id INTO id_festa_junina FROM tipos_eventos WHERE nome = 'Festa Junina'; SELECT id INTO id_colacao_oficial FROM tipos_eventos WHERE nome = 'Colação Oficial'; SELECT id INTO id_family_day FROM tipos_eventos WHERE nome = 'Family Day'; SELECT id INTO id_refeicao FROM tipos_eventos WHERE nome = 'Refeição'; SELECT id INTO id_estudio_id FROM tipos_eventos WHERE nome = 'Estudio ID e Family Day'; SELECT id INTO id_estudio_col FROM tipos_eventos WHERE nome = 'Estudio Colação / Baile'; -- Helper temp table for inserts to keep code clean? No, direct inserts are clearer. -- Identificação: Rec 90, Foto 160 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_identificacao, id_recep, 90.00), (id_identificacao, id_foto, 160.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Baile: Rec 115, Cin 450, Foto 310 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_baile, id_recep, 115.00), (id_baile, id_cine, 450.00), (id_baile, id_foto, 310.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Colação: Rec 115, Cin 450, Foto 280 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_colacao, id_recep, 115.00), (id_colacao, id_cine, 450.00), (id_colacao, id_foto, 280.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Col/Baile (mesmo local): Rec 140, Cin 510, Foto 350 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_col_baile_mesmo, id_recep, 140.00), (id_col_baile_mesmo, id_cine, 510.00), (id_col_baile_mesmo, id_foto, 350.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Col/Baile (local diferente): Rec 150, Cin 610, Foto 390 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_col_baile_dif, id_recep, 150.00), (id_col_baile_dif, id_cine, 610.00), (id_col_baile_dif, id_foto, 390.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Missa / Culto: Rec 115, Cin 440, Foto 230 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_missa, id_recep, 115.00), (id_missa, id_cine, 440.00), (id_missa, id_foto, 230.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Churrasco: Rec 90, Cin 440, Foto 250 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_churrasco, id_recep, 90.00), (id_churrasco, id_cine, 440.00), (id_churrasco, id_foto, 250.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Trote: Rec 70, Foto 100 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_trote, id_recep, 70.00), (id_trote, id_foto, 100.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Outro: Foto 250 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_outro, id_foto, 250.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Balada: Rec 115, Cin 440, Foto 250 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_balada, id_recep, 115.00), (id_balada, id_cine, 440.00), (id_balada, id_foto, 250.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Jantar: Rec 115, Cin 440, Foto 310 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_jantar, id_recep, 115.00), (id_jantar, id_cine, 440.00), (id_jantar, id_foto, 310.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Festa Junina: Foto 200 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_festa_junina, id_foto, 200.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Colação Oficial: Rec 115, Cin 450, Foto 280 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_colacao_oficial, id_recep, 115.00), (id_colacao_oficial, id_cine, 450.00), (id_colacao_oficial, id_foto, 280.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Family Day: Rec 210, Cin 670, Foto 490 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_family_day, id_recep, 210.00), (id_family_day, id_cine, 670.00), (id_family_day, id_foto, 490.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Refeição: Rec 35 (Assuming Rec column corresponds to Refeição cost based on position, or just mapping single value) INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_refeicao, id_recep, 35.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Estudio ID e Family Day: Rec 80 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_estudio_id, id_recep, 80.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; -- Estudio Colação / Baile: Rec 50 INSERT INTO precos_tipos_eventos (tipo_evento_id, funcao_profissional_id, valor) VALUES (id_estudio_col, id_recep, 50.00) ON CONFLICT (tipo_evento_id, funcao_profissional_id) DO UPDATE SET valor = EXCLUDED.valor; END $$; -- 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) ); -- 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), 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 ); 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, criado_em TIMESTAMPTZ NOT NULL DEFAULT NOW(), UNIQUE(agenda_id, profissional_id) ); ALTER TABLE agenda_profissionais ADD COLUMN IF NOT EXISTS posicao VARCHAR(100); 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) );