72 lines
1.9 KiB
Go
72 lines
1.9 KiB
Go
package processor
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"eslogad-be/internal/entities"
|
|
"eslogad-be/internal/repository"
|
|
)
|
|
|
|
// LetterNumberGenerator handles generation of letter numbers with configurable prefix and sequence
|
|
type LetterNumberGenerator interface {
|
|
GenerateNumber(ctx context.Context, prefixKey, sequenceKey string, defaultPrefix string) (string, error)
|
|
}
|
|
|
|
type LetterNumberGeneratorImpl struct {
|
|
settingRepo *repository.AppSettingRepository
|
|
}
|
|
|
|
func NewLetterNumberGenerator(settingRepo *repository.AppSettingRepository) *LetterNumberGeneratorImpl {
|
|
return &LetterNumberGeneratorImpl{
|
|
settingRepo: settingRepo,
|
|
}
|
|
}
|
|
|
|
func (g *LetterNumberGeneratorImpl) GenerateNumber(ctx context.Context, prefixKey, sequenceKey string, defaultPrefix string) (string, error) {
|
|
prefix := defaultPrefix
|
|
if s, err := g.settingRepo.Get(ctx, prefixKey); err == nil {
|
|
if v, ok := s.Value["value"].(string); ok && v != "" {
|
|
prefix = v
|
|
}
|
|
}
|
|
|
|
seq := 0
|
|
if s, err := g.settingRepo.Get(ctx, sequenceKey); err == nil {
|
|
if v, ok := s.Value["value"].(float64); ok {
|
|
seq = int(v)
|
|
}
|
|
}
|
|
|
|
seq = seq + 1
|
|
|
|
letterNumber := fmt.Sprintf("%s%04d", prefix, seq)
|
|
|
|
if err := g.settingRepo.Upsert(ctx, sequenceKey, entities.JSONB{"value": seq}); err != nil {
|
|
}
|
|
|
|
return letterNumber, nil
|
|
}
|
|
|
|
// GetCurrentSequence returns the current sequence number for a given key
|
|
func (g *LetterNumberGeneratorImpl) GetCurrentSequence(ctx context.Context, sequenceKey string) (int, error) {
|
|
seq := 0
|
|
if s, err := g.settingRepo.Get(ctx, sequenceKey); err == nil {
|
|
if v, ok := s.Value["value"].(float64); ok {
|
|
seq = int(v)
|
|
}
|
|
}
|
|
return seq, nil
|
|
}
|
|
|
|
// GetPrefix returns the configured prefix for a given key
|
|
func (g *LetterNumberGeneratorImpl) GetPrefix(ctx context.Context, prefixKey string, defaultPrefix string) string {
|
|
prefix := defaultPrefix
|
|
if s, err := g.settingRepo.Get(ctx, prefixKey); err == nil {
|
|
if v, ok := s.Value["value"].(string); ok && v != "" {
|
|
prefix = v
|
|
}
|
|
}
|
|
return prefix
|
|
}
|