/* Options: Date: 2026-02-04 10:32:49 SwiftVersion: 5.0 Version: 6.110 Tip: To override a DTO option, remove "//" prefix before updating BaseUrl: https://etc-api.vsmlab.vn //BaseClass: //AddModelExtensions: True //AddServiceStackTypes: True IncludeTypes: GetWorkflowStepRequest.* //ExcludeTypes: //ExcludeGenericBaseTypes: False //AddResponseStatus: False //AddImplicitVersion: //AddDescriptionAsComments: True //InitializeCollections: True //TreatTypesAsStrings: //DefaultImports: Foundation,ServiceStack */ import Foundation import ServiceStack // @Route("/WorkflowStep/by-workflow", "Get") public class GetWorkflowStepRequest : IReturn, Codable { public typealias Return = GetWorkflowStepResponse public var workflowId:Int required public init(){} } public class GetWorkflowStepResponse : IResponseRequest, Codable { public var code:Int public var message:String public var data:[WorkflowStepDetail] = [] required public init(){} } public enum CategoryTypes : String, Codable { case Department case PartyGroup case DocGroup case DocType case IssuingAgency case Status case Subjects case Workflow case WorkStatus case StepStatus case SignStatus } public class CreateCategoryModel : Codable { public var name:String public var Description:String public var type:CategoryTypes public var isParty:Bool // @Ignore() public var childList:[Int] = [] required public init(){} } public class UploadedFiles : BasicUploadedFile { public var id:Int? public var uploadedFile:String public var subDocumentId:Int? public var stepId:Int? public var code:Int required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case id case uploadedFile case subDocumentId case stepId case code } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decodeIfPresent(Int.self, forKey: .id) uploadedFile = try container.decodeIfPresent(String.self, forKey: .uploadedFile) subDocumentId = try container.decodeIfPresent(Int.self, forKey: .subDocumentId) stepId = try container.decodeIfPresent(Int.self, forKey: .stepId) code = try container.decodeIfPresent(Int.self, forKey: .code) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if id != nil { try container.encode(id, forKey: .id) } if uploadedFile != nil { try container.encode(uploadedFile, forKey: .uploadedFile) } if subDocumentId != nil { try container.encode(subDocumentId, forKey: .subDocumentId) } if stepId != nil { try container.encode(stepId, forKey: .stepId) } if code != nil { try container.encode(code, forKey: .code) } } } public class SimpleDocumentRelation : Codable { public var id:Int public var title:String public var documentCode:String public var publicationDate:Date? public var isSequentialSigning:Bool? public var statusText:String public var documentTypeId:Int? required public init(){} } public class BasicDocument : Codable { // @Required() public var title:String? // @StringLength(4000) public var Description:String // @StringLength(500) public var owner:String public var documentPolicyId:Int? public var updateDocumentId:Int? public var effectBeginDate:Date? public var effectEndDate:Date? public var issuingAgencyId:Int? public var documentTypeId:Int? public var documentGroupId:Int? public var subjectId:Int? // @StringLength(500) public var signBy:String public var signDate:Date? public var statusId:Int? public var isInternal:Bool public var documentNumber:String public var documentCode:String public var isUrgent:Bool? public var scopeType:Int? public var isActive:Bool? required public init(){} } public class StepAttached : Codable { public var id:Int public var documentCode:String public var title:String public var isSequentialSigning:Bool? public var pendingSignFile:UploadedFiles public var originalFile:UploadedFiles public var signerConfigs:[SignerConfigDetail] = [] required public init(){} } public class WorkflowStep : Codable { public var id:Int // @References(typeof(Document)) public var workflowId:Int public var stepOrder:Int? public var statusId:Int? // @Required() // @StringLength(255) public var stepName:String? // @Required() public var isRequired:Bool? public var slaLegalValue:Int? public var slaLegalIsByDay:Bool? public var slaInternalValue:Int? public var slaInternalIsByDay:Bool? public var requireAttachment:Bool public var isUsingForm:Bool? // @Required() public var Description:String? public var createdBy:Int // @Ignore() public var departmentIds:[Int] = [] // @Ignore() public var mainAssigneeIds:[Int] = [] // @Ignore() public var coDepartmentIds:[Int] = [] // @Ignore() public var supportingAssigneeIds:[Int] = [] // @Ignore() public var stepBasisDocumentIds:[Int] = [] // @Ignore() public var attachedDocuments:[StepAttached] = [] required public init(){} } public protocol IResponseRequest { var code:Int { get set } var message:String { get set } } public class Category : CreateCategoryModel { public var id:Int public var level:Int public var key:String public var sortOrder:Int public var lastUpdate:Date? // @Ignore() public var children:[Category] = [] required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case id case level case key case sortOrder case lastUpdate case children } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decodeIfPresent(Int.self, forKey: .id) level = try container.decodeIfPresent(Int.self, forKey: .level) key = try container.decodeIfPresent(String.self, forKey: .key) sortOrder = try container.decodeIfPresent(Int.self, forKey: .sortOrder) lastUpdate = try container.decodeIfPresent(Date.self, forKey: .lastUpdate) children = try container.decodeIfPresent([Category].self, forKey: .children) ?? [] } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if id != nil { try container.encode(id, forKey: .id) } if level != nil { try container.encode(level, forKey: .level) } if key != nil { try container.encode(key, forKey: .key) } if sortOrder != nil { try container.encode(sortOrder, forKey: .sortOrder) } if lastUpdate != nil { try container.encode(lastUpdate, forKey: .lastUpdate) } if children.count > 0 { try container.encode(children, forKey: .children) } } } public class Roles : Codable { public var id:Int // @StringLength(50) public var name:String public var createdAt:Date? public var deletedAt:Date? public var updatedAt:Date? public var updatedBy:Int? public var deletedBy:Int? public var createdBy:Int? // @Ignore() public var permission:[String] = [] required public init(){} } public class WorkflowStepDetail : WorkflowStep { public var departments:[Category] = [] public var coDepartments:[Category] = [] public var basisDocuments:[SimpleDocumentRelation] = [] public var referenceDocuments:[SimpleDocumentRelation] = [] public var mainAssignees:[WorkFlowProfile] = [] public var supportingAssignees:[WorkFlowProfile] = [] public var statusKey:String public var statusText:String // @Ignore() public var canRead:Bool? // @Ignore() public var canWrite:Bool? // @Ignore() public var canUpload:Bool? public var reasonReturn:String public var returnDate:Date? required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case departments case coDepartments case basisDocuments case referenceDocuments case mainAssignees case supportingAssignees case statusKey case statusText case canRead case canWrite case canUpload case reasonReturn case returnDate } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) departments = try container.decodeIfPresent([Category].self, forKey: .departments) ?? [] coDepartments = try container.decodeIfPresent([Category].self, forKey: .coDepartments) ?? [] basisDocuments = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .basisDocuments) ?? [] referenceDocuments = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .referenceDocuments) ?? [] mainAssignees = try container.decodeIfPresent([WorkFlowProfile].self, forKey: .mainAssignees) ?? [] supportingAssignees = try container.decodeIfPresent([WorkFlowProfile].self, forKey: .supportingAssignees) ?? [] statusKey = try container.decodeIfPresent(String.self, forKey: .statusKey) statusText = try container.decodeIfPresent(String.self, forKey: .statusText) canRead = try container.decodeIfPresent(Bool.self, forKey: .canRead) canWrite = try container.decodeIfPresent(Bool.self, forKey: .canWrite) canUpload = try container.decodeIfPresent(Bool.self, forKey: .canUpload) reasonReturn = try container.decodeIfPresent(String.self, forKey: .reasonReturn) returnDate = try container.decodeIfPresent(Date.self, forKey: .returnDate) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if departments.count > 0 { try container.encode(departments, forKey: .departments) } if coDepartments.count > 0 { try container.encode(coDepartments, forKey: .coDepartments) } if basisDocuments.count > 0 { try container.encode(basisDocuments, forKey: .basisDocuments) } if referenceDocuments.count > 0 { try container.encode(referenceDocuments, forKey: .referenceDocuments) } if mainAssignees.count > 0 { try container.encode(mainAssignees, forKey: .mainAssignees) } if supportingAssignees.count > 0 { try container.encode(supportingAssignees, forKey: .supportingAssignees) } if statusKey != nil { try container.encode(statusKey, forKey: .statusKey) } if statusText != nil { try container.encode(statusText, forKey: .statusText) } if canRead != nil { try container.encode(canRead, forKey: .canRead) } if canWrite != nil { try container.encode(canWrite, forKey: .canWrite) } if canUpload != nil { try container.encode(canUpload, forKey: .canUpload) } if reasonReturn != nil { try container.encode(reasonReturn, forKey: .reasonReturn) } if returnDate != nil { try container.encode(returnDate, forKey: .returnDate) } } } public class BasicUploadedFile : Codable { public var fileName:String public var filekey:String public var fileUrl:String public var checksum:String public var eTag:String public var fileSize:Int required public init(){} } public class SignerConfigDetail : SignerConfig { public var profile:WorkFlowProfile public var role:Roles required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case profile case role } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) profile = try container.decodeIfPresent(WorkFlowProfile.self, forKey: .profile) role = try container.decodeIfPresent(Roles.self, forKey: .role) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if profile != nil { try container.encode(profile, forKey: .profile) } if role != nil { try container.encode(role, forKey: .role) } } } public class Document : BasicDocument { public var id:Int // @StringLength(500) public var reasonReturn:String public var accountId:Int? public var deletedAt:Date? // @StringLength(500) public var deletedBy:String // @StringLength(500) public var updatedBy:String public var createdAt:Date? // @StringLength(500) public var createdBy:String public var isParty:Bool? public var isRevisionRequested:Bool public var lastUpdatedAt:Date? public var isPrivate:Bool? public var departmentId:Int? public var publicationDate:Date? public var processStatusId:Int? public var fullTextSearchContent:String required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case id case reasonReturn case accountId case deletedAt case deletedBy case updatedBy case createdAt case createdBy case isParty case isRevisionRequested case lastUpdatedAt case isPrivate case departmentId case publicationDate case processStatusId case fullTextSearchContent } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decodeIfPresent(Int.self, forKey: .id) reasonReturn = try container.decodeIfPresent(String.self, forKey: .reasonReturn) accountId = try container.decodeIfPresent(Int.self, forKey: .accountId) deletedAt = try container.decodeIfPresent(Date.self, forKey: .deletedAt) deletedBy = try container.decodeIfPresent(String.self, forKey: .deletedBy) updatedBy = try container.decodeIfPresent(String.self, forKey: .updatedBy) createdAt = try container.decodeIfPresent(Date.self, forKey: .createdAt) createdBy = try container.decodeIfPresent(String.self, forKey: .createdBy) isParty = try container.decodeIfPresent(Bool.self, forKey: .isParty) isRevisionRequested = try container.decodeIfPresent(Bool.self, forKey: .isRevisionRequested) lastUpdatedAt = try container.decodeIfPresent(Date.self, forKey: .lastUpdatedAt) isPrivate = try container.decodeIfPresent(Bool.self, forKey: .isPrivate) departmentId = try container.decodeIfPresent(Int.self, forKey: .departmentId) publicationDate = try container.decodeIfPresent(Date.self, forKey: .publicationDate) processStatusId = try container.decodeIfPresent(Int.self, forKey: .processStatusId) fullTextSearchContent = try container.decodeIfPresent(String.self, forKey: .fullTextSearchContent) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if id != nil { try container.encode(id, forKey: .id) } if reasonReturn != nil { try container.encode(reasonReturn, forKey: .reasonReturn) } if accountId != nil { try container.encode(accountId, forKey: .accountId) } if deletedAt != nil { try container.encode(deletedAt, forKey: .deletedAt) } if deletedBy != nil { try container.encode(deletedBy, forKey: .deletedBy) } if updatedBy != nil { try container.encode(updatedBy, forKey: .updatedBy) } if createdAt != nil { try container.encode(createdAt, forKey: .createdAt) } if createdBy != nil { try container.encode(createdBy, forKey: .createdBy) } if isParty != nil { try container.encode(isParty, forKey: .isParty) } if isRevisionRequested != nil { try container.encode(isRevisionRequested, forKey: .isRevisionRequested) } if lastUpdatedAt != nil { try container.encode(lastUpdatedAt, forKey: .lastUpdatedAt) } if isPrivate != nil { try container.encode(isPrivate, forKey: .isPrivate) } if departmentId != nil { try container.encode(departmentId, forKey: .departmentId) } if publicationDate != nil { try container.encode(publicationDate, forKey: .publicationDate) } if processStatusId != nil { try container.encode(processStatusId, forKey: .processStatusId) } if fullTextSearchContent != nil { try container.encode(fullTextSearchContent, forKey: .fullTextSearchContent) } } } public class WorkFlowProfile : Codable { public var id:Int public var name:String public var fullName:String public var email:String public var departmentId:Int? public var avatar:String public var telephone:String public var birthday:Date? public var confirmStatus:Int? public var confirmStatusText:String public var signAt:Date? public var signedFileId:Int? public var originalFileId:Int? public var signedFileName:String public var isSigned:Bool public var signStatusText:String required public init(){} } public class SignerConfig : BasicSignerConfig { public var id:Int public var documentId:Int public var stepId:Int? required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case id case documentId case stepId } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decodeIfPresent(Int.self, forKey: .id) documentId = try container.decodeIfPresent(Int.self, forKey: .documentId) stepId = try container.decodeIfPresent(Int.self, forKey: .stepId) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if id != nil { try container.encode(id, forKey: .id) } if documentId != nil { try container.encode(documentId, forKey: .documentId) } if stepId != nil { try container.encode(stepId, forKey: .stepId) } } } public class BasicSignerConfig : Codable { public var subDocumentId:Int? public var departmentId:Int? public var signerType:UInt8 public var signerRefId:Int // @Ignore() public var signerRefText:String public var actionType:UInt8 public var orderIndex:Int required public init(){} }