| POST | /picup/createshipment |
|---|
import Foundation
import ServiceStack
public class PicUpCreateShipmentRequest : IHasApiKey, ILogRequest, Codable
{
public var apiKey:String
// @DataMember(Name="courier_request")
public var courier_request:CourierRequest
required public init(){}
}
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 BucketDetails : Codable
{
// @DataMember(Name="delivery_date")
public var delivery_date:Date
required public init(){}
}
public class Shipment : Codable
{
// @DataMember(Name="waybill_number")
public var waybill_number:String
// @DataMember(Name="business_reference")
public var business_reference:String
// @DataMember(Name="service_type")
public var service_type:String
// @DataMember(Name="sender")
public var sender:Sender
// @DataMember(Name="receiver")
public var receiver:Receiver
required public init(){}
}
public class Sender : Codable
{
// @DataMember(Name="address")
public var address:Address
// @DataMember(Name="contact")
public var contact:Contact
required public init(){}
}
public class Address : Codable
{
// @DataMember(Name="address_line_1")
public var address_line_1:String
// @DataMember(Name="address_line_2")
public var address_line_2:String
// @DataMember(Name="address_line_3")
public var address_line_3:String
// @DataMember(Name="address_line_4")
public var address_line_4:String
// @DataMember(Name="city")
public var city:String
// @DataMember(Name="formatted_address")
public var formatted_address:String
// @DataMember(Name="latitude")
public var latitude:Double
// @DataMember(Name="longitude")
public var longitude:Double
// @DataMember(Name="postal_code")
public var postal_code:String
// @DataMember(Name="suburb")
public var suburb:String
// @DataMember(Name="unit")
public var unit:String
// @DataMember(Name="building")
public var building:String
required public init(){}
}
public class Contact : Codable
{
// @DataMember(Name="customer_name")
public var customer_name:String
// @DataMember(Name="customer_phone")
public var customer_phone:String
// @DataMember(Name="email_address")
public var email_address:String
// @DataMember(Name="special_instructions")
public var special_instructions:String
required public init(){}
}
public class Receiver : Codable
{
// @DataMember(Name="parcels")
public var parcels:[Parcel] = []
// @DataMember(Name="address")
public var address:Address
// @DataMember(Name="contact")
public var contact:Contact
required public init(){}
}
public class Parcel : Codable
{
// @DataMember(Name="parcel_waybill")
public var parcel_waybill:String
// @DataMember(Name="parcel_reference")
public var parcel_reference:String
// @DataMember(Name="tracking_number")
public var tracking_number:String
// @DataMember(Name="length_mm")
public var length_mm:Int
// @DataMember(Name="width_mm")
public var width_mm:Int
// @DataMember(Name="height_mm")
public var height_mm:Int
// @DataMember(Name="weight_kg")
public var weight_kg:Int
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 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 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(){}
}
public class WaypointValidationInformation : Codable
{
public var waypointNumber:Int
public var isValid:Bool
public var errorMessages:[String] = []
required public init(){}
}
Swift PicUpCreateShipmentRequest DTOs
To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv
The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.
POST /picup/createshipment HTTP/1.1
Host: api.1fetch.co.za
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length
{
ApiKey: String,
courier_request:
{
bucket_details:
{
delivery_date: 0001-01-01T00:00:00.0000000+00:00
},
shipments:
[
{
waybill_number: String,
business_reference: String,
service_type: String,
sender:
{
address:
{
address_line_1: String,
address_line_2: String,
address_line_3: String,
address_line_4: String,
city: String,
formatted_address: String,
latitude: 0,
longitude: 0,
postal_code: String,
suburb: String,
unit: String,
building: String
},
contact:
{
customer_name: String,
customer_phone: String,
email_address: String,
special_instructions: String
}
},
receiver:
{
parcels:
[
{
parcel_waybill: String,
parcel_reference: String,
tracking_number: String,
length_mm: 0,
width_mm: 0,
height_mm: 0,
weight_kg: 0
}
],
address:
{
address_line_1: String,
address_line_2: String,
address_line_3: String,
address_line_4: String,
city: String,
formatted_address: String,
latitude: 0,
longitude: 0,
postal_code: String,
suburb: String,
unit: String,
building: String
},
contact:
{
customer_name: String,
customer_phone: String,
email_address: String,
special_instructions: String
}
}
}
]
}
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length
{
is_success: False,
courier_reference: String,
error: String,
Waypoints:
[
{
}
],
WaypointValidations:
[
{
}
],
Waybill: String
}