| GET | /api/invoice | Get un-acknowledged invoice, oldest first |
|---|
import Foundation
import ServiceStack
/**
* Invoice
*/
// @Api(Description="Invoice")
// @ApiResponse(Description="Invoice message", IsDefaultResponse=true, StatusCode=200)
// @ApiResponse(Description="No Content", ResponseType=typeof(IReturnVoid), StatusCode=204)
public class GetInvoice : Codable
{
required public init(){}
}
public class ResultItem<T : Codable> : IDocument, Codable
{
public var token:String
public var item:ClaimMessage
required public init(){}
}
public class ClaimMessage : Codable
{
public var header:Header
public var claimNotification:ClaimNotification
required public init(){}
}
// @DataContract
public class Header : Codable
{
// @DataMember(Name="documentIdentification")
public var documentIdentification:DocumentIdentification
// @DataMember(Name="sender")
public var sender:Partner
// @DataMember(Name="receiver")
public var receiver:Partner
required public init(){}
}
// @DataContract
public class DocumentIdentification : Codable
{
// @DataMember(Name="identifier")
public var identifier:String
// @DataMember(Name="type")
public var type:String
// @DataMember(Name="creationDateAndTime")
public var creationDateAndTime:Date
required public init(){}
}
// @DataContract
public class Partner : Codable
{
// @DataMember(Name="identifier")
public var identifier:Identifier
// @DataMember(Name="contactInformation")
public var contactInformation:[ContactInformation] = []
required public init(){}
}
// @DataContract
public class Identifier : Codable
{
// @DataMember(Name="authority")
public var authority:String
// @DataMember(Name="text")
public var text:String
required public init(){}
}
// @DataContract
public class ContactInformation : Codable
{
required public init(){}
}
public class ClaimNotification : BaseDocument
{
public var claimsNotificationTypeCode:String
public var isManualProcessNeededForClaimsResolution:Bool
public var isSupplementalMessageBeingSent:Bool
public var supplementalMessageDescription:String
public var claimsNotificationIdentification:String
public var buyer:TransactionalParty
public var remitTo:TransactionalParty
public var seller:TransactionalParty
public var billOfLading:BillOfLading
public var claimsNotification:DocumentReference
public var dispatchAdvice:DocumentReference
public var purchaseOrder:DocumentReference
public var invoice:DocumentReference
public var claimsNotificationDiscrepancyInformation:[ClaimsNotificationDiscrepancyInformation] = []
public var `extension`:ClaimExtension
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case claimsNotificationTypeCode
case isManualProcessNeededForClaimsResolution
case isSupplementalMessageBeingSent
case supplementalMessageDescription
case claimsNotificationIdentification
case buyer
case remitTo
case seller
case billOfLading
case claimsNotification
case dispatchAdvice
case purchaseOrder
case invoice
case claimsNotificationDiscrepancyInformation
case `extension`
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
claimsNotificationTypeCode = try container.decodeIfPresent(String.self, forKey: .claimsNotificationTypeCode)
isManualProcessNeededForClaimsResolution = try container.decodeIfPresent(Bool.self, forKey: .isManualProcessNeededForClaimsResolution)
isSupplementalMessageBeingSent = try container.decodeIfPresent(Bool.self, forKey: .isSupplementalMessageBeingSent)
supplementalMessageDescription = try container.decodeIfPresent(String.self, forKey: .supplementalMessageDescription)
claimsNotificationIdentification = try container.decodeIfPresent(String.self, forKey: .claimsNotificationIdentification)
buyer = try container.decodeIfPresent(TransactionalParty.self, forKey: .buyer)
remitTo = try container.decodeIfPresent(TransactionalParty.self, forKey: .remitTo)
seller = try container.decodeIfPresent(TransactionalParty.self, forKey: .seller)
billOfLading = try container.decodeIfPresent(BillOfLading.self, forKey: .billOfLading)
claimsNotification = try container.decodeIfPresent(DocumentReference.self, forKey: .claimsNotification)
dispatchAdvice = try container.decodeIfPresent(DocumentReference.self, forKey: .dispatchAdvice)
purchaseOrder = try container.decodeIfPresent(DocumentReference.self, forKey: .purchaseOrder)
invoice = try container.decodeIfPresent(DocumentReference.self, forKey: .invoice)
claimsNotificationDiscrepancyInformation = try container.decodeIfPresent([ClaimsNotificationDiscrepancyInformation].self, forKey: .claimsNotificationDiscrepancyInformation) ?? []
`extension` = try container.decodeIfPresent(ClaimExtension.self, forKey: .`extension`)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if claimsNotificationTypeCode != nil { try container.encode(claimsNotificationTypeCode, forKey: .claimsNotificationTypeCode) }
if isManualProcessNeededForClaimsResolution != nil { try container.encode(isManualProcessNeededForClaimsResolution, forKey: .isManualProcessNeededForClaimsResolution) }
if isSupplementalMessageBeingSent != nil { try container.encode(isSupplementalMessageBeingSent, forKey: .isSupplementalMessageBeingSent) }
if supplementalMessageDescription != nil { try container.encode(supplementalMessageDescription, forKey: .supplementalMessageDescription) }
if claimsNotificationIdentification != nil { try container.encode(claimsNotificationIdentification, forKey: .claimsNotificationIdentification) }
if buyer != nil { try container.encode(buyer, forKey: .buyer) }
if remitTo != nil { try container.encode(remitTo, forKey: .remitTo) }
if seller != nil { try container.encode(seller, forKey: .seller) }
if billOfLading != nil { try container.encode(billOfLading, forKey: .billOfLading) }
if claimsNotification != nil { try container.encode(claimsNotification, forKey: .claimsNotification) }
if dispatchAdvice != nil { try container.encode(dispatchAdvice, forKey: .dispatchAdvice) }
if purchaseOrder != nil { try container.encode(purchaseOrder, forKey: .purchaseOrder) }
if invoice != nil { try container.encode(invoice, forKey: .invoice) }
if claimsNotificationDiscrepancyInformation.count > 0 { try container.encode(claimsNotificationDiscrepancyInformation, forKey: .claimsNotificationDiscrepancyInformation) }
if `extension` != nil { try container.encode(`extension`, forKey: .`extension`) }
}
}
public class BaseDocument : Codable
{
public var currencyCode:String
public var creationDateTime:Date
public var documentActionCode:DocumentAction
public var documentStatusCode:DocumentStatus
public var documentStructureVersion:String
public var lastUpdateDateTime:Date?
public var revisionNumber:Int?
public var avpList:[AvpList] = []
required public init(){}
}
public enum DocumentAction : String, Codable
{
case ADD
case CHANGE_BY_REFRESH
case DELETE
case REJECTED
}
public enum DocumentStatus : String, Codable
{
case ADDITIONAL_TRANSMISSION
case COPY
case ORIGINAL
}
public class AvpList : Codable
{
public var code:String
public var value:String
required public init(){}
}
public class TransactionalParty : Ecom_PartyIdentificationType
{
public var contact:[Contact] = []
public var address:Address
public var communicationChannel:[AvpList] = []
public var financialInstitutionInformation:FinancialInstitutionInformation
public var dutyFeeTaxRegistration:String
public var entityIdentification:String
required public init(){ super.init() }
private enum CodingKeys : String, CodingKey {
case contact
case address
case communicationChannel
case financialInstitutionInformation
case dutyFeeTaxRegistration
case entityIdentification
}
required public init(from decoder: Decoder) throws {
try super.init(from: decoder)
let container = try decoder.container(keyedBy: CodingKeys.self)
contact = try container.decodeIfPresent([Contact].self, forKey: .contact) ?? []
address = try container.decodeIfPresent(Address.self, forKey: .address)
communicationChannel = try container.decodeIfPresent([AvpList].self, forKey: .communicationChannel) ?? []
financialInstitutionInformation = try container.decodeIfPresent(FinancialInstitutionInformation.self, forKey: .financialInstitutionInformation)
dutyFeeTaxRegistration = try container.decodeIfPresent(String.self, forKey: .dutyFeeTaxRegistration)
entityIdentification = try container.decodeIfPresent(String.self, forKey: .entityIdentification)
}
public override func encode(to encoder: Encoder) throws {
try super.encode(to: encoder)
var container = encoder.container(keyedBy: CodingKeys.self)
if contact.count > 0 { try container.encode(contact, forKey: .contact) }
if address != nil { try container.encode(address, forKey: .address) }
if communicationChannel.count > 0 { try container.encode(communicationChannel, forKey: .communicationChannel) }
if financialInstitutionInformation != nil { try container.encode(financialInstitutionInformation, forKey: .financialInstitutionInformation) }
if dutyFeeTaxRegistration != nil { try container.encode(dutyFeeTaxRegistration, forKey: .dutyFeeTaxRegistration) }
if entityIdentification != nil { try container.encode(entityIdentification, forKey: .entityIdentification) }
}
}
public class Ecom_PartyIdentificationType : Codable
{
public var gln:String
public var name:String
public var additionalPartyIdentification:[AvpList] = []
required public init(){}
}
public class Contact : Codable
{
public var contactTypeCode:String
public var personName:String
public var departmentName:String
public var jobTitle:String
public var responsibility:String
public var communicationChannel:[CommunicationChannel] = []
required public init(){}
}
public class CommunicationChannel : Codable
{
public var communicationChannelCode:String
public var communicationChannelName:String
public var communicationValue:String
required public init(){}
}
public class Address : Codable
{
public var streetAddressOne:String
public var streetAddressTwo:String
public var streetAddressThree:String
public var city:String
public var postalCode:String
public var provinceCode:String
public var countryCode:String
required public init(){}
}
public class FinancialInstitutionInformation : Codable
{
public var financialInstitutionBranchName:String
public var financialInstitutionName:String
public var financialRoutingNumber:FinancialRoutingNumber
public var financialAccount:FinancialAccount
public var swiftCode:String
public var exportersCode:String
required public init(){}
}
public class FinancialRoutingNumber : Codable
{
public var number:String
public var numberTypeCode:String
required public init(){}
}
public class FinancialAccount : Codable
{
public var number:String
public var numberTypeCode:String
public var name:String
required public init(){}
}
public class BillOfLading : Codable
{
public var creationDate:Date
public var revisionNumber:Int
public var entityIdentification:String
public var tagNumbers:[String] = []
public var totalBags:Int
required public init(){}
}
public class DocumentReference : Codable
{
public var creationDateTime:Date?
public var revisionNumber:Int?
public var lineItemNumber:Int?
public var entityIdentification:String
required public init(){}
}
public class ClaimsNotificationDiscrepancyInformation : Codable
{
public var claimAmount:Double
public var claimReasonCode:String
public var discrepancyDescription:String
public var actualReceived:ClaimsNotificationItemDiscrepancy
public var expectedToReceive:ClaimsNotificationItemDiscrepancy
public var avpList:[AvpList] = []
required public init(){}
}
public class ClaimsNotificationItemDiscrepancy : Codable
{
public var price:Double
public var quantity:Quantity
public var transactionalTradeItem:TransactionalTradeItem
required public init(){}
}
public class Quantity : Codable
{
public var value:Double?
public var measurementUnitCode:String
public var codeListVersion:String
required public init(){}
}
public class TransactionalTradeItem : Codable
{
public var gtin:String
public var additionalTradeItemIdentification:[AvpList] = []
public var tradeItemQuantity:Double?
public var tradeItemDescription:String
public var productVariantIdentifier:String
public var itemTypeCode:String
public var tradeItemDataOwner:String
public var butterFatReference:String
public var transactionalItemData:[TransactionalItemData] = []
public var colour:[Colour] = []
public var size:Size
public var tradeItemClassification:TradeItemClassification
public var avpList:[AvpList] = []
required public init(){}
}
public class TransactionalItemData : Codable
{
public var availableForSaleDate:Date?
public var batchNumber:String
public var bestBeforeDate:Date?
public var countryOfOrigin:String
public var itemExpirationDate:Date?
public var lotNumber:String
public var packagingDate:Date?
public var productionDate:Date?
public var productQualityIndication:String
public var sellByDate:Date?
public var serialNumber:[String] = []
public var shelfLife:String
public var tradeItemQuantity:Int?
public var itemInContactWithFoodProduct:Bool?
public var transactionalItemWeight:[TransactionalItem] = []
public var transactionalItemVolume:[TransactionalItem] = []
public var serialNumberRange:[SerialNumberRange] = []
public var transactionalItemDimensions:[TransactionalItemDimension] = []
public var transactionalItemLogisticUnitInformation:TransactionalItemLogisticUnitInformation
public var transactionalItemDataCarrierAndIdentification:TransactionalItemDataCarrierAndIdentification
public var tradeItemWaste:[TradeItemWaste] = []
public var transactionalItemOrganicInformation:TransactionalItemOrganicInformation
public var avpList:[AvpList] = []
required public init(){}
}
public class TransactionalItem : Codable
{
public var measurementUnitCode:String
public var measurementType:String
public var measurementValue:String
required public init(){}
}
public class SerialNumberRange : Codable
{
public var maximumValue:String
public var minimumValue:String
required public init(){}
}
public class TransactionalItemDimension : Codable
{
public var measurementUnitCode:String
public var depth:String
public var height:String
public var width:String
required public init(){}
}
public class TransactionalItemLogisticUnitInformation : Codable
{
public var numberOfLayers:Int?
public var numberOfUnitsPerLayer:Int?
public var numberOfUnitsPerPallet:Int?
public var packagingTerms:String
public var packageTypeCode:String
public var maximumStackingFactor:Int?
public var returnablePackageTransportCostPayment:String
public var dimensionsOfLogisticUnit:[TransactionalItemDimension] = []
required public init(){}
}
public class TransactionalItemDataCarrierAndIdentification : Codable
{
public var gs1TransactionalItemIdentificationKey:String
public var dataCarrier:String
required public init(){}
}
public class TradeItemWaste : Codable
{
public var wasteIdentification:String
public var typeOfWaste:[AvpList] = []
required public init(){}
}
public class TransactionalItemOrganicInformation : Codable
{
public var isTradeItemOrganic:Bool?
public var organicCertification:String
required public init(){}
}
public class Colour : Codable
{
public var colourCode:String
public var colourDescription:String
required public init(){}
}
public class Size : Codable
{
public var descriptiveSize:String
public var sizeCode:String
required public init(){}
}
public class TradeItemClassification : Codable
{
public var gpcCategoryCode:String
public var additionalTradeItemClassificationCode:[AvpList] = []
public var gpcCategoryName:String
public var gpcAttribute:[AvpList] = []
required public init(){}
}
public class ClaimExtension : Codable
{
public var claimTotals:ClaimTotals
public var shipFrom:TransactionalParty
public var shipTo:TransactionalParty
required public init(){}
}
public class ClaimTotals : Codable
{
public var baseAmount:Double?
public var totalTaxAmount:Double?
public var totalClaimAmount:Double?
required public init(){}
}
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.
GET /api/invoice HTTP/1.1 Host: stf-api-uat.data-xchange.co.za Accept: text/jsv