photum/backend/internal/availability/service.go
NANDO9322 434548c158 feat(staffing): implementa sistema de disponibilidade e escalonamento
- Adiciona tabela `disponibilidade_profissionais` no schema
- Adiciona coluna `posicao` para mapa de profissionais no evento
- Implementa Service e Handler para gerenciar Disponibilidade (Set/Get)
- Implementa lógica de Escalonamento: listar disponíveis e atribuir posição
- Atualiza rotas da API e serviço do frontend

feat(frontend): implementa modal de detalhes e updates otimistas na equipe

- Adiciona componente ProfessionalDetailsModal para exibir dados completos do profissional
- Implementa update otimista em DataContext para adição/removação instantânea da equipe
- Corrige bug crítico de sintaxe e estrutura na Dashboard.tsx
- Adiciona badges de status (Pendente/Confirmado/Rejeitado) na listagem de equipe
- Corrige erro de referência de variável (professionalId) no fluxo de atribuição
2025-12-23 17:29:40 -03:00

75 lines
2 KiB
Go

package availability
import (
"context"
"time"
"photum-backend/internal/db/generated"
"github.com/google/uuid"
"github.com/jackc/pgx/v5/pgtype"
)
type Service struct {
queries *generated.Queries
}
func NewService(queries *generated.Queries) *Service {
return &Service{queries: queries}
}
type SetAvailabilityInput struct {
Date string `json:"date"` // YYYY-MM-DD
Status string `json:"status"` // DISPONIVEL, INDISPONIVEL
}
func (s *Service) SetAvailability(ctx context.Context, userID string, input SetAvailabilityInput) error {
userUUID, err := uuid.Parse(userID)
if err != nil {
return err
}
date, err := time.Parse("2006-01-02", input.Date)
if err != nil {
return err
}
pgDate := pgtype.Date{Time: date, Valid: true}
if input.Status == "INDISPONIVEL" {
// Remove record if unavailable (or explicit status if we prefer history, but opt-in usually means record exists = available)
// Specifically for this implementation, let's follow the schema which has a status column.
// However, "availability" usually implies "I am available".
// If I set "INDISPONIVEL", I can either delete the record or set status to INDISPONIVEL.
// Let's set status.
}
_, err = s.queries.CreateDisponibilidade(ctx, generated.CreateDisponibilidadeParams{
UsuarioID: pgtype.UUID{Bytes: userUUID, Valid: true},
Data: pgDate,
Status: input.Status,
})
return err
}
func (s *Service) ListMyAvailability(ctx context.Context, userID string, startDate, endDate string) ([]generated.DisponibilidadeProfissionai, error) {
userUUID, err := uuid.Parse(userID)
if err != nil {
return nil, err
}
start, err := time.Parse("2006-01-02", startDate)
if err != nil {
return nil, err
}
end, err := time.Parse("2006-01-02", endDate)
if err != nil {
return nil, err
}
return s.queries.ListDisponibilidadeByPeriod(ctx, generated.ListDisponibilidadeByPeriodParams{
UsuarioID: pgtype.UUID{Bytes: userUUID, Valid: true},
Data: pgtype.Date{Time: start, Valid: true},
Data_2: pgtype.Date{Time: end, Valid: true},
})
}