package service import ( "context" "fmt" "time" "github.com/Caknoooo/go-gin-clean-starter/modules/sequence/repository" pkgdto "github.com/Caknoooo/go-gin-clean-starter/pkg/dto" "gorm.io/gorm" ) type SequenceService interface { GenerateNumber(ctx context.Context, clientId string, config pkgdto.SequenceConfig) (string, error) GenerateNumberWithPeriod(ctx context.Context, clientId string, config pkgdto.SequenceConfig, suffix string) (string, error) GenerateNumberWithSuffix(ctx context.Context, clientId string, config pkgdto.SequenceConfig, suffix string) (string, error) GetNextSequence(ctx context.Context, clientId string, config pkgdto.SequenceConfig) (int, error) } type sequenceService struct { db *gorm.DB sequenceRepo repository.SequenceRepository } func NewSequenceService(sequenceRepo repository.SequenceRepository, db *gorm.DB) SequenceService { return &sequenceService{ sequenceRepo: sequenceRepo, db: db, } } // GenerateNumberWithSuffix implements SequenceService. func (s *sequenceService) GenerateNumberWithSuffix(ctx context.Context, clientId string, config pkgdto.SequenceConfig, suffix string) (string, error) { period := config.Period seq, err := s.sequenceRepo.GetOrCreateSequence(ctx, s.db, clientId, config.EntityType, period) if err != nil { return "", err } seq.CurrentSeq++ if err := s.sequenceRepo.UpdateSequence(ctx, s.db, seq); err != nil { return "", err } refNum := fmt.Sprintf("%s-%s-%04d", config.Prefix, suffix, seq.CurrentSeq) return refNum, nil } func (s *sequenceService) GenerateNumber(ctx context.Context, clientId string, config pkgdto.SequenceConfig) (string, error) { period := config.Period if period == "" { period = "-" } seq, err := s.sequenceRepo.GetOrCreateSequence(ctx, s.db, clientId, config.EntityType, period) if err != nil { return "", err } seq.CurrentSeq++ if err := s.sequenceRepo.UpdateSequence(ctx, s.db, seq); err != nil { return "", err } refNum := fmt.Sprintf("%s-%04d", config.Prefix, seq.CurrentSeq) return refNum, nil } func (s *sequenceService) GenerateNumberWithPeriod(ctx context.Context, clientId string, config pkgdto.SequenceConfig, suffix string) (string, error) { if config.Period == "" { config.Period = time.Now().Format("0601") } period := config.Period seq, err := s.sequenceRepo.GetOrCreateSequence(ctx, s.db, clientId, config.EntityType, period) if err != nil { return "", err } seq.CurrentSeq++ if err := s.sequenceRepo.UpdateSequence(ctx, s.db, seq); err != nil { return "", err } refNum := fmt.Sprintf("%s-%s-%s-%04d", config.Prefix, suffix, period, seq.CurrentSeq) return refNum, nil } func (s *sequenceService) GetNextSequence(ctx context.Context, clientId string, config pkgdto.SequenceConfig) (int, error) { period := config.Period if period == "" { period = "-" } seq, err := s.sequenceRepo.GetOrCreateSequence(ctx, s.db, clientId, config.EntityType, period) if err != nil { return 0, err } seq.CurrentSeq++ if err := s.sequenceRepo.UpdateSequence(ctx, s.db, seq); err != nil { return 0, err } return seq.CurrentSeq, nil }