Tag Archives: Sepa

Create a Sepa XML File

I use Chilkat XML to create the Sepa XML code as its more structured and easier to follow. You can also replicate this code in Microsoft XML. This example is used from an access database I will post a sample Excel file which is used to generate an XML file with the associated code.

To start you will need a header recordset which summarises the party being debited,the total value and number of transactions.

You can use this code to process you direct debits from Sage line 50 by taking the account balances from a given date. Connect to Sage using the ODBC connection to get the customer balances.

Function MakeXML(tmpRunNo, tmpBank, tmpFirst As Boolean)
On Error GoTo Errorhandler

Dim rst As Recordset
Dim success As Long, tmpSQL As String

Dim xml As New ChilkatXml
Dim DDInst As ChilkatXml
Dim GroupHeader As ChilkatXml
Dim PaymentInformation As ChilkatXml
Dim DDTransactionInformation As ChilkatXml

'Group Header Fields
Dim MessageID As ChilkatXml
Dim MessageDateTime As ChilkatXml
Dim TotalNumberofPayments As ChilkatXml
Dim TotalValue As ChilkatXml
Dim InitiatingParty As ChilkatXml
Dim InitiatingPartyID As ChilkatXml
Dim InitiatingPartyOrgID As ChilkatXml
Dim InitiatingPartyOthr As ChilkatXml
Dim InitiatingPartyOthrId As ChilkatXml

'Payment Fields
Dim PaymentID As ChilkatXml
Dim PaymentMethod As ChilkatXml
Dim BatchBook As ChilkatXml
Dim NoofTrans  As ChilkatXml
Dim TransValue As ChilkatXml
Dim PaymentTypeInformation As ChilkatXml
Dim ServiceLevel As ChilkatXml
Dim ServiceLevelCode As ChilkatXml
Dim LocalInstrument As ChilkatXml
Dim LocalInstrumentCode As ChilkatXml
Dim SequenceTP As ChilkatXml
Dim RequestedCollectionDate As ChilkatXml
Dim Creditor As ChilkatXml
Dim CreditorName As ChilkatXml
Dim CreditorAccount As ChilkatXml
Dim CreditorID As ChilkatXml
Dim CreditorIBAN As ChilkatXml
Dim CreditorAgentBIC As ChilkatXml
Dim FinInstnId As ChilkatXml
Dim CreditorBIC As ChilkatXml
Dim PmtId As ChilkatXml
Dim PaymentEndToEndId As ChilkatXml
Dim InstructionAmount As ChilkatXml
Dim DDMandatetx As ChilkatXml
Dim MndtRltdInf As ChilkatXml
Dim MandateId As ChilkatXml
Dim MandateSignDate As ChilkatXml
Dim CdtrSchmeId As ChilkatXml
Dim CdtrSchmeIdID As ChilkatXml
Dim PrvtId As ChilkatXml
Dim Othr As ChilkatXml
Dim CreditorSEPAID As ChilkatXml
Dim CreditorSchmeNm As ChilkatXml
Dim CreditorPrtry As ChilkatXml
Dim CustomerAgent As ChilkatXml
Dim CustomerFinInstnId As ChilkatXml
Dim CustomerBIC As ChilkatXml
Dim Customer As ChilkatXml
Dim CustomerName As ChilkatXml
Dim CustomerAccount As ChilkatXml
Dim CustomerAccId As ChilkatXml
Dim CustomerIBAN As ChilkatXml

Dim PL_CdtrSchmeId As ChilkatXml
Dim PL_CdtrSchmeIdID As ChilkatXml
Dim PL_PrvtId As ChilkatXml
Dim PL_Othr As ChilkatXml
Dim PL_CreditorSEPAID As ChilkatXml
Dim PL_CreditorSchmeNm As ChilkatXml
Dim PL_CreditorPrtry As ChilkatXml

Dim rstHeader As Recordset
Dim rstTrans As Recordset

tmpSQL = "SELECT tblBank.OwnerID AS SEPA_UserID, tblBank.DBankName AS SEPA_Name, tblBank.DbankNumber AS SEPA_IBAN, tblBank.DbankCode AS SEPA_BIC, tblDDListing.DDRunNumber AS RunNo, Sum(roundcc(tblDDListing.Value)) AS DDTotal, Count(tblDDListing.CCode) AS TotalTrans, '" & [Forms]![frmDDCreate]![UFileLoc] & IIf(tmpFirst, "FIRST_", "RECURRING_") & [Forms]![frmDDCreate]![UFileName] & "'  AS ExportFileName"
tmpSQL = tmpSQL & " FROM tblDDListing, tblBank"
tmpSQL = tmpSQL & " WHERE DDRunNumber=" & tmpRunNo
tmpSQL = tmpSQL & " AND TransCode='" & IIf(tmpFirst, "01", "17") & "'"
tmpSQL = tmpSQL & " GROUP BY tblBank.OwnerID, tblBank.DBankName, tblBank.DbankNumber, tblBank.DbankCode, tblDDListing.DDRunNumber, '" & [Forms]![frmDDCreate]![UFileLoc] & IIf(tmpFirst, "FRST_", "RCUR_") & [Forms]![frmDDCreate]![UFileName] & "'"

'Debug.Print tmpSQL

Set rstHeader = CurrentDb.OpenRecordset(tmpSQL)
If rstHeader.RecordCount = 0 Then
    Set rstHeader = Nothing
    Exit Function
End If
Set rstTrans = CurrentDb.OpenRecordset("qryTrans")

xml.Tag = "Document"
xml.AddAttribute "xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.008.001.02"

Set DDInst = xml.NewChild("CstmrDrctDbtInitn", "")

'Payment Group Information
Set GroupHeader = DDInst.NewChild("GrpHdr", "")
   
Set MessageID = GroupHeader.NewChild("MsgId", Format(Now(), "YYYYMMDDhhss") & "-" & rstHeader!RunNo)
Set MessageDateTime = GroupHeader.NewChild("CreDtTm", Format(Date, "YYYY-MM-DD") & "T" & Format(Now(), "HH:mm:SS"))
Set TotalNumberofPayments = GroupHeader.NewChild("NbOfTxs", rstHeader!TotalTrans)
Set TotalValue = GroupHeader.NewChild(" CtrlSum", Format(rstHeader!DDTotal, "#.00"))
Set InitiatingParty = GroupHeader.NewChild("InitgPty", "") ' Sepa User ID
Set InitiatingPartyID = InitiatingParty.NewChild("Id", "")
If tmpBank = "AIB" Then
    Set InitiatingPartyOrgID = InitiatingPartyID.NewChild("OrgId", "")
    Set InitiatingPartyOthr = InitiatingPartyOrgID.NewChild("Othr", "")
    Set InitiatingPartyOthrId = InitiatingPartyOthr.NewChild("Id", rstHeader!SEPA_UserID)
ElseIf tmpBank = "BOI" Then
    Set InitiatingPartyOrgID = InitiatingPartyID.NewChild("PrvtId", "")
    Set InitiatingPartyOthr = InitiatingPartyOrgID.NewChild("Othr", "")
    Set InitiatingPartyOthrId = InitiatingPartyOthr.NewChild("Id", rstHeader!SEPA_UserID)
Else
    Set InitiatingPartyOrgID = InitiatingPartyID.NewChild("OrgId", "")
    Set InitiatingPartyOthr = InitiatingPartyOrgID.NewChild("Othr", "")
    Set InitiatingPartyOthrId = InitiatingPartyOthr.NewChild("Id", rstHeader!SEPA_UserID)
End If



   
Set PaymentInformation = DDInst.NewChild("PmtInf", "")
Set PaymentID = PaymentInformation.NewChild("PmtInfId", rstTrans!TransID)
Set PaymentMethod = PaymentInformation.NewChild("PmtMtd", "DD")
Set BatchBook = PaymentInformation.NewChild("BtchBookg", "true")
Set NoofTrans = PaymentInformation.NewChild("NbOfTxs", rstHeader!TotalTrans)
Set TransValue = PaymentInformation.NewChild("CtrlSum", Format(rstHeader!DDTotal, "#.00"))

Set PaymentTypeInformation = PaymentInformation.NewChild("PmtTpInf", "")
Set ServiceLevel = PaymentTypeInformation.NewChild("SvcLvl", "")
Set ServiceLevelCode = ServiceLevel.NewChild("Cd", "SEPA")
Set LocalInstrument = PaymentTypeInformation.NewChild("LclInstrm", "")
Set LocalInstrumentCode = LocalInstrument.NewChild("Cd", "CORE")
Set SequenceTP = PaymentTypeInformation.NewChild("SeqTp", rstTrans!Seq) 'FRST – for First presentation RCUR – for Recurrent presentation OOFF – for Once off presentation FNAL – for Final presenta
Set RequestedCollectionDate = PaymentInformation.NewChild("ReqdColltnDt", Format(rstTrans!CollectionDate, "YYYY-MM-DD"))
Set Creditor = PaymentInformation.NewChild("Cdtr", "")
Set CreditorName = Creditor.NewChild("Nm", rstHeader!SEPA_Name) 
Set CreditorAccount = PaymentInformation.NewChild("CdtrAcct", "")
Set CreditorID = CreditorAccount.NewChild("Id", "")
Set CreditorIBAN = CreditorID.NewChild("IBAN", rstHeader!SEPA_IBAN)
Set CreditorAgentBIC = PaymentInformation.NewChild("CdtrAgt", "")
Set FinInstnId = CreditorAgentBIC.NewChild("FinInstnId", "")
Set CreditorBIC = FinInstnId.NewChild("BIC", rstHeader!SEPA_BIC)

'Set CdtrSchmeId = PaymentInformation.NewChild("CdtrSchmeId", "")
'Set CdtrSchmeIdID = CdtrSchmeId.NewChild("Id", "")
'Set PrvtId = CdtrSchmeIdID.NewChild("PrvtId", "")
'Set Othr = PrvtId.NewChild("Othr", "")
'Set CreditorSEPAID = Othr.NewChild("Id", "") 'rstHeader!SEPA_UserID) Line 47
'Set CreditorSchmeNm = Othr.NewChild("SchmeNm", "")
'Set CreditorPrtry = CreditorSchmeNm.NewChild("Prtry", "") '"SEPA")


'loop on payment
Do While Not rstTrans.EOF

    Set DDTransactionInformation = PaymentInformation.NewChild("DrctDbtTxInf", "")
    Set PmtId = DDTransactionInformation.NewChild("PmtId", "")
    Set PaymentEndToEndId = PmtId.NewChild("EndToEndId", Format(Now(), "YYYYMMDDhhss") & "T" & rstTrans!TransID) ' must be unique
    Set InstructionAmount = DDTransactionInformation.NewChild("InstdAmt", Format(RoundCC(rstTrans!Amount), "#.00"))
    InstructionAmount.AddAttribute "Ccy", "EUR"

    Set DDMandatetx = DDTransactionInformation.NewChild("DrctDbtTx", "")
    Set MndtRltdInf = DDMandatetx.NewChild("MndtRltdInf", "")
    Set MandateId = MndtRltdInf.NewChild("MndtId", rstTrans!D_Bankname)
    Set MandateSignDate = MndtRltdInf.NewChild("DtOfSgntr", Format(rstTrans!MandateDate, "YYYY-MM-DD"))  ' default to jan 2013 if ported from DD
   
    Set PL_CdtrSchmeId = DDMandatetx.NewChild("CdtrSchmeId", "")
    Set PL_CdtrSchmeIdID = PL_CdtrSchmeId.NewChild("Id", "")
    Set PL_PrvtId = PL_CdtrSchmeIdID.NewChild("PrvtId", "")
    Set PL_Othr = PL_PrvtId.NewChild("Othr", "")
    Set PL_CreditorSEPAID = PL_Othr.NewChild("Id", rstHeader!SEPA_UserID)
    Set PL_CreditorSchmeNm = PL_Othr.NewChild("SchmeNm", "")
    Set PL_CreditorPrtry = PL_CreditorSchmeNm.NewChild("Prtry", "SEPA")
   
   
    Set CustomerAgent = DDTransactionInformation.NewChild("DbtrAgt", "")
    Set CustomerFinInstnId = CustomerAgent.NewChild("FinInstnId", "")
    Set CustomerBIC = CustomerFinInstnId.NewChild("BIC", rstTrans!BIC) 'rstHeader!SEPA_BIC)
   
    Set Customer = DDTransactionInformation.NewChild("Dbtr", "")
    Set CustomerName = Customer.NewChild("Nm", FindAndReplace(rstTrans!DebtorsName, "&", "+"))
    Set CustomerAccount = DDTransactionInformation.NewChild("DbtrAcct", "")
    Set CustomerAccId = CustomerAccount.NewChild("Id", "")
    Set CustomerIBAN = CustomerAccId.NewChild("IBAN", rstTrans!IBAN) 
    'end loop on payment
    rstTrans.MoveNext
Loop


success = xml.SaveXml(rstHeader!ExportFileName)
If (success <> 1) Then
    MsgBox xml.LastErrorText
Else
    MsgBox "File Created " & rstHeader!ExportFileName
End If


Set rstTrans = Nothing
Set rstHeader = Nothing


Exit Function

Errorhandler:
MsgBox "An Error Occurred creating the File " & Err.Number & " " & Err.Description


End Function