/* Options: Date: 2025-12-06 06:45:38 SwiftVersion: 5.0 Version: 8.0 Tip: To override a DTO option, remove "//" prefix before updating BaseUrl: https://api.1fetch.co.za //BaseClass: //AddModelExtensions: True //AddServiceStackTypes: True IncludeTypes: PicUpCreateShipmentRequest.* //ExcludeTypes: //ExcludeGenericBaseTypes: False //AddResponseStatus: False //AddImplicitVersion: //AddDescriptionAsComments: True //InitializeCollections: True //TreatTypesAsStrings: //DefaultImports: Foundation,ServiceStack */ import Foundation import ServiceStack // @Route("/picup/createshipment", "POST") public class PicUpCreateShipmentRequest : IReturn, IHasApiKey, ILogRequest, Codable { public typealias Return = PicUpCreateShipmentResponse public var apiKey:String // @DataMember(Name="courier_request") public var courier_request:CourierRequest required public init(){} } public class PicUpCreateShipmentResponse : Codable { // @DataMember(Name="is_success") public var is_success:Bool // @DataMember(Name="courier_reference") public var courier_reference:String // @DataMember(Name="error") public var error:String /** * List of order information for pricing etc between each waypoint */ // @ApiMember(Description="List of order information for pricing etc between each waypoint") public var waypoints:[WaypointQuoteInformation] = [] /** * List with validation information for each waypoint */ // @ApiMember(Description="List with validation information for each waypoint") public var waypointValidations:[WaypointValidationInformation] = [] /** * The 1Fetch Waybill reference for the shipment */ // @ApiMember(Description="The 1Fetch Waybill reference for the shipment") public var waybill:String required public init(){} } public protocol IHasApiKey { var apiKey:String { get set } } public protocol ILogRequest { } public class CourierRequest : Codable { // @DataMember(Name="bucket_details") public var bucket_details:BucketDetails // @DataMember(Name="shipments") public var shipments:[Shipment] = [] required public init(){} } public class WaypointQuoteInformation : LinkedWaypoint { /** * Distance between waypoints as a number */ // @ApiMember(Description="Distance between waypoints as a number") public var distance:Double /** * String formatted distance */ // @ApiMember(Description="String formatted distance") public var distanceValue:String public var waypointValid:Bool public var message:String public var errorDetails:[String] = [] /** * Caculated price between waypoints excluding vat */ // @ApiMember(Description="Caculated price between waypoints excluding vat") public var price:Double /** * Price excluding vat formatted as a string rand value */ // @ApiMember(Description="Price excluding vat formatted as a string rand value") public var priceValue:String /** * The price between waypoints including vat */ // @ApiMember(Description="The price between waypoints including vat") public var priceWithVAT:Double /** * The price including vat formatted as a rand value string */ // @ApiMember(Description="The price including vat formatted as a rand value string") public var priceValueWithVAT:String required public init(){ super.init() } private enum CodingKeys : String, CodingKey { case distance case distanceValue case waypointValid case message case errorDetails case price case priceValue case priceWithVAT case priceValueWithVAT } required public init(from decoder: Decoder) throws { try super.init(from: decoder) let container = try decoder.container(keyedBy: CodingKeys.self) distance = try container.decodeIfPresent(Double.self, forKey: .distance) distanceValue = try container.decodeIfPresent(String.self, forKey: .distanceValue) waypointValid = try container.decodeIfPresent(Bool.self, forKey: .waypointValid) message = try container.decodeIfPresent(String.self, forKey: .message) errorDetails = try container.decodeIfPresent([String].self, forKey: .errorDetails) ?? [] price = try container.decodeIfPresent(Double.self, forKey: .price) priceValue = try container.decodeIfPresent(String.self, forKey: .priceValue) priceWithVAT = try container.decodeIfPresent(Double.self, forKey: .priceWithVAT) priceValueWithVAT = try container.decodeIfPresent(String.self, forKey: .priceValueWithVAT) } public override func encode(to encoder: Encoder) throws { try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) if distance != nil { try container.encode(distance, forKey: .distance) } if distanceValue != nil { try container.encode(distanceValue, forKey: .distanceValue) } if waypointValid != nil { try container.encode(waypointValid, forKey: .waypointValid) } if message != nil { try container.encode(message, forKey: .message) } if errorDetails.count > 0 { try container.encode(errorDetails, forKey: .errorDetails) } if price != nil { try container.encode(price, forKey: .price) } if priceValue != nil { try container.encode(priceValue, forKey: .priceValue) } if priceWithVAT != nil { try container.encode(priceWithVAT, forKey: .priceWithVAT) } if priceValueWithVAT != nil { try container.encode(priceValueWithVAT, forKey: .priceValueWithVAT) } } } public class WaypointValidationInformation : Codable { public var waypointNumber:Int public var isValid:Bool public var errorMessages:[String] = [] required public init(){} } public class BucketDetails : Codable { // @DataMember(Name="delivery_date") public var delivery_date:Date required public init(){} } public class LinkedWaypoint : Codable { public var fromWaypointNumber:Int public var toWaypointNumber:Int public var fromLatitude:Double public var fromLongitude:Double public var toLatitude:Double public var toLongitude:Double required public init(){} }