/* Options: Date: 2026-04-17 20:34:13 SwiftVersion: 5.0 Version: 6.110 Tip: To override a DTO option, remove "//" prefix before updating BaseUrl: https://qlcn-api.vsmlab.vn //BaseClass: //AddModelExtensions: True //AddServiceStackTypes: True IncludeTypes: DocumentSearchRequest.* //ExcludeTypes: //ExcludeGenericBaseTypes: False //AddResponseStatus: False //AddImplicitVersion: //AddDescriptionAsComments: True //InitializeCollections: True //TreatTypesAsStrings: //DefaultImports: Foundation,ServiceStack */ import Foundation import ServiceStack // @Route("/document/search", "POST") public class DocumentSearchRequest : PagingRequest, IReturn, IDocumentSearchFilter, IPost { public typealias Return = SearchResponse public var title:String public var typeId:Int? public var groupId:Int? public var subjectId:Int? public var issuingAgencyId:Int? public var isUrgent:Bool? public var documentSearchStage:DocumentSearchStage public var isInternal:Bool? public var statusId:Int? public var orderBy:SearchOrderBy public var fromDate:Date? public var toDate:Date? public var isParty:Bool? public var branchType:Int16? public var scopeType:Int public var isFullTextSearch:Bool? public var createdByMe:Bool? public var mainId:Int? required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case title case typeId case groupId case subjectId case issuingAgencyId case isUrgent case documentSearchStage case isInternal case statusId case orderBy case fromDate case toDate case isParty case branchType case scopeType case isFullTextSearch case createdByMe case mainId } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) title = try container.decodeIfPresent(String.self, forKey: .title) typeId = try container.decodeIfPresent(Int.self, forKey: .typeId) groupId = try container.decodeIfPresent(Int.self, forKey: .groupId) subjectId = try container.decodeIfPresent(Int.self, forKey: .subjectId) issuingAgencyId = try container.decodeIfPresent(Int.self, forKey: .issuingAgencyId) isUrgent = try container.decodeIfPresent(Bool.self, forKey: .isUrgent) documentSearchStage = try container.decodeIfPresent(DocumentSearchStage.self, forKey: .documentSearchStage) isInternal = try container.decodeIfPresent(Bool.self, forKey: .isInternal) statusId = try container.decodeIfPresent(Int.self, forKey: .statusId) orderBy = try container.decodeIfPresent(SearchOrderBy.self, forKey: .orderBy) fromDate = try container.decodeIfPresent(Date.self, forKey: .fromDate) toDate = try container.decodeIfPresent(Date.self, forKey: .toDate) isParty = try container.decodeIfPresent(Bool.self, forKey: .isParty) branchType = try container.decodeIfPresent(Int16.self, forKey: .branchType) scopeType = try container.decodeIfPresent(Int.self, forKey: .scopeType) isFullTextSearch = try container.decodeIfPresent(Bool.self, forKey: .isFullTextSearch) createdByMe = try container.decodeIfPresent(Bool.self, forKey: .createdByMe) mainId = try container.decodeIfPresent(Int.self, forKey: .mainId) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if title != nil { try container.encode(title, forKey: .title) } if typeId != nil { try container.encode(typeId, forKey: .typeId) } if groupId != nil { try container.encode(groupId, forKey: .groupId) } if subjectId != nil { try container.encode(subjectId, forKey: .subjectId) } if issuingAgencyId != nil { try container.encode(issuingAgencyId, forKey: .issuingAgencyId) } if isUrgent != nil { try container.encode(isUrgent, forKey: .isUrgent) } if documentSearchStage != nil { try container.encode(documentSearchStage, forKey: .documentSearchStage) } if isInternal != nil { try container.encode(isInternal, forKey: .isInternal) } if statusId != nil { try container.encode(statusId, forKey: .statusId) } if orderBy != nil { try container.encode(orderBy, forKey: .orderBy) } if fromDate != nil { try container.encode(fromDate, forKey: .fromDate) } if toDate != nil { try container.encode(toDate, forKey: .toDate) } if isParty != nil { try container.encode(isParty, forKey: .isParty) } if branchType != nil { try container.encode(branchType, forKey: .branchType) } if scopeType != nil { try container.encode(scopeType, forKey: .scopeType) } if isFullTextSearch != nil { try container.encode(isFullTextSearch, forKey: .isFullTextSearch) } if createdByMe != nil { try container.encode(createdByMe, forKey: .createdByMe) } if mainId != nil { try container.encode(mainId, forKey: .mainId) } } } public class SearchResponse : IResponseRequest, Codable { public var totalCount:Int public var code:Int public var data:[DocumentSearchResultItem] = [] public var message:String required public init(){} } public class PagingRequest : Codable { public var page:Int public var limit:Int required public init(){} } public enum DocumentSearchStage : String, Codable { case All case AllProcessing case Draft case PendingApproval case IsRevisionRequested case PendingCompilation case PendingReport case Published case Active case InActive } public enum SearchOrderBy : String, Codable { case UpdatedDateDesc case PublishDateDesc case TitleAsc case DocumentCodeAsc } public protocol IDocumentSearchFilter { var title:String { get set } var typeId:Int? { get set } var groupId:Int? { get set } var subjectId:Int? { get set } var isUrgent:Bool? { get set } var documentSearchStage:DocumentSearchStage { get set } var isInternal:Bool? { get set } var isFullTextSearch:Bool? { get set } } 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 signBy:String public var signDate:Date? public var updatedAt:Date? public var statusId:Int? public var statusKey:String 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 branchType:Int16 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 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? public var completedStepCount:Int? required public init(){} }