photum/backend/internal/db/queries/profissionais.sql
NANDO9322 e78de535c1 feat: implementação do financeiro e suporte a múltiplas funções
Este commit introduz o módulo financeiro completo e refatora o sistema de profissionais para suportar múltiplas funções, corrigindo a contabilização e validação de equipes.

Principais alterações:

- **Módulo Financeiro:**
  - Criação da tabela `financial_transactions` e queries associadas.
  - Implementação do backend (Handler/Service) para gerenciar transações.
  - Nova página [Finance.tsx](cci:7://file:///c:/Projetos/photum/frontend/pages/Finance.tsx:0:0-0:0) com listagem, edição, filtros avançados e agrupamento por FOT.
  - Correção na busca de FOTs e formatação de datas.

- **Gestão de Equipe e Profissionais:**
  - Refatoração para suportar múltiplas funções por profissional (Backend & Frontend).
  - Atualização do [Dashboard](cci:1://file:///c:/Projetos/photum/frontend/pages/Dashboard.tsx:31:0-1663:2) e [EventTable](cci:1://file:///c:/Projetos/photum/frontend/components/EventTable.tsx:28:0-659:2) para contabilizar corretamente profissionais (Fotografo, Cinegrafista, Recepcionista) verificando a lista de funções.
  - Implementação de validação de cota no aceite de convites (bloqueia se a equipe da função específica já estiver completa).
  - Ajuste visual nos indicadores de "Equipe Completa" e contadores de faltantes na listagem de eventos.

- **Geral:**
  - Atualização da documentação Swagger.
  - Ajustes de tipagem e migrações de banco de dados.
2026-01-15 18:07:39 -03:00

133 lines
4 KiB
SQL

-- name: CreateProfissional :one
INSERT INTO cadastro_profissionais (
usuario_id, nome, funcao_profissional_id, endereco, cidade, uf, whatsapp,
cpf_cnpj_titular, banco, agencia, conta_pix, carro_disponivel,
tem_estudio, qtd_estudio, tipo_cartao, observacao, qual_tec,
educacao_simpatia, desempenho_evento, disp_horario, media,
tabela_free, extra_por_equipamento, equipamentos, email, avatar_url
) VALUES (
$1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15,
$16, $17, $18, $19, $20, $21, $22, $23, $24, $25, $26
) RETURNING *;
-- name: GetProfissionalByUsuarioID :one
SELECT p.*,
COALESCE(
(SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
FROM profissionais_funcoes_junction pfj
JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
WHERE pfj.profissional_id = p.id
), '[]'::json
) as functions
FROM cadastro_profissionais p
WHERE p.usuario_id = $1 LIMIT 1;
-- name: GetProfissionalByID :one
SELECT p.*,
COALESCE(
(SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
FROM profissionais_funcoes_junction pfj
JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
WHERE pfj.profissional_id = p.id
), '[]'::json
) as functions
FROM cadastro_profissionais p
WHERE p.id = $1 LIMIT 1;
-- name: ListProfissionais :many
SELECT p.*, u.email as usuario_email,
COALESCE(
(SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
FROM profissionais_funcoes_junction pfj
JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
WHERE pfj.profissional_id = p.id
), '[]'::json
) as functions
FROM cadastro_profissionais p
LEFT JOIN usuarios u ON p.usuario_id = u.id
ORDER BY p.nome;
-- name: UpdateProfissional :one
UPDATE cadastro_profissionais
SET
nome = $2,
funcao_profissional_id = $3,
endereco = $4,
cidade = $5,
uf = $6,
whatsapp = $7,
cpf_cnpj_titular = $8,
banco = $9,
agencia = $10,
conta_pix = $11,
carro_disponivel = $12,
tem_estudio = $13,
qtd_estudio = $14,
tipo_cartao = $15,
observacao = $16,
qual_tec = $17,
educacao_simpatia = $18,
desempenho_evento = $19,
disp_horario = $20,
media = $21,
tabela_free = $22,
extra_por_equipamento = $23,
equipamentos = $24,
avatar_url = $25,
email = $26,
atualizado_em = NOW()
WHERE id = $1
RETURNING *;
-- name: DeleteProfissional :exec
DELETE FROM cadastro_profissionais
WHERE id = $1;
-- name: SearchProfissionais :many
SELECT p.*,
COALESCE(
(SELECT json_agg(json_build_object('id', f.id, 'nome', f.nome))
FROM profissionais_funcoes_junction pfj
JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
WHERE pfj.profissional_id = p.id
), '[]'::json
) as functions
FROM cadastro_profissionais p
WHERE p.nome ILIKE '%' || $1 || '%'
ORDER BY p.nome
LIMIT 20;
-- name: SearchProfissionaisByFunction :many
SELECT p.*,
COALESCE(
(SELECT json_agg(json_build_object('id', f2.id, 'nome', f2.nome))
FROM profissionais_funcoes_junction pfj2
JOIN funcoes_profissionais f2 ON pfj2.funcao_id = f2.id
WHERE pfj2.profissional_id = p.id
), '[]'::json
) as functions
FROM cadastro_profissionais p
WHERE (p.nome ILIKE '%' || $1 || '%')
AND (
EXISTS (
SELECT 1
FROM profissionais_funcoes_junction pfj
JOIN funcoes_profissionais f ON pfj.funcao_id = f.id
WHERE pfj.profissional_id = p.id AND f.nome = $2
)
OR
p.funcao_profissional_id = (SELECT id FROM funcoes_profissionais WHERE nome = $2 LIMIT 1)
)
ORDER BY p.nome
LIMIT 20;
-- name: AddFunctionToProfessional :exec
INSERT INTO profissionais_funcoes_junction (profissional_id, funcao_id)
VALUES ($1, $2)
ON CONFLICT DO NOTHING;
-- name: ClearProfessionalFunctions :exec
DELETE FROM profissionais_funcoes_junction WHERE profissional_id = $1;
-- name: DeleteProfessionalFunctions :exec
DELETE FROM profissionais_funcoes_junction WHERE profissional_id = $1;