365 lines
17 KiB
Go
365 lines
17 KiB
Go
package contract
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/google/uuid"
|
|
)
|
|
|
|
type SearchOutgoingLettersRequest struct {
|
|
Query string `json:"query" form:"query"`
|
|
LetterNumber string `json:"letter_number" form:"letter_number"`
|
|
Subject string `json:"subject" form:"subject"`
|
|
Status string `json:"status" form:"status"`
|
|
PriorityID *uuid.UUID `json:"priority_id" form:"priority_id"`
|
|
InstitutionID *uuid.UUID `json:"institution_id" form:"institution_id"`
|
|
CreatedBy *uuid.UUID `json:"created_by" form:"created_by"`
|
|
DateFrom *time.Time `json:"date_from" form:"date_from"`
|
|
DateTo *time.Time `json:"date_to" form:"date_to"`
|
|
Page int `json:"page" form:"page"`
|
|
Limit int `json:"limit" form:"limit"`
|
|
SortBy string `json:"sort_by" form:"sort_by"`
|
|
SortOrder string `json:"sort_order" form:"sort_order"`
|
|
}
|
|
|
|
type SearchOutgoingLettersResponse struct {
|
|
Letters []OutgoingLetterResponse `json:"letters"`
|
|
TotalCount int64 `json:"total_count"`
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
}
|
|
|
|
type CreateOutgoingLetterRecipient struct {
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
UserID *uuid.UUID `json:"user_id,omitempty"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
IsPrimary bool `json:"is_primary"`
|
|
Status string `json:"status"`
|
|
Flag *string `json:"flag,omitempty"`
|
|
IsArchived bool `json:"is_archived"`
|
|
}
|
|
|
|
type CreateOutgoingLetterAttachment struct {
|
|
FileURL string `json:"file_url" validate:"required"`
|
|
FileName string `json:"file_name" validate:"required"`
|
|
FileType string `json:"file_type" validate:"required"`
|
|
}
|
|
|
|
type CreateOutgoingLetterRequest struct {
|
|
ReferenceNumber *string `json:"reference_number,omitempty"`
|
|
Subject string `json:"subject" validate:"required"`
|
|
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" validate:"required"`
|
|
Attachments []CreateOutgoingLetterAttachment `json:"attachments,omitempty"`
|
|
UserID uuid.UUID
|
|
}
|
|
|
|
type OutgoingLetterRecipientResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
UserID *uuid.UUID `json:"user_id,omitempty"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
IsPrimary bool `json:"is_primary"`
|
|
Status string `json:"status"`
|
|
ReadAt *time.Time `json:"read_at,omitempty"`
|
|
Flag *string `json:"flag,omitempty"`
|
|
IsArchived bool `json:"is_archived"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
User *UserResponse `json:"user,omitempty"`
|
|
Department *DepartmentResponse `json:"department,omitempty"`
|
|
}
|
|
|
|
type OutgoingLetterAttachmentResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
FileURL string `json:"file_url"`
|
|
FileName string `json:"file_name"`
|
|
FileType string `json:"file_type"`
|
|
UploadedAt time.Time `json:"uploaded_at"`
|
|
}
|
|
|
|
type OutgoingLetterApprovalResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
StepOrder int `json:"step_order"`
|
|
ParallelGroup int `json:"parallel_group"`
|
|
IsRequired bool `json:"is_required"`
|
|
ApproverID *uuid.UUID `json:"approver_id,omitempty"`
|
|
Status string `json:"status"`
|
|
Remarks *string `json:"remarks,omitempty"`
|
|
ActedAt *time.Time `json:"acted_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
}
|
|
|
|
type OutgoingLetterResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterNumber string `json:"letter_number"`
|
|
ReferenceNumber *string `json:"reference_number,omitempty"`
|
|
Subject string `json:"subject"`
|
|
Description *string `json:"description,omitempty"`
|
|
PriorityID *uuid.UUID `json:"priority_id,omitempty"`
|
|
Priority *PriorityResponse `json:"priority,omitempty"`
|
|
ReceiverInstitutionID *uuid.UUID `json:"receiver_institution_id,omitempty"`
|
|
ReceiverInstitution *InstitutionResponse `json:"receiver_institution,omitempty"`
|
|
ReceiverName *string `json:"receiver_name,omitempty"`
|
|
IssueDate time.Time `json:"issue_date"`
|
|
Status string `json:"status"`
|
|
ApprovalFlowID *uuid.UUID `json:"approval_flow_id,omitempty"`
|
|
CreatedBy uuid.UUID `json:"created_by"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
Recipients []OutgoingLetterRecipientResponse `json:"recipients,omitempty"`
|
|
Attachments []OutgoingLetterAttachmentResponse `json:"attachments,omitempty"`
|
|
Approvals []OutgoingLetterApprovalResponse `json:"approvals,omitempty"`
|
|
}
|
|
|
|
type UpdateOutgoingLetterRequest struct {
|
|
ReferenceNumber *string `json:"reference_number,omitempty"`
|
|
Subject *string `json:"subject,omitempty"`
|
|
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,omitempty"`
|
|
}
|
|
|
|
type ListOutgoingLettersRequest struct {
|
|
Page int `form:"page" json:"page"`
|
|
Limit int `form:"limit" json:"limit"`
|
|
Status string `form:"status" json:"status,omitempty"`
|
|
Query string `form:"q" json:"query,omitempty"`
|
|
CreatedBy *uuid.UUID `form:"created_by" json:"created_by,omitempty"`
|
|
DepartmentID *uuid.UUID `form:"department_id" json:"department_id,omitempty"`
|
|
ReceiverInstitutionID *uuid.UUID `form:"receiver_institution_id" json:"receiver_institution_id,omitempty"`
|
|
FromDate string `form:"from_date" json:"from_date,omitempty"`
|
|
ToDate string `form:"to_date" json:"to_date,omitempty"`
|
|
PriorityID *uuid.UUID `form:"priority_id" json:"priority_id,omitempty"`
|
|
SortBy string `form:"sort_by" json:"sort_by,omitempty"`
|
|
SortOrder string `form:"sort_order" json:"sort_order,omitempty"`
|
|
IsArchived *bool `form:"is_archived" json:"is_archived,omitempty"`
|
|
}
|
|
|
|
type ListOutgoingLettersResponse struct {
|
|
Items []*OutgoingLetterResponse `json:"items"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
type ApproveLetterRequest struct {
|
|
Remarks *string `json:"remarks,omitempty"`
|
|
}
|
|
|
|
type RejectLetterRequest struct {
|
|
Reason string `json:"reason" validate:"required"`
|
|
}
|
|
|
|
type AddRecipientsRequest struct {
|
|
Recipients []CreateOutgoingLetterRecipient `json:"recipients" validate:"required,dive"`
|
|
}
|
|
|
|
type UpdateRecipientRequest struct {
|
|
UserID *uuid.UUID `json:"user_id,omitempty"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
IsPrimary bool `json:"is_primary"`
|
|
Status *string `json:"status,omitempty"`
|
|
Flag *string `json:"flag,omitempty"`
|
|
IsArchived *bool `json:"is_archived,omitempty"`
|
|
}
|
|
|
|
type AddAttachmentsRequest struct {
|
|
Attachments []CreateOutgoingLetterAttachment `json:"attachments" validate:"required,dive"`
|
|
}
|
|
|
|
type CreateDiscussionAttachment struct {
|
|
FileURL string `json:"file_url" validate:"required"`
|
|
FileName string `json:"file_name" validate:"required"`
|
|
FileType string `json:"file_type" validate:"required"`
|
|
}
|
|
|
|
type CreateDiscussionRequest struct {
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
Message string `json:"message" validate:"required"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
Attachments []CreateDiscussionAttachment `json:"attachments,omitempty"`
|
|
}
|
|
|
|
type UpdateDiscussionRequest struct {
|
|
Message string `json:"message" validate:"required"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
}
|
|
|
|
type DiscussionResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
UserID uuid.UUID `json:"user_id"`
|
|
Message string `json:"message"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
EditedAt *time.Time `json:"edited_at,omitempty"`
|
|
}
|
|
|
|
type ApprovalFlowRequest struct {
|
|
DepartmentID uuid.UUID `json:"department_id" validate:"required"`
|
|
Name string `json:"name" validate:"required"`
|
|
Description *string `json:"description,omitempty"`
|
|
IsActive bool `json:"is_active"`
|
|
Steps []ApprovalFlowStepRequest `json:"steps" validate:"required,dive"`
|
|
}
|
|
|
|
type ApprovalFlowStepRequest struct {
|
|
StepOrder int `json:"step_order" validate:"required,min=1"`
|
|
ParallelGroup int `json:"parallel_group" validate:"min=1"`
|
|
ApproverRoleID *uuid.UUID `json:"approver_role_id,omitempty"`
|
|
ApproverUserID *uuid.UUID `json:"approver_user_id,omitempty"`
|
|
Required bool `json:"required"`
|
|
}
|
|
|
|
type ApprovalFlowResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
DepartmentID uuid.UUID `json:"department_id"`
|
|
Department *DepartmentResponse `json:"department,omitempty"`
|
|
Name string `json:"name"`
|
|
Description *string `json:"description,omitempty"`
|
|
IsActive bool `json:"is_active"`
|
|
Steps []ApprovalFlowStepResponse `json:"steps,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ApprovalFlowStepResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
StepOrder int `json:"step_order"`
|
|
ParallelGroup int `json:"parallel_group"`
|
|
ApproverRoleID *uuid.UUID `json:"approver_role_id,omitempty"`
|
|
ApproverRole *RoleResponse `json:"approver_role,omitempty"`
|
|
ApproverUserID *uuid.UUID `json:"approver_user_id,omitempty"`
|
|
ApproverUser *UserResponse `json:"approver_user,omitempty"`
|
|
Required bool `json:"required"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
}
|
|
|
|
type ListApprovalFlowsRequest struct {
|
|
Limit int `json:"limit"`
|
|
Offset int `json:"offset"`
|
|
DepartmentID *uuid.UUID `json:"department_id,omitempty"`
|
|
IsActive *bool `json:"is_active,omitempty"`
|
|
}
|
|
|
|
type ListApprovalFlowsResponse struct {
|
|
Items []*ApprovalFlowResponse `json:"items"`
|
|
Total int64 `json:"total"`
|
|
}
|
|
|
|
// Letter Approval Information for Approver
|
|
type LetterApprovalInfoResponse struct {
|
|
IsApproverOnActiveStep bool `json:"is_approver_on_active_step"`
|
|
DecisionStatus string `json:"decision_status"`
|
|
CanApprove bool `json:"can_approve"`
|
|
Actions []ApprovalAction `json:"actions"`
|
|
NotesVisibility string `json:"notes_visibility"`
|
|
}
|
|
|
|
type ApprovalAction struct {
|
|
Type string `json:"type"`
|
|
Href string `json:"href"`
|
|
Method string `json:"method"`
|
|
}
|
|
|
|
// OutgoingLetterApprovalDiscussionsResponse combines approvals and discussions for outgoing letters
|
|
type OutgoingLetterApprovalDiscussionsResponse struct {
|
|
Approvals []EnhancedOutgoingLetterApprovalResponse `json:"approvals"`
|
|
Discussions []OutgoingLetterDiscussionResponse `json:"discussions"`
|
|
}
|
|
|
|
// EnhancedOutgoingLetterApprovalResponse includes approval details with related data
|
|
type EnhancedOutgoingLetterApprovalResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
StepID uuid.UUID `json:"step_id"`
|
|
StepOrder int `json:"step_order"`
|
|
ParallelGroup int `json:"parallel_group"`
|
|
IsRequired bool `json:"is_required"`
|
|
ApproverID *uuid.UUID `json:"approver_id,omitempty"`
|
|
Status string `json:"status"`
|
|
Remarks *string `json:"remarks,omitempty"`
|
|
ActedAt *time.Time `json:"acted_at,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
Step *ApprovalFlowStepResponse `json:"step,omitempty"`
|
|
Approver *UserResponse `json:"approver,omitempty"`
|
|
}
|
|
|
|
// GetLetterApprovalsResponse represents the list of approvals for a letter
|
|
type GetLetterApprovalsResponse struct {
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
LetterNumber string `json:"letter_number"`
|
|
LetterStatus string `json:"letter_status"`
|
|
TotalSteps int `json:"total_steps"`
|
|
CurrentStep int `json:"current_step"`
|
|
Approvals []EnhancedOutgoingLetterApprovalResponse `json:"approvals"`
|
|
}
|
|
|
|
// OutgoingLetterDiscussionResponse represents a discussion on an outgoing letter
|
|
type OutgoingLetterDiscussionResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
ParentID *uuid.UUID `json:"parent_id,omitempty"`
|
|
UserID uuid.UUID `json:"user_id"`
|
|
Message string `json:"message"`
|
|
Mentions map[string]interface{} `json:"mentions,omitempty"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
EditedAt *time.Time `json:"edited_at,omitempty"`
|
|
User *UserResponse `json:"user,omitempty"`
|
|
MentionedUsers []UserResponse `json:"mentioned_users,omitempty"`
|
|
Attachments []OutgoingLetterDiscussionAttachmentResponse `json:"attachments,omitempty"`
|
|
}
|
|
|
|
// OutgoingLetterDiscussionAttachmentResponse represents an attachment in a discussion
|
|
type OutgoingLetterDiscussionAttachmentResponse struct {
|
|
ID uuid.UUID `json:"id"`
|
|
DiscussionID uuid.UUID `json:"discussion_id"`
|
|
FileURL string `json:"file_url"`
|
|
FileName string `json:"file_name"`
|
|
FileType string `json:"file_type"`
|
|
UploadedBy *uuid.UUID `json:"uploaded_by,omitempty"`
|
|
UploadedAt time.Time `json:"uploaded_at"`
|
|
}
|
|
|
|
// TimelineEvent represents a single event in the approval timeline
|
|
type TimelineEvent struct {
|
|
ID string `json:"id"`
|
|
Type string `json:"type"` // "approval", "discussion", "submission", "rejection"
|
|
Timestamp time.Time `json:"timestamp"`
|
|
Actor *UserResponse `json:"actor,omitempty"`
|
|
Action string `json:"action"`
|
|
Description string `json:"description"`
|
|
Status string `json:"status,omitempty"`
|
|
StepOrder int `json:"step_order,omitempty"`
|
|
Message string `json:"message,omitempty"`
|
|
Data interface{} `json:"data,omitempty"`
|
|
}
|
|
|
|
// ApprovalTimelineResponse represents the complete timeline for a letter
|
|
type ApprovalTimelineResponse struct {
|
|
LetterID uuid.UUID `json:"letter_id"`
|
|
LetterNumber string `json:"letter_number"`
|
|
Subject string `json:"subject"`
|
|
Status string `json:"status"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
Timeline []TimelineEvent `json:"timeline"`
|
|
Summary TimelineSummary `json:"summary"`
|
|
}
|
|
|
|
// TimelineSummary provides overview statistics for the timeline
|
|
type TimelineSummary struct {
|
|
TotalSteps int `json:"total_steps"`
|
|
CompletedSteps int `json:"completed_steps"`
|
|
PendingSteps int `json:"pending_steps"`
|
|
CurrentStep int `json:"current_step"`
|
|
TotalDuration string `json:"total_duration"`
|
|
AverageStepTime string `json:"average_step_time"`
|
|
Status string `json:"status"`
|
|
}
|