diff --git a/backend/docs/docs.go b/backend/docs/docs.go index 568496c..497d795 100644 --- a/backend/docs/docs.go +++ b/backend/docs/docs.go @@ -3244,6 +3244,9 @@ const docTemplate = `{ "horario": { "type": "string" }, + "horario_fim": { + "type": "string" + }, "local_evento": { "type": "string" }, diff --git a/backend/docs/swagger.json b/backend/docs/swagger.json index c1c86ce..5c83845 100644 --- a/backend/docs/swagger.json +++ b/backend/docs/swagger.json @@ -3238,6 +3238,9 @@ "horario": { "type": "string" }, + "horario_fim": { + "type": "string" + }, "local_evento": { "type": "string" }, diff --git a/backend/docs/swagger.yaml b/backend/docs/swagger.yaml index f9435de..fe5f6eb 100644 --- a/backend/docs/swagger.yaml +++ b/backend/docs/swagger.yaml @@ -27,6 +27,8 @@ definitions: type: integer horario: type: string + horario_fim: + type: string local_evento: type: string logistica_observacoes: diff --git a/backend/internal/agenda/service.go b/backend/internal/agenda/service.go index 18028db..ee0a7de 100644 --- a/backend/internal/agenda/service.go +++ b/backend/internal/agenda/service.go @@ -50,6 +50,7 @@ type CreateAgendaRequest struct { LocalEvento string `json:"local_evento"` Endereco string `json:"endereco"` Horario string `json:"horario"` + HorarioFim string `json:"horario_fim"` QtdFormandos int32 `json:"qtd_formandos"` QtdFotografos int32 `json:"qtd_fotografos"` 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 != ""}, Endereco: pgtype.Text{String: req.Endereco, Valid: req.Endereco != ""}, 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}, QtdFotografos: pgtype.Int4{Int32: req.QtdFotografos, 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, Endereco: r.Endereco, Horario: r.Horario, + HorarioFim: r.HorarioFim, QtdFormandos: r.QtdFormandos, QtdFotografos: r.QtdFotografos, 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 != ""}, Endereco: pgtype.Text{String: req.Endereco, Valid: req.Endereco != ""}, 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}, QtdFotografos: pgtype.Int4{Int32: req.QtdFotografos, Valid: true}, QtdRecepcionistas: pgtype.Int4{Int32: req.QtdRecepcionistas, Valid: true}, diff --git a/backend/internal/db/generated/agenda.sql.go b/backend/internal/db/generated/agenda.sql.go index 45ba2f5..e6e800a 100644 --- a/backend/internal/db/generated/agenda.sql.go +++ b/backend/internal/db/generated/agenda.sql.go @@ -30,7 +30,7 @@ func (q *Queries) AssignProfessional(ctx context.Context, arg AssignProfessional } 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 JOIN agenda a ON ap.agenda_id = a.id WHERE ap.profissional_id = $1 @@ -46,9 +46,10 @@ type CheckProfessionalBusyDateParams struct { } type CheckProfessionalBusyDateRow struct { - ID pgtype.UUID `json:"id"` - Horario pgtype.Text `json:"horario"` - Status pgtype.Text `json:"status"` + ID pgtype.UUID `json:"id"` + Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` + Status pgtype.Text `json:"status"` } 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 for rows.Next() { 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 } items = append(items, i) @@ -80,6 +86,7 @@ INSERT INTO agenda ( local_evento, endereco, horario, + horario_fim, qtd_formandos, qtd_fotografos, qtd_recepcionistas, @@ -100,8 +107,8 @@ INSERT INTO agenda ( 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, $26, $25 -) 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 + $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, 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 { @@ -112,6 +119,7 @@ type CreateAgendaParams struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` @@ -142,6 +150,7 @@ func (q *Queries) CreateAgenda(ctx context.Context, arg CreateAgendaParams) (Age arg.LocalEvento, arg.Endereco, arg.Horario, + arg.HorarioFim, arg.QtdFormandos, arg.QtdFotografos, arg.QtdRecepcionistas, @@ -173,6 +182,7 @@ func (q *Queries) CreateAgenda(ctx context.Context, arg CreateAgendaParams) (Age &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -215,7 +225,7 @@ func (q *Queries) DeleteAgenda(ctx context.Context, arg DeleteAgendaParams) erro } 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 ` @@ -237,6 +247,7 @@ func (q *Queries) GetAgenda(ctx context.Context, arg GetAgendaParams) (Agenda, e &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -264,7 +275,7 @@ func (q *Queries) GetAgenda(ctx context.Context, arg GetAgendaParams) (Agenda, e } 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 LIMIT 1 ` @@ -294,6 +305,7 @@ func (q *Queries) GetAgendaByFotDataTipo(ctx context.Context, arg GetAgendaByFot &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -456,7 +468,7 @@ func (q *Queries) GetAssignment(ctx context.Context, arg GetAssignmentParams) (A const listAgendas = `-- name: ListAgendas :many 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.instituicao, c.nome as curso_nome, @@ -499,6 +511,7 @@ type ListAgendasRow struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` @@ -553,6 +566,7 @@ func (q *Queries) ListAgendas(ctx context.Context, regiao pgtype.Text) ([]ListAg &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -599,7 +613,7 @@ func (q *Queries) ListAgendas(ctx context.Context, regiao pgtype.Text) ([]ListAg const listAgendasByCompany = `-- name: ListAgendasByCompany :many 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.instituicao, c.nome as curso_nome, @@ -647,6 +661,7 @@ type ListAgendasByCompanyRow struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` @@ -701,6 +716,7 @@ func (q *Queries) ListAgendasByCompany(ctx context.Context, arg ListAgendasByCom &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -747,7 +763,7 @@ func (q *Queries) ListAgendasByCompany(ctx context.Context, arg ListAgendasByCom const listAgendasByFot = `-- name: ListAgendasByFot :many 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 FROM agenda a JOIN tipos_eventos te ON a.tipo_evento_id = te.id @@ -770,6 +786,7 @@ type ListAgendasByFotRow struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` @@ -814,6 +831,7 @@ func (q *Queries) ListAgendasByFot(ctx context.Context, arg ListAgendasByFotPara &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -850,7 +868,7 @@ func (q *Queries) ListAgendasByFot(ctx context.Context, arg ListAgendasByFotPara const listAgendasByUser = `-- name: ListAgendasByUser :many 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.instituicao, c.nome as curso_nome, @@ -898,6 +916,7 @@ type ListAgendasByUserRow struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` @@ -952,6 +971,7 @@ func (q *Queries) ListAgendasByUser(ctx context.Context, arg ListAgendasByUserPa &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -1166,26 +1186,27 @@ SET 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, + horario_fim = $9, + qtd_formandos = $10, + qtd_fotografos = $11, + qtd_recepcionistas = $12, + qtd_cinegrafistas = $13, + qtd_estudios = $14, + qtd_ponto_foto = $15, + qtd_ponto_id = $16, + qtd_ponto_decorado = $17, + qtd_pontos_led = $18, + qtd_plataforma_360 = $19, + status_profissionais = $20, + foto_faltante = $21, + recep_faltante = $22, + cine_faltante = $23, + logistica_observacoes = $24, + pre_venda = $25, + contatos = $26, atualizado_em = NOW() -WHERE id = $1 AND regiao = $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 +WHERE id = $1 AND regiao = $27 +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 { @@ -1197,6 +1218,7 @@ type UpdateAgendaParams struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` @@ -1227,6 +1249,7 @@ func (q *Queries) UpdateAgenda(ctx context.Context, arg UpdateAgendaParams) (Age arg.LocalEvento, arg.Endereco, arg.Horario, + arg.HorarioFim, arg.QtdFormandos, arg.QtdFotografos, arg.QtdRecepcionistas, @@ -1257,6 +1280,7 @@ func (q *Queries) UpdateAgenda(ctx context.Context, arg UpdateAgendaParams) (Age &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, @@ -1287,7 +1311,7 @@ const updateAgendaStatus = `-- name: UpdateAgendaStatus :one UPDATE agenda SET status = $2, atualizado_em = NOW() 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 { @@ -1309,6 +1333,7 @@ func (q *Queries) UpdateAgendaStatus(ctx context.Context, arg UpdateAgendaStatus &i.LocalEvento, &i.Endereco, &i.Horario, + &i.HorarioFim, &i.QtdFormandos, &i.QtdFotografos, &i.QtdRecepcionistas, diff --git a/backend/internal/db/generated/models.go b/backend/internal/db/generated/models.go index e605af2..31de571 100644 --- a/backend/internal/db/generated/models.go +++ b/backend/internal/db/generated/models.go @@ -18,6 +18,7 @@ type Agenda struct { LocalEvento pgtype.Text `json:"local_evento"` Endereco pgtype.Text `json:"endereco"` Horario pgtype.Text `json:"horario"` + HorarioFim pgtype.Text `json:"horario_fim"` QtdFormandos pgtype.Int4 `json:"qtd_formandos"` QtdFotografos pgtype.Int4 `json:"qtd_fotografos"` QtdRecepcionistas pgtype.Int4 `json:"qtd_recepcionistas"` diff --git a/backend/internal/db/migrations/021_add_horario_fim.up.sql b/backend/internal/db/migrations/021_add_horario_fim.up.sql new file mode 100644 index 0000000..200cc47 --- /dev/null +++ b/backend/internal/db/migrations/021_add_horario_fim.up.sql @@ -0,0 +1 @@ +ALTER TABLE agenda ADD COLUMN IF NOT EXISTS horario_fim VARCHAR(20); diff --git a/backend/internal/db/queries/agenda.sql b/backend/internal/db/queries/agenda.sql index 1651555..89223ed 100644 --- a/backend/internal/db/queries/agenda.sql +++ b/backend/internal/db/queries/agenda.sql @@ -7,6 +7,7 @@ INSERT INTO agenda ( local_evento, endereco, horario, + horario_fim, qtd_formandos, qtd_fotografos, qtd_recepcionistas, @@ -27,7 +28,7 @@ INSERT INTO agenda ( 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 + $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 *; -- name: GetAgenda :one @@ -112,23 +113,24 @@ SET 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, + horario_fim = $9, + qtd_formandos = $10, + qtd_fotografos = $11, + qtd_recepcionistas = $12, + qtd_cinegrafistas = $13, + qtd_estudios = $14, + qtd_ponto_foto = $15, + qtd_ponto_id = $16, + qtd_ponto_decorado = $17, + qtd_pontos_led = $18, + qtd_plataforma_360 = $19, + status_profissionais = $20, + foto_faltante = $21, + recep_faltante = $22, + cine_faltante = $23, + logistica_observacoes = $24, + pre_venda = $25, + contatos = $26, atualizado_em = NOW() WHERE id = $1 AND regiao = @regiao RETURNING *; @@ -196,7 +198,7 @@ WHERE dp.data = $1 ORDER BY p.nome; -- name: CheckProfessionalBusyDate :many -SELECT a.id, a.horario, ap.status +SELECT a.id, a.horario, a.horario_fim, ap.status FROM agenda_profissionais ap JOIN agenda a ON ap.agenda_id = a.id WHERE ap.profissional_id = $1 diff --git a/backend/internal/db/schema.sql b/backend/internal/db/schema.sql index 5c30282..a5eb5cd 100644 --- a/backend/internal/db/schema.sql +++ b/backend/internal/db/schema.sql @@ -226,6 +226,7 @@ CREATE TABLE IF NOT EXISTS agenda ( 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, diff --git a/frontend/components/EventForm.tsx b/frontend/components/EventForm.tsx index 4050d90..a6e6606 100644 --- a/frontend/components/EventForm.tsx +++ b/frontend/components/EventForm.tsx @@ -439,6 +439,7 @@ export const EventForm: React.FC = ({ tipo_evento_id: finalTypeId, data_evento: new Date(formData.date).toISOString(), horario: formData.startTime || "", + horario_fim: formData.endTime || "", observacoes_evento: formData.name || formData.briefing || "", local_evento: formData.locationName || "", endereco: `${formData.address.street}, ${formData.address.number} - ${formData.address.city}/${formData.address.state}`, diff --git a/frontend/contexts/DataContext.tsx b/frontend/contexts/DataContext.tsx index 63784c7..afe584c 100644 --- a/frontend/contexts/DataContext.tsx +++ b/frontend/contexts/DataContext.tsx @@ -1182,6 +1182,8 @@ export const DataProvider: React.FC<{ children: ReactNode }> = ({ ...evt, date: data.data_evento ? data.data_evento.split("T")[0] : evt.date, time: data.horario || evt.time, + startTime: data.horario || evt.startTime, + endTime: data.horario_fim || evt.endTime, name: data.observacoes_evento || evt.name, briefing: data.observacoes_evento || evt.briefing, fotId: data.fot_id || evt.fotId, diff --git a/frontend/pages/DailyLogistics.tsx b/frontend/pages/DailyLogistics.tsx index 2fc5a4d..3672125 100644 --- a/frontend/pages/DailyLogistics.tsx +++ b/frontend/pages/DailyLogistics.tsx @@ -228,7 +228,7 @@ export const DailyLogistics: React.FC = () => {
- {event.time} + {event.startTime || event.time}{event.endTime || event.horario_fim ? ` às ${event.endTime || event.horario_fim}` : ''} {event.address?.city || "Cidade N/A"}
diff --git a/frontend/pages/Dashboard.tsx b/frontend/pages/Dashboard.tsx index 913d032..ecf7995 100644 --- a/frontend/pages/Dashboard.tsx +++ b/frontend/pages/Dashboard.tsx @@ -115,6 +115,8 @@ export const Dashboard: React.FC = ({ name: data.observacoes_evento || selectedEvent.name, briefing: data.observacoes_evento || selectedEvent.briefing, time: data.horario || selectedEvent.time, + startTime: data.horario || selectedEvent.startTime, + endTime: data.horario_fim || selectedEvent.endTime || selectedEvent.horario_fim, }; setSelectedEvent(updatedEvent); setView("details"); @@ -463,15 +465,36 @@ export const Dashboard: React.FC = ({ const [teamPage, setTeamPage] = useState(1); 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(() => { if (!selectedEvent) return new Set(); const busySet = new Set(); + 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 for (const e of events) { 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) { if (a.status === 'ACEITO') { busySet.add(a.professionalId); @@ -1144,7 +1167,8 @@ export const Dashboard: React.FC = ({ {new Date( selectedEvent.date + "T00:00:00" ).toLocaleDateString("pt-BR")}{" "} - às {selectedEvent.time} + das {selectedEvent.startTime || selectedEvent.time} + {selectedEvent.endTime || selectedEvent.horario_fim ? ` às ${selectedEvent.endTime || selectedEvent.horario_fim}` : ''} @@ -1283,7 +1307,8 @@ export const Dashboard: React.FC = ({ Horário

- {selectedEvent.time} + {selectedEvent.startTime || selectedEvent.time} + {selectedEvent.endTime || selectedEvent.horario_fim ? ` - ${selectedEvent.endTime || selectedEvent.horario_fim}` : ''}

@@ -1600,7 +1625,8 @@ export const Dashboard: React.FC = ({ Horário - {selectedEvent.time} + {selectedEvent.startTime || selectedEvent.time} + {selectedEvent.endTime || selectedEvent.horario_fim ? ` - ${selectedEvent.endTime || selectedEvent.horario_fim}` : ''} @@ -2172,7 +2198,7 @@ export const Dashboard: React.FC = ({ {!status && ( {isBusy ? : } {isBusy ? "Em outro evento" : "Disponível"} diff --git a/frontend/types.ts b/frontend/types.ts index 5b4cb42..ecd1af7 100644 --- a/frontend/types.ts +++ b/frontend/types.ts @@ -133,6 +133,7 @@ export interface EventData { name: string; date: string; 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 endTime?: string; // Horário de término type: EventType;