dukcapil/internal/processor/letter_creation_processor.go
2025-09-20 16:31:22 +07:00

72 lines
2.1 KiB
Go

package processor
import (
"context"
"eslogad-be/internal/entities"
"eslogad-be/internal/repository"
"github.com/google/uuid"
)
type LetterCreationProcessor interface {
PrepareLetterForCreation(ctx context.Context, letter *entities.LetterOutgoing, departmentID uuid.UUID) error
CreateLetter(ctx context.Context, letter *entities.LetterOutgoing) error
GenerateLetterNumber(ctx context.Context, letter *entities.LetterOutgoing) error
}
type LetterCreationProcessorImpl struct {
letterRepo *repository.LetterOutgoingRepository
approvalFlowRepo *repository.ApprovalFlowRepository
numberGenerator LetterNumberGenerator
}
func NewLetterCreationProcessor(
letterRepo *repository.LetterOutgoingRepository,
approvalFlowRepo *repository.ApprovalFlowRepository,
numberGenerator LetterNumberGenerator,
) *LetterCreationProcessorImpl {
return &LetterCreationProcessorImpl{
letterRepo: letterRepo,
approvalFlowRepo: approvalFlowRepo,
numberGenerator: numberGenerator,
}
}
func (p *LetterCreationProcessorImpl) PrepareLetterForCreation(ctx context.Context, letter *entities.LetterOutgoing, departmentID uuid.UUID) error {
// Assign approval flow from department if not provided
if letter.ApprovalFlowID == nil && departmentID != uuid.Nil {
flow, err := p.approvalFlowRepo.GetByDepartment(ctx, departmentID)
if err == nil && flow != nil {
letter.ApprovalFlowID = &flow.ID
}
}
// Set initial status based on approval flow
if letter.ApprovalFlowID != nil {
letter.Status = entities.LetterOutgoingStatusPendingApproval
} else {
letter.Status = entities.LetterOutgoingStatusApproved
}
return nil
}
func (p *LetterCreationProcessorImpl) CreateLetter(ctx context.Context, letter *entities.LetterOutgoing) error {
return p.letterRepo.Create(ctx, letter)
}
func (p *LetterCreationProcessorImpl) GenerateLetterNumber(ctx context.Context, letter *entities.LetterOutgoing) error {
letterNumber, err := p.numberGenerator.GenerateNumber(
ctx,
"outgoing_letter_prefix",
"outgoing_letter_sequence",
"ESLO",
)
if err != nil {
return err
}
letter.LetterNumber = letterNumber
return nil
}