package tender_submission import ( "errors" "fmt" "strings" ) var ( ErrTenderSubmissionNotFound = errors.New("tender submission not found") ErrTenderSubmissionExists = errors.New("tender submission already exists for this tender and company") ErrInvalidStatus = errors.New("invalid tender submission status") ErrInvalidStage = errors.New("invalid tender submission stage") ErrTenderNotFound = errors.New("tender not found") ErrApprovalRequired = errors.New("tender must be approved before starting submission workflow") ErrInvalidStatusTransition = errors.New("invalid status transition") ErrTerminalStatus = errors.New("tender submission is in a terminal state and cannot be updated") ErrConcurrentUpdate = errors.New("tender submission was modified concurrently") ) // InvalidStatusTransitionError is returned when a status change is not allowed. type InvalidStatusTransitionError struct { CurrentStatus string NewStatus string Allowed []string } func (e *InvalidStatusTransitionError) Error() string { if len(e.Allowed) == 0 { return fmt.Sprintf("Tender submission status is already %s and cannot be changed", e.CurrentStatus) } return fmt.Sprintf( "Cannot change tender submission status from %s to %s. Allowed next statuses: %s", e.CurrentStatus, e.NewStatus, strings.Join(e.Allowed, ", "), ) } func NewInvalidStatusTransitionError(currentStatus, newStatus string, allowed []string) *InvalidStatusTransitionError { return &InvalidStatusTransitionError{ CurrentStatus: currentStatus, NewStatus: newStatus, Allowed: allowed, } }