DX STF Client API

<back to all web services

AddSettlement

Settlement Requests

Settlement

Requires Authentication
The following routes are available for this service:
POST/api/settlementAdd new Settlement
import Foundation
import ServiceStack

/**
* Settlement
*/
// @Api(Description="Settlement")
// @ApiResponse(Description="Add Settlement request received", IsDefaultResponse=true, StatusCode=200)
// @ApiResponse(Description="Settlement not accepted, Confirm Sender GLN", ResponseType=typeof(UnauthorizedAccessException), StatusCode=403)
public class AddSettlement : IPost, Codable
{
    /**
    * Settlement model containing all of the Settlement data
    */
    // @ApiMember(Description="Settlement model containing all of the Settlement data", ParameterType="model")
    public var settlement:SettlementMessage

    required public init(){}
}

public class SettlementMessage : Codable
{
    public var header:Header
    public var settlement:Settlement

    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 Settlement : BaseDocument
{
    public var batchIdentification:String
    public var paymentEffectiveDate:Date
    public var settlementCurrency:String
    public var settlementHandlingTypeCode:String
    public var totalAmount:Double?
    public var paymentMethod:PaymentMethod
    public var payee:TransactionalParty
    public var payer:TransactionalParty
    public var remitTo:TransactionalParty
    public var settlementIdentification:String
    public var settlementLineItem:[SettlementLineItem] = []
    public var `extension`:SettlementExtension

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case batchIdentification
        case paymentEffectiveDate
        case settlementCurrency
        case settlementHandlingTypeCode
        case totalAmount
        case paymentMethod
        case payee
        case payer
        case remitTo
        case settlementIdentification
        case settlementLineItem
        case `extension`
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        batchIdentification = try container.decodeIfPresent(String.self, forKey: .batchIdentification)
        paymentEffectiveDate = try container.decodeIfPresent(Date.self, forKey: .paymentEffectiveDate)
        settlementCurrency = try container.decodeIfPresent(String.self, forKey: .settlementCurrency)
        settlementHandlingTypeCode = try container.decodeIfPresent(String.self, forKey: .settlementHandlingTypeCode)
        totalAmount = try container.decodeIfPresent(Double.self, forKey: .totalAmount)
        paymentMethod = try container.decodeIfPresent(PaymentMethod.self, forKey: .paymentMethod)
        payee = try container.decodeIfPresent(TransactionalParty.self, forKey: .payee)
        payer = try container.decodeIfPresent(TransactionalParty.self, forKey: .payer)
        remitTo = try container.decodeIfPresent(TransactionalParty.self, forKey: .remitTo)
        settlementIdentification = try container.decodeIfPresent(String.self, forKey: .settlementIdentification)
        settlementLineItem = try container.decodeIfPresent([SettlementLineItem].self, forKey: .settlementLineItem) ?? []
        `extension` = try container.decodeIfPresent(SettlementExtension.self, forKey: .`extension`)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if batchIdentification != nil { try container.encode(batchIdentification, forKey: .batchIdentification) }
        if paymentEffectiveDate != nil { try container.encode(paymentEffectiveDate, forKey: .paymentEffectiveDate) }
        if settlementCurrency != nil { try container.encode(settlementCurrency, forKey: .settlementCurrency) }
        if settlementHandlingTypeCode != nil { try container.encode(settlementHandlingTypeCode, forKey: .settlementHandlingTypeCode) }
        if totalAmount != nil { try container.encode(totalAmount, forKey: .totalAmount) }
        if paymentMethod != nil { try container.encode(paymentMethod, forKey: .paymentMethod) }
        if payee != nil { try container.encode(payee, forKey: .payee) }
        if payer != nil { try container.encode(payer, forKey: .payer) }
        if remitTo != nil { try container.encode(remitTo, forKey: .remitTo) }
        if settlementIdentification != nil { try container.encode(settlementIdentification, forKey: .settlementIdentification) }
        if settlementLineItem.count > 0 { try container.encode(settlementLineItem, forKey: .settlementLineItem) }
        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 PaymentMethod : Codable
{
    public var automatedClearingHousePaymentFormat:String
    public var paymentMethodCode:String
    public var paymentMethodIdentification: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 SettlementLineItem : Codable
{
    public var amountPaid:Double?
    public var lineItemNumber:Int
    public var originalAmount:Double?
    public var settlementAdjustment:[SettlementAdjustment] = []
    public var avpList:AvpList
    public var debitCreditAdvice:DocumentReference
    public var invoice:InvoiceDocumentReference
    public var requestForPayment:DocumentReference
    public var settlementParty:[SettlementParty] = []

    required public init(){}
}

public class SettlementAdjustment : Codable
{
    public var adjustmentAmount:Double?
    public var financialAdjusmentReasonPartyRoleCode:String
    public var financialAdjustmentReasonCode:String
    public var transactionalReference:TransactionalReference

    required public init(){}
}

public class TransactionalReference : DocumentReference
{
    public var transactionalReferenceTypeCode:String

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case transactionalReferenceTypeCode
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        transactionalReferenceTypeCode = try container.decodeIfPresent(String.self, forKey: .transactionalReferenceTypeCode)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if transactionalReferenceTypeCode != nil { try container.encode(transactionalReferenceTypeCode, forKey: .transactionalReferenceTypeCode) }
    }
}

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 InvoiceDocumentReference : DocumentReference
{
    public var invoiceTypeCode:String
    public var contentOwner:ContentOwner

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case invoiceTypeCode
        case contentOwner
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        invoiceTypeCode = try container.decodeIfPresent(String.self, forKey: .invoiceTypeCode)
        contentOwner = try container.decodeIfPresent(ContentOwner.self, forKey: .contentOwner)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if invoiceTypeCode != nil { try container.encode(invoiceTypeCode, forKey: .invoiceTypeCode) }
        if contentOwner != nil { try container.encode(contentOwner, forKey: .contentOwner) }
    }
}

public class ContentOwner : Codable
{
    public var gln:String
    public var additionalPartyIdentification:[AvpList] = []

    required public init(){}
}

public class SettlementParty : Ecom_PartyIdentification
{
    public var partyRoleCode:String

    required public init(){ super.init() }

    private enum CodingKeys : String, CodingKey {
        case partyRoleCode
    }

    required public init(from decoder: Decoder) throws {
        try super.init(from: decoder)
        let container = try decoder.container(keyedBy: CodingKeys.self)
        partyRoleCode = try container.decodeIfPresent(String.self, forKey: .partyRoleCode)
    }

    public override func encode(to encoder: Encoder) throws {
        try super.encode(to: encoder)
        var container = encoder.container(keyedBy: CodingKeys.self)
        if partyRoleCode != nil { try container.encode(partyRoleCode, forKey: .partyRoleCode) }
    }
}

public class Ecom_PartyIdentification : Codable
{
    public var additionalPartyIdentification:[AvpList] = []
    public var gln:String

    required public init(){}
}

public class SettlementExtension : Codable
{
    public var settlementExtensionLineItem:[SettlementExtensionLineItem] = []
    public var adjustmentAndDiscountSummary:[AdjustmentAndDiscountSummary] = []
    public var totalAmountSplit:TotalAmountSplit

    required public init(){}
}

public class SettlementExtensionLineItem : Codable
{
    public var number:Int
    public var documentType:String
    public var documentNumber:String
    public var itemText:String

    required public init(){}
}

public class AdjustmentAndDiscountSummary : Codable
{
    public var amountTotal:Double
    public var amountNett:Double
    public var amountVat:Double
    public var reasonMessage:String

    required public init(){}
}

public class TotalAmountSplit : Codable
{
    public var amountTotal:Double
    public var amountNett:Double
    public var amountVat:Double

    required public init(){}
}

public class TokenDto : ICommandResponse, Codable
{
    public var token:String

    required public init(){}
}


Swift AddSettlement DTOs

To override the Content-type in your clients, use the HTTP Accept Header, append the .jsv suffix or ?format=jsv

HTTP + JSV

The following are sample HTTP requests and responses. The placeholders shown need to be replaced with actual values.

POST /api/settlement HTTP/1.1 
Host: stf-api-uat.data-xchange.co.za 
Accept: text/jsv
Content-Type: text/jsv
Content-Length: length

{
	settlement: 
	{
		header: 
		{
			documentIdentification: 
			{
				identifier: String,
				type: String
			},
			sender: 
			{
				identifier: 
				{
					authority: String,
					text: String
				},
				contactInformation: 
				[
					{
						
					}
				]
			},
			receiver: 
			{
				identifier: 
				{
					authority: String,
					text: String
				},
				contactInformation: 
				[
					{
						
					}
				]
			}
		},
		settlement: 
		{
			batchIdentification: String,
			settlementCurrency: String,
			settlementHandlingTypeCode: String,
			totalAmount: 0,
			paymentMethod: 
			{
				automatedClearingHousePaymentFormat: String,
				paymentMethodCode: String,
				paymentMethodIdentification: String
			},
			payee: 
			{
				contact: 
				[
					{
						contactTypeCode: String,
						personName: String,
						departmentName: String,
						jobTitle: String,
						responsibility: String,
						communicationChannel: 
						[
							{
								communicationChannelCode: String,
								communicationChannelName: String,
								communicationValue: String
							}
						]
					}
				],
				address: 
				{
					streetAddressOne: String,
					streetAddressTwo: String,
					streetAddressThree: String,
					city: String,
					postalCode: String,
					provinceCode: String,
					countryCode: String
				},
				communicationChannel: 
				[
					{
						code: String,
						value: String
					}
				],
				financialInstitutionInformation: 
				{
					financialInstitutionBranchName: String,
					financialInstitutionName: String,
					financialRoutingNumber: 
					{
						number: String,
						numberTypeCode: String
					},
					financialAccount: 
					{
						number: String,
						numberTypeCode: String,
						name: String
					},
					swiftCode: String,
					exportersCode: String
				},
				dutyFeeTaxRegistration: String,
				entityIdentification: String,
				gln: String,
				name: String,
				additionalPartyIdentification: 
				[
					{
						code: String,
						value: String
					}
				]
			},
			payer: 
			{
				contact: 
				[
					{
						contactTypeCode: String,
						personName: String,
						departmentName: String,
						jobTitle: String,
						responsibility: String,
						communicationChannel: 
						[
							{
								communicationChannelCode: String,
								communicationChannelName: String,
								communicationValue: String
							}
						]
					}
				],
				address: 
				{
					streetAddressOne: String,
					streetAddressTwo: String,
					streetAddressThree: String,
					city: String,
					postalCode: String,
					provinceCode: String,
					countryCode: String
				},
				communicationChannel: 
				[
					{
						code: String,
						value: String
					}
				],
				financialInstitutionInformation: 
				{
					financialInstitutionBranchName: String,
					financialInstitutionName: String,
					financialRoutingNumber: 
					{
						number: String,
						numberTypeCode: String
					},
					financialAccount: 
					{
						number: String,
						numberTypeCode: String,
						name: String
					},
					swiftCode: String,
					exportersCode: String
				},
				dutyFeeTaxRegistration: String,
				entityIdentification: String,
				gln: String,
				name: String,
				additionalPartyIdentification: 
				[
					{
						code: String,
						value: String
					}
				]
			},
			remitTo: 
			{
				contact: 
				[
					{
						contactTypeCode: String,
						personName: String,
						departmentName: String,
						jobTitle: String,
						responsibility: String,
						communicationChannel: 
						[
							{
								communicationChannelCode: String,
								communicationChannelName: String,
								communicationValue: String
							}
						]
					}
				],
				address: 
				{
					streetAddressOne: String,
					streetAddressTwo: String,
					streetAddressThree: String,
					city: String,
					postalCode: String,
					provinceCode: String,
					countryCode: String
				},
				communicationChannel: 
				[
					{
						code: String,
						value: String
					}
				],
				financialInstitutionInformation: 
				{
					financialInstitutionBranchName: String,
					financialInstitutionName: String,
					financialRoutingNumber: 
					{
						number: String,
						numberTypeCode: String
					},
					financialAccount: 
					{
						number: String,
						numberTypeCode: String,
						name: String
					},
					swiftCode: String,
					exportersCode: String
				},
				dutyFeeTaxRegistration: String,
				entityIdentification: String,
				gln: String,
				name: String,
				additionalPartyIdentification: 
				[
					{
						code: String,
						value: String
					}
				]
			},
			settlementIdentification: String,
			settlementLineItem: 
			[
				{
					amountPaid: 0,
					lineItemNumber: 0,
					originalAmount: 0,
					settlementAdjustment: 
					[
						{
							adjustmentAmount: 0,
							financialAdjusmentReasonPartyRoleCode: String,
							financialAdjustmentReasonCode: String,
							transactionalReference: 
							{
								transactionalReferenceTypeCode: String,
								creationDateTime: 0001-01-01,
								revisionNumber: 0,
								lineItemNumber: 0,
								entityIdentification: String
							}
						}
					],
					avpList: 
					{
						code: String,
						value: String
					},
					debitCreditAdvice: 
					{
						creationDateTime: 0001-01-01,
						revisionNumber: 0,
						lineItemNumber: 0,
						entityIdentification: String
					},
					invoice: 
					{
						invoiceTypeCode: String,
						contentOwner: 
						{
							gln: String,
							additionalPartyIdentification: 
							[
								{
									code: String,
									value: String
								}
							]
						},
						creationDateTime: 0001-01-01,
						revisionNumber: 0,
						lineItemNumber: 0,
						entityIdentification: String
					},
					requestForPayment: 
					{
						creationDateTime: 0001-01-01,
						revisionNumber: 0,
						lineItemNumber: 0,
						entityIdentification: String
					},
					settlementParty: 
					[
						{
							partyRoleCode: String,
							additionalPartyIdentification: 
							[
								{
									code: String,
									value: String
								}
							],
							gln: String
						}
					]
				}
			],
			extension: 
			{
				settlementExtensionLineItem: 
				[
					{
						number: 0,
						documentType: String,
						documentNumber: String,
						itemText: String
					}
				],
				adjustmentAndDiscountSummary: 
				[
					{
						amountTotal: 0,
						amountNett: 0,
						amountVat: 0,
						reasonMessage: String
					}
				],
				totalAmountSplit: 
				{
					amountTotal: 0,
					amountNett: 0,
					amountVat: 0
				}
			},
			currencyCode: String,
			documentActionCode: ADD,
			documentStatusCode: ADDITIONAL_TRANSMISSION,
			documentStructureVersion: String,
			lastUpdateDateTime: 0001-01-01,
			revisionNumber: 0,
			avpList: 
			[
				{
					code: String,
					value: String
				}
			]
		}
	}
}
HTTP/1.1 200 OK
Content-Type: text/jsv
Content-Length: length

{
	
}