aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntoine A <>2024-01-16 10:38:12 +0000
committerAntoine A <>2024-01-16 10:38:12 +0000
commit7d3e3ea416ab8b7bc1495f8560cb41bb93013228 (patch)
treebf6a5ad168601214d854b8c826a5aa6ed9a0a179
parent460a80b96a4449c68f1d2c5fae131feb4e76151d (diff)
downloadlibeufin-7d3e3ea416ab8b7bc1495f8560cb41bb93013228.tar.gz
libeufin-7d3e3ea416ab8b7bc1495f8560cb41bb93013228.tar.bz2
libeufin-7d3e3ea416ab8b7bc1495f8560cb41bb93013228.zip
Start parsing CustomerPaymentStatusReport
-rw-r--r--.gitignore1
-rw-r--r--integration/src/main/kotlin/Main.kt92
-rw-r--r--nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt134
-rw-r--r--nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt87
-rw-r--r--util/import.py49
-rw-r--r--util/src/main/kotlin/EbicsCodeSets.kt335
-rw-r--r--util/src/main/resources/xsd/pain.002.001.13.xsd1253
7 files changed, 1649 insertions, 302 deletions
diff --git a/.gitignore b/.gitignore
index fb39b151..8d1b734f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -26,7 +26,6 @@ __pycache__
*.log
.DS_Store
*.mk
-*.xsd
util/src/main/resources/version.txt
debian/usr/share/libeufin/demobank-ui/index.js
debian/usr/share/libeufin/demobank-ui/*.html
diff --git a/integration/src/main/kotlin/Main.kt b/integration/src/main/kotlin/Main.kt
index 6d823ffd..bf946cab 100644
--- a/integration/src/main/kotlin/Main.kt
+++ b/integration/src/main/kotlin/Main.kt
@@ -117,34 +117,56 @@ class Cli : CliktCommand("Run integration tests on banks provider") {
.assertOk("ebics-setup should succeed the second time")
}
- if (ask("Submit transactions ? y/n>") == "y") {
- val payto = "payto://iban/CH2989144971918294289?receiver-name=Test"
+ val payto = "payto://iban/CH2989144971918294289?receiver-name=Test"
- step("Test submit one transaction")
- nexusDb.initiatedPaymentCreate(InitiatedPayment(
- amount = NexusAmount(42L, 0, "CFH"),
- creditPaytoUri = payto,
- wireTransferSubject = "single transaction test",
- initiationTime = Instant.now(),
- requestUid = Base32Crockford.encode(randBytes(16))
- ))
- nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
-
- step("Test submit many transaction")
- repeat(4) {
+ step("Test fetch transactions")
+ nexusCmd.test("ebics-fetch --transient -c $conf --pinned-start 2022-01-01").assertOk()
+
+ while (true) {
+ when (ask("Run 'fetch', 'submit', 'tx', 'txs', 'logs', 'ack' or 'exit'>")) {
+ "fetch" -> {
+ step("Fetch new transactions")
+ nexusCmd.test("ebics-fetch --transient -c $conf").assertOk()
+ }
+ "tx" -> {
+ step("Test submit one transaction")
nexusDb.initiatedPaymentCreate(InitiatedPayment(
- amount = NexusAmount(100L + it, 0, "CFH"),
- creditPaytoUri = payto,
- wireTransferSubject = "multi transaction test $it",
- initiationTime = Instant.now(),
- requestUid = Base32Crockford.encode(randBytes(16))
- ))
+ amount = NexusAmount(42L, 0, "CFH"),
+ creditPaytoUri = payto,
+ wireTransferSubject = "single transaction test",
+ initiationTime = Instant.now(),
+ requestUid = Base32Crockford.encode(randBytes(16))
+ ))
+ nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
+ }
+ "txs" -> {
+ step("Test submit many transaction")
+ repeat(4) {
+ nexusDb.initiatedPaymentCreate(InitiatedPayment(
+ amount = NexusAmount(100L + it, 0, "CFH"),
+ creditPaytoUri = payto,
+ wireTransferSubject = "multi transaction test $it",
+ initiationTime = Instant.now(),
+ requestUid = Base32Crockford.encode(randBytes(16))
+ ))
+ }
+ nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
+ }
+ "submit" -> {
+ step("Submit pending transactions")
+ nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
+ }
+ "logs" -> {
+ step("Fetch logs")
+ nexusCmd.test("ebics-fetch --transient -c $conf --only-logs").assertOk()
+ }
+ "ack" -> {
+ step("Fetch ack")
+ nexusCmd.test("ebics-fetch --transient -c $conf --only-ack").assertOk()
+ }
+ "exit" -> break
}
- nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
}
-
- step("Test fetch transactions")
- nexusCmd.test("ebics-fetch --transient -c $conf --pinned-start 2022-01-01").assertOk()
}
Kind.netzbon -> {
if (!hasClientKeys)
@@ -159,7 +181,7 @@ class Cli : CliktCommand("Run integration tests on banks provider") {
nexusCmd.test("ebics-fetch --transient -c $conf --pinned-start 2022-01-01").assertOk()
while (true) {
- when (ask("Run 'fetch', 'submit' or 'exit'>")) {
+ when (ask("Run 'fetch', 'submit', 'logs', 'ack' or 'exit'>")) {
"fetch" -> {
step("Fetch new transactions")
nexusCmd.test("ebics-fetch --transient -c $conf").assertOk()
@@ -168,6 +190,26 @@ class Cli : CliktCommand("Run integration tests on banks provider") {
step("Submit pending transactions")
nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
}
+ "tx" -> {
+ step("Submit new transaction")
+ // TODO interactive payment editor
+ nexusDb.initiatedPaymentCreate(InitiatedPayment(
+ amount = getTalerAmount("1.1", "CFH"),
+ creditPaytoUri = "payto://iban/CH6208704048981247126?receiver-name=Grothoff+Hans",
+ wireTransferSubject = "single transaction test",
+ initiationTime = Instant.now(),
+ requestUid = Base32Crockford.encode(randBytes(16))
+ ))
+ nexusCmd.test("ebics-submit --transient -c $conf").assertOk()
+ }
+ "logs" -> {
+ step("Fetch logs")
+ nexusCmd.test("ebics-fetch --transient -c $conf --only-logs").assertOk()
+ }
+ "ack" -> {
+ step("Fetch ack")
+ nexusCmd.test("ebics-fetch --transient -c $conf --only-ack").assertOk()
+ }
"exit" -> break
}
}
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
index 91af3e84..5f51d023 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/EbicsFetch.kt
@@ -18,6 +18,7 @@ import java.time.LocalDate
import java.time.ZoneId
import java.util.UUID
import kotlin.io.path.*
+import kotlin.io.*
/**
* Necessary data to perform a download.
@@ -340,43 +341,60 @@ fun firstLessThanSecond(
return a.value < b.value
}
-/**
- * Parses the response of an EBICS notification looking for
- * incoming payments. As a result, it either creates a Taler
- * withdrawal or bounces the incoming payment. In detail, this
- * function extracts the camt.054 from the ZIP archive, invokes
- * the lower-level camt.054 parser and updates the database.
- *
- * @param db database connection.
- * @param content the ZIP file that contains the EBICS
- * notification as camt.054 records.
- */
-private fun ingestNotification(
+private fun ingestDocument(
db: Database,
- ctx: FetchContext,
- content: ByteArray
+ currency: String,
+ content: ByteArray,
+ whichDocument: SupportedDocument
) {
- val incomingPayments = mutableListOf<IncomingPayment>()
- val outgoingPayments = mutableListOf<OutgoingPayment>()
-
- try {
- content.unzipForEach { fileName, xmlContent ->
- if (!fileName.contains("camt.054", ignoreCase = true))
- throw Exception("Asked for notification but did NOT get a camt.054")
- logger.debug("parse $fileName")
- parseTxNotif(xmlContent, ctx.cfg.currency, incomingPayments, outgoingPayments)
- }
- } catch (e: IOException) {
- throw Exception("Could not open any ZIP archive", e)
- }
+ when (whichDocument) {
+ SupportedDocument.CAMT_054 -> {
+ try {
+ val incomingPayments = mutableListOf<IncomingPayment>()
+ val outgoingPayments = mutableListOf<OutgoingPayment>()
+
+ try {
+ content.unzipForEach { fileName, xmlContent ->
+ if (!fileName.contains("camt.054", ignoreCase = true))
+ throw Exception("Asked for notification but did NOT get a camt.054")
+ logger.debug("parse $fileName")
+ parseTxNotif(xmlContent, currency, incomingPayments, outgoingPayments)
+ }
+ } catch (e: IOException) {
+ throw Exception("Could not open any ZIP archive", e)
+ }
- runBlocking {
- incomingPayments.forEach {
- ingestIncomingPayment(db, it)
+ runBlocking {
+ incomingPayments.forEach {
+ ingestIncomingPayment(db, it)
+ }
+ outgoingPayments.forEach {
+ ingestOutgoingPayment(db, it)
+ }
+ }
+ } catch (e: Exception) {
+ throw Exception("Ingesting notifications failed", e)
+ }
}
- outgoingPayments.forEach {
- ingestOutgoingPayment(db, it)
+ SupportedDocument.PAIN_002_LOGS -> {
+ val acks = parseCustomerAck(content.toString(Charsets.UTF_8))
+ for (ack in acks) {
+ println(ack)
+ }
+ }
+ SupportedDocument.PAIN_002 -> {
+ try {
+ content.unzipForEach { fileName, xmlContent ->
+ logger.debug("parse $fileName")
+ val status = parseCustomerPaymentStatusReport(xmlContent.toString())
+ logger.debug("$status") // TODO ingest in db
+ }
+ } catch (e: IOException) {
+ throw Exception("Could not open any ZIP archive", e)
+ }
+
}
+ else -> logger.warn("Not ingesting ${whichDocument}. Only camt.054 notifications supported.")
}
}
@@ -427,27 +445,7 @@ private suspend fun fetchDocuments(
maybeContent,
nonZip = ctx.whichDocument == SupportedDocument.PAIN_002_LOGS
)
- // Parsing the XML: only camt.054 (Detailavisierung) supported currently.
-
- when (ctx.whichDocument) {
- SupportedDocument.CAMT_054 -> {
- try {
- ingestNotification(db, ctx, maybeContent)
- } catch (e: Exception) {
- throw Exception("Ingesting notifications failed", e)
- }
- }
- SupportedDocument.PAIN_002_LOGS -> {
- val acks = parseCustomerAck(maybeContent.toString(Charsets.UTF_8))
- for (ack in acks) {
- if (ack.code != null)
- println("${ack.timestamp.fmtDateTime()} ${ack.actionType} ${ack.code.name} ${ack.code.isoCode} ${ack.code.description}")
- else
- println("${ack.timestamp.fmtDateTime()} ${ack.actionType}")
- }
- }
- else -> logger.warn("Not ingesting ${ctx.whichDocument}. Only camt.054 notifications supported.")
- }
+ ingestDocument(db, ctx.cfg.currency, maybeContent, ctx.whichDocument)
}
class EbicsFetch: CliktCommand("Fetches bank records. Defaults to camt.054 notifications") {
@@ -516,34 +514,8 @@ class EbicsFetch: CliktCommand("Fetches bank records. Defaults to camt.054 noti
Database(dbCfg.dbConnStr).use { db ->
if (parse || import) {
logger.debug("Reading from STDIN, running in debug mode. Not involving the database.")
- val maybeStdin = generateSequence(::readLine).joinToString("\n")
- when(whichDoc) {
- SupportedDocument.CAMT_054 -> {
- val incomingTxs = mutableListOf<IncomingPayment>()
- val outgoingTxs = mutableListOf<OutgoingPayment>()
- parseTxNotif(maybeStdin, cfg.currency, incomingTxs, outgoingTxs)
- if (import) {
- runBlocking {
- incomingTxs.forEach {
- ingestIncomingPayment(db, it)
- }
- outgoingTxs.forEach {
- ingestOutgoingPayment(db, it)
- }
- }
- }
- }
- SupportedDocument.PAIN_002_LOGS -> {
- val acks = parseCustomerAck(maybeStdin)
- for (ack in acks) {
- if (ack.code != null)
- println("${ack.timestamp.fmtDateTime()} ${ack.actionType} ${ack.code.name} ${ack.code.isoCode} ${ack.code.description}")
- else
- println("${ack.timestamp.fmtDateTime()} ${ack.actionType}")
- }
- }
- else -> throw Exception("Parsing $whichDoc not supported")
- }
+ val stdin = generateSequence(::readLine).joinToString("\n").toByteArray()
+ ingestDocument(db, cfg.currency, stdin, whichDoc) // TODO no db
return@cliCmd
}
diff --git a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt
index d0a46389..35fbec8d 100644
--- a/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt
+++ b/nexus/src/main/kotlin/tech/libeufin/nexus/Iso20022.kt
@@ -159,17 +159,22 @@ data class CustomerAck(
val actionType: String,
val code: ExternalStatusReasonCode?,
val timestamp: Instant
-)
+) {
+ override fun toString(): String {
+ return if (code != null)
+ "${timestamp.fmtDateTime()} ${actionType} ${code.isoCode} '${code.description}'"
+ else
+ "${timestamp.fmtDateTime()} ${actionType}"
+ }
+}
/**
* Extract logs from a pain.002 HAC document.
*
- * @param notifXml pain.002 input document
+ * @param xml pain.002 input document
*/
-fun parseCustomerAck(
- notifXml: String
-): List<CustomerAck> {
- val notifDoc = XMLUtil.parseStringIntoDom(notifXml)
+fun parseCustomerAck(xml: String): List<CustomerAck> {
+ val notifDoc = XMLUtil.parseStringIntoDom(xml)
return destructXml(notifDoc) {
requireRootElement("Document") {
requireUniqueChildNamed("CstmrPmtStsRpt") {
@@ -215,6 +220,76 @@ fun parseCustomerAck(
}
}
+data class PaymentStatus(
+ val msgId: String,
+ val code: ExternalPaymentGroupStatusCode,
+ val reasons: List<Reason>
+) {
+ override fun toString(): String {
+ var builder = "'${msgId}' ${code.isoCode} '${code.description}'"
+ for (reason in reasons) {
+ builder += " - ${reason.code.isoCode} '${reason.code.description}'"
+ }
+ return builder
+ }
+}
+
+data class Reason (
+ val code: ExternalStatusReasonCode,
+ val information: String
+)
+
+/**
+ * Extract payment status from a pain.002 document.
+ *
+ * @param xml pain.002 input document
+ */
+fun parseCustomerPaymentStatusReport(xml: String): PaymentStatus {
+ val notifDoc = XMLUtil.parseStringIntoDom(xml)
+ fun XmlElementDestructor.reasons(): List<Reason> {
+ return mapEachChildNamed("StsRsnInf") {
+ val code = requireUniqueChildNamed("Rsn") {
+ requireUniqueChildNamed("Cd") {
+ ExternalStatusReasonCode.valueOf(focusElement.textContent)
+ }
+ }
+ // TODO parse information
+ Reason(code, "")
+ }
+ }
+ return destructXml(notifDoc) {
+ requireRootElement("Document") {
+ requireUniqueChildNamed("CstmrPmtStsRpt") {
+ val (msgId, msgCode, msgReasons) = requireUniqueChildNamed("OrgnlGrpInfAndSts") {
+ val id = requireUniqueChildNamed("OrgnlMsgId") {
+ focusElement.textContent
+ }
+ val code = maybeUniqueChildNamed("GrpSts") {
+ ExternalPaymentGroupStatusCode.valueOf(focusElement.textContent)
+ }
+ val reasons = reasons()
+ Triple(id, code, reasons)
+ }
+ val paymentInfo = maybeUniqueChildNamed("OrgnlPmtInfAndSts") {
+ val code = requireUniqueChildNamed("PmtInfSts") {
+ ExternalPaymentGroupStatusCode.valueOf(focusElement.textContent)
+ }
+ val reasons = reasons()
+ Pair(code, reasons)
+ }
+
+ // TODO handle multi level code better
+ if (paymentInfo != null) {
+ val (code, reasons) = paymentInfo
+ PaymentStatus(msgId, code, reasons)
+ } else {
+ PaymentStatus(msgId, msgCode!!, msgReasons)
+ }
+ }
+ }
+ }
+}
+
/**
* Searches payments in a camt.054 (Detailavisierung) document.
*
diff --git a/util/import.py b/util/import.py
index fae5e2e4..e1389052 100644
--- a/util/import.py
+++ b/util/import.py
@@ -17,17 +17,27 @@ files = zip.namelist()
assert len(files) == 1
file = zip.open(files[0])
-# Extract specific code set from XLSX
-df = (
- pl.read_excel(file, sheet_name="AllCodeSets")
- .filter(pl.col("Code Set") == "ExternalStatusReason1Code")
- .sort("Code Value")
-)
+# Parse excel
+df = pl.read_excel(file, sheet_name="AllCodeSets")
+
+def extractCodeSet(setName: str, className: str) -> str:
+ out = f"enum class {className}(val isoCode: String, val description: String) {{"
+
+ for row in df.filter(pl.col("Code Set") == setName).sort("Code Value").rows(named=True):
+ (value, isoCode, description) = (
+ row["Code Value"],
+ row["Code Name"],
+ row["Code Definition"].split("\n", 1)[0].strip(),
+ )
+ out += f'\n\t{value}("{isoCode}", "{description}"),'
+
+ out += "\n}"
+ return out
# Write kotlin file
-kt = """/*
+kt = f"""/*
* This file is part of LibEuFin.
- * Copyright (C) 2023 Stanisci and Dold.
+ * Copyright (C) 2024 Taler Systems S.A.
* LibEuFin is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@@ -44,26 +54,13 @@ kt = """/*
* <http://www.gnu.org/licenses/>
*/
-package tech.libeufin.util
-
-enum class ExternalStatusReasonCode(val isoCode: String, val description: String) {"""
-for row in df.rows(named=True):
- (value, isoCode, description) = (
- row["Code Value"],
- row["Code Name"],
- row["Code Definition"].split("\n", 1)[0].strip().strip("."),
- )
- kt += f'\n\t{value}("{isoCode}", "{description}"),'
+// THIS FILE IS GENERATED, DO NOT EDIT
+package tech.libeufin.util
-kt += """;
-
- companion object {
- fun lookup(statusCode: String): ExternalStatusReasonCode? {
- return values().find { it.name == statusCode }
- }
- }
-}"""
+{extractCodeSet("ExternalStatusReason1Code", "ExternalStatusReasonCode")}
+{extractCodeSet("ExternalPaymentGroupStatus1Code", "ExternalPaymentGroupStatusCode")}
+"""
with open("src/main/kotlin/EbicsCodeSets.kt", "w") as file1:
file1.write(kt)
diff --git a/util/src/main/kotlin/EbicsCodeSets.kt b/util/src/main/kotlin/EbicsCodeSets.kt
index e11c34bb..4e0f95da 100644
--- a/util/src/main/kotlin/EbicsCodeSets.kt
+++ b/util/src/main/kotlin/EbicsCodeSets.kt
@@ -1,6 +1,6 @@
/*
* This file is part of LibEuFin.
- * Copyright (C) 2023 Stanisci and Dold.
+ * Copyright (C) 2024 Taler Systems S.A.
* LibEuFin is free software; you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@@ -17,61 +17,63 @@
* <http://www.gnu.org/licenses/>
*/
+// THIS FILE IS GENERATED, DO NOT EDIT
+
package tech.libeufin.util
enum class ExternalStatusReasonCode(val isoCode: String, val description: String) {
- AB01("AbortedClearingTimeout", "Clearing process aborted due to timeout"),
- AB02("AbortedClearingFatalError", "Clearing process aborted due to a fatal error"),
- AB03("AbortedSettlementTimeout", "Settlement aborted due to timeout"),
- AB04("AbortedSettlementFatalError", "Settlement process aborted due to a fatal error"),
- AB05("TimeoutCreditorAgent", "Transaction stopped due to timeout at the Creditor Agent"),
- AB06("TimeoutInstructedAgent", "Transaction stopped due to timeout at the Instructed Agent"),
- AB07("OfflineAgent", "Agent of message is not online"),
- AB08("OfflineCreditorAgent", "Creditor Agent is not online"),
- AB09("ErrorCreditorAgent", "Transaction stopped due to error at the Creditor Agent"),
- AB10("ErrorInstructedAgent", "Transaction stopped due to error at the Instructed Agent"),
- AB11("TimeoutDebtorAgent", "Transaction stopped due to timeout at the Debtor Agent"),
- AC01("IncorrectAccountNumber", "Account number is invalid or missing"),
+ AB01("AbortedClearingTimeout", "Clearing process aborted due to timeout."),
+ AB02("AbortedClearingFatalError", "Clearing process aborted due to a fatal error."),
+ AB03("AbortedSettlementTimeout", "Settlement aborted due to timeout."),
+ AB04("AbortedSettlementFatalError", "Settlement process aborted due to a fatal error."),
+ AB05("TimeoutCreditorAgent", "Transaction stopped due to timeout at the Creditor Agent."),
+ AB06("TimeoutInstructedAgent", "Transaction stopped due to timeout at the Instructed Agent."),
+ AB07("OfflineAgent", "Agent of message is not online."),
+ AB08("OfflineCreditorAgent", "Creditor Agent is not online."),
+ AB09("ErrorCreditorAgent", "Transaction stopped due to error at the Creditor Agent."),
+ AB10("ErrorInstructedAgent", "Transaction stopped due to error at the Instructed Agent."),
+ AB11("TimeoutDebtorAgent", "Transaction stopped due to timeout at the Debtor Agent."),
+ AC01("IncorrectAccountNumber", "Account number is invalid or missing."),
AC02("InvalidDebtorAccountNumber", "Debtor account number invalid or missing"),
AC03("InvalidCreditorAccountNumber", "Creditor account number invalid or missing"),
- AC04("ClosedAccountNumber", "Account number specified has been closed on the bank of account's books"),
+ AC04("ClosedAccountNumber", "Account number specified has been closed on the bank of account's books."),
AC05("ClosedDebtorAccountNumber", "Debtor account number closed"),
- AC06("BlockedAccount", "Account specified is blocked, prohibiting posting of transactions against it"),
+ AC06("BlockedAccount", "Account specified is blocked, prohibiting posting of transactions against it."),
AC07("ClosedCreditorAccountNumber", "Creditor account number closed"),
AC08("InvalidBranchCode", "Branch code is invalid or missing"),
AC09("InvalidAccountCurrency", "Account currency is invalid or missing"),
AC10("InvalidDebtorAccountCurrency", "Debtor account currency is invalid or missing"),
AC11("InvalidCreditorAccountCurrency", "Creditor account currency is invalid or missing"),
- AC12("InvalidAccountType", "Account type missing or invalid"),
+ AC12("InvalidAccountType", "Account type missing or invalid."),
AC13("InvalidDebtorAccountType", "Debtor account type missing or invalid"),
AC14("InvalidCreditorAccountType", "Creditor account type missing or invalid"),
- AC15("AccountDetailsChanged", "The account details for the counterparty have changed"),
- AC16("CardNumberInvalid", "Credit or debit card number is invalid"),
- AEXR("AlreadyExpiredRTP", "Request-to-pay Expiry Date and Time has already passed"),
+ AC15("AccountDetailsChanged", "The account details for the counterparty have changed."),
+ AC16("CardNumberInvalid", "Credit or debit card number is invalid."),
+ AEXR("AlreadyExpiredRTP", "Request-to-pay Expiry Date and Time has already passed."),
AG01("TransactionForbidden", "Transaction forbidden on this type of account (formerly NoAgreement)"),
AG02("InvalidBankOperationCode", "Bank Operation code specified in the message is not valid for receiver"),
AG03("TransactionNotSupported", "Transaction type not supported/authorized on this account"),
- AG04("InvalidAgentCountry", "Agent country code is missing or invalid"),
+ AG04("InvalidAgentCountry", "Agent country code is missing or invalid."),
AG05("InvalidDebtorAgentCountry", "Debtor agent country code is missing or invalid"),
AG06("InvalidCreditorAgentCountry", "Creditor agent country code is missing or invalid"),
- AG07("UnsuccesfulDirectDebit", "Debtor account cannot be debited for a generic reason"),
+ AG07("UnsuccesfulDirectDebit", "Debtor account cannot be debited for a generic reason."),
AG08("InvalidAccessRights", "Transaction failed due to invalid or missing user or access right"),
- AG09("PaymentNotReceived", "Original payment never received"),
- AG10("AgentSuspended", "Agent of message is suspended from the Real Time Payment system"),
- AG11("CreditorAgentSuspended", "Creditor Agent of message is suspended from the Real Time Payment system"),
- AG12("NotAllowedBookTransfer", "Payment orders made by transferring funds from one account to another at the same financial institution (bank or payment institution) are not allowed"),
- AG13("ForbiddenReturnPayment", "Returned payments derived from previously returned transactions are not allowed"),
+ AG09("PaymentNotReceived", "Original payment never received."),
+ AG10("AgentSuspended", "Agent of message is suspended from the Real Time Payment system."),
+ AG11("CreditorAgentSuspended", "Creditor Agent of message is suspended from the Real Time Payment system."),
+ AG12("NotAllowedBookTransfer", "Payment orders made by transferring funds from one account to another at the same financial institution (bank or payment institution) are not allowed."),
+ AG13("ForbiddenReturnPayment", "Returned payments derived from previously returned transactions are not allowed."),
AGNT("IncorrectAgent", "Agent in the payment workflow is incorrect"),
- ALAC("AlreadyAcceptedRTP", "Request-to-pay has already been accepted by the Debtor"),
+ ALAC("AlreadyAcceptedRTP", "Request-to-pay has already been accepted by the Debtor."),
AM01("ZeroAmount", "Specified message amount is equal to zero"),
AM02("NotAllowedAmount", "Specific transaction/message amount is greater than allowed maximum"),
AM03("NotAllowedCurrency", "Specified message amount is an non processable currency outside of existing agreement"),
- AM04("InsufficientFunds", "Amount of funds available to cover specified message amount is insufficient"),
+ AM04("InsufficientFunds", "Amount of funds available to cover specified message amount is insufficient."),
AM05("Duplication", "Duplication"),
- AM06("TooLowAmount", "Specified transaction amount is less than agreed minimum"),
- AM07("BlockedAmount", "Amount specified in message has been blocked by regulatory authorities"),
+ AM06("TooLowAmount", "Specified transaction amount is less than agreed minimum."),
+ AM07("BlockedAmount", "Amount specified in message has been blocked by regulatory authorities."),
AM09("WrongAmount", "Amount received is not the amount agreed or expected"),
- AM10("InvalidControlSum", "Sum of instructed amounts does not equal the control sum"),
+ AM10("InvalidControlSum", "Sum of instructed amounts does not equal the control sum."),
AM11("InvalidTransactionCurrency", "Transaction currency is invalid or missing"),
AM12("InvalidAmount", "Amount is invalid or missing"),
AM13("AmountExceedsClearingSystemLimit", "Transaction amount exceeds limits set by clearing system"),
@@ -79,38 +81,38 @@ enum class ExternalStatusReasonCode(val isoCode: String, val description: String
AM15("AmountBelowClearingSystemMinimum", "Transaction amount below minimum set by clearing system"),
AM16("InvalidGroupControlSum", "Control Sum at the Group level is invalid"),
AM17("InvalidPaymentInfoControlSum", "Control Sum at the Payment Information level is invalid"),
- AM18("InvalidNumberOfTransactions", "Number of transactions is invalid or missing"),
+ AM18("InvalidNumberOfTransactions", "Number of transactions is invalid or missing."),
AM19("InvalidGroupNumberOfTransactions", "Number of transactions at the Group level is invalid or missing"),
AM20("InvalidPaymentInfoNumberOfTransactions", "Number of transactions at the Payment Information level is invalid"),
- AM21("LimitExceeded", "Transaction amount exceeds limits agreed between bank and client"),
- AM22("ZeroAmountNotApplied", "Unable to apply zero amount to designated account. For example, where the rules of a service allow the use of zero amount payments, however the back-office system is unable to apply the funds to the account. If the rules of a service prohibit the use of zero amount payments, then code AM01 is used to report the error condition"),
- AM23("AmountExceedsSettlementLimit", "Transaction amount exceeds settlement limit"),
- APAR("AlreadyPaidRTP", "Request To Pay has already been paid by the Debtor"),
- ARFR("AlreadyRefusedRTP", "Request-to-pay has already been refused by the Debtor"),
- ARJR("AlreadyRejectedRTP", "Request-to-pay has already been rejected"),
- ATNS("AttachementsNotSupported", "Attachments to the request-to-pay are not supported"),
- BE01("InconsistenWithEndCustomer", "Identification of end customer is not consistent with associated account number. (formerly CreditorConsistency)"),
- BE04("MissingCreditorAddress", "Specification of creditor's address, which is required for payment, is missing/not correct (formerly IncorrectCreditorAddress)"),
+ AM21("LimitExceeded", "Transaction amount exceeds limits agreed between bank and client."),
+ AM22("ZeroAmountNotApplied", "Unable to apply zero amount to designated account. For example, where the rules of a service allow the use of zero amount payments, however the back-office system is unable to apply the funds to the account. If the rules of a service prohibit the use of zero amount payments, then code AM01 is used to report the error condition."),
+ AM23("AmountExceedsSettlementLimit", "Transaction amount exceeds settlement limit."),
+ APAR("AlreadyPaidRTP", "Request To Pay has already been paid by the Debtor."),
+ ARFR("AlreadyRefusedRTP", "Request-to-pay has already been refused by the Debtor."),
+ ARJR("AlreadyRejectedRTP", "Request-to-pay has already been rejected."),
+ ATNS("AttachementsNotSupported", "Attachments to the request-to-pay are not supported."),
+ BE01("InconsistenWithEndCustomer", "Identification of end customer is not consistent with associated account number. (formerly CreditorConsistency)."),
+ BE04("MissingCreditorAddress", "Specification of creditor's address, which is required for payment, is missing/not correct (formerly IncorrectCreditorAddress)."),
BE05("UnrecognisedInitiatingParty", "Party who initiated the message is not recognised by the end customer"),
BE06("UnknownEndCustomer", "End customer specified is not known at associated Sort/National Bank Code or does no longer exist in the books"),
- BE07("MissingDebtorAddress", "Specification of debtor's address, which is required for payment, is missing/not correct"),
+ BE07("MissingDebtorAddress", "Specification of debtor's address, which is required for payment, is missing/not correct."),
BE08("MissingDebtorName", "Debtor name is missing"),
- BE09("InvalidCountry", "Country code is missing or Invalid"),
+ BE09("InvalidCountry", "Country code is missing or Invalid."),
BE10("InvalidDebtorCountry", "Debtor country code is missing or invalid"),
BE11("InvalidCreditorCountry", "Creditor country code is missing or invalid"),
- BE12("InvalidCountryOfResidence", "Country code of residence is missing or Invalid"),
+ BE12("InvalidCountryOfResidence", "Country code of residence is missing or Invalid."),
BE13("InvalidDebtorCountryOfResidence", "Country code of debtor's residence is missing or Invalid"),
BE14("InvalidCreditorCountryOfResidence", "Country code of creditor's residence is missing or Invalid"),
- BE15("InvalidIdentificationCode", "Identification code missing or invalid"),
+ BE15("InvalidIdentificationCode", "Identification code missing or invalid."),
BE16("InvalidDebtorIdentificationCode", "Debtor or Ultimate Debtor identification code missing or invalid"),
BE17("InvalidCreditorIdentificationCode", "Creditor or Ultimate Creditor identification code missing or invalid"),
BE18("InvalidContactDetails", "Contact details missing or invalid"),
BE19("InvalidChargeBearerCode", "Charge bearer code for transaction type is invalid"),
- BE20("InvalidNameLength", "Name length exceeds local rules for payment type"),
- BE21("MissingName", "Name missing or invalid. Generic usage if cannot specifically identify debtor or creditor"),
+ BE20("InvalidNameLength", "Name length exceeds local rules for payment type."),
+ BE21("MissingName", "Name missing or invalid. Generic usage if cannot specifically identify debtor or creditor."),
BE22("MissingCreditorName", "Creditor name is missing"),
- BE23("AccountProxyInvalid", "Phone number or email address, or any other proxy, used as the account proxy is unknown or invalid"),
- CERI("CheckERI", "Credit transfer is not tagged as an Extended Remittance Information (ERI) transaction but contains ERI"),
+ BE23("AccountProxyInvalid", "Phone number or email address, or any other proxy, used as the account proxy is unknown or invalid."),
+ CERI("CheckERI", "Credit transfer is not tagged as an Extended Remittance Information (ERI) transaction but contains ERI."),
CH03("RequestedExecutionDateOrRequestedCollectionDateTooFarInFuture", "Value in Requested Execution Date or Requested Collection Date is too far in the future"),
CH04("RequestedExecutionDateOrRequestedCollectionDateTooFarInPast", "Value in Requested Execution Date or Requested Collection Date is too far in the past"),
CH07("ElementIsNotToBeUsedAtB-andC-Level", "Element is not to be used at B- and C-Level"),
@@ -127,12 +129,12 @@ enum class ExternalStatusReasonCode(val isoCode: String, val description: String
CH20("DecimalPointsNotCompatibleWithCurrency", "Number of decimal points not compatible with the currency"),
CH21("RequiredCompulsoryElementMissing", "Mandatory element is missing"),
CH22("COREandB2BwithinOnemessage", "SDD CORE and B2B not permitted within one message"),
- CHQC("ChequeSettledOnCreditorAccount", "Cheque has been presented in cheque clearing and settled on the creditor’s account"),
- CN01("AuthorisationCancelled", "Authorisation is cancelled"),
+ CHQC("ChequeSettledOnCreditorAccount", "Cheque has been presented in cheque clearing and settled on the creditor’s account."),
+ CN01("AuthorisationCancelled", "Authorisation is cancelled."),
CNOR("CreditorBankIsNotRegistered", "Creditor bank is not registered under this BIC in the CSM"),
CURR("IncorrectCurrency", "Currency of the payment is incorrect"),
CUST("RequestedByCustomer", "Cancellation requested by the Debtor"),
- DC02("SettlementNotReceived", "Rejection of a payment due to covering FI settlement not being received"),
+ DC02("SettlementNotReceived", "Rejection of a payment due to covering FI settlement not being received."),
DNOR("DebtorBankIsNotRegistered", "Debtor bank is not registered under this BIC in the CSM"),
DS01("ElectronicSignaturesCorrect", "The electronic signature(s) is/are correct"),
DS02("OrderCancelled", "An authorized user has cancelled the order"),
@@ -143,29 +145,29 @@ enum class ExternalStatusReasonCode(val isoCode: String, val description: String
DS07("ProcessingOK", "All actions concerning the order could be done by the EBICS bank server"),
DS08("DecompressionError", "The decompression of the file was not successful"),
DS09("DecryptionError", "The decryption of the file was not successful"),
- DS0A("DataSignRequested", "Data signature is required"),
- DS0B("UnknownDataSignFormat", "Data signature for the format is not available or invalid"),
- DS0C("SignerCertificateRevoked", "The signer certificate is revoked"),
- DS0D("SignerCertificateNotValid", "The signer certificate is not valid (revoked or not active)"),
- DS0E("IncorrectSignerCertificate", "The signer certificate is not present"),
- DS0F("SignerCertificationAuthoritySignerNotValid", "The authority of the signer certification sending the certificate is unknown"),
- DS0G("NotAllowedPayment", "Signer is not allowed to sign this operation type"),
- DS0H("NotAllowedAccount", "Signer is not allowed to sign for this account"),
- DS0K("NotAllowedNumberOfTransaction", "The number of transaction is over the number allowed for this signer"),
- DS10("Signer1CertificateRevoked", "The certificate is revoked for the first signer"),
- DS11("Signer1CertificateNotValid", "The certificate is not valid (revoked or not active) for the first signer"),
- DS12("IncorrectSigner1Certificate", "The certificate is not present for the first signer"),
- DS13("SignerCertificationAuthoritySigner1NotValid", "The authority of signer certification sending the certificate is unknown for the first signer"),
+ DS0A("DataSignRequested", "Data signature is required."),
+ DS0B("UnknownDataSignFormat", "Data signature for the format is not available or invalid."),
+ DS0C("SignerCertificateRevoked", "The signer certificate is revoked."),
+ DS0D("SignerCertificateNotValid", "The signer certificate is not valid (revoked or not active)."),
+ DS0E("IncorrectSignerCertificate", "The signer certificate is not present."),
+ DS0F("SignerCertificationAuthoritySignerNotValid", "The authority of the signer certification sending the certificate is unknown."),
+ DS0G("NotAllowedPayment", "Signer is not allowed to sign this operation type."),
+ DS0H("NotAllowedAccount", "Signer is not allowed to sign for this account."),
+ DS0K("NotAllowedNumberOfTransaction", "The number of transaction is over the number allowed for this signer."),
+ DS10("Signer1CertificateRevoked", "The certificate is revoked for the first signer."),
+ DS11("Signer1CertificateNotValid", "The certificate is not valid (revoked or not active) for the first signer."),
+ DS12("IncorrectSigner1Certificate", "The certificate is not present for the first signer."),
+ DS13("SignerCertificationAuthoritySigner1NotValid", "The authority of signer certification sending the certificate is unknown for the first signer."),
DS14("UserDoesNotExist", "The user is unknown on the server"),
DS15("IdenticalSignatureFound", "The same signature has already been sent to the bank"),
- DS16("PublicKeyVersionIncorrect", "The public key version is not correct. This code is returned when a customer sends signature files to the financial institution after conversion from an older program version (old ES format) to a new program version (new ES format) without having carried out re-initialisation with regard to a public key change"),
+ DS16("PublicKeyVersionIncorrect", "The public key version is not correct. This code is returned when a customer sends signature files to the financial institution after conversion from an older program version (old ES format) to a new program version (new ES format) without having carried out re-initialisation with regard to a public key change."),
DS17("DifferentOrderDataInSignatures", "Order data and signatures don’t match"),
- DS18("RepeatOrder", "File cannot be tested, the complete order has to be repeated. This code is returned in the event of a malfunction during the signature check, e.g. not enough storage space"),
+ DS18("RepeatOrder", "File cannot be tested, the complete order has to be repeated. This code is returned in the event of a malfunction during the signature check, e.g. not enough storage space."),
DS19("ElectronicSignatureRightsInsufficient", "The user’s rights (concerning his signature) are insufficient to execute the order"),
- DS20("Signer2CertificateRevoked", "The certificate is revoked for the second signer"),
- DS21("Signer2CertificateNotValid", "The certificate is not valid (revoked or not active) for the second signer"),
- DS22("IncorrectSigner2Certificate", "The certificate is not present for the second signer"),
- DS23("SignerCertificationAuthoritySigner2NotValid", "The authority of signer certification sending the certificate is unknown for the second signer"),
+ DS20("Signer2CertificateRevoked", "The certificate is revoked for the second signer."),
+ DS21("Signer2CertificateNotValid", "The certificate is not valid (revoked or not active) for the second signer."),
+ DS22("IncorrectSigner2Certificate", "The certificate is not present for the second signer."),
+ DS23("SignerCertificationAuthoritySigner2NotValid", "The authority of signer certification sending the certificate is unknown for the second signer."),
DS24("WaitingTimeExpired", "Waiting time expired due to incomplete order"),
DS25("OrderFileDeleted", "The order file was deleted by the bank server"),
DS26("UserSignedMultipleTimes", "The same user has signed multiple times"),
@@ -174,24 +176,24 @@ enum class ExternalStatusReasonCode(val isoCode: String, val description: String
DT02("InvalidCreationDate", "Invalid creation date and time in Group Header (eg, historic date)"),
DT03("InvalidNonProcessingDate", "Invalid non bank processing date (eg, weekend or local public holiday)"),
DT04("FutureDateNotSupported", "Future date not supported"),
- DT05("InvalidCutOffDate", "Associated message, payment information block or transaction was received after agreed processing cut-off date, i.e., date in the past"),
+ DT05("InvalidCutOffDate", "Associated message, payment information block or transaction was received after agreed processing cut-off date, i.e., date in the past."),
DT06("ExecutionDateChanged", "Execution Date has been modified in order for transaction to be processed"),
- DU01("DuplicateMessageID", "Message Identification is not unique"),
- DU02("DuplicatePaymentInformationID", "Payment Information Block is not unique"),
- DU03("DuplicateTransaction", "Transaction is not unique"),
- DU04("DuplicateEndToEndID", "End To End ID is not unique"),
- DU05("DuplicateInstructionID", "Instruction ID is not unique"),
+ DU01("DuplicateMessageID", "Message Identification is not unique."),
+ DU02("DuplicatePaymentInformationID", "Payment Information Block is not unique."),
+ DU03("DuplicateTransaction", "Transaction is not unique."),
+ DU04("DuplicateEndToEndID", "End To End ID is not unique."),
+ DU05("DuplicateInstructionID", "Instruction ID is not unique."),
DUPL("DuplicatePayment", "Payment is a duplicate of another payment"),
- ED01("CorrespondentBankNotPossible", "Correspondent bank not possible"),
+ ED01("CorrespondentBankNotPossible", "Correspondent bank not possible."),
ED03("BalanceInfoRequest", "Balance of payments complementary info is requested"),
- ED05("SettlementFailed", "Settlement of the transaction has failed"),
- ED06("SettlementSystemNotAvailable", "Interbank settlement system not available"),
- EDTL("ExpiryDateTooLong", "Expiry date time of the request-to-pay is too far in the future"),
- EDTR("ExpiryDateTimeReached", "Expiry date time of the request-to-pay is already reached"),
- ERIN("ERIOptionNotSupported", "Extended Remittance Information (ERI) option is not supported"),
+ ED05("SettlementFailed", "Settlement of the transaction has failed."),
+ ED06("SettlementSystemNotAvailable", "Interbank settlement system not available."),
+ EDTL("ExpiryDateTooLong", "Expiry date time of the request-to-pay is too far in the future."),
+ EDTR("ExpiryDateTimeReached", "Expiry date time of the request-to-pay is already reached."),
+ ERIN("ERIOptionNotSupported", "Extended Remittance Information (ERI) option is not supported."),
FF01("InvalidFileFormat", "File Format incomplete or invalid"),
- FF02("SyntaxError", "Syntax error reason is provided as narrative information in the additional reason information"),
- FF03("InvalidPaymentTypeInformation", "Payment Type Information is missing or invalid"),
+ FF02("SyntaxError", "Syntax error reason is provided as narrative information in the additional reason information."),
+ FF03("InvalidPaymentTypeInformation", "Payment Type Information is missing or invalid."),
FF04("InvalidServiceLevelCode", "Service Level code is missing or invalid"),
FF05("InvalidLocalInstrumentCode", "Local Instrument code is missing or invalid"),
FF06("InvalidCategoryPurposeCode", "Category Purpose code is missing or invalid"),
@@ -199,102 +201,109 @@ enum class ExternalStatusReasonCode(val isoCode: String, val description: String
FF08("InvalidEndToEndId", "End to End Id missing or invalid"),
FF09("InvalidChequeNumber", "Cheque number missing or invalid"),
FF10("BankSystemProcessingError", "File or transaction cannot be processed due to technical issues at the bank side"),
- FF11("ClearingRequestAborted", "Clearing request rejected due it being subject to an abort operation"),
- FF12("OriginalTransactionNotEligibleForRequestedReturn", "Original payment is not eligible to be returned given its current status"),
- FF13("RequestForCancellationNotFound", "No record of request for cancellation found"),
- FOCR("FollowingCancellationRequest", "Return following a cancellation request"),
- FR01("Fraud", "Returned as a result of fraud"),
- FRAD("FraudulentOrigin", "Cancellation requested following a transaction that was originated fraudulently. The use of the FraudulentOrigin code should be governed by jurisdictions"),
- G000("PaymentTransferredAndTracked", "In an FI To FI Customer Credit Transfer: The Status Originator transferred the payment to the next Agent or to a Market Infrastructure. The payment transfer is tracked. No further updates will follow from the Status Originator"),
- G001("PaymentTransferredAndNotTracked", "In an FI To FI Customer Credit Transfer: The Status Originator transferred the payment to the next Agent or to a Market Infrastructure. The payment transfer is not tracked. No further updates will follow from the Status Originator"),
- G002("CreditDebitNotConfirmed", "In a FIToFI Customer Credit Transfer: Credit to the creditor’s account may not be confirmed same day. Update will follow from the Status Originator"),
- G003("CreditPendingDocuments", "In a FIToFI Customer Credit Transfer: Credit to creditor’s account is pending receipt of required documents. The Status Originator has requested creditor to provide additional documentation. Update will follow from the Status Originator"),
- G004("CreditPendingFunds", "In a FIToFI Customer Credit Transfer: Credit to the creditor’s account is pending, status Originator is waiting for funds provided via a cover. Update will follow from the Status Originator"),
- G005("DeliveredWithServiceLevel", "Payment has been delivered to creditor agent with service level"),
- G006("DeliveredWIthoutServiceLevel", "Payment has been delivered to creditor agent without service level"),
- ID01("CorrespondingOriginalFileStillNotSent", "Signature file was sent to the bank but the corresponding original file has not been sent yet"),
- IEDT("IncorrectExpiryDateTime", "Expiry date time of the request-to-pay is incorrect"),
- IRNR("InitialRTPNeverReceived", "No initial request-to-pay has been received"),
+ FF11("ClearingRequestAborted", "Clearing request rejected due it being subject to an abort operation."),
+ FF12("OriginalTransactionNotEligibleForRequestedReturn", "Original payment is not eligible to be returned given its current status."),
+ FF13("RequestForCancellationNotFound", "No record of request for cancellation found."),
+ FOCR("FollowingCancellationRequest", "Return following a cancellation request."),
+ FR01("Fraud", "Returned as a result of fraud."),
+ FRAD("FraudulentOrigin", "Cancellation requested following a transaction that was originated fraudulently. The use of the FraudulentOrigin code should be governed by jurisdictions."),
+ G000("PaymentTransferredAndTracked", "In an FI To FI Customer Credit Transfer: The Status Originator transferred the payment to the next Agent or to a Market Infrastructure. The payment transfer is tracked. No further updates will follow from the Status Originator."),
+ G001("PaymentTransferredAndNotTracked", "In an FI To FI Customer Credit Transfer: The Status Originator transferred the payment to the next Agent or to a Market Infrastructure. The payment transfer is not tracked. No further updates will follow from the Status Originator."),
+ G002("CreditDebitNotConfirmed", "In a FIToFI Customer Credit Transfer: Credit to the creditor’s account may not be confirmed same day. Update will follow from the Status Originator."),
+ G003("CreditPendingDocuments", "In a FIToFI Customer Credit Transfer: Credit to creditor’s account is pending receipt of required documents. The Status Originator has requested creditor to provide additional documentation. Update will follow from the Status Originator."),
+ G004("CreditPendingFunds", "In a FIToFI Customer Credit Transfer: Credit to the creditor’s account is pending, status Originator is waiting for funds provided via a cover. Update will follow from the Status Originator."),
+ G005("DeliveredWithServiceLevel", "Payment has been delivered to creditor agent with service level."),
+ G006("DeliveredWIthoutServiceLevel", "Payment has been delivered to creditor agent without service level."),
+ ID01("CorrespondingOriginalFileStillNotSent", "Signature file was sent to the bank but the corresponding original file has not been sent yet."),
+ IEDT("IncorrectExpiryDateTime", "Expiry date time of the request-to-pay is incorrect."),
+ IRNR("InitialRTPNeverReceived", "No initial request-to-pay has been received."),
MD01("NoMandate", "No Mandate"),
- MD02("MissingMandatoryInformationInMandate", "Mandate related information data required by the scheme is missing"),
+ MD02("MissingMandatoryInformationInMandate", "Mandate related information data required by the scheme is missing."),
MD05("CollectionNotDue", "Creditor or creditor's agent should not have collected the direct debit"),
MD06("RefundRequestByEndCustomer", "Return of funds requested by end customer"),
- MD07("EndCustomerDeceased", "End customer is deceased"),
+ MD07("EndCustomerDeceased", "End customer is deceased."),
MS02("NotSpecifiedReasonCustomerGenerated", "Reason has not been specified by end customer"),
- MS03("NotSpecifiedReasonAgentGenerated", "Reason has not been specified by agent"),
- NARR("Narrative", "Reason is provided as narrative information in the additional reason information"),
- NERI("NoERI", "Credit transfer is tagged as an Extended Remittance Information (ERI) transaction but does not contain ERI"),
- NOAR("NonAgreedRTP", "No existing agreement for receiving request-to-pay messages"),
- NOAS("NoAnswerFromCustomer", "No response from Beneficiary"),
- NOCM("NotCompliantGeneric", "Customer account is not compliant with regulatory requirements, for example FICA (in South Africa) or any other regulatory requirements which render an account inactive for certain processing"),
- NOPG("NoPaymentGuarantee", "Requested payment guarantee (by Creditor) related to a request-to-pay cannot be provided"),
- NRCH("PayerOrPayerRTPSPNotReachable", "Recipient side of the request-to-pay (payer or its request-to-pay service provider) is not reachable"),
- PINS("TypeOfPaymentInstrumentNotSupported", "Type of payment requested in the request-to-pay is not supported by the payer"),
- RC01("BankIdentifierIncorrect", "Bank identifier code specified in the message has an incorrect format (formerly IncorrectFormatForRoutingCode)"),
- RC02("InvalidBankIdentifier", "Bank identifier is invalid or missing"),
+ MS03("NotSpecifiedReasonAgentGenerated", "Reason has not been specified by agent."),
+ NARR("Narrative", "Reason is provided as narrative information in the additional reason information."),
+ NERI("NoERI", "Credit transfer is tagged as an Extended Remittance Information (ERI) transaction but does not contain ERI."),
+ NOAR("NonAgreedRTP", "No existing agreement for receiving request-to-pay messages."),
+ NOAS("NoAnswerFromCustomer", "No response from Beneficiary."),
+ NOCM("NotCompliantGeneric", "Customer account is not compliant with regulatory requirements, for example FICA (in South Africa) or any other regulatory requirements which render an account inactive for certain processing."),
+ NOPG("NoPaymentGuarantee", "Requested payment guarantee (by Creditor) related to a request-to-pay cannot be provided."),
+ NRCH("PayerOrPayerRTPSPNotReachable", "Recipient side of the request-to-pay (payer or its request-to-pay service provider) is not reachable."),
+ PINS("TypeOfPaymentInstrumentNotSupported", "Type of payment requested in the request-to-pay is not supported by the payer."),
+ RC01("BankIdentifierIncorrect", "Bank identifier code specified in the message has an incorrect format (formerly IncorrectFormatForRoutingCode)."),
+ RC02("InvalidBankIdentifier", "Bank identifier is invalid or missing."),
RC03("InvalidDebtorBankIdentifier", "Debtor bank identifier is invalid or missing"),
RC04("InvalidCreditorBankIdentifier", "Creditor bank identifier is invalid or missing"),
- RC05("InvalidBICIdentifier", "BIC identifier is invalid or missing"),
+ RC05("InvalidBICIdentifier", "BIC identifier is invalid or missing."),
RC06("InvalidDebtorBICIdentifier", "Debtor BIC identifier is invalid or missing"),
RC07("InvalidCreditorBICIdentifier", "Creditor BIC identifier is invalid or missing"),
- RC08("InvalidClearingSystemMemberIdentifier", "ClearingSystemMemberidentifier is invalid or missing"),
+ RC08("InvalidClearingSystemMemberIdentifier", "ClearingSystemMemberidentifier is invalid or missing."),
RC09("InvalidDebtorClearingSystemMemberIdentifier", "Debtor ClearingSystemMember identifier is invalid or missing"),
RC10("InvalidCreditorClearingSystemMemberIdentifier", "Creditor ClearingSystemMember identifier is invalid or missing"),
RC11("InvalidIntermediaryAgent", "Intermediary Agent is invalid or missing"),
RC12("MissingCreditorSchemeId", "Creditor Scheme Id is invalid or missing"),
RCON("RMessageConflict", "Conflict with R-Message"),
- RECI("ReceiverCustomerInformation", "Further information regarding the intended recipient"),
- REPR("RTPReceivedCanBeProcessed", "Request-to-pay has been received and can be processed further"),
- RF01("NotUniqueTransactionReference", "Transaction reference is not unique within the message"),
+ RECI("ReceiverCustomerInformation", "Further information regarding the intended recipient."),
+ REPR("RTPReceivedCanBeProcessed", "Request-to-pay has been received and can be processed further."),
+ RF01("NotUniqueTransactionReference", "Transaction reference is not unique within the message."),
RR01("MissingDebtorAccountOrIdentification", "Specification of the debtor’s account or unique identification needed for reasons of regulatory requirements is insufficient or missing"),
- RR02("MissingDebtorNameOrAddress", "Specification of the debtor’s name and/or address needed for regulatory requirements is insufficient or missing"),
- RR03("MissingCreditorNameOrAddress", "Specification of the creditor’s name and/or address needed for regulatory requirements is insufficient or missing"),
+ RR02("MissingDebtorNameOrAddress", "Specification of the debtor’s name and/or address needed for regulatory requirements is insufficient or missing."),
+ RR03("MissingCreditorNameOrAddress", "Specification of the creditor’s name and/or address needed for regulatory requirements is insufficient or missing."),
RR04("RegulatoryReason", "Regulatory Reason"),
- RR05("RegulatoryInformationInvalid", "Regulatory or Central Bank Reporting information missing, incomplete or invalid"),
- RR06("TaxInformationInvalid", "Tax information missing, incomplete or invalid"),
- RR07("RemittanceInformationInvalid", "Remittance information structure does not comply with rules for payment type"),
- RR08("RemittanceInformationTruncated", "Remittance information truncated to comply with rules for payment type"),
- RR09("InvalidStructuredCreditorReference", "Structured creditor reference invalid or missing"),
- RR10("InvalidCharacterSet", "Character set supplied not valid for the country and payment type"),
- RR11("InvalidDebtorAgentServiceID", "Invalid or missing identification of a bank proprietary service"),
- RR12("InvalidPartyID", "Invalid or missing identification required within a particular country or payment type"),
- RTNS("RTPNotSupportedForDebtor", "Debtor does not support request-to-pay transactions"),
- RUTA("ReturnUponUnableToApply", "Return following investigation request and no remediation possible"),
- S000("ValidRequestForCancellationAcknowledged", "Request for Cancellation is acknowledged following validation"),
- S001("UETRFlaggedForCancellation", "Unique End-to-end Transaction Reference (UETR) relating to a payment has been identified as being associated with a Request for Cancellation"),
- S002("NetworkStopOfUETR", "Unique End-to-end Transaction Reference (UETR) relating to a payment has been prevent from traveling across a messaging network"),
- S003("RequestForCancellationForwarded", "Request for Cancellation has been forwarded to the payment processing/last payment processing agent"),
- S004("RequestForCancellationDeliveryAcknowledgement", "Request for Cancellation has been acknowledged as delivered to payment processing/last payment processing agent"),
- SL01("SpecificServiceOfferedByDebtorAgent", "Due to specific service offered by the Debtor Agent"),
- SL02("SpecificServiceOfferedByCreditorAgent", "Due to specific service offered by the Creditor Agent"),
- SL03("ServiceofClearingSystem", "Due to a specific service offered by the clearing system"),
- SL11("CreditorNotOnWhitelistOfDebtor", "Whitelisting service offered by the Debtor Agent; Debtor has not included the Creditor on its “Whitelist” (yet). In the Whitelist the Debtor may list all allowed Creditors to debit Debtor bank account"),
- SL12("CreditorOnBlacklistOfDebtor", "Blacklisting service offered by the Debtor Agent; Debtor included the Creditor on his “Blacklist”. In the Blacklist the Debtor may list all Creditors not allowed to debit Debtor bank account"),
- SL13("MaximumNumberOfDirectDebitTransactionsExceeded", "Due to Maximum allowed Direct Debit Transactions per period service offered by the Debtor Agent"),
- SL14("MaximumDirectDebitTransactionAmountExceeded", "Due to Maximum allowed Direct Debit Transaction amount service offered by the Debtor Agent"),
- SPII("RTPServiceProviderIdentifierIncorrect", "Identifier of the request-to-pay service provider is incorrect"),
+ RR05("RegulatoryInformationInvalid", "Regulatory or Central Bank Reporting information missing, incomplete or invalid."),
+ RR06("TaxInformationInvalid", "Tax information missing, incomplete or invalid."),
+ RR07("RemittanceInformationInvalid", "Remittance information structure does not comply with rules for payment type."),
+ RR08("RemittanceInformationTruncated", "Remittance information truncated to comply with rules for payment type."),
+ RR09("InvalidStructuredCreditorReference", "Structured creditor reference invalid or missing."),
+ RR10("InvalidCharacterSet", "Character set supplied not valid for the country and payment type."),
+ RR11("InvalidDebtorAgentServiceID", "Invalid or missing identification of a bank proprietary service."),
+ RR12("InvalidPartyID", "Invalid or missing identification required within a particular country or payment type."),
+ RTNS("RTPNotSupportedForDebtor", "Debtor does not support request-to-pay transactions."),
+ RUTA("ReturnUponUnableToApply", "Return following investigation request and no remediation possible."),
+ S000("ValidRequestForCancellationAcknowledged", "Request for Cancellation is acknowledged following validation."),
+ S001("UETRFlaggedForCancellation", "Unique End-to-end Transaction Reference (UETR) relating to a payment has been identified as being associated with a Request for Cancellation."),
+ S002("NetworkStopOfUETR", "Unique End-to-end Transaction Reference (UETR) relating to a payment has been prevent from traveling across a messaging network."),
+ S003("RequestForCancellationForwarded", "Request for Cancellation has been forwarded to the payment processing/last payment processing agent."),
+ S004("RequestForCancellationDeliveryAcknowledgement", "Request for Cancellation has been acknowledged as delivered to payment processing/last payment processing agent."),
+ SL01("SpecificServiceOfferedByDebtorAgent", "Due to specific service offered by the Debtor Agent."),
+ SL02("SpecificServiceOfferedByCreditorAgent", "Due to specific service offered by the Creditor Agent."),
+ SL03("ServiceofClearingSystem", "Due to a specific service offered by the clearing system."),
+ SL11("CreditorNotOnWhitelistOfDebtor", "Whitelisting service offered by the Debtor Agent; Debtor has not included the Creditor on its “Whitelist” (yet). In the Whitelist the Debtor may list all allowed Creditors to debit Debtor bank account."),
+ SL12("CreditorOnBlacklistOfDebtor", "Blacklisting service offered by the Debtor Agent; Debtor included the Creditor on his “Blacklist”. In the Blacklist the Debtor may list all Creditors not allowed to debit Debtor bank account."),
+ SL13("MaximumNumberOfDirectDebitTransactionsExceeded", "Due to Maximum allowed Direct Debit Transactions per period service offered by the Debtor Agent."),
+ SL14("MaximumDirectDebitTransactionAmountExceeded", "Due to Maximum allowed Direct Debit Transaction amount service offered by the Debtor Agent."),
+ SPII("RTPServiceProviderIdentifierIncorrect", "Identifier of the request-to-pay service provider is incorrect."),
TA01("TransmissonAborted", "The transmission of the file was not successful – it had to be aborted (for technical reasons)"),
TD01("NoDataAvailable", "There is no data available (for download)"),
TD02("FileNonReadable", "The file cannot be read (e.g. unknown format)"),
TD03("IncorrectFileStructure", "The file format is incomplete or invalid"),
- TK01("TokenInvalid", "Token is invalid"),
- TK02("SenderTokenNotFound", "Token used for the sender does not exist"),
- TK03("ReceiverTokenNotFound", "Token used for the receiver does not exist"),
- TK09("TokenMissing", "Token required for request is missing"),
- TKCM("TokenCounterpartyMismatch", "Token found with counterparty mismatch"),
- TKSG("TokenSingleUse", "Single Use Token already used"),
- TKSP("TokenSuspended", "Token found with suspended status"),
- TKVE("TokenValueLimitExceeded", "Token found with value limit rule violation"),
- TKXP("TokenExpired", "Token expired"),
- TM01("InvalidCutOffTime", "Associated message, payment information block, or transaction was received after agreed processing cut-off time"),
- TS01("TransmissionSuccessful", "The (technical) transmission of the file was successful"),
+ TK01("TokenInvalid", "Token is invalid."),
+ TK02("SenderTokenNotFound", "Token used for the sender does not exist."),
+ TK03("ReceiverTokenNotFound", "Token used for the receiver does not exist."),
+ TK09("TokenMissing", "Token required for request is missing."),
+ TKCM("TokenCounterpartyMismatch", "Token found with counterparty mismatch."),
+ TKSG("TokenSingleUse", "Single Use Token already used."),
+ TKSP("TokenSuspended", "Token found with suspended status."),
+ TKVE("TokenValueLimitExceeded", "Token found with value limit rule violation."),
+ TKXP("TokenExpired", "Token expired."),
+ TM01("InvalidCutOffTime", "Associated message, payment information block, or transaction was received after agreed processing cut-off time."),
+ TS01("TransmissionSuccessful", "The (technical) transmission of the file was successful."),
TS04("TransferToSignByHand", "The order was transferred to pass by accompanying note signed by hand"),
- UCRD("UnknownCreditor", "Unknown Creditor"),
- UPAY("UnduePayment", "Payment is not justified"),;
+ UCRD("UnknownCreditor", "Unknown Creditor."),
+ UPAY("UnduePayment", "Payment is not justified."),
+}
- companion object {
- fun lookup(statusCode: String): ExternalStatusReasonCode? {
- return values().find { it.name == statusCode }
- }
- }
-} \ No newline at end of file
+enum class ExternalPaymentGroupStatusCode(val isoCode: String, val description: String) {
+ ACCC("AcceptedSettlementCompletedCreditorAccount", "Settlement on the creditor's account has been completed."),
+ ACCP("AcceptedCustomerProfile", "Preceding check of technical validation was successful. Customer profile check was also successful."),
+ ACSC("AcceptedSettlementCompletedDebitorAccount", "Settlement on the debtor's account has been completed."),
+ ACSP("AcceptedSettlementInProcess", "All preceding checks such as technical validation and customer profile were successful and therefore the payment initiation has been accepted for execution."),
+ ACTC("AcceptedTechnicalValidation", "Authentication and syntactical and semantical validation are successful"),
+ ACWC("AcceptedWithChange", "Instruction is accepted but a change will be made, such as date or remittance not sent."),
+ PART("PartiallyAccepted", "A number of transactions have been accepted, whereas another number of transactions have not yet achieved"),
+ PDNG("Pending", "Payment initiation or individual transaction included in the payment initiation is pending. Further checks and status update will be performed."),
+ RCVD("Received", "Payment initiation has been received by the receiving agent"),
+ RJCT("Rejected", "Payment initiation or individual transaction included in the payment initiation has been rejected."),
+}
diff --git a/util/src/main/resources/xsd/pain.002.001.13.xsd b/util/src/main/resources/xsd/pain.002.001.13.xsd
new file mode 100644
index 00000000..01d18ba4
--- /dev/null
+++ b/util/src/main/resources/xsd/pain.002.001.13.xsd
@@ -0,0 +1,1253 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--Generated by Standards Editor (build:R1.6.22) on 2023 Feb 09 10:24:15, ISO 20022 version : 2013-->
+<xs:schema xmlns="urn:iso:std:iso:20022:tech:xsd:pain.002.001.13" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:iso:std:iso:20022:tech:xsd:pain.002.001.13">
+ <xs:element name="Document" type="Document"/>
+ <xs:complexType name="AccountIdentification4Choice">
+ <xs:choice>
+ <xs:element name="IBAN" type="IBAN2007Identifier"/>
+ <xs:element name="Othr" type="GenericAccountIdentification1"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="AccountSchemeName1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalAccountIdentification1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="ActiveCurrencyAndAmount_SimpleType">
+ <xs:restriction base="xs:decimal">
+ <xs:fractionDigits value="5"/>
+ <xs:totalDigits value="18"/>
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ActiveCurrencyAndAmount">
+ <xs:simpleContent>
+ <xs:extension base="ActiveCurrencyAndAmount_SimpleType">
+ <xs:attribute name="Ccy" type="ActiveCurrencyCode" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:simpleType name="ActiveCurrencyCode">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z]{3,3}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ActiveOrHistoricCurrencyAndAmount_SimpleType">
+ <xs:restriction base="xs:decimal">
+ <xs:fractionDigits value="5"/>
+ <xs:totalDigits value="18"/>
+ <xs:minInclusive value="0"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ActiveOrHistoricCurrencyAndAmount">
+ <xs:simpleContent>
+ <xs:extension base="ActiveOrHistoricCurrencyAndAmount_SimpleType">
+ <xs:attribute name="Ccy" type="ActiveOrHistoricCurrencyCode" use="required"/>
+ </xs:extension>
+ </xs:simpleContent>
+ </xs:complexType>
+ <xs:simpleType name="ActiveOrHistoricCurrencyCode">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z]{3,3}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="AddressType2Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="ADDR"/>
+ <xs:enumeration value="PBOX"/>
+ <xs:enumeration value="HOME"/>
+ <xs:enumeration value="BIZZ"/>
+ <xs:enumeration value="MLTO"/>
+ <xs:enumeration value="DLVY"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="AddressType3Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="AddressType2Code"/>
+ <xs:element name="Prtry" type="GenericIdentification30"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="AmendmentInformationDetails14">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlMndtId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlCdtrSchmeId" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlCdtrAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlCdtrAgtAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlDbtr" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlDbtrAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlDbtrAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlDbtrAgtAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlFnlColltnDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlFrqcy" type="Frequency36Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlRsn" type="MandateSetupReason1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlTrckgDays" type="Exact2NumericText"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="AmountType4Choice">
+ <xs:choice>
+ <xs:element name="InstdAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element name="EqvtAmt" type="EquivalentAmount2"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="AnyBICDec2014Identifier">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z0-9]{4,4}[A-Z]{2,2}[A-Z0-9]{2,2}([A-Z0-9]{3,3}){0,1}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="BICFIDec2014Identifier">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z0-9]{4,4}[A-Z]{2,2}[A-Z0-9]{2,2}([A-Z0-9]{3,3}){0,1}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="BaseOneRate">
+ <xs:restriction base="xs:decimal">
+ <xs:fractionDigits value="10"/>
+ <xs:totalDigits value="11"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="BranchAndFinancialInstitutionIdentification6">
+ <xs:sequence>
+ <xs:element name="FinInstnId" type="FinancialInstitutionIdentification18"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="BrnchId" type="BranchData3"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="BranchData3">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Id" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="LEI" type="LEIIdentifier"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nm" type="Max140Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PstlAdr" type="PostalAddress24"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CashAccount40">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Id" type="AccountIdentification4Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="CashAccountType2Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Ccy" type="ActiveOrHistoricCurrencyCode"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nm" type="Max70Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Prxy" type="ProxyAccountIdentification1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CashAccountType2Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalCashAccountType1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="CategoryPurpose1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalCategoryPurpose1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="ChargeBearerType1Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="DEBT"/>
+ <xs:enumeration value="CRED"/>
+ <xs:enumeration value="SHAR"/>
+ <xs:enumeration value="SLEV"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ChargeType3Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalChargeType1Code"/>
+ <xs:element name="Prtry" type="GenericIdentification3"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="Charges12">
+ <xs:sequence>
+ <xs:element name="Amt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element name="Agt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="ChargeType3Choice"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="ClearingChannel2Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="RTGS"/>
+ <xs:enumeration value="RTNS"/>
+ <xs:enumeration value="MPNS"/>
+ <xs:enumeration value="BOOK"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ClearingSystemIdentification2Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalClearingSystemIdentification1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="ClearingSystemIdentification3Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalCashClearingSystem1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="ClearingSystemMemberIdentification2">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="ClrSysId" type="ClearingSystemIdentification2Choice"/>
+ <xs:element name="MmbId" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="Contact4">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="NmPrfx" type="NamePrefix2Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nm" type="Max140Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PhneNb" type="PhoneNumber"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="MobNb" type="PhoneNumber"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FaxNb" type="PhoneNumber"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="EmailAdr" type="Max2048Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="EmailPurp" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="JobTitl" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Rspnsblty" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Dept" type="Max70Text"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Othr" type="OtherContact1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PrefrdMtd" type="PreferredContactMethod1Code"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="CountryCode">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z]{2,2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="CreditDebitCode">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="CRDT"/>
+ <xs:enumeration value="DBIT"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="CreditTransferMandateData1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="MndtId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="MandateTypeInformation2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DtOfSgntr" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DtOfVrfctn" type="ISODateTime"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ElctrncSgntr" type="Max10KBinary"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FrstPmtDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FnlPmtDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Frqcy" type="Frequency36Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Rsn" type="MandateSetupReason1Choice"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CreditorReferenceInformation2">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="CreditorReferenceType2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Ref" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CreditorReferenceType1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="DocumentType3Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="CreditorReferenceType2">
+ <xs:sequence>
+ <xs:element name="CdOrPrtry" type="CreditorReferenceType1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CurrencyExchange13">
+ <xs:sequence>
+ <xs:element name="SrcCcy" type="ActiveCurrencyCode"/>
+ <xs:element name="TrgtCcy" type="ActiveCurrencyCode"/>
+ <xs:element name="XchgRate" type="BaseOneRate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="UnitCcy" type="ActiveCurrencyCode"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="CustomerPaymentStatusReportV13">
+ <xs:sequence>
+ <xs:element name="GrpHdr" type="GroupHeader86"/>
+ <xs:element name="OrgnlGrpInfAndSts" type="OriginalGroupHeader17"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="OrgnlPmtInfAndSts" type="OriginalPaymentInstruction45"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="SplmtryData" type="SupplementaryData1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DateAndDateTime2Choice">
+ <xs:choice>
+ <xs:element name="Dt" type="ISODate"/>
+ <xs:element name="DtTm" type="ISODateTime"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="DateAndPlaceOfBirth1">
+ <xs:sequence>
+ <xs:element name="BirthDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PrvcOfBirth" type="Max35Text"/>
+ <xs:element name="CityOfBirth" type="Max35Text"/>
+ <xs:element name="CtryOfBirth" type="CountryCode"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DatePeriod2">
+ <xs:sequence>
+ <xs:element name="FrDt" type="ISODate"/>
+ <xs:element name="ToDt" type="ISODate"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="DecimalNumber">
+ <xs:restriction base="xs:decimal">
+ <xs:fractionDigits value="17"/>
+ <xs:totalDigits value="18"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="DiscountAmountAndType1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="DiscountAmountType1Choice"/>
+ <xs:element name="Amt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DiscountAmountType1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalDiscountAmountType1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="Document">
+ <xs:sequence>
+ <xs:element name="CstmrPmtStsRpt" type="CustomerPaymentStatusReportV13"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DocumentAdjustment1">
+ <xs:sequence>
+ <xs:element name="Amt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtDbtInd" type="CreditDebitCode"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Rsn" type="Max4Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AddtlInf" type="Max140Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DocumentLineIdentification1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="DocumentLineType1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nb" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RltdDt" type="ISODate"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DocumentLineInformation1">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="1" name="Id" type="DocumentLineIdentification1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Desc" type="Max2048Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Amt" type="RemittanceAmount3"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DocumentLineType1">
+ <xs:sequence>
+ <xs:element name="CdOrPrtry" type="DocumentLineType1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="DocumentLineType1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalDocumentLineType1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="DocumentType3Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="RADM"/>
+ <xs:enumeration value="RPIN"/>
+ <xs:enumeration value="FXDR"/>
+ <xs:enumeration value="DISP"/>
+ <xs:enumeration value="PUOR"/>
+ <xs:enumeration value="SCOR"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="DocumentType6Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="MSIN"/>
+ <xs:enumeration value="CNFA"/>
+ <xs:enumeration value="DNFA"/>
+ <xs:enumeration value="CINV"/>
+ <xs:enumeration value="CREN"/>
+ <xs:enumeration value="DEBN"/>
+ <xs:enumeration value="HIRI"/>
+ <xs:enumeration value="SBIN"/>
+ <xs:enumeration value="CMCN"/>
+ <xs:enumeration value="SOAC"/>
+ <xs:enumeration value="DISP"/>
+ <xs:enumeration value="BOLD"/>
+ <xs:enumeration value="VCHR"/>
+ <xs:enumeration value="AROI"/>
+ <xs:enumeration value="TSUT"/>
+ <xs:enumeration value="PUOR"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="EquivalentAmount2">
+ <xs:sequence>
+ <xs:element name="Amt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element name="CcyOfTrf" type="ActiveOrHistoricCurrencyCode"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="Exact2NumericText">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9]{2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Exact4AlphaNumericText">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-zA-Z0-9]{4}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalAccountIdentification1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalCashAccountType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalCashClearingSystem1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="3"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalCategoryPurpose1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalChargeType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalClearingSystemIdentification1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="5"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalDiscountAmountType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalDocumentLineType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalFinancialInstitutionIdentification1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalGarnishmentType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalLocalInstrument1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="35"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalMandateSetupReason1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalOrganisationIdentification1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalPaymentGroupStatus1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalPaymentTransactionStatus1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalPersonIdentification1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalProxyAccountType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalPurpose1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalServiceLevel1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalStatusReason1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ExternalTaxAmountType1Code">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="FinancialIdentificationSchemeName1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalFinancialInstitutionIdentification1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="FinancialInstitutionIdentification18">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="BICFI" type="BICFIDec2014Identifier"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ClrSysMmbId" type="ClearingSystemMemberIdentification2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="LEI" type="LEIIdentifier"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nm" type="Max140Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PstlAdr" type="PostalAddress24"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Othr" type="GenericFinancialIdentification1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="Frequency36Choice">
+ <xs:choice>
+ <xs:element name="Tp" type="Frequency6Code"/>
+ <xs:element name="Prd" type="FrequencyPeriod1"/>
+ <xs:element name="PtInTm" type="FrequencyAndMoment1"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="Frequency6Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="YEAR"/>
+ <xs:enumeration value="MNTH"/>
+ <xs:enumeration value="QURT"/>
+ <xs:enumeration value="MIAN"/>
+ <xs:enumeration value="WEEK"/>
+ <xs:enumeration value="DAIL"/>
+ <xs:enumeration value="ADHO"/>
+ <xs:enumeration value="INDA"/>
+ <xs:enumeration value="FRTN"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="FrequencyAndMoment1">
+ <xs:sequence>
+ <xs:element name="Tp" type="Frequency6Code"/>
+ <xs:element name="PtInTm" type="Exact2NumericText"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="FrequencyPeriod1">
+ <xs:sequence>
+ <xs:element name="Tp" type="Frequency6Code"/>
+ <xs:element name="CntPerPrd" type="DecimalNumber"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="Garnishment3">
+ <xs:sequence>
+ <xs:element name="Tp" type="GarnishmentType1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Grnshee" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="GrnshmtAdmstr" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RefNb" type="Max140Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Dt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RmtdAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FmlyMdclInsrncInd" type="TrueFalseIndicator"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="MplyeeTermntnInd" type="TrueFalseIndicator"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GarnishmentType1">
+ <xs:sequence>
+ <xs:element name="CdOrPrtry" type="GarnishmentType1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GarnishmentType1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalGarnishmentType1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="GenericAccountIdentification1">
+ <xs:sequence>
+ <xs:element name="Id" type="Max34Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SchmeNm" type="AccountSchemeName1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GenericFinancialIdentification1">
+ <xs:sequence>
+ <xs:element name="Id" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SchmeNm" type="FinancialIdentificationSchemeName1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GenericIdentification3">
+ <xs:sequence>
+ <xs:element name="Id" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GenericIdentification30">
+ <xs:sequence>
+ <xs:element name="Id" type="Exact4AlphaNumericText"/>
+ <xs:element name="Issr" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SchmeNm" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GenericOrganisationIdentification1">
+ <xs:sequence>
+ <xs:element name="Id" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SchmeNm" type="OrganisationIdentificationSchemeName1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GenericPersonIdentification1">
+ <xs:sequence>
+ <xs:element name="Id" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SchmeNm" type="PersonIdentificationSchemeName1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="GroupHeader86">
+ <xs:sequence>
+ <xs:element name="MsgId" type="Max35Text"/>
+ <xs:element name="CreDtTm" type="ISODateTime"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="InitgPty" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FwdgAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DbtrAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtrAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="IBAN2007Identifier">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z]{2,2}[0-9]{2,2}[a-zA-Z0-9]{1,30}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="ISODate">
+ <xs:restriction base="xs:date"/>
+ </xs:simpleType>
+ <xs:simpleType name="ISODateTime">
+ <xs:restriction base="xs:dateTime"/>
+ </xs:simpleType>
+ <xs:simpleType name="ISOYear">
+ <xs:restriction base="xs:gYear"/>
+ </xs:simpleType>
+ <xs:simpleType name="LEIIdentifier">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[A-Z0-9]{18,18}[0-9]{2,2}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="LocalInstrument2Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalLocalInstrument1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="MandateClassification1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="MandateClassification1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="MandateClassification1Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="FIXE"/>
+ <xs:enumeration value="USGB"/>
+ <xs:enumeration value="VARI"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="MandateRelatedData2Choice">
+ <xs:choice>
+ <xs:element maxOccurs="1" minOccurs="0" name="DrctDbtMndt" type="MandateRelatedInformation15"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtTrfMndt" type="CreditTransferMandateData1"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="MandateRelatedInformation15">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="MndtId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DtOfSgntr" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AmdmntInd" type="TrueFalseIndicator"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AmdmntInfDtls" type="AmendmentInformationDetails14"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ElctrncSgntr" type="Max1025Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FrstColltnDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FnlColltnDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Frqcy" type="Frequency36Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Rsn" type="MandateSetupReason1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TrckgDays" type="Exact2NumericText"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="MandateSetupReason1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalMandateSetupReason1Code"/>
+ <xs:element name="Prtry" type="Max70Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="MandateTypeInformation2">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="SvcLvl" type="ServiceLevel8Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="LclInstrm" type="LocalInstrument2Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CtgyPurp" type="CategoryPurpose1Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Clssfctn" type="MandateClassification1Choice"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="Max1025Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="1025"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max105Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="105"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max10KBinary">
+ <xs:restriction base="xs:base64Binary">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="10240"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max128Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="128"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max140Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="140"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max15NumericText">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[0-9]{1,15}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max16Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="16"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max2048Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="2048"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max34Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="34"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max350Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="350"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max35Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="35"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max4Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="4"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Max70Text">
+ <xs:restriction base="xs:string">
+ <xs:minLength value="1"/>
+ <xs:maxLength value="70"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="NamePrefix2Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="DOCT"/>
+ <xs:enumeration value="MADM"/>
+ <xs:enumeration value="MISS"/>
+ <xs:enumeration value="MIST"/>
+ <xs:enumeration value="MIKS"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Number">
+ <xs:restriction base="xs:decimal">
+ <xs:fractionDigits value="0"/>
+ <xs:totalDigits value="18"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="NumberOfTransactionsPerStatus5">
+ <xs:sequence>
+ <xs:element name="DtldNbOfTxs" type="Max15NumericText"/>
+ <xs:element name="DtldSts" type="ExternalPaymentTransactionStatus1Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DtldCtrlSum" type="DecimalNumber"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="OrganisationIdentification29">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="AnyBIC" type="AnyBICDec2014Identifier"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="LEI" type="LEIIdentifier"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Othr" type="GenericOrganisationIdentification1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="OrganisationIdentificationSchemeName1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalOrganisationIdentification1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="OriginalGroupHeader17">
+ <xs:sequence>
+ <xs:element name="OrgnlMsgId" type="Max35Text"/>
+ <xs:element name="OrgnlMsgNmId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlCreDtTm" type="ISODateTime"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlNbOfTxs" type="Max15NumericText"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlCtrlSum" type="DecimalNumber"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="GrpSts" type="ExternalPaymentGroupStatus1Code"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="StsRsnInf" type="StatusReasonInformation12"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="NbOfTxsPerSts" type="NumberOfTransactionsPerStatus5"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="OriginalPaymentInstruction45">
+ <xs:sequence>
+ <xs:element name="OrgnlPmtInfId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlNbOfTxs" type="Max15NumericText"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlCtrlSum" type="DecimalNumber"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PmtInfSts" type="ExternalPaymentGroupStatus1Code"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="StsRsnInf" type="StatusReasonInformation12"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="NbOfTxsPerSts" type="NumberOfTransactionsPerStatus5"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="TxInfAndSts" type="PaymentTransaction144"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="OriginalTransactionReference35">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="IntrBkSttlmAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Amt" type="AmountType4Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="IntrBkSttlmDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ReqdColltnDt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ReqdExctnDt" type="DateAndDateTime2Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtrSchmeId" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SttlmInf" type="SettlementInstruction11"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PmtTpInf" type="PaymentTypeInformation27"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PmtMtd" type="PaymentMethod4Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="MndtRltdInf" type="MandateRelatedData2Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RmtInf" type="RemittanceInformation21"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="UltmtDbtr" type="Party40Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Dbtr" type="Party40Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DbtrAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DbtrAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DbtrAgtAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtrAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtrAgtAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Cdtr" type="Party40Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtrAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="UltmtCdtr" type="Party40Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Purp" type="Purpose2Choice"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="OtherContact1">
+ <xs:sequence>
+ <xs:element name="ChanlTp" type="Max4Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Id" type="Max128Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="Party38Choice">
+ <xs:choice>
+ <xs:element name="OrgId" type="OrganisationIdentification29"/>
+ <xs:element name="PrvtId" type="PersonIdentification13"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="Party40Choice">
+ <xs:choice>
+ <xs:element name="Pty" type="PartyIdentification135"/>
+ <xs:element name="Agt" type="BranchAndFinancialInstitutionIdentification6"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="PartyIdentification135">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nm" type="Max140Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PstlAdr" type="PostalAddress24"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Id" type="Party38Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CtryOfRes" type="CountryCode"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CtctDtls" type="Contact4"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="PaymentMethod4Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="CHK"/>
+ <xs:enumeration value="TRF"/>
+ <xs:enumeration value="DD"/>
+ <xs:enumeration value="TRA"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="PaymentTransaction144">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="StsId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlInstrId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlEndToEndId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlUETR" type="UUIDv4Identifier"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TxSts" type="ExternalPaymentTransactionStatus1Code"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="StsRsnInf" type="StatusReasonInformation12"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="ChrgsInf" type="Charges12"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TrckrData" type="TrackerData1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AccptncDtTm" type="ISODateTime"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AcctSvcrRef" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ClrSysRef" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="OrgnlTxRef" type="OriginalTransactionReference35"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="SplmtryData" type="SupplementaryData1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PaymentTypeInformation27">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="InstrPrty" type="Priority2Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ClrChanl" type="ClearingChannel2Code"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="SvcLvl" type="ServiceLevel8Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="LclInstrm" type="LocalInstrument2Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SeqTp" type="SequenceType3Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CtgyPurp" type="CategoryPurpose1Choice"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="PercentageRate">
+ <xs:restriction base="xs:decimal">
+ <xs:fractionDigits value="10"/>
+ <xs:totalDigits value="11"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="PersonIdentification13">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="DtAndPlcOfBirth" type="DateAndPlaceOfBirth1"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Othr" type="GenericPersonIdentification1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="PersonIdentificationSchemeName1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalPersonIdentification1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:simpleType name="PhoneNumber">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="\+[0-9]{1,3}-[0-9()+\-]{1,30}"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="PostalAddress24">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="AdrTp" type="AddressType3Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Dept" type="Max70Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SubDept" type="Max70Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="StrtNm" type="Max70Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="BldgNb" type="Max16Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="BldgNm" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Flr" type="Max70Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PstBx" type="Max16Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Room" type="Max70Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="PstCd" type="Max16Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TwnNm" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TwnLctnNm" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DstrctNm" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CtrySubDvsn" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Ctry" type="CountryCode"/>
+ <xs:element maxOccurs="7" minOccurs="0" name="AdrLine" type="Max70Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="PreferredContactMethod1Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="LETT"/>
+ <xs:enumeration value="MAIL"/>
+ <xs:enumeration value="PHON"/>
+ <xs:enumeration value="FAXX"/>
+ <xs:enumeration value="CELL"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:simpleType name="Priority2Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="HIGH"/>
+ <xs:enumeration value="NORM"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ProxyAccountIdentification1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="ProxyAccountType1Choice"/>
+ <xs:element name="Id" type="Max2048Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ProxyAccountType1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalProxyAccountType1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="Purpose2Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalPurpose1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="ReferredDocumentInformation7">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="ReferredDocumentType4"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nb" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RltdDt" type="ISODate"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="LineDtls" type="DocumentLineInformation1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="ReferredDocumentType3Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="DocumentType6Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="ReferredDocumentType4">
+ <xs:sequence>
+ <xs:element name="CdOrPrtry" type="ReferredDocumentType3Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Issr" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="RemittanceAmount2">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="DuePyblAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="DscntApldAmt" type="DiscountAmountAndType1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtNoteAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="TaxAmt" type="TaxAmountAndType1"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="AdjstmntAmtAndRsn" type="DocumentAdjustment1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RmtdAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="RemittanceAmount3">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="DuePyblAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="DscntApldAmt" type="DiscountAmountAndType1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtNoteAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="TaxAmt" type="TaxAmountAndType1"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="AdjstmntAmtAndRsn" type="DocumentAdjustment1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RmtdAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="RemittanceInformation21">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Ustrd" type="Max140Text"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Strd" type="StructuredRemittanceInformation17"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="SequenceType3Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="FRST"/>
+ <xs:enumeration value="RCUR"/>
+ <xs:enumeration value="FNAL"/>
+ <xs:enumeration value="OOFF"/>
+ <xs:enumeration value="RPRE"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="ServiceLevel8Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalServiceLevel1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="SettlementInstruction11">
+ <xs:sequence>
+ <xs:element name="SttlmMtd" type="SettlementMethod1Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SttlmAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ClrSys" type="ClearingSystemIdentification3Choice"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="InstgRmbrsmntAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="InstgRmbrsmntAgtAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="InstdRmbrsmntAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="InstdRmbrsmntAgtAcct" type="CashAccount40"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ThrdRmbrsmntAgt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ThrdRmbrsmntAgtAcct" type="CashAccount40"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="SettlementMethod1Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="INDA"/>
+ <xs:enumeration value="INGA"/>
+ <xs:enumeration value="COVE"/>
+ <xs:enumeration value="CLRG"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="StatusReason6Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalStatusReason1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="StatusReasonInformation12">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Orgtr" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Rsn" type="StatusReason6Choice"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="AddtlInf" type="Max105Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="StructuredRemittanceInformation17">
+ <xs:sequence>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="RfrdDocInf" type="ReferredDocumentInformation7"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RfrdDocAmt" type="RemittanceAmount2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CdtrRefInf" type="CreditorReferenceInformation2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Invcr" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Invcee" type="PartyIdentification135"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxRmt" type="TaxData1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="GrnshmtRmt" type="Garnishment3"/>
+ <xs:element maxOccurs="3" minOccurs="0" name="AddtlRmtInf" type="Max140Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="SupplementaryData1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="PlcAndNm" type="Max350Text"/>
+ <xs:element name="Envlp" type="SupplementaryDataEnvelope1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="SupplementaryDataEnvelope1">
+ <xs:sequence>
+ <xs:any namespace="##any" processContents="lax"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxAmount3">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Rate" type="PercentageRate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxblBaseAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TtlAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Dtls" type="TaxRecordDetails3"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxAmountAndType1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="TaxAmountType1Choice"/>
+ <xs:element name="Amt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxAmountType1Choice">
+ <xs:choice>
+ <xs:element name="Cd" type="ExternalTaxAmountType1Code"/>
+ <xs:element name="Prtry" type="Max35Text"/>
+ </xs:choice>
+ </xs:complexType>
+ <xs:complexType name="TaxAuthorisation1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Titl" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Nm" type="Max140Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxData1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Cdtr" type="TaxParty1"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Dbtr" type="TaxParty2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="UltmtDbtr" type="TaxParty2"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AdmstnZone" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RefNb" type="Max140Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Mtd" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TtlTaxblBaseAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TtlTaxAmt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Dt" type="ISODate"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="SeqNb" type="Number"/>
+ <xs:element maxOccurs="unbounded" minOccurs="0" name="Rcrd" type="TaxRecord3"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxParty1">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RegnId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxTp" type="Max35Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxParty2">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="RegnId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxTp" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Authstn" type="TaxAuthorisation1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxPeriod3">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Yr" type="ISOYear"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="TaxRecordPeriod1Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FrToDt" type="DatePeriod2"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxRecord3">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Tp" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Ctgy" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CtgyDtls" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="DbtrSts" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="CertId" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="FrmsCd" type="Max35Text"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="Prd" type="TaxPeriod3"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="TaxAmt" type="TaxAmount3"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="AddtlInf" type="Max140Text"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TaxRecordDetails3">
+ <xs:sequence>
+ <xs:element maxOccurs="1" minOccurs="0" name="Prd" type="TaxPeriod3"/>
+ <xs:element name="Amt" type="ActiveOrHistoricCurrencyAndAmount"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="TaxRecordPeriod1Code">
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="MM01"/>
+ <xs:enumeration value="MM02"/>
+ <xs:enumeration value="MM03"/>
+ <xs:enumeration value="MM04"/>
+ <xs:enumeration value="MM05"/>
+ <xs:enumeration value="MM06"/>
+ <xs:enumeration value="MM07"/>
+ <xs:enumeration value="MM08"/>
+ <xs:enumeration value="MM09"/>
+ <xs:enumeration value="MM10"/>
+ <xs:enumeration value="MM11"/>
+ <xs:enumeration value="MM12"/>
+ <xs:enumeration value="QTR1"/>
+ <xs:enumeration value="QTR2"/>
+ <xs:enumeration value="QTR3"/>
+ <xs:enumeration value="QTR4"/>
+ <xs:enumeration value="HLF1"/>
+ <xs:enumeration value="HLF2"/>
+ </xs:restriction>
+ </xs:simpleType>
+ <xs:complexType name="TrackerData1">
+ <xs:sequence>
+ <xs:element name="ConfdDt" type="DateAndDateTime2Choice"/>
+ <xs:element name="ConfdAmt" type="ActiveCurrencyAndAmount"/>
+ <xs:element maxOccurs="unbounded" minOccurs="1" name="TrckrRcrd" type="TrackerRecord1"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:complexType name="TrackerRecord1">
+ <xs:sequence>
+ <xs:element name="Agt" type="BranchAndFinancialInstitutionIdentification6"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ChrgBr" type="ChargeBearerType1Code"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="ChrgsAmt" type="ActiveCurrencyAndAmount"/>
+ <xs:element maxOccurs="1" minOccurs="0" name="XchgRateData" type="CurrencyExchange13"/>
+ </xs:sequence>
+ </xs:complexType>
+ <xs:simpleType name="TrueFalseIndicator">
+ <xs:restriction base="xs:boolean"/>
+ </xs:simpleType>
+ <xs:simpleType name="UUIDv4Identifier">
+ <xs:restriction base="xs:string">
+ <xs:pattern value="[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89ab][a-f0-9]{3}-[a-f0-9]{12}"/>
+ </xs:restriction>
+ </xs:simpleType>
+</xs:schema>