| POST | /v1/CarConfiguratorStock | Validate and save a car configurator code for a vehicle search | This endpoint calls Agency API to validate and save a car configurator code. The code is validated and saved in the database and returns a response from a third party CCS which provides car configuration details. These get saved to open search and used to perform a vehicle search |
|---|
import Foundation
import ServiceStack
public class CarConfiguratorStockRequest : IPost, Codable
{
/**
* The configurator code to search on
*/
// @ApiMember(Description="The configurator code to search on", IsRequired=true)
public var configuratorCode:String
/**
* Whether to return sellable vehicles
*/
// @ApiMember(Description="Whether to return sellable vehicles")
public var isSellable:Bool?
/**
* Whether to only get exact matches
*/
// @ApiMember(Description="Whether to only get exact matches")
public var exactMatch:Bool
/**
* Whether to restrict vehicles response to a GSSN
*/
// @ApiMember(Description="Whether to restrict vehicles response to a GSSN")
public var gssn:String
required public init(){}
}
public class CarConfiguratorStockResponse : Codable
{
public var totalVehicles:Int
public var carConfiguratorResponse:CarConfiguratorResponse
public var exactMatches:CarConfiguratorStockMatches
public var closeMatches:CarConfiguratorStockMatches
required public init(){}
}
public class CarConfiguratorResponse : Codable
{
public var name:String
public var keyInformation:KeyInformation
public var orderingOptions:OrderingOptions
public var responseStatus:ResponseStatus
public var configuratorCode:String
required public init(){}
}
public class KeyInformation : Codable
{
public var bM7NST:String
public var configurationDate:String
public var modelYear:String
public var halfYear:String
required public init(){}
}
public class OrderingOptions : Codable
{
public var interior:[String]
public var exterior:[String]
public var options:[String]
public var wheelOptions:[EquipmentCache] = []
public var trimOptions:[EquipmentCache] = []
public var optionCodes:[EquipmentCache] = []
required public init(){}
}
public class EquipmentCache : Codable
{
public var code:String
public var Description:String
public var standardFlag:String
public var price:Double
public var category:String
public var importance:String
required public init(){}
}
public class CarConfiguratorStockMatches : Codable
{
public var sellableMatches:[CarConfiguratorStockMatch] = []
public var nonSellableMatches:[CarConfiguratorStockMatch] = []
required public init(){}
}
public class CarConfiguratorStockMatch : Codable
{
public var vehicle:CarConfiguratorVehicle
public var isSellable:Bool
public var vehicleWheels:String
public var vehicleTrim:String
public var vehicleAdditionalOptionCodes:[String] = []
public var fullModelYearDifferences:[String] = []
public var paintDifferences:[String] = []
public var upholsteryDifferences:[String] = []
public var wheelDifferences:[String] = []
public var trimDifferences:[String] = []
public var equipmentDifferences:[String] = []
public var differences:[String] = []
public var exactMatch:Bool
required public init(){}
}
public class CarConfiguratorVehicle : BackOrderVehicleDetailsWithPackages
{
public var modelYearCode:String
public var halfModelYearCode:String
public var activeOffers:[Int] = []
public var eligibleForMotability:Bool
public var nearestPort:Bool?
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case modelYearCode
case halfModelYearCode
case activeOffers
case eligibleForMotability
case nearestPort
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
modelYearCode = try container.decodeIfPresent(String.self, forKey: .modelYearCode)
halfModelYearCode = try container.decodeIfPresent(String.self, forKey: .halfModelYearCode)
activeOffers = try container.decodeIfPresent([Int].self, forKey: .activeOffers) ?? []
eligibleForMotability = try container.decodeIfPresent(Bool.self, forKey: .eligibleForMotability)
nearestPort = try container.decodeIfPresent(Bool.self, forKey: .nearestPort)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if modelYearCode != nil { try container.encode(modelYearCode, forKey: .modelYearCode) }
if halfModelYearCode != nil { try container.encode(halfModelYearCode, forKey: .halfModelYearCode) }
if activeOffers.count > 0 { try container.encode(activeOffers, forKey: .activeOffers) }
if eligibleForMotability != nil { try container.encode(eligibleForMotability, forKey: .eligibleForMotability) }
if nearestPort != nil { try container.encode(nearestPort, forKey: .nearestPort) }
}
}
public class BackOrderVehicleDetailsWithPackages : BackOrderVehicleDetails, IPackages
{
public var packages:[Package]
public var packageNames:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case packages
case packageNames
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
packages = try container.decodeIfPresent([Package].self, forKey: .packages) ?? []
packageNames = try container.decodeIfPresent(String.self, forKey: .packageNames)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if packages != nil { try container.encode(packages, forKey: .packages) }
if packageNames != nil { try container.encode(packageNames, forKey: .packageNames) }
}
}
public class BackOrderVehicleDetails : IVehiclePrices, IVehiclePriceCollection, IImageUrl, IVehicleDetails, Codable
{
public var vin:String
public var commissionNumber:String
public var Description:String
public var shortDescription:String
public var modelId:Int
public var model:String
public var fullModelYearCode:String
public var brandId:Int?
public var brand:BackOrderVehicleDetailsBrand
public var retailerId:Int
public var imageUrl:String
public var colour:String
public var colourCode:String
public var fuelType:String
public var fuelTypeId:Int
public var transmission:String
public var transmissionType:String
public var engine:Engine
public var engineBadge:String
public var package:String
public var line:String
public var upholstery:String
public var upholsteryCode:String
public var usageCode:String
public var account:String
public var accountType:String
public var nst:String
public var baumuster:String
public var electricRange:Double?
public var electricConsumption:Double?
public var actualPrice:Double?
public var otrPrice:Double
public var retailPriceExVat:Double
public var p11D:Double
public var vehicleType:String
public var upholsteryDescription:String
public var upholsteryType:String
public var bodyStyle:String
public var bodyStyleStyleCode:String
public var bodyStyleStyleCodeElectric:String
public var bodyStyleStyleCodeHybrid:String
public var availablePackages:[String]
public var mapped_Line:Int?
public var secured:Bool
public var bm7NST:String
public var isAvailableOnline:Bool
public var isSpecialistCar:Bool
public var isSellable:Bool
public var underOffer:Bool
public var vehicleAuditDetails:[VehicleAuditDetails]
public var retailer:Retailer
public var media:Media
public var emission:Double?
public var colourGroup:String
public var vehicleClass:String
public var productRange:String
public var isHOBackOrderAccountVehicle:Bool
public var isAllocatedToBackOrder:Bool
public var inBackOrderAccount:Bool
public var deliveryCharge:Double
public var deliveryChargeNet:Double?
public var deliveryChargeVAT:Double?
public var plates:Double
public var platesNet:Double?
public var platesVAT:Double?
public var fuelCharge:Double
public var fuelChargeNet:Double?
public var fuelChargeVAT:Double?
public var retailPrice_ExVAT:Double
public var retailPrice_IncVAT:Double
public var veD_Year1:Double
public var veD_Year2:Double
public var firstRegFee:Double
public var otR_Value:Double
public var otr:Double
public var prices:[Price]
public var productionDate:String
public var portArrivalDate:Date?
public var location:String
public var isDisplayStock:Bool
public var displayRetailerId:Int?
public var displayRetailer:String
public var displayRetailerGssnId:String
public var displayRetailerMarketAreaId:Int?
public var isSmartDisplayRetailer:Bool?
public var colourDescription:String
public var creation:Date?
public var modified:Date?
public var vatQualifyingNumber:Int?
public var vatQualifying:Bool
public var currentRetailerOfferPrice:Double
public var gssnId:String
public var noImage:Bool
public var registrationNumber:String
public var registrationDate:Date?
public var mileage:Int?
public var tradeInDate:Date?
public var vid:String
public var emissionCombined:String
public var emissionDirective:String
public var normalisedEmissionDirective:String
public var hasMildHybridEquipmentCode:Bool
public var acceleration:Double?
public var chassisNumber:String
public var numberOfDoors:String
public var numberOfSeats:String
public var specialInfo:Bool
public var eligibleForIntegratedServiceCare:Bool
public var consumptionCombined:Consumption
public var consumptionExtraUrban:Consumption
public var consumptionUrban:Consumption
public var wltpFuelConsumptionCombined:Consumption
public var wltpFuelConsumptionExtraHigh:Consumption
public var wltpFuelConsumptionHigh:Consumption
public var wltpFuelConsumptionLow:Consumption
public var wltpFuelConsumptionMedium:Consumption
public var energyEfficiencyClass:EmissionClass
public var equipment:[Equipmentv2]
public var equipmentAdditional:[Equipment]
public var equipmentCategories:[EquipmentCategoryv2]
public var vehicleData:[VehicleAttribute]
public var integratedServiceCareOptions:[IntegratedServiceCareOptions]
public var ispVehicleCustomerDescriptions:[String]
public var marketingCode:String
public var eligibleForMaTransfer:Bool
public var confirmedProductionDate:String
public var forecastedArrivalDate:String
required public init(){}
}
public class BackOrderVehicleDetailsBrand : Codable
{
public var Description:String
required public init(){}
}
public class Engine : Codable
{
public var id:Int
public var badge:String
public var cubicCapacity:Int
public var cyclinders:Int
public var horsePower:String
public var kw:String
public var selected:Bool
required public init(){}
}
public class VehicleAuditDetails : Codable
{
public var userId:String
public var status:Bool
public var notes:String
public var creationDate:String
required public init(){}
}
public class Retailer : Codable
{
public var id:Int
public var gssnId:String
public var Description:String
public var street:String
public var city:String
public var district:String
public var postcode:String
public var googleMapPostcode:String
public var phone:String
public var fax:String
public var email:String
public var website:String
public var latitude:Double
public var longitude:Double
public var retailerGroup_Id:Int?
public var retailerGroupId:String
public var retailerGroupName:String
public var distance:Double
public var paymentServiceGuid:String
public var isOnline:Bool?
public var isNewCarRetailer:Bool?
public var isUsedCarRetailer:Bool?
public var isCentralRetailer:Bool
public var chatEnabled:Bool
public var tradeInEnabled:Bool
public var displayPhoneNumberNew:String
public var displayPhoneNumberUsed:String
public var services:RetailerServices
public var smart:Bool
public var smartDescription:String
public var smartWebsite:String
public var smartEmail:String
public var smartPhone:String
public var additionalInformation:String
public var legacyId:String
public var driveTime:Double
public var agent:Bool
public var port:Int?
public var portName:String
public var marketAreaId:Int?
public var marketAreaName:String
public var maintenanceDate:String
public var maintenanceSource:String
public var stpAccountNumbers:String
public var campaignExcluded:Bool?
public var digitalLoungeParentGssnId:String
public var sendLeadsToDigitalLoungeParent:Bool
public var isExcludedFromImport:Bool
public var openingTimes:RetailerOpeningTimes
required public init(){}
}
public class RetailerServices : Codable
{
public var `new`:[RetailerService]
public var used:[RetailerService]
required public init(){}
}
public class RetailerService : Codable
{
public var id:Int
public var Description:String
public var priority:Bool
required public init(){}
}
public class RetailerOpeningTimes : Codable
{
public var `new`:[RetailerOpeningTime] = []
public var used:[RetailerOpeningTime] = []
required public init(){}
}
public class RetailerOpeningTime : Codable
{
public var day:String
public var openFrom:String
public var openTo:String
public var special:String
required public init(){}
}
public class Media : Codable
{
public var imageCount:Int
public var mainImageUrl:String
public var mainImageUrlMobile:String
public var noImage:Bool
public var threeSixtyDegreeImageUrls:[String]
public var threeSixtyDegreeMobileImageUrls:[String]
public var vehicleImageUrls:[String]
public var vehicleMobileImageUrls:[String]
required public init(){}
}
public class Price : Codable
{
public var id:String
public var Description:String
public var net:Double
public var vat:Double
public var gross:Double
public var product:OfferPriceProductType
required public init(){}
}
public enum OfferPriceProductType : String, Codable
{
case LIST_PRICE
case NUMBER_PLATE_FEE
case DELIVERY_CHARGE
case FUEL_CHARGE
case MANUFACTURER_OFFER
case PERSONALISED_MONEYOFFER
case PERSONALISED_NONMONEYOFFER
case PERSONALISED_NONMONEYOFFER_NEG
case SERVICE
case SERVICE_NEG
case GOVERNMENT_GRANT
case OUTRIGHT_PURCHASE_DISCOUNT
case VIP_OFFER
case WALLBOX_OFFER
case WALLBOX_OFFER_NEG
case ROAD_FUND_LICENCE
case FIRST_REGISTRATION_FEE
case NOT_FOUND
case ACCESSORY_OFFER
case ACCESSORY_OFFER_NEG
case MOTABILITY_DISCOUNT
}
public class Consumption : Codable
{
public var id:Int
public var lkm:Double
public var mpg:Double
required public init(){}
}
public class EmissionClass : Codable
{
public var colour:String
public var rating:String
required public init(){}
}
public class Equipmentv2 : Equipment
{
public var importance:Int
public var isAdditional:Bool
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case importance
case isAdditional
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
importance = try container.decodeIfPresent(Int.self, forKey: .importance)
isAdditional = try container.decodeIfPresent(Bool.self, forKey: .isAdditional)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if importance != nil { try container.encode(importance, forKey: .importance) }
if isAdditional != nil { try container.encode(isAdditional, forKey: .isAdditional) }
}
}
public class Equipment : Codable
{
public var id:Int?
public var code:String
public var Description:String
required public init(){}
}
public class EquipmentCategoryv2 : Codable
{
public var order:Int
public var code:String
public var Description:String
public var equipment:[Equipmentv2]
required public init(){}
}
public class VehicleAttribute : Codable
{
public var Description:String
public var value:String
required public init(){}
}
public class IntegratedServiceCareOptions : Codable
{
public var optionCode:String
public var bM7NST:String
public var fullModelYear:String
public var integratedProductType:String
public var customerDescription:String
public var oneAgentProductType:String
required public init(){}
}
public class Package : Codable
{
public var id:Int
public var Description:String
required public init(){}
}
Swift CarConfiguratorStockRequest 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 /v1/CarConfiguratorStock HTTP/1.1
Host: prod-api-agency-orch-mb-dhc.rapp-customers.co.uk
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length
{
ConfiguratorCode: String,
IsSellable: False,
ExactMatch: False,
GSSN: String
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length
{
TotalVehicles: 4,
CarConfiguratorResponse:
{
Name: String,
KeyInformation:
{
BM7NST: String,
ConfigurationDate: String,
ModelYear: String,
HalfYear: String
},
OrderingOptions:
{
Interior:
[
String
],
Exterior:
[
String
],
Options:
[
String
],
WheelOptions:
[
{
Code: String,
Description: String,
StandardFlag: String,
Price: 0,
Category: String,
Importance: String
}
],
TrimOptions:
[
{
Code: String,
Description: String,
StandardFlag: String,
Price: 0,
Category: String,
Importance: String
}
],
OptionCodes:
[
{
Code: String,
Description: String,
StandardFlag: String,
Price: 0,
Category: String,
Importance: String
}
]
},
ResponseStatus:
{
ErrorCode: String,
Message: String,
StackTrace: String,
Errors:
[
{
ErrorCode: String,
FieldName: String,
Message: String,
Meta:
{
String: String
}
}
],
Meta:
{
String: String
}
},
ConfiguratorCode: String
},
ExactMatches:
{
SellableMatches:
[
{
}
],
NonSellableMatches:
[
{
}
]
},
CloseMatches:
{
SellableMatches:
[
{
}
],
NonSellableMatches:
[
{
}
]
}
}