saveinmed/backend/internal/usecase/credit_line.go
Gabbriiel 90467db1ec refactor: substitui backend Medusa por backend Go e corrige testes do marketplace
- Remove backend Medusa.js (TypeScript) e substitui pelo backend Go (saveinmed-performance-core)
- Corrige testes auth.test.ts: alinha paths de API (v1/ sem barra inicial) e campo access_token
- Corrige GroupedProductCard.test.tsx: ajusta distância formatada (toFixed) e troca userEvent por fireEvent com fakeTimers
- Corrige AuthContext.test.tsx: usa vi.hoisted() para mocks e corrige parênteses no waitFor

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 04:56:37 -06:00

81 lines
2.3 KiB
Go

package usecase
import (
"context"
"errors"
"github.com/gofrs/uuid/v5"
)
// ErrInsufficientCredit is returned when order exceeds available credit
var ErrInsufficientCredit = errors.New("insufficient credit: order total exceeds available credit line")
// CheckCreditLine verifies if a company has enough credit to place an order
func (s *Service) CheckCreditLine(ctx context.Context, companyID uuid.UUID, orderTotalCents int64) (bool, error) {
company, err := s.repo.GetCompany(ctx, companyID)
if err != nil {
return false, err
}
if company == nil {
return false, errors.New("company not found")
}
// If no credit limit, credit line is not enabled
if company.CreditLimitCents == 0 {
return false, errors.New("credit line not enabled for this company")
}
availableCredit := company.CreditLimitCents - company.CreditUsedCents
return orderTotalCents <= availableCredit, nil
}
// UseCreditLine reserves credit for an order (call during CreateOrder with payment_method=CREDIT_LINE)
func (s *Service) UseCreditLine(ctx context.Context, companyID uuid.UUID, amountCents int64) error {
company, err := s.repo.GetCompany(ctx, companyID)
if err != nil {
return err
}
if company == nil {
return errors.New("company not found")
}
availableCredit := company.CreditLimitCents - company.CreditUsedCents
if amountCents > availableCredit {
return ErrInsufficientCredit
}
// Update credit used
company.CreditUsedCents += amountCents
return s.repo.UpdateCompany(ctx, company)
}
// ReleaseCreditLine releases credit when order is paid or cancelled
func (s *Service) ReleaseCreditLine(ctx context.Context, companyID uuid.UUID, amountCents int64) error {
company, err := s.repo.GetCompany(ctx, companyID)
if err != nil {
return err
}
if company == nil {
return errors.New("company not found")
}
company.CreditUsedCents -= amountCents
if company.CreditUsedCents < 0 {
company.CreditUsedCents = 0
}
return s.repo.UpdateCompany(ctx, company)
}
// SetCreditLimit updates a company's credit limit (admin only)
func (s *Service) SetCreditLimit(ctx context.Context, companyID uuid.UUID, limitCents int64) error {
company, err := s.repo.GetCompany(ctx, companyID)
if err != nil {
return err
}
if company == nil {
return errors.New("company not found")
}
company.CreditLimitCents = limitCents
return s.repo.UpdateCompany(ctx, company)
}