74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"aggios-app/backend/internal/domain"
|
|
"aggios-app/backend/internal/repository"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
var (
|
|
ErrCompanyNotFound = errors.New("company not found")
|
|
ErrCNPJAlreadyExists = errors.New("CNPJ already registered")
|
|
)
|
|
|
|
// CompanyService handles company business logic
|
|
type CompanyService struct {
|
|
companyRepo *repository.CompanyRepository
|
|
}
|
|
|
|
// NewCompanyService creates a new company service
|
|
func NewCompanyService(companyRepo *repository.CompanyRepository) *CompanyService {
|
|
return &CompanyService{
|
|
companyRepo: companyRepo,
|
|
}
|
|
}
|
|
|
|
// Create creates a new company
|
|
func (s *CompanyService) Create(req domain.CreateCompanyRequest, tenantID, userID uuid.UUID) (*domain.Company, error) {
|
|
// Check if CNPJ already exists for this tenant
|
|
exists, err := s.companyRepo.CNPJExists(req.CNPJ, tenantID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if exists {
|
|
return nil, ErrCNPJAlreadyExists
|
|
}
|
|
|
|
company := &domain.Company{
|
|
CNPJ: req.CNPJ,
|
|
RazaoSocial: req.RazaoSocial,
|
|
NomeFantasia: req.NomeFantasia,
|
|
Email: req.Email,
|
|
Telefone: req.Telefone,
|
|
Status: "active",
|
|
TenantID: tenantID,
|
|
CreatedByUserID: &userID,
|
|
}
|
|
|
|
if err := s.companyRepo.Create(company); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return company, nil
|
|
}
|
|
|
|
// GetByID retrieves a company by ID
|
|
func (s *CompanyService) GetByID(id uuid.UUID) (*domain.Company, error) {
|
|
company, err := s.companyRepo.FindByID(id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if company == nil {
|
|
return nil, ErrCompanyNotFound
|
|
}
|
|
return company, nil
|
|
}
|
|
|
|
// ListByTenant retrieves all companies for a tenant
|
|
func (s *CompanyService) ListByTenant(tenantID uuid.UUID) ([]*domain.Company, error) {
|
|
return s.companyRepo.FindByTenantID(tenantID)
|
|
}
|