72 lines
2.1 KiB
Go
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
|
|
} |