package entities import ( "time" "github.com/google/uuid" ) type LetterOutgoingStatus string const ( LetterOutgoingStatusDraft LetterOutgoingStatus = "draft" LetterOutgoingStatusPendingApproval LetterOutgoingStatus = "pending_approval" LetterOutgoingStatusApproved LetterOutgoingStatus = "approved" LetterOutgoingStatusSent LetterOutgoingStatus = "sent" LetterOutgoingStatusRejected LetterOutgoingStatus = "rejected" ) type LetterOutgoing struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` LetterNumber string `gorm:"uniqueIndex;not null" json:"letter_number"` ReferenceNumber *string `json:"reference_number,omitempty"` Subject string `gorm:"not null" json:"subject"` Description *string `json:"description,omitempty"` PriorityID *uuid.UUID `json:"priority_id,omitempty"` ReceiverInstitutionID *uuid.UUID `json:"receiver_institution_id,omitempty"` ReceiverName *string `json:"receiver_name,omitempty"` IssueDate time.Time `json:"issue_date"` Status LetterOutgoingStatus `gorm:"not null;default:'draft'" json:"status"` ApprovalFlowID *uuid.UUID `json:"approval_flow_id,omitempty"` RevisionNumber int `gorm:"not null;default:0" json:"revision_number"` CreatedBy uuid.UUID `gorm:"not null" json:"created_by"` IsArchived bool `gorm:"not null;default:false" json:"is_archived"` ArchivedAt *time.Time `json:"archived_at,omitempty"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` DeletedAt *time.Time `gorm:"index" json:"deleted_at,omitempty"` // Relations Priority *Priority `gorm:"foreignKey:PriorityID" json:"priority,omitempty"` ReceiverInstitution *Institution `gorm:"foreignKey:ReceiverInstitutionID" json:"receiver_institution,omitempty"` Creator *User `gorm:"foreignKey:CreatedBy" json:"creator,omitempty"` ApprovalFlow *ApprovalFlow `gorm:"foreignKey:ApprovalFlowID" json:"approval_flow,omitempty"` Recipients []LetterOutgoingRecipient `gorm:"foreignKey:LetterID" json:"recipients,omitempty"` Attachments []LetterOutgoingAttachment `gorm:"foreignKey:LetterID" json:"attachments,omitempty"` Approvals []LetterOutgoingApproval `gorm:"foreignKey:LetterID" json:"approvals,omitempty"` Discussions []LetterOutgoingDiscussion `gorm:"foreignKey:LetterID" json:"discussions,omitempty"` ActivityLogs []LetterOutgoingActivityLog `gorm:"foreignKey:LetterID" json:"activity_logs,omitempty"` } func (LetterOutgoing) TableName() string { return "letters_outgoing" } type LetterOutgoingRecipient struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` LetterID uuid.UUID `gorm:"type:uuid;not null" json:"letter_id"` UserID *uuid.UUID `gorm:"type:uuid" json:"user_id,omitempty"` DepartmentID *uuid.UUID `gorm:"type:uuid" json:"department_id,omitempty"` IsPrimary bool `gorm:"default:false" json:"is_primary"` Status string `gorm:"default:'pending'" json:"status"` ReadAt *time.Time `json:"read_at,omitempty"` Flag *string `json:"flag,omitempty"` IsArchived bool `gorm:"default:false" json:"is_archived"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` User *User `gorm:"foreignKey:UserID" json:"user,omitempty"` Department *Department `gorm:"foreignKey:DepartmentID" json:"department,omitempty"` } func (LetterOutgoingRecipient) TableName() string { return "letter_outgoing_recipients" } type LetterOutgoingAttachment struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` LetterID uuid.UUID `gorm:"type:uuid;not null" json:"letter_id"` RevisionNumber int `gorm:"not null;default:0" json:"revision_number"` FileURL string `gorm:"not null" json:"file_url"` FileName string `gorm:"not null" json:"file_name"` FileType string `gorm:"not null" json:"file_type"` UploadedBy *uuid.UUID `json:"uploaded_by,omitempty"` UploadedAt time.Time `gorm:"autoCreateTime" json:"uploaded_at"` } func (LetterOutgoingAttachment) TableName() string { return "letter_outgoing_attachments" } type LetterOutgoingDiscussion struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` LetterID uuid.UUID `gorm:"type:uuid;not null" json:"letter_id"` ParentID *uuid.UUID `json:"parent_id,omitempty"` UserID uuid.UUID `gorm:"not null" json:"user_id"` Message string `gorm:"not null" json:"message"` Mentions JSONB `gorm:"type:jsonb" json:"mentions,omitempty"` CreatedAt time.Time `gorm:"autoCreateTime" json:"created_at"` UpdatedAt time.Time `gorm:"autoUpdateTime" json:"updated_at"` EditedAt *time.Time `json:"edited_at,omitempty"` // Relations User *User `gorm:"foreignKey:UserID" json:"user,omitempty"` Attachments []LetterOutgoingDiscussionAttachment `gorm:"foreignKey:DiscussionID" json:"attachments,omitempty"` Replies []LetterOutgoingDiscussion `gorm:"foreignKey:ParentID" json:"replies,omitempty"` } func (LetterOutgoingDiscussion) TableName() string { return "letter_outgoing_discussions" } type LetterOutgoingDiscussionAttachment struct { ID uuid.UUID `gorm:"type:uuid;primary_key;default:gen_random_uuid()" json:"id"` DiscussionID uuid.UUID `gorm:"type:uuid;not null" json:"discussion_id"` FileURL string `gorm:"not null" json:"file_url"` FileName string `gorm:"not null" json:"file_name"` FileType string `gorm:"not null" json:"file_type"` UploadedBy *uuid.UUID `json:"uploaded_by,omitempty"` UploadedAt time.Time `gorm:"autoCreateTime" json:"uploaded_at"` } func (LetterOutgoingDiscussionAttachment) TableName() string { return "letter_outgoing_discussion_attachments" }