- Destaque em azul para pré-venda na grid. - Filtros por status (Pré-venda/Finalizada) no Dashboard. - Badges de status nos detalhes do evento. - Ajustes no backend para expor campo `pre_venda` da FOT.
258 lines
No EOL
7 KiB
SQL
258 lines
No EOL
7 KiB
SQL
-- name: CreateAgenda :one
|
|
INSERT INTO agenda (
|
|
fot_id,
|
|
data_evento,
|
|
tipo_evento_id,
|
|
observacoes_evento,
|
|
local_evento,
|
|
endereco,
|
|
horario,
|
|
qtd_formandos,
|
|
qtd_fotografos,
|
|
qtd_recepcionistas,
|
|
qtd_cinegrafistas,
|
|
qtd_estudios,
|
|
qtd_ponto_foto,
|
|
qtd_ponto_id,
|
|
qtd_ponto_decorado,
|
|
qtd_pontos_led,
|
|
qtd_plataforma_360,
|
|
status_profissionais,
|
|
foto_faltante,
|
|
recep_faltante,
|
|
cine_faltante,
|
|
logistica_observacoes,
|
|
pre_venda,
|
|
user_id,
|
|
regiao,
|
|
contatos
|
|
) 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, @regiao, $25
|
|
) RETURNING *;
|
|
|
|
-- name: GetAgenda :one
|
|
SELECT * FROM agenda
|
|
WHERE id = $1 AND regiao = @regiao LIMIT 1;
|
|
|
|
-- name: ListAgendas :many
|
|
SELECT
|
|
a.*,
|
|
cf.fot as fot_numero,
|
|
cf.instituicao,
|
|
c.nome as curso_nome,
|
|
e.nome as empresa_nome,
|
|
af.ano_semestre,
|
|
cf.observacoes as observacoes_fot,
|
|
te.nome as tipo_evento_nome,
|
|
cf.empresa_id,
|
|
cf.finalizada as fot_finalizada,
|
|
cf.pre_venda as fot_pre_venda,
|
|
COALESCE(
|
|
(SELECT json_agg(json_build_object(
|
|
'professional_id', ap.profissional_id,
|
|
'status', ap.status,
|
|
'motivo_rejeicao', ap.motivo_rejeicao,
|
|
'funcao_id', ap.funcao_id,
|
|
'is_coordinator', ap.is_coordinator
|
|
))
|
|
FROM agenda_profissionais ap
|
|
WHERE ap.agenda_id = a.id),
|
|
'[]'::json
|
|
) as assigned_professionals
|
|
FROM agenda a
|
|
JOIN cadastro_fot cf ON a.fot_id = cf.id
|
|
JOIN cursos c ON cf.curso_id = c.id
|
|
JOIN empresas e ON cf.empresa_id = e.id
|
|
JOIN anos_formaturas af ON cf.ano_formatura_id = af.id
|
|
JOIN tipos_eventos te ON a.tipo_evento_id = te.id
|
|
WHERE a.regiao = @regiao
|
|
ORDER BY a.data_evento;
|
|
|
|
-- name: ListAgendasByUser :many
|
|
SELECT
|
|
a.*,
|
|
cf.fot as fot_numero,
|
|
cf.instituicao,
|
|
c.nome as curso_nome,
|
|
e.nome as empresa_nome,
|
|
af.ano_semestre,
|
|
cf.observacoes as observacoes_fot,
|
|
te.nome as tipo_evento_nome,
|
|
cf.empresa_id,
|
|
cf.finalizada as fot_finalizada,
|
|
cf.pre_venda as fot_pre_venda,
|
|
COALESCE(
|
|
(SELECT json_agg(json_build_object(
|
|
'professional_id', ap.profissional_id,
|
|
'status', ap.status,
|
|
'motivo_rejeicao', ap.motivo_rejeicao,
|
|
'funcao_id', ap.funcao_id,
|
|
'is_coordinator', ap.is_coordinator
|
|
))
|
|
FROM agenda_profissionais ap
|
|
WHERE ap.agenda_id = a.id),
|
|
'[]'::json
|
|
) as assigned_professionals
|
|
FROM agenda a
|
|
JOIN cadastro_fot cf ON a.fot_id = cf.id
|
|
JOIN cursos c ON cf.curso_id = c.id
|
|
JOIN empresas e ON cf.empresa_id = e.id
|
|
JOIN anos_formaturas af ON cf.ano_formatura_id = af.id
|
|
JOIN tipos_eventos te ON a.tipo_evento_id = te.id
|
|
WHERE a.user_id = $1 AND a.regiao = @regiao
|
|
ORDER BY a.data_evento;
|
|
|
|
-- name: UpdateAgenda :one
|
|
UPDATE agenda
|
|
SET
|
|
fot_id = $2,
|
|
data_evento = $3,
|
|
tipo_evento_id = $4,
|
|
observacoes_evento = $5,
|
|
local_evento = $6,
|
|
endereco = $7,
|
|
horario = $8,
|
|
qtd_formandos = $9,
|
|
qtd_fotografos = $10,
|
|
qtd_recepcionistas = $11,
|
|
qtd_cinegrafistas = $12,
|
|
qtd_estudios = $13,
|
|
qtd_ponto_foto = $14,
|
|
qtd_ponto_id = $15,
|
|
qtd_ponto_decorado = $16,
|
|
qtd_pontos_led = $17,
|
|
qtd_plataforma_360 = $18,
|
|
status_profissionais = $19,
|
|
foto_faltante = $20,
|
|
recep_faltante = $21,
|
|
cine_faltante = $22,
|
|
logistica_observacoes = $23,
|
|
pre_venda = $24,
|
|
contatos = $25,
|
|
atualizado_em = NOW()
|
|
WHERE id = $1 AND regiao = @regiao
|
|
RETURNING *;
|
|
|
|
-- name: DeleteAgenda :exec
|
|
DELETE FROM agenda
|
|
WHERE id = $1 AND regiao = @regiao;
|
|
|
|
-- name: AssignProfessional :exec
|
|
INSERT INTO agenda_profissionais (agenda_id, profissional_id, funcao_id)
|
|
VALUES ($1, $2, $3)
|
|
ON CONFLICT (agenda_id, profissional_id) DO UPDATE
|
|
SET funcao_id = EXCLUDED.funcao_id;
|
|
|
|
-- name: RemoveProfessional :exec
|
|
DELETE FROM agenda_profissionais
|
|
WHERE agenda_id = $1 AND profissional_id = $2;
|
|
|
|
-- name: GetAgendaProfessionals :many
|
|
SELECT p.*, f.nome as funcao_nome, u.email
|
|
FROM cadastro_profissionais p
|
|
JOIN agenda_profissionais ap ON p.id = ap.profissional_id
|
|
LEFT JOIN funcoes_profissionais f ON p.funcao_profissional_id = f.id
|
|
LEFT JOIN usuarios u ON p.usuario_id = u.id
|
|
WHERE ap.agenda_id = $1;
|
|
|
|
-- name: UpdateAgendaStatus :one
|
|
UPDATE agenda
|
|
SET status = $2, atualizado_em = NOW()
|
|
WHERE id = $1 AND regiao = @regiao
|
|
RETURNING *;
|
|
|
|
-- name: UpdateAssignmentStatus :one
|
|
UPDATE agenda_profissionais
|
|
SET status = $3, motivo_rejeicao = $4
|
|
WHERE agenda_id = $1 AND profissional_id = $2
|
|
RETURNING *;
|
|
|
|
-- name: UpdateAssignmentPosition :one
|
|
UPDATE agenda_profissionais
|
|
SET posicao = $3
|
|
WHERE agenda_id = $1 AND profissional_id = $2
|
|
RETURNING *;
|
|
|
|
-- name: ListAvailableProfessionalsForDate :many
|
|
SELECT
|
|
p.*,
|
|
u.email,
|
|
f.nome as funcao_nome,
|
|
dp.status as status_disponibilidade
|
|
FROM cadastro_profissionais p
|
|
JOIN usuarios u ON p.usuario_id = u.id
|
|
JOIN funcoes_profissionais f ON p.funcao_profissional_id = f.id
|
|
JOIN disponibilidade_profissionais dp ON u.id = dp.usuario_id
|
|
WHERE dp.data = $1
|
|
AND dp.status = 'DISPONIVEL'
|
|
AND p.regiao = @regiao
|
|
AND p.id NOT IN (
|
|
SELECT ap.profissional_id
|
|
FROM agenda_profissionais ap
|
|
JOIN agenda a ON ap.agenda_id = a.id
|
|
WHERE a.data_evento = $1
|
|
AND ap.status = 'ACEITO'
|
|
)
|
|
ORDER BY p.nome;
|
|
|
|
-- name: CheckProfessionalBusyDate :many
|
|
SELECT a.id, a.horario, ap.status
|
|
FROM agenda_profissionais ap
|
|
JOIN agenda a ON ap.agenda_id = a.id
|
|
WHERE ap.profissional_id = $1
|
|
AND a.data_evento = $2
|
|
AND ap.status = 'ACEITO'
|
|
AND a.id != $3;
|
|
|
|
-- name: ListAgendasByFot :many
|
|
SELECT
|
|
a.*,
|
|
te.nome as tipo_evento_nome
|
|
FROM agenda a
|
|
JOIN tipos_eventos te ON a.tipo_evento_id = te.id
|
|
WHERE a.fot_id = $1 AND a.regiao = @regiao
|
|
ORDER BY a.data_evento;
|
|
|
|
-- name: GetAgendaByFotDataTipo :one
|
|
SELECT * FROM agenda
|
|
WHERE fot_id = $1 AND data_evento = $2 AND tipo_evento_id = $3 AND regiao = @regiao
|
|
LIMIT 1;
|
|
|
|
-- name: ListAgendasByCompany :many
|
|
SELECT
|
|
a.*,
|
|
cf.fot as fot_numero,
|
|
cf.instituicao,
|
|
c.nome as curso_nome,
|
|
e.nome as empresa_nome,
|
|
af.ano_semestre,
|
|
cf.observacoes as observacoes_fot,
|
|
te.nome as tipo_evento_nome,
|
|
cf.empresa_id,
|
|
cf.finalizada as fot_finalizada,
|
|
cf.pre_venda as fot_pre_venda,
|
|
COALESCE(
|
|
(SELECT json_agg(json_build_object(
|
|
'professional_id', ap.profissional_id,
|
|
'status', ap.status,
|
|
'motivo_rejeicao', ap.motivo_rejeicao,
|
|
'funcao_id', ap.funcao_id,
|
|
'is_coordinator', ap.is_coordinator
|
|
))
|
|
FROM agenda_profissionais ap
|
|
WHERE ap.agenda_id = a.id),
|
|
'[]'::json
|
|
) as assigned_professionals
|
|
FROM agenda a
|
|
JOIN cadastro_fot cf ON a.fot_id = cf.id
|
|
JOIN cursos c ON cf.curso_id = c.id
|
|
JOIN empresas e ON cf.empresa_id = e.id
|
|
JOIN anos_formaturas af ON cf.ano_formatura_id = af.id
|
|
JOIN tipos_eventos te ON a.tipo_evento_id = te.id
|
|
WHERE cf.empresa_id = $1 AND a.regiao = @regiao
|
|
ORDER BY a.data_evento;
|
|
|
|
-- name: SetCoordinator :exec
|
|
UPDATE agenda_profissionais
|
|
SET is_coordinator = $3
|
|
WHERE agenda_id = $1 AND profissional_id = $2; |