Merge pull request #56 from rede5/melhoria-no-conflito-de-agendas-sobreposicao-de-tempo-e-adicao-de-horario-de-termino-11362854289
Implementação do recurso de **Horário de Término** para os Eventos e a reformulação do algoritmo de **Verificação de Conflitos na Escala de Equipe**
This commit is contained in:
commit
2c6891b7ed
14 changed files with 131 additions and 59 deletions
|
|
@ -3244,6 +3244,9 @@ const docTemplate = `{
|
||||||
"horario": {
|
"horario": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"horario_fim": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"local_evento": {
|
"local_evento": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -3238,6 +3238,9 @@
|
||||||
"horario": {
|
"horario": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
"horario_fim": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
"local_evento": {
|
"local_evento": {
|
||||||
"type": "string"
|
"type": "string"
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -27,6 +27,8 @@ definitions:
|
||||||
type: integer
|
type: integer
|
||||||
horario:
|
horario:
|
||||||
type: string
|
type: string
|
||||||
|
horario_fim:
|
||||||
|
type: string
|
||||||
local_evento:
|
local_evento:
|
||||||
type: string
|
type: string
|
||||||
logistica_observacoes:
|
logistica_observacoes:
|
||||||
|
|
|
||||||
|
|
@ -50,6 +50,7 @@ type CreateAgendaRequest struct {
|
||||||
LocalEvento string `json:"local_evento"`
|
LocalEvento string `json:"local_evento"`
|
||||||
Endereco string `json:"endereco"`
|
Endereco string `json:"endereco"`
|
||||||
Horario string `json:"horario"`
|
Horario string `json:"horario"`
|
||||||
|
HorarioFim string `json:"horario_fim"`
|
||||||
QtdFormandos int32 `json:"qtd_formandos"`
|
QtdFormandos int32 `json:"qtd_formandos"`
|
||||||
QtdFotografos int32 `json:"qtd_fotografos"`
|
QtdFotografos int32 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas int32 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas int32 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -125,6 +126,7 @@ func (s *Service) Create(ctx context.Context, userID uuid.UUID, req CreateAgenda
|
||||||
LocalEvento: pgtype.Text{String: req.LocalEvento, Valid: req.LocalEvento != ""},
|
LocalEvento: pgtype.Text{String: req.LocalEvento, Valid: req.LocalEvento != ""},
|
||||||
Endereco: pgtype.Text{String: req.Endereco, Valid: req.Endereco != ""},
|
Endereco: pgtype.Text{String: req.Endereco, Valid: req.Endereco != ""},
|
||||||
Horario: pgtype.Text{String: req.Horario, Valid: req.Horario != ""},
|
Horario: pgtype.Text{String: req.Horario, Valid: req.Horario != ""},
|
||||||
|
HorarioFim: pgtype.Text{String: req.HorarioFim, Valid: req.HorarioFim != ""},
|
||||||
QtdFormandos: pgtype.Int4{Int32: req.QtdFormandos, Valid: true},
|
QtdFormandos: pgtype.Int4{Int32: req.QtdFormandos, Valid: true},
|
||||||
QtdFotografos: pgtype.Int4{Int32: req.QtdFotografos, Valid: true},
|
QtdFotografos: pgtype.Int4{Int32: req.QtdFotografos, Valid: true},
|
||||||
QtdRecepcionistas: pgtype.Int4{Int32: req.QtdRecepcionistas, Valid: true},
|
QtdRecepcionistas: pgtype.Int4{Int32: req.QtdRecepcionistas, Valid: true},
|
||||||
|
|
@ -185,6 +187,7 @@ func (s *Service) List(ctx context.Context, userID uuid.UUID, role string, regia
|
||||||
LocalEvento: r.LocalEvento,
|
LocalEvento: r.LocalEvento,
|
||||||
Endereco: r.Endereco,
|
Endereco: r.Endereco,
|
||||||
Horario: r.Horario,
|
Horario: r.Horario,
|
||||||
|
HorarioFim: r.HorarioFim,
|
||||||
QtdFormandos: r.QtdFormandos,
|
QtdFormandos: r.QtdFormandos,
|
||||||
QtdFotografos: r.QtdFotografos,
|
QtdFotografos: r.QtdFotografos,
|
||||||
QtdRecepcionistas: r.QtdRecepcionistas,
|
QtdRecepcionistas: r.QtdRecepcionistas,
|
||||||
|
|
@ -304,6 +307,7 @@ func (s *Service) Update(ctx context.Context, id uuid.UUID, req CreateAgendaRequ
|
||||||
LocalEvento: pgtype.Text{String: req.LocalEvento, Valid: req.LocalEvento != ""},
|
LocalEvento: pgtype.Text{String: req.LocalEvento, Valid: req.LocalEvento != ""},
|
||||||
Endereco: pgtype.Text{String: req.Endereco, Valid: req.Endereco != ""},
|
Endereco: pgtype.Text{String: req.Endereco, Valid: req.Endereco != ""},
|
||||||
Horario: pgtype.Text{String: req.Horario, Valid: req.Horario != ""},
|
Horario: pgtype.Text{String: req.Horario, Valid: req.Horario != ""},
|
||||||
|
HorarioFim: pgtype.Text{String: req.HorarioFim, Valid: req.HorarioFim != ""},
|
||||||
QtdFormandos: pgtype.Int4{Int32: req.QtdFormandos, Valid: true},
|
QtdFormandos: pgtype.Int4{Int32: req.QtdFormandos, Valid: true},
|
||||||
QtdFotografos: pgtype.Int4{Int32: req.QtdFotografos, Valid: true},
|
QtdFotografos: pgtype.Int4{Int32: req.QtdFotografos, Valid: true},
|
||||||
QtdRecepcionistas: pgtype.Int4{Int32: req.QtdRecepcionistas, Valid: true},
|
QtdRecepcionistas: pgtype.Int4{Int32: req.QtdRecepcionistas, Valid: true},
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ func (q *Queries) AssignProfessional(ctx context.Context, arg AssignProfessional
|
||||||
}
|
}
|
||||||
|
|
||||||
const checkProfessionalBusyDate = `-- name: CheckProfessionalBusyDate :many
|
const checkProfessionalBusyDate = `-- name: CheckProfessionalBusyDate :many
|
||||||
SELECT a.id, a.horario, ap.status
|
SELECT a.id, a.horario, a.horario_fim, ap.status
|
||||||
FROM agenda_profissionais ap
|
FROM agenda_profissionais ap
|
||||||
JOIN agenda a ON ap.agenda_id = a.id
|
JOIN agenda a ON ap.agenda_id = a.id
|
||||||
WHERE ap.profissional_id = $1
|
WHERE ap.profissional_id = $1
|
||||||
|
|
@ -46,9 +46,10 @@ type CheckProfessionalBusyDateParams struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
type CheckProfessionalBusyDateRow struct {
|
type CheckProfessionalBusyDateRow struct {
|
||||||
ID pgtype.UUID `json:"id"`
|
ID pgtype.UUID `json:"id"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
Status pgtype.Text `json:"status"`
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
|
Status pgtype.Text `json:"status"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (q *Queries) CheckProfessionalBusyDate(ctx context.Context, arg CheckProfessionalBusyDateParams) ([]CheckProfessionalBusyDateRow, error) {
|
func (q *Queries) CheckProfessionalBusyDate(ctx context.Context, arg CheckProfessionalBusyDateParams) ([]CheckProfessionalBusyDateRow, error) {
|
||||||
|
|
@ -60,7 +61,12 @@ func (q *Queries) CheckProfessionalBusyDate(ctx context.Context, arg CheckProfes
|
||||||
var items []CheckProfessionalBusyDateRow
|
var items []CheckProfessionalBusyDateRow
|
||||||
for rows.Next() {
|
for rows.Next() {
|
||||||
var i CheckProfessionalBusyDateRow
|
var i CheckProfessionalBusyDateRow
|
||||||
if err := rows.Scan(&i.ID, &i.Horario, &i.Status); err != nil {
|
if err := rows.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
|
&i.Status,
|
||||||
|
); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
items = append(items, i)
|
items = append(items, i)
|
||||||
|
|
@ -80,6 +86,7 @@ INSERT INTO agenda (
|
||||||
local_evento,
|
local_evento,
|
||||||
endereco,
|
endereco,
|
||||||
horario,
|
horario,
|
||||||
|
horario_fim,
|
||||||
qtd_formandos,
|
qtd_formandos,
|
||||||
qtd_fotografos,
|
qtd_fotografos,
|
||||||
qtd_recepcionistas,
|
qtd_recepcionistas,
|
||||||
|
|
@ -100,8 +107,8 @@ INSERT INTO agenda (
|
||||||
regiao,
|
regiao,
|
||||||
contatos
|
contatos
|
||||||
) VALUES (
|
) 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, $26, $25
|
$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, $27, $26
|
||||||
) RETURNING id, user_id, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos
|
) RETURNING id, user_id, fot_id, data_evento, tipo_evento_id, observacoes_evento, local_evento, endereco, horario, horario_fim, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos
|
||||||
`
|
`
|
||||||
|
|
||||||
type CreateAgendaParams struct {
|
type CreateAgendaParams struct {
|
||||||
|
|
@ -112,6 +119,7 @@ type CreateAgendaParams struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -142,6 +150,7 @@ func (q *Queries) CreateAgenda(ctx context.Context, arg CreateAgendaParams) (Age
|
||||||
arg.LocalEvento,
|
arg.LocalEvento,
|
||||||
arg.Endereco,
|
arg.Endereco,
|
||||||
arg.Horario,
|
arg.Horario,
|
||||||
|
arg.HorarioFim,
|
||||||
arg.QtdFormandos,
|
arg.QtdFormandos,
|
||||||
arg.QtdFotografos,
|
arg.QtdFotografos,
|
||||||
arg.QtdRecepcionistas,
|
arg.QtdRecepcionistas,
|
||||||
|
|
@ -173,6 +182,7 @@ func (q *Queries) CreateAgenda(ctx context.Context, arg CreateAgendaParams) (Age
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -215,7 +225,7 @@ func (q *Queries) DeleteAgenda(ctx context.Context, arg DeleteAgendaParams) erro
|
||||||
}
|
}
|
||||||
|
|
||||||
const getAgenda = `-- name: GetAgenda :one
|
const getAgenda = `-- name: GetAgenda :one
|
||||||
SELECT id, user_id, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos FROM agenda
|
SELECT id, user_id, fot_id, data_evento, tipo_evento_id, observacoes_evento, local_evento, endereco, horario, horario_fim, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos FROM agenda
|
||||||
WHERE id = $1 AND regiao = $2 LIMIT 1
|
WHERE id = $1 AND regiao = $2 LIMIT 1
|
||||||
`
|
`
|
||||||
|
|
||||||
|
|
@ -237,6 +247,7 @@ func (q *Queries) GetAgenda(ctx context.Context, arg GetAgendaParams) (Agenda, e
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -264,7 +275,7 @@ func (q *Queries) GetAgenda(ctx context.Context, arg GetAgendaParams) (Agenda, e
|
||||||
}
|
}
|
||||||
|
|
||||||
const getAgendaByFotDataTipo = `-- name: GetAgendaByFotDataTipo :one
|
const getAgendaByFotDataTipo = `-- name: GetAgendaByFotDataTipo :one
|
||||||
SELECT id, user_id, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos FROM agenda
|
SELECT id, user_id, fot_id, data_evento, tipo_evento_id, observacoes_evento, local_evento, endereco, horario, horario_fim, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos FROM agenda
|
||||||
WHERE fot_id = $1 AND data_evento = $2 AND tipo_evento_id = $3 AND regiao = $4
|
WHERE fot_id = $1 AND data_evento = $2 AND tipo_evento_id = $3 AND regiao = $4
|
||||||
LIMIT 1
|
LIMIT 1
|
||||||
`
|
`
|
||||||
|
|
@ -294,6 +305,7 @@ func (q *Queries) GetAgendaByFotDataTipo(ctx context.Context, arg GetAgendaByFot
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -456,7 +468,7 @@ func (q *Queries) GetAssignment(ctx context.Context, arg GetAssignmentParams) (A
|
||||||
|
|
||||||
const listAgendas = `-- name: ListAgendas :many
|
const listAgendas = `-- name: ListAgendas :many
|
||||||
SELECT
|
SELECT
|
||||||
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.horario_fim, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
||||||
cf.fot as fot_numero,
|
cf.fot as fot_numero,
|
||||||
cf.instituicao,
|
cf.instituicao,
|
||||||
c.nome as curso_nome,
|
c.nome as curso_nome,
|
||||||
|
|
@ -499,6 +511,7 @@ type ListAgendasRow struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -553,6 +566,7 @@ func (q *Queries) ListAgendas(ctx context.Context, regiao pgtype.Text) ([]ListAg
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -599,7 +613,7 @@ func (q *Queries) ListAgendas(ctx context.Context, regiao pgtype.Text) ([]ListAg
|
||||||
|
|
||||||
const listAgendasByCompany = `-- name: ListAgendasByCompany :many
|
const listAgendasByCompany = `-- name: ListAgendasByCompany :many
|
||||||
SELECT
|
SELECT
|
||||||
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.horario_fim, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
||||||
cf.fot as fot_numero,
|
cf.fot as fot_numero,
|
||||||
cf.instituicao,
|
cf.instituicao,
|
||||||
c.nome as curso_nome,
|
c.nome as curso_nome,
|
||||||
|
|
@ -647,6 +661,7 @@ type ListAgendasByCompanyRow struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -701,6 +716,7 @@ func (q *Queries) ListAgendasByCompany(ctx context.Context, arg ListAgendasByCom
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -747,7 +763,7 @@ func (q *Queries) ListAgendasByCompany(ctx context.Context, arg ListAgendasByCom
|
||||||
|
|
||||||
const listAgendasByFot = `-- name: ListAgendasByFot :many
|
const listAgendasByFot = `-- name: ListAgendasByFot :many
|
||||||
SELECT
|
SELECT
|
||||||
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.horario_fim, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
||||||
te.nome as tipo_evento_nome
|
te.nome as tipo_evento_nome
|
||||||
FROM agenda a
|
FROM agenda a
|
||||||
JOIN tipos_eventos te ON a.tipo_evento_id = te.id
|
JOIN tipos_eventos te ON a.tipo_evento_id = te.id
|
||||||
|
|
@ -770,6 +786,7 @@ type ListAgendasByFotRow struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -814,6 +831,7 @@ func (q *Queries) ListAgendasByFot(ctx context.Context, arg ListAgendasByFotPara
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -850,7 +868,7 @@ func (q *Queries) ListAgendasByFot(ctx context.Context, arg ListAgendasByFotPara
|
||||||
|
|
||||||
const listAgendasByUser = `-- name: ListAgendasByUser :many
|
const listAgendasByUser = `-- name: ListAgendasByUser :many
|
||||||
SELECT
|
SELECT
|
||||||
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
a.id, a.user_id, a.fot_id, a.data_evento, a.tipo_evento_id, a.observacoes_evento, a.local_evento, a.endereco, a.horario, a.horario_fim, a.qtd_formandos, a.qtd_fotografos, a.qtd_recepcionistas, a.qtd_cinegrafistas, a.qtd_estudios, a.qtd_ponto_foto, a.qtd_ponto_id, a.qtd_ponto_decorado, a.qtd_pontos_led, a.qtd_plataforma_360, a.status_profissionais, a.foto_faltante, a.recep_faltante, a.cine_faltante, a.logistica_observacoes, a.pre_venda, a.criado_em, a.atualizado_em, a.status, a.logistica_notificacao_enviada_em, a.regiao, a.contatos,
|
||||||
cf.fot as fot_numero,
|
cf.fot as fot_numero,
|
||||||
cf.instituicao,
|
cf.instituicao,
|
||||||
c.nome as curso_nome,
|
c.nome as curso_nome,
|
||||||
|
|
@ -898,6 +916,7 @@ type ListAgendasByUserRow struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -952,6 +971,7 @@ func (q *Queries) ListAgendasByUser(ctx context.Context, arg ListAgendasByUserPa
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -1166,26 +1186,27 @@ SET
|
||||||
local_evento = $6,
|
local_evento = $6,
|
||||||
endereco = $7,
|
endereco = $7,
|
||||||
horario = $8,
|
horario = $8,
|
||||||
qtd_formandos = $9,
|
horario_fim = $9,
|
||||||
qtd_fotografos = $10,
|
qtd_formandos = $10,
|
||||||
qtd_recepcionistas = $11,
|
qtd_fotografos = $11,
|
||||||
qtd_cinegrafistas = $12,
|
qtd_recepcionistas = $12,
|
||||||
qtd_estudios = $13,
|
qtd_cinegrafistas = $13,
|
||||||
qtd_ponto_foto = $14,
|
qtd_estudios = $14,
|
||||||
qtd_ponto_id = $15,
|
qtd_ponto_foto = $15,
|
||||||
qtd_ponto_decorado = $16,
|
qtd_ponto_id = $16,
|
||||||
qtd_pontos_led = $17,
|
qtd_ponto_decorado = $17,
|
||||||
qtd_plataforma_360 = $18,
|
qtd_pontos_led = $18,
|
||||||
status_profissionais = $19,
|
qtd_plataforma_360 = $19,
|
||||||
foto_faltante = $20,
|
status_profissionais = $20,
|
||||||
recep_faltante = $21,
|
foto_faltante = $21,
|
||||||
cine_faltante = $22,
|
recep_faltante = $22,
|
||||||
logistica_observacoes = $23,
|
cine_faltante = $23,
|
||||||
pre_venda = $24,
|
logistica_observacoes = $24,
|
||||||
contatos = $25,
|
pre_venda = $25,
|
||||||
|
contatos = $26,
|
||||||
atualizado_em = NOW()
|
atualizado_em = NOW()
|
||||||
WHERE id = $1 AND regiao = $26
|
WHERE id = $1 AND regiao = $27
|
||||||
RETURNING id, user_id, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos
|
RETURNING id, user_id, fot_id, data_evento, tipo_evento_id, observacoes_evento, local_evento, endereco, horario, horario_fim, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos
|
||||||
`
|
`
|
||||||
|
|
||||||
type UpdateAgendaParams struct {
|
type UpdateAgendaParams struct {
|
||||||
|
|
@ -1197,6 +1218,7 @@ type UpdateAgendaParams struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
@ -1227,6 +1249,7 @@ func (q *Queries) UpdateAgenda(ctx context.Context, arg UpdateAgendaParams) (Age
|
||||||
arg.LocalEvento,
|
arg.LocalEvento,
|
||||||
arg.Endereco,
|
arg.Endereco,
|
||||||
arg.Horario,
|
arg.Horario,
|
||||||
|
arg.HorarioFim,
|
||||||
arg.QtdFormandos,
|
arg.QtdFormandos,
|
||||||
arg.QtdFotografos,
|
arg.QtdFotografos,
|
||||||
arg.QtdRecepcionistas,
|
arg.QtdRecepcionistas,
|
||||||
|
|
@ -1257,6 +1280,7 @@ func (q *Queries) UpdateAgenda(ctx context.Context, arg UpdateAgendaParams) (Age
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
@ -1287,7 +1311,7 @@ const updateAgendaStatus = `-- name: UpdateAgendaStatus :one
|
||||||
UPDATE agenda
|
UPDATE agenda
|
||||||
SET status = $2, atualizado_em = NOW()
|
SET status = $2, atualizado_em = NOW()
|
||||||
WHERE id = $1 AND regiao = $3
|
WHERE id = $1 AND regiao = $3
|
||||||
RETURNING id, user_id, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos
|
RETURNING id, user_id, fot_id, data_evento, tipo_evento_id, observacoes_evento, local_evento, endereco, horario, horario_fim, 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, criado_em, atualizado_em, status, logistica_notificacao_enviada_em, regiao, contatos
|
||||||
`
|
`
|
||||||
|
|
||||||
type UpdateAgendaStatusParams struct {
|
type UpdateAgendaStatusParams struct {
|
||||||
|
|
@ -1309,6 +1333,7 @@ func (q *Queries) UpdateAgendaStatus(ctx context.Context, arg UpdateAgendaStatus
|
||||||
&i.LocalEvento,
|
&i.LocalEvento,
|
||||||
&i.Endereco,
|
&i.Endereco,
|
||||||
&i.Horario,
|
&i.Horario,
|
||||||
|
&i.HorarioFim,
|
||||||
&i.QtdFormandos,
|
&i.QtdFormandos,
|
||||||
&i.QtdFotografos,
|
&i.QtdFotografos,
|
||||||
&i.QtdRecepcionistas,
|
&i.QtdRecepcionistas,
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,7 @@ type Agenda struct {
|
||||||
LocalEvento pgtype.Text `json:"local_evento"`
|
LocalEvento pgtype.Text `json:"local_evento"`
|
||||||
Endereco pgtype.Text `json:"endereco"`
|
Endereco pgtype.Text `json:"endereco"`
|
||||||
Horario pgtype.Text `json:"horario"`
|
Horario pgtype.Text `json:"horario"`
|
||||||
|
HorarioFim pgtype.Text `json:"horario_fim"`
|
||||||
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
QtdFormandos pgtype.Int4 `json:"qtd_formandos"`
|
||||||
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
QtdFotografos pgtype.Int4 `json:"qtd_fotografos"`
|
||||||
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"`
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1 @@
|
||||||
|
ALTER TABLE agenda ADD COLUMN IF NOT EXISTS horario_fim VARCHAR(20);
|
||||||
|
|
@ -7,6 +7,7 @@ INSERT INTO agenda (
|
||||||
local_evento,
|
local_evento,
|
||||||
endereco,
|
endereco,
|
||||||
horario,
|
horario,
|
||||||
|
horario_fim,
|
||||||
qtd_formandos,
|
qtd_formandos,
|
||||||
qtd_fotografos,
|
qtd_fotografos,
|
||||||
qtd_recepcionistas,
|
qtd_recepcionistas,
|
||||||
|
|
@ -27,7 +28,7 @@ INSERT INTO agenda (
|
||||||
regiao,
|
regiao,
|
||||||
contatos
|
contatos
|
||||||
) VALUES (
|
) 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
|
$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, @regiao, $26
|
||||||
) RETURNING *;
|
) RETURNING *;
|
||||||
|
|
||||||
-- name: GetAgenda :one
|
-- name: GetAgenda :one
|
||||||
|
|
@ -112,23 +113,24 @@ SET
|
||||||
local_evento = $6,
|
local_evento = $6,
|
||||||
endereco = $7,
|
endereco = $7,
|
||||||
horario = $8,
|
horario = $8,
|
||||||
qtd_formandos = $9,
|
horario_fim = $9,
|
||||||
qtd_fotografos = $10,
|
qtd_formandos = $10,
|
||||||
qtd_recepcionistas = $11,
|
qtd_fotografos = $11,
|
||||||
qtd_cinegrafistas = $12,
|
qtd_recepcionistas = $12,
|
||||||
qtd_estudios = $13,
|
qtd_cinegrafistas = $13,
|
||||||
qtd_ponto_foto = $14,
|
qtd_estudios = $14,
|
||||||
qtd_ponto_id = $15,
|
qtd_ponto_foto = $15,
|
||||||
qtd_ponto_decorado = $16,
|
qtd_ponto_id = $16,
|
||||||
qtd_pontos_led = $17,
|
qtd_ponto_decorado = $17,
|
||||||
qtd_plataforma_360 = $18,
|
qtd_pontos_led = $18,
|
||||||
status_profissionais = $19,
|
qtd_plataforma_360 = $19,
|
||||||
foto_faltante = $20,
|
status_profissionais = $20,
|
||||||
recep_faltante = $21,
|
foto_faltante = $21,
|
||||||
cine_faltante = $22,
|
recep_faltante = $22,
|
||||||
logistica_observacoes = $23,
|
cine_faltante = $23,
|
||||||
pre_venda = $24,
|
logistica_observacoes = $24,
|
||||||
contatos = $25,
|
pre_venda = $25,
|
||||||
|
contatos = $26,
|
||||||
atualizado_em = NOW()
|
atualizado_em = NOW()
|
||||||
WHERE id = $1 AND regiao = @regiao
|
WHERE id = $1 AND regiao = @regiao
|
||||||
RETURNING *;
|
RETURNING *;
|
||||||
|
|
@ -196,7 +198,7 @@ WHERE dp.data = $1
|
||||||
ORDER BY p.nome;
|
ORDER BY p.nome;
|
||||||
|
|
||||||
-- name: CheckProfessionalBusyDate :many
|
-- name: CheckProfessionalBusyDate :many
|
||||||
SELECT a.id, a.horario, ap.status
|
SELECT a.id, a.horario, a.horario_fim, ap.status
|
||||||
FROM agenda_profissionais ap
|
FROM agenda_profissionais ap
|
||||||
JOIN agenda a ON ap.agenda_id = a.id
|
JOIN agenda a ON ap.agenda_id = a.id
|
||||||
WHERE ap.profissional_id = $1
|
WHERE ap.profissional_id = $1
|
||||||
|
|
|
||||||
|
|
@ -226,6 +226,7 @@ CREATE TABLE IF NOT EXISTS agenda (
|
||||||
local_evento VARCHAR(255),
|
local_evento VARCHAR(255),
|
||||||
endereco VARCHAR(255),
|
endereco VARCHAR(255),
|
||||||
horario VARCHAR(20),
|
horario VARCHAR(20),
|
||||||
|
horario_fim VARCHAR(20),
|
||||||
qtd_formandos INTEGER DEFAULT 0,
|
qtd_formandos INTEGER DEFAULT 0,
|
||||||
qtd_fotografos INTEGER DEFAULT 0,
|
qtd_fotografos INTEGER DEFAULT 0,
|
||||||
qtd_recepcionistas INTEGER DEFAULT 0,
|
qtd_recepcionistas INTEGER DEFAULT 0,
|
||||||
|
|
|
||||||
|
|
@ -439,6 +439,7 @@ export const EventForm: React.FC<EventFormProps> = ({
|
||||||
tipo_evento_id: finalTypeId,
|
tipo_evento_id: finalTypeId,
|
||||||
data_evento: new Date(formData.date).toISOString(),
|
data_evento: new Date(formData.date).toISOString(),
|
||||||
horario: formData.startTime || "",
|
horario: formData.startTime || "",
|
||||||
|
horario_fim: formData.endTime || "",
|
||||||
observacoes_evento: formData.name || formData.briefing || "",
|
observacoes_evento: formData.name || formData.briefing || "",
|
||||||
local_evento: formData.locationName || "",
|
local_evento: formData.locationName || "",
|
||||||
endereco: `${formData.address.street}, ${formData.address.number} - ${formData.address.city}/${formData.address.state}`,
|
endereco: `${formData.address.street}, ${formData.address.number} - ${formData.address.city}/${formData.address.state}`,
|
||||||
|
|
|
||||||
|
|
@ -1182,6 +1182,8 @@ export const DataProvider: React.FC<{ children: ReactNode }> = ({
|
||||||
...evt,
|
...evt,
|
||||||
date: data.data_evento ? data.data_evento.split("T")[0] : evt.date,
|
date: data.data_evento ? data.data_evento.split("T")[0] : evt.date,
|
||||||
time: data.horario || evt.time,
|
time: data.horario || evt.time,
|
||||||
|
startTime: data.horario || evt.startTime,
|
||||||
|
endTime: data.horario_fim || evt.endTime,
|
||||||
name: data.observacoes_evento || evt.name,
|
name: data.observacoes_evento || evt.name,
|
||||||
briefing: data.observacoes_evento || evt.briefing,
|
briefing: data.observacoes_evento || evt.briefing,
|
||||||
fotId: data.fot_id || evt.fotId,
|
fotId: data.fot_id || evt.fotId,
|
||||||
|
|
|
||||||
|
|
@ -228,7 +228,7 @@ export const DailyLogistics: React.FC = () => {
|
||||||
<ChevronRight size={16} className="text-transparent group-hover:text-brand-purple transition-colors" />
|
<ChevronRight size={16} className="text-transparent group-hover:text-brand-purple transition-colors" />
|
||||||
</h3>
|
</h3>
|
||||||
<div className="flex items-center text-xs text-gray-500 mt-2 gap-4">
|
<div className="flex items-center text-xs text-gray-500 mt-2 gap-4">
|
||||||
<span className="flex items-center gap-1"><Clock size={14}/> {event.time}</span>
|
<span className="flex items-center gap-1"><Clock size={14}/> {event.startTime || event.time}{event.endTime || event.horario_fim ? ` às ${event.endTime || event.horario_fim}` : ''}</span>
|
||||||
<span className="flex items-center gap-1 truncate max-w-[150px]"><MapPin size={14}/> {event.address?.city || "Cidade N/A"}</span>
|
<span className="flex items-center gap-1 truncate max-w-[150px]"><MapPin size={14}/> {event.address?.city || "Cidade N/A"}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,8 @@ export const Dashboard: React.FC<DashboardProps> = ({
|
||||||
name: data.observacoes_evento || selectedEvent.name,
|
name: data.observacoes_evento || selectedEvent.name,
|
||||||
briefing: data.observacoes_evento || selectedEvent.briefing,
|
briefing: data.observacoes_evento || selectedEvent.briefing,
|
||||||
time: data.horario || selectedEvent.time,
|
time: data.horario || selectedEvent.time,
|
||||||
|
startTime: data.horario || selectedEvent.startTime,
|
||||||
|
endTime: data.horario_fim || selectedEvent.endTime || selectedEvent.horario_fim,
|
||||||
};
|
};
|
||||||
setSelectedEvent(updatedEvent);
|
setSelectedEvent(updatedEvent);
|
||||||
setView("details");
|
setView("details");
|
||||||
|
|
@ -463,15 +465,36 @@ export const Dashboard: React.FC<DashboardProps> = ({
|
||||||
const [teamPage, setTeamPage] = useState(1);
|
const [teamPage, setTeamPage] = useState(1);
|
||||||
const ITEMS_PER_PAGE = 20;
|
const ITEMS_PER_PAGE = 20;
|
||||||
|
|
||||||
// Optimização 1: Pre-calcular status de ocupação (remove complexidade O(N*M) de dentro do loop)
|
// Optimização 1: Pre-calcular status de ocupação com suporte a colisão de horários reais
|
||||||
const busyProfessionalIds = useMemo(() => {
|
const busyProfessionalIds = useMemo(() => {
|
||||||
if (!selectedEvent) return new Set<string>();
|
if (!selectedEvent) return new Set<string>();
|
||||||
const busySet = new Set<string>();
|
const busySet = new Set<string>();
|
||||||
|
|
||||||
|
const parseTime = (timeStr?: string) => {
|
||||||
|
if (!timeStr) return null;
|
||||||
|
const [hours, minutes] = timeStr.split(':').map(Number);
|
||||||
|
if (isNaN(hours) || isNaN(minutes)) return null;
|
||||||
|
return hours * 60 + minutes;
|
||||||
|
};
|
||||||
|
|
||||||
|
const targetStart = parseTime(selectedEvent.startTime || selectedEvent.time);
|
||||||
|
const targetEnd = parseTime(selectedEvent.endTime || selectedEvent.horario_fim);
|
||||||
|
|
||||||
// Itera eventos apenas UMA vez
|
// Itera eventos apenas UMA vez
|
||||||
for (const e of events) {
|
for (const e of events) {
|
||||||
if (e.id !== selectedEvent.id && e.date === selectedEvent.date) {
|
if (e.id !== selectedEvent.id && e.date === selectedEvent.date) {
|
||||||
if (e.assignments) {
|
|
||||||
|
const eStart = parseTime(e.startTime || e.time);
|
||||||
|
const eEnd = parseTime(e.endTime || e.horario_fim);
|
||||||
|
|
||||||
|
let isOverlapping = true; // Por padrão, se não tiver horário, bloqueia o dia todo (comportamento seguro legado)
|
||||||
|
|
||||||
|
if (targetStart !== null && targetEnd !== null && eStart !== null && eEnd !== null) {
|
||||||
|
// Checagem estrita de colisão: O novo começa antes do agendado terminar E termina depois do agendado começar
|
||||||
|
isOverlapping = (targetStart < eEnd) && (targetEnd > eStart);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isOverlapping && e.assignments) {
|
||||||
for (const a of e.assignments) {
|
for (const a of e.assignments) {
|
||||||
if (a.status === 'ACEITO') {
|
if (a.status === 'ACEITO') {
|
||||||
busySet.add(a.professionalId);
|
busySet.add(a.professionalId);
|
||||||
|
|
@ -1144,7 +1167,8 @@ export const Dashboard: React.FC<DashboardProps> = ({
|
||||||
{new Date(
|
{new Date(
|
||||||
selectedEvent.date + "T00:00:00"
|
selectedEvent.date + "T00:00:00"
|
||||||
).toLocaleDateString("pt-BR")}{" "}
|
).toLocaleDateString("pt-BR")}{" "}
|
||||||
às {selectedEvent.time}
|
das {selectedEvent.startTime || selectedEvent.time}
|
||||||
|
{selectedEvent.endTime || selectedEvent.horario_fim ? ` às ${selectedEvent.endTime || selectedEvent.horario_fim}` : ''}
|
||||||
</span>
|
</span>
|
||||||
<span className="flex items-center gap-1">
|
<span className="flex items-center gap-1">
|
||||||
<MapPin size={16} className="text-brand-gold" />
|
<MapPin size={16} className="text-brand-gold" />
|
||||||
|
|
@ -1283,7 +1307,8 @@ export const Dashboard: React.FC<DashboardProps> = ({
|
||||||
Horário
|
Horário
|
||||||
</p>
|
</p>
|
||||||
<p className="font-semibold text-gray-900">
|
<p className="font-semibold text-gray-900">
|
||||||
{selectedEvent.time}
|
{selectedEvent.startTime || selectedEvent.time}
|
||||||
|
{selectedEvent.endTime || selectedEvent.horario_fim ? ` - ${selectedEvent.endTime || selectedEvent.horario_fim}` : ''}
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
@ -1600,7 +1625,8 @@ export const Dashboard: React.FC<DashboardProps> = ({
|
||||||
Horário
|
Horário
|
||||||
</td>
|
</td>
|
||||||
<td className="px-4 py-3 text-sm text-gray-900">
|
<td className="px-4 py-3 text-sm text-gray-900">
|
||||||
{selectedEvent.time}
|
{selectedEvent.startTime || selectedEvent.time}
|
||||||
|
{selectedEvent.endTime || selectedEvent.horario_fim ? ` - ${selectedEvent.endTime || selectedEvent.horario_fim}` : ''}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|
||||||
|
|
@ -2172,7 +2198,7 @@ export const Dashboard: React.FC<DashboardProps> = ({
|
||||||
{!status && (
|
{!status && (
|
||||||
<span
|
<span
|
||||||
className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium ${isBusy ? "bg-red-100 text-red-800 cursor-help" : "bg-gray-100 text-gray-600"}`}
|
className={`inline-flex items-center gap-1.5 px-3 py-1 rounded-full text-xs font-medium ${isBusy ? "bg-red-100 text-red-800 cursor-help" : "bg-gray-100 text-gray-600"}`}
|
||||||
title={busyEvent ? `Em evento: ${busyEvent.name} - ${busyEvent.local_evento || 'Local não informado'} (${busyEvent.time || busyEvent.startTime || 'Horário indefinido'})` : ""}
|
title={busyEvent ? `Em evento: ${busyEvent.name} - ${busyEvent.local_evento || 'Local não informado'} (${busyEvent.startTime || busyEvent.time || 'Horário indefinido'}${busyEvent.endTime || busyEvent.horario_fim ? ' às ' + (busyEvent.endTime || busyEvent.horario_fim) : ''})` : ""}
|
||||||
>
|
>
|
||||||
{isBusy ? <UserX size={14} /> : <UserCheck size={14} />}
|
{isBusy ? <UserX size={14} /> : <UserCheck size={14} />}
|
||||||
{isBusy ? "Em outro evento" : "Disponível"}
|
{isBusy ? "Em outro evento" : "Disponível"}
|
||||||
|
|
|
||||||
|
|
@ -133,6 +133,7 @@ export interface EventData {
|
||||||
name: string;
|
name: string;
|
||||||
date: string;
|
date: string;
|
||||||
time: string; // Mantido por compatibilidade, mas deprecated
|
time: string; // Mantido por compatibilidade, mas deprecated
|
||||||
|
horario_fim?: string; // Novo Horário de Término vindo do Banco
|
||||||
startTime?: string; // Horário de início
|
startTime?: string; // Horário de início
|
||||||
endTime?: string; // Horário de término
|
endTime?: string; // Horário de término
|
||||||
type: EventType;
|
type: EventType;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue