gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] branch master updated (460a80b9 -> 11d3a68b)


From: gnunet
Subject: [libeufin] branch master updated (460a80b9 -> 11d3a68b)
Date: Tue, 16 Jan 2024 12:28:46 +0100

This is an automated email from the git hooks/post-receive script.

antoine pushed a change to branch master
in repository libeufin.

    from 460a80b9 Parse and print HAC logs
     new 7d3e3ea4 Start parsing CustomerPaymentStatusReport
     new 11d3a68b Add back withdrawal /abort in corebank API

The 2 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .gitignore                                         |    1 -
 .../main/kotlin/tech/libeufin/bank/CoreBankApi.kt  |   14 +
 bank/src/test/kotlin/CoreBankApiTest.kt            |    4 +-
 integration/src/main/kotlin/Main.kt                |   92 +-
 .../main/kotlin/tech/libeufin/nexus/EbicsFetch.kt  |  134 +--
 .../main/kotlin/tech/libeufin/nexus/Iso20022.kt    |   87 +-
 util/import.py                                     |   49 +-
 util/src/main/kotlin/EbicsCodeSets.kt              |  335 +++---
 util/src/main/resources/xsd/pain.002.001.13.xsd    | 1253 ++++++++++++++++++++
 9 files changed, 1665 insertions(+), 304 deletions(-)
 create mode 100644 util/src/main/resources/xsd/pain.002.001.13.xsd

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/bank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt 
b/bank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt
index a7d0f2c6..eb39c136 100644
--- a/bank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt
+++ b/bank/src/main/kotlin/tech/libeufin/bank/CoreBankApi.kt
@@ -506,6 +506,20 @@ private fun Routing.coreBankWithdrawalApi(db: Database, 
ctx: BankConfig) {
                 WithdrawalConfirmationResult.Success -> 
call.respond(HttpStatusCode.NoContent)
             }
         }
+        post("/accounts/{USERNAME}/withdrawals/{withdrawal_id}/abort") {
+            val opId = call.uuidParameter("withdrawal_id")
+            when (db.withdrawal.abort(opId)) {
+                AbortResult.UnknownOperation -> throw notFound(
+                    "Withdrawal operation $opId not found",
+                    TalerErrorCode.BANK_TRANSACTION_NOT_FOUND
+                )
+                AbortResult.AlreadyConfirmed -> throw conflict(
+                    "Cannot abort confirmed withdrawal", 
+                    TalerErrorCode.BANK_ABORT_CONFIRM_CONFLICT
+                )
+                AbortResult.Success -> call.respond(HttpStatusCode.NoContent)
+            }
+        }
     }
     get("/withdrawals/{withdrawal_id}") {
         val uuid = call.uuidParameter("withdrawal_id")
diff --git a/bank/src/test/kotlin/CoreBankApiTest.kt 
b/bank/src/test/kotlin/CoreBankApiTest.kt
index 86115e78..5a031b87 100644
--- a/bank/src/test/kotlin/CoreBankApiTest.kt
+++ b/bank/src/test/kotlin/CoreBankApiTest.kt
@@ -1003,7 +1003,7 @@ class CoreBankWithdrawalApiTest {
         }.assertOkJson<BankAccountCreateWithdrawalResponse> {
             val uuid = it.taler_withdraw_uri.split("/").last()
             withdrawalSelect(uuid)
-            
client.postA("/taler-integration/withdrawal-operation/$uuid/abort").assertNoContent()
+            
client.postA("/accounts/merchant/withdrawals/$uuid/abort").assertNoContent()
 
             // Check error
             client.postA("/accounts/merchant/withdrawals/$uuid/confirm")
@@ -1023,7 +1023,7 @@ class CoreBankWithdrawalApiTest {
                 .assertConflict(TalerErrorCode.BANK_UNALLOWED_DEBIT)
 
             // Check can abort because not confirmed
-            
client.postA("/taler-integration/withdrawal-operation/$uuid/abort").assertNoContent()
+            
client.postA("/accounts/merchant/withdrawals/$uuid/abort").assertNoContent()
         }
 
         // Check confirm another user's operation
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>

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]