Backend: - Migration 007: alterada coluna `fot` de INTEGER para VARCHAR(50). - Ajustados serviços (finance, agenda) e handlers para processar FOT como string. - Regenerados modelos e queries do banco de dados (sqlc). Frontend: - [FotForm](cci:1://file:///c:/Projetos/photum/frontend/components/FotForm.tsx:13:0-348:2): Permitido input de texto/alfanumérico (ex: "20000MG"). - [EventTable](cci:1://file:///c:/Projetos/photum/frontend/components/EventTable.tsx:29:0-684:2): Removido bloqueio do botão "Aprovar" para equipes incompletas. - [Dashboard](cci:1://file:///c:/Projetos/photum/frontend/pages/Dashboard.tsx:31:0-1749:2): Corrigida duplicação do campo "Qtd Formandos". - [Dashboard](cci:1://file:///c:/Projetos/photum/frontend/pages/Dashboard.tsx:31:0-1749:2): Filtros de "Gerenciar Equipe" agora usam funções dinâmicas (IDs) em vez de valores fixos. - `Navbar`: Logo agora redireciona corretamente para `/painel`.
111 lines
3.4 KiB
Go
111 lines
3.4 KiB
Go
package finance
|
|
|
|
import (
|
|
"context"
|
|
"photum-backend/internal/db/generated"
|
|
|
|
"github.com/jackc/pgx/v5/pgtype"
|
|
)
|
|
|
|
type Service struct {
|
|
queries *generated.Queries
|
|
}
|
|
|
|
func NewService(queries *generated.Queries) *Service {
|
|
return &Service{queries: queries}
|
|
}
|
|
|
|
func (s *Service) Create(ctx context.Context, params generated.CreateTransactionParams) (generated.FinancialTransaction, error) {
|
|
txn, err := s.queries.CreateTransaction(ctx, params)
|
|
if err != nil {
|
|
return generated.FinancialTransaction{}, err
|
|
}
|
|
|
|
if params.FotID.Valid {
|
|
_ = s.updateFotExpenses(ctx, params.FotID)
|
|
}
|
|
|
|
return txn, nil
|
|
}
|
|
|
|
func (s *Service) Update(ctx context.Context, params generated.UpdateTransactionParams) (generated.FinancialTransaction, error) {
|
|
txn, err := s.queries.UpdateTransaction(ctx, params)
|
|
if err != nil {
|
|
return generated.FinancialTransaction{}, err
|
|
}
|
|
|
|
// Recalculate for the new FOT (if changed, we should technically recalc old one too, but simpler for now)
|
|
if params.FotID.Valid {
|
|
_ = s.updateFotExpenses(ctx, params.FotID)
|
|
}
|
|
return txn, nil
|
|
}
|
|
|
|
func (s *Service) Delete(ctx context.Context, id pgtype.UUID) error {
|
|
// First fetch to get FotID
|
|
txn, err := s.queries.GetTransaction(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = s.queries.DeleteTransaction(ctx, id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if txn.FotID.Valid {
|
|
_ = s.updateFotExpenses(ctx, txn.FotID)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *Service) ListByFot(ctx context.Context, fotID pgtype.UUID) ([]generated.FinancialTransaction, error) {
|
|
return s.queries.ListTransactionsByFot(ctx, fotID)
|
|
}
|
|
|
|
func (s *Service) ListAll(ctx context.Context) ([]generated.ListTransactionsRow, error) {
|
|
return s.queries.ListTransactions(ctx)
|
|
}
|
|
|
|
func (s *Service) AutoFillSearch(ctx context.Context, fotNumber string) (generated.GetCadastroFotByFotJoinRow, error) {
|
|
return s.queries.GetCadastroFotByFotJoin(ctx, fotNumber)
|
|
}
|
|
|
|
func (s *Service) ListFotEvents(ctx context.Context, fotID pgtype.UUID) ([]generated.ListAgendasByFotRow, error) {
|
|
return s.queries.ListAgendasByFot(ctx, fotID)
|
|
}
|
|
|
|
func (s *Service) SearchProfessionals(ctx context.Context, query string) ([]generated.SearchProfissionaisRow, error) {
|
|
return s.queries.SearchProfissionais(ctx, pgtype.Text{String: query, Valid: true})
|
|
}
|
|
|
|
func (s *Service) SearchProfessionalsByFunction(ctx context.Context, query string, functionName string) ([]generated.SearchProfissionaisByFunctionRow, error) {
|
|
return s.queries.SearchProfissionaisByFunction(ctx, generated.SearchProfissionaisByFunctionParams{
|
|
Column1: pgtype.Text{String: query, Valid: true}, // $1 - Name
|
|
Nome: functionName, // $2 - Function Name
|
|
})
|
|
}
|
|
|
|
func (s *Service) GetStandardPrice(ctx context.Context, eventName string, serviceName string) (pgtype.Numeric, error) {
|
|
// serviceName here is the Function Name (e.g. Fotógrafo)
|
|
return s.queries.GetStandardPrice(ctx, generated.GetStandardPriceParams{
|
|
Nome: eventName, // $1 - Event Name
|
|
Nome_2: serviceName, // $2 - Function Name
|
|
})
|
|
}
|
|
|
|
func (s *Service) SearchFot(ctx context.Context, query string) ([]generated.SearchFotRow, error) {
|
|
return s.queries.SearchFot(ctx, pgtype.Text{String: query, Valid: true})
|
|
}
|
|
|
|
func (s *Service) updateFotExpenses(ctx context.Context, fotID pgtype.UUID) error {
|
|
total, err := s.queries.SumTotalByFot(ctx, fotID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return s.queries.UpdateCadastroFotGastos(ctx, generated.UpdateCadastroFotGastosParams{
|
|
ID: fotID,
|
|
GastosCaptacao: total,
|
|
})
|
|
}
|