/* Options: Date: 2025-12-06 13:09:43 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: AdvanceCreateDocument.* //ExcludeTypes: //ExcludeGenericBaseTypes: False //AddResponseStatus: False //AddImplicitVersion: //AddDescriptionAsComments: True //InitializeCollections: True //TreatTypesAsStrings: //DefaultImports: Foundation,ServiceStack */ import Foundation import ServiceStack // @Route("/document/advance-create", "POST") public class AdvanceCreateDocument : BasicDocument, IReturn { public typealias Return = DocumentDetailResponse public var partUploadedFile:UploadedFiles public var compactUploadedFile:UploadedFiles public var analysisUploadedFile:UploadedFiles public var fullUploadedFile:UploadedFiles public var attachFiles:[UploadedFiles] = [] public var basisDocumentId:[Int] = [] public var referenceDocumentId:[Int] = [] public var replacedDocumentId:[Int] = [] public var expiredDocumentId:[Int] = [] required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case partUploadedFile case compactUploadedFile case analysisUploadedFile case fullUploadedFile case attachFiles case basisDocumentId case referenceDocumentId case replacedDocumentId case expiredDocumentId } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) partUploadedFile = try container.decodeIfPresent(UploadedFiles.self, forKey: .partUploadedFile) compactUploadedFile = try container.decodeIfPresent(UploadedFiles.self, forKey: .compactUploadedFile) analysisUploadedFile = try container.decodeIfPresent(UploadedFiles.self, forKey: .analysisUploadedFile) fullUploadedFile = try container.decodeIfPresent(UploadedFiles.self, forKey: .fullUploadedFile) attachFiles = try container.decodeIfPresent([UploadedFiles].self, forKey: .attachFiles) ?? [] basisDocumentId = try container.decodeIfPresent([Int].self, forKey: .basisDocumentId) ?? [] referenceDocumentId = try container.decodeIfPresent([Int].self, forKey: .referenceDocumentId) ?? [] replacedDocumentId = try container.decodeIfPresent([Int].self, forKey: .replacedDocumentId) ?? [] expiredDocumentId = try container.decodeIfPresent([Int].self, forKey: .expiredDocumentId) ?? [] } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if partUploadedFile != nil { try container.encode(partUploadedFile, forKey: .partUploadedFile) } if compactUploadedFile != nil { try container.encode(compactUploadedFile, forKey: .compactUploadedFile) } if analysisUploadedFile != nil { try container.encode(analysisUploadedFile, forKey: .analysisUploadedFile) } if fullUploadedFile != nil { try container.encode(fullUploadedFile, forKey: .fullUploadedFile) } if attachFiles.count > 0 { try container.encode(attachFiles, forKey: .attachFiles) } if basisDocumentId.count > 0 { try container.encode(basisDocumentId, forKey: .basisDocumentId) } if referenceDocumentId.count > 0 { try container.encode(referenceDocumentId, forKey: .referenceDocumentId) } if replacedDocumentId.count > 0 { try container.encode(replacedDocumentId, forKey: .replacedDocumentId) } if expiredDocumentId.count > 0 { try container.encode(expiredDocumentId, forKey: .expiredDocumentId) } } } public class DocumentDetailResponse : IResponseRequest, Codable { public var data:DocumentDetail public var code:Int public var message:String 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 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 enum AccessType : String, Codable { case Public case Restricted } public protocol IResponseRequest { var code:Int { get set } var message:String { get set } } public class DocumentSearchResultItem : Codable { public var title:String public var Description:String 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 subjectId:Int? public var signBy:String public var signDate:Date? public var updatedAt:Date? public var statusId:Int? public var isInternal:Bool public var documentNumber:String public var documentCode:String public var isUrgent:Bool? public var id:Int public var reasonReturn:String public var accountId:Int? public var approverId:Int? // @StringLength(500) public var updatedBy:String // @StringLength(500) public var createdBy:String public var isParty:Bool? public var isRevisionRequested:Bool? public var isPrivate:Bool? public var departmentId:Int? public var publicationDate:Date? public var processStatusId:Int public var documentTypeId:Int? public var documentGroupId:Int? public var accountName:String public var acceptAccountName:String public var documentGroupText:String public var processStatusText:String public var documentTypeText:String public var departmentText:String public var statusText:String public var issuingAgencyText:String public var subjectText:String public var comment:String public var submitComment:String public var fullFile:String public var parthFile:String public var isActive:Bool? public var stepOrder:Int? public var stepCount:Int? required public init(){} } public class DocumentDetail : DocumentSearchResultItem { public var partUploadedFile:UploadedFileAttach public var compactUploadedFile:UploadedFileAttach public var analysisUploadedFile:UploadedFileAttach public var fullUploadedFile:UploadedFileAttach public var createdAt:Date public var nextApprover:ApproversProfile public var currentApprover:CurrentApprover public var attachFiles:[UploadedFileAttach] = [] public var hasReadPermission:Bool public var canGrantReadPermission:Bool public var basisDocument:[SimpleDocumentRelation] = [] public var basisForDocument:[SimpleDocumentRelation] = [] public var mainDocument:SimpleDocumentRelation public var referenceDocument:[SimpleDocumentRelation] = [] public var referencedByDocument:[SimpleDocumentRelation] = [] public var replacedDocument:[SimpleDocumentRelation] = [] public var replacedByDocument:[SimpleDocumentRelation] = [] public var expiredDocument:[SimpleDocumentRelation] = [] public var expiredByDocument:[SimpleDocumentRelation] = [] public var updateForDocument:SimpleDocumentRelation public var scopeType:Int? public var stepOrder:Int required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case partUploadedFile case compactUploadedFile case analysisUploadedFile case fullUploadedFile case createdAt case nextApprover case currentApprover case attachFiles case hasReadPermission case canGrantReadPermission case basisDocument case basisForDocument case mainDocument case referenceDocument case referencedByDocument case replacedDocument case replacedByDocument case expiredDocument case expiredByDocument case updateForDocument case scopeType case stepOrder } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) partUploadedFile = try container.decodeIfPresent(UploadedFileAttach.self, forKey: .partUploadedFile) compactUploadedFile = try container.decodeIfPresent(UploadedFileAttach.self, forKey: .compactUploadedFile) analysisUploadedFile = try container.decodeIfPresent(UploadedFileAttach.self, forKey: .analysisUploadedFile) fullUploadedFile = try container.decodeIfPresent(UploadedFileAttach.self, forKey: .fullUploadedFile) createdAt = try container.decodeIfPresent(Date.self, forKey: .createdAt) nextApprover = try container.decodeIfPresent(ApproversProfile.self, forKey: .nextApprover) currentApprover = try container.decodeIfPresent(CurrentApprover.self, forKey: .currentApprover) attachFiles = try container.decodeIfPresent([UploadedFileAttach].self, forKey: .attachFiles) ?? [] hasReadPermission = try container.decodeIfPresent(Bool.self, forKey: .hasReadPermission) canGrantReadPermission = try container.decodeIfPresent(Bool.self, forKey: .canGrantReadPermission) basisDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .basisDocument) ?? [] basisForDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .basisForDocument) ?? [] mainDocument = try container.decodeIfPresent(SimpleDocumentRelation.self, forKey: .mainDocument) referenceDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .referenceDocument) ?? [] referencedByDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .referencedByDocument) ?? [] replacedDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .replacedDocument) ?? [] replacedByDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .replacedByDocument) ?? [] expiredDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .expiredDocument) ?? [] expiredByDocument = try container.decodeIfPresent([SimpleDocumentRelation].self, forKey: .expiredByDocument) ?? [] updateForDocument = try container.decodeIfPresent(SimpleDocumentRelation.self, forKey: .updateForDocument) scopeType = try container.decodeIfPresent(Int.self, forKey: .scopeType) stepOrder = try container.decodeIfPresent(Int.self, forKey: .stepOrder) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if partUploadedFile != nil { try container.encode(partUploadedFile, forKey: .partUploadedFile) } if compactUploadedFile != nil { try container.encode(compactUploadedFile, forKey: .compactUploadedFile) } if analysisUploadedFile != nil { try container.encode(analysisUploadedFile, forKey: .analysisUploadedFile) } if fullUploadedFile != nil { try container.encode(fullUploadedFile, forKey: .fullUploadedFile) } if createdAt != nil { try container.encode(createdAt, forKey: .createdAt) } if nextApprover != nil { try container.encode(nextApprover, forKey: .nextApprover) } if currentApprover != nil { try container.encode(currentApprover, forKey: .currentApprover) } if attachFiles.count > 0 { try container.encode(attachFiles, forKey: .attachFiles) } if hasReadPermission != nil { try container.encode(hasReadPermission, forKey: .hasReadPermission) } if canGrantReadPermission != nil { try container.encode(canGrantReadPermission, forKey: .canGrantReadPermission) } if basisDocument.count > 0 { try container.encode(basisDocument, forKey: .basisDocument) } if basisForDocument.count > 0 { try container.encode(basisForDocument, forKey: .basisForDocument) } if mainDocument != nil { try container.encode(mainDocument, forKey: .mainDocument) } if referenceDocument.count > 0 { try container.encode(referenceDocument, forKey: .referenceDocument) } if referencedByDocument.count > 0 { try container.encode(referencedByDocument, forKey: .referencedByDocument) } if replacedDocument.count > 0 { try container.encode(replacedDocument, forKey: .replacedDocument) } if replacedByDocument.count > 0 { try container.encode(replacedByDocument, forKey: .replacedByDocument) } if expiredDocument.count > 0 { try container.encode(expiredDocument, forKey: .expiredDocument) } if expiredByDocument.count > 0 { try container.encode(expiredByDocument, forKey: .expiredByDocument) } if updateForDocument != nil { try container.encode(updateForDocument, forKey: .updateForDocument) } if scopeType != nil { try container.encode(scopeType, forKey: .scopeType) } if stepOrder != nil { try container.encode(stepOrder, forKey: .stepOrder) } } } public class UserProfile : UserLogin { public var id:Int public var fullName:String public var email:String public var departmentId:Int? public var partyGroupId:Int? public var avatar:String public var telephone:String public var birthday:Date? public var createdAt:Date? public var updatedAt:Date? public var failedLoginCount:Int // @Ignore() public var roles:[Int] = [] public var lastLoginDate:Date? required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case id case fullName case email case departmentId case partyGroupId case avatar case telephone case birthday case createdAt case updatedAt case failedLoginCount case roles case lastLoginDate } 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) fullName = try container.decodeIfPresent(String.self, forKey: .fullName) email = try container.decodeIfPresent(String.self, forKey: .email) departmentId = try container.decodeIfPresent(Int.self, forKey: .departmentId) partyGroupId = try container.decodeIfPresent(Int.self, forKey: .partyGroupId) avatar = try container.decodeIfPresent(String.self, forKey: .avatar) telephone = try container.decodeIfPresent(String.self, forKey: .telephone) birthday = try container.decodeIfPresent(Date.self, forKey: .birthday) createdAt = try container.decodeIfPresent(Date.self, forKey: .createdAt) updatedAt = try container.decodeIfPresent(Date.self, forKey: .updatedAt) failedLoginCount = try container.decodeIfPresent(Int.self, forKey: .failedLoginCount) roles = try container.decodeIfPresent([Int].self, forKey: .roles) ?? [] lastLoginDate = try container.decodeIfPresent(Date.self, forKey: .lastLoginDate) } 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 fullName != nil { try container.encode(fullName, forKey: .fullName) } if email != nil { try container.encode(email, forKey: .email) } if departmentId != nil { try container.encode(departmentId, forKey: .departmentId) } if partyGroupId != nil { try container.encode(partyGroupId, forKey: .partyGroupId) } if avatar != nil { try container.encode(avatar, forKey: .avatar) } if telephone != nil { try container.encode(telephone, forKey: .telephone) } if birthday != nil { try container.encode(birthday, forKey: .birthday) } if createdAt != nil { try container.encode(createdAt, forKey: .createdAt) } if updatedAt != nil { try container.encode(updatedAt, forKey: .updatedAt) } if failedLoginCount != nil { try container.encode(failedLoginCount, forKey: .failedLoginCount) } if roles.count > 0 { try container.encode(roles, forKey: .roles) } if lastLoginDate != nil { try container.encode(lastLoginDate, forKey: .lastLoginDate) } } } 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 UploadedFileAttach : UploadedFileModel { public var fileType:String public var subDocumentId:Int? public var stepId:Int? required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case fileType case subDocumentId case stepId } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) fileType = try container.decodeIfPresent(String.self, forKey: .fileType) subDocumentId = try container.decodeIfPresent(Int.self, forKey: .subDocumentId) 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 fileType != nil { try container.encode(fileType, forKey: .fileType) } if subDocumentId != nil { try container.encode(subDocumentId, forKey: .subDocumentId) } if stepId != nil { try container.encode(stepId, forKey: .stepId) } } } public class ApproversProfile : Codable { public var userProfiles:[UserProfile] = [] public var processStatusId:Int public var processTitle:String public var actionButtonLabel:String public var processDescription:String public var isApprovalRequired:Bool public var isFinalStep:Bool public var stepOrder:Int required public init(){} } public class CurrentApprover : Codable { public var approverId:Int? public var status:String public var processStatusId:Int public var processTitle:String public var actionButtonLabel:String public var processDescription:String public var isApprovalRequired:Bool public var isFinalStep:Bool public var stepOrder:Int required public init(){} } public class SimpleDocumentRelation : Codable { public var id:Int public var title:String public var documentCode:String public var publicationDate:Date? required public init(){} } public class UserLogin : Codable { // @Required() public var name:String? required public init(){} } public class UploadedFileModel : BasicUploadedFile { public var id:Int public var accessType:AccessType public var createdBy:Int public var createdDate:Date required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case id case accessType case createdBy case createdDate } 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) accessType = try container.decodeIfPresent(AccessType.self, forKey: .accessType) createdBy = try container.decodeIfPresent(Int.self, forKey: .createdBy) createdDate = try container.decodeIfPresent(Date.self, forKey: .createdDate) } 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 accessType != nil { try container.encode(accessType, forKey: .accessType) } if createdBy != nil { try container.encode(createdBy, forKey: .createdBy) } if createdDate != nil { try container.encode(createdDate, forKey: .createdDate) } } }