<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.1.1">
    <!--=====================================================================-->
    <!--                        Schema Management                            -->
    <!--=====================================================================-->
    <!--                             IMPORTS                                 -->
    <!--                          DOCUMENTATION                              -->
    <xsd:annotation>
        <xsd:documentation xml:lang="en"/>
        <xsd:documentation>
            <name>IBANCheck Interface</name>
            <revision version="1.1.1">
                <date>2020-JAN-27</date>
            </revision>
        </xsd:documentation>
    </xsd:annotation>
    <!--                             INCLUDE                                 -->
    <!--                            REDEFINE                                 -->
    <!--=====================================================================-->
    <!--                    Model-Building Components                        -->
    <!--=====================================================================-->
    <!--                            NOTATIONS                                -->
    <!--                           SIMPLE TYPES                              -->
    <xsd:simpleType name="ModeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="direct"/>
            <xsd:enumeration value="batch"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="BatchIdentifierSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="22"/>
            <xsd:maxLength value="150"/>
            <xsd:pattern value="[A-Z]{1,4}-[A-Z,0-9]{1,32}-[A-Z,0-9]{1,32}-([A-Z]{1,32}-){0,2}[0-9]{17}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="IdentifierSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="32"/>
            <xsd:pattern value="[0-9a-zA-Z]{1,32}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="RelaxedIdentifierSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="32"/>
            <xsd:pattern value="[0-9a-zA-Z_\-]{1,32}"/>
         </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="VersionSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[0-9].[0-9]"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="DateTimeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="24"/>
            <xsd:maxLength value="24"/>
            <xsd:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}Z"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="DateSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="10"/>
            <xsd:maxLength value="10"/>
            <xsd:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="MessageCountSimpleType">
        <xsd:restriction base="xsd:nonNegativeInteger">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="3000"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="FlagSimpleType">
        <xsd:restriction base="xsd:nonNegativeInteger">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
        
    <xsd:simpleType name="DebtorReferenceSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="35"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="TokenLength5SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="5"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="TokenLength35SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="35"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="TokenLength64SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="64"/>
        </xsd:restriction>
    </xsd:simpleType>

   <xsd:simpleType name="TokenLength128SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="128"/>
        </xsd:restriction>
    </xsd:simpleType>
    
   <xsd:simpleType name="TokenLength256SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:maxLength value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
        
   <xsd:simpleType name="NonEmptyRestrictedTokenLength80SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="80"/>
            <xsd:pattern value="[^&gt;&lt;]+"/>
        </xsd:restriction>
    </xsd:simpleType>

   
    <xsd:simpleType name="IBANTokenLength128SimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="128"/>
        </xsd:restriction>
    </xsd:simpleType>

     
    <xsd:simpleType name="EntranceCodeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
            <xsd:maxLength value="40"/>
            <xsd:pattern value="[0-9a-zA-Z]{1,40}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
     
    <xsd:simpleType name="StatusCodeSimpleType">
        <xsd:restriction base="xsd:nonNegativeInteger">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="999999"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="TransactionIDType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[0-9a-zA-Z]{1,64}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="ErrorCodeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[A-Z]{2}[0-9]{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
        
    <xsd:simpleType name="IBANAccountNumberSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:pattern value="[A-Z]{2}[0-9]{2}[A-Z0-9]{1,30}"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="BICSimpleType">
        <xsd:union>
            <xsd:simpleType>
                <xsd:restriction base="xsd:token">
                    <xsd:minLength value="8"/>
                    <xsd:maxLength value="11"/>
                    <xsd:pattern value="[A-Z0-9]{8,11}"/>
                </xsd:restriction>
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:normalizedString">
                    <xsd:minLength value="0"/>
                    <xsd:maxLength value="0"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>
    
    <xsd:simpleType name="IBANResultSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="INVALID"/>
            <xsd:enumeration value="VALID"/>
            <xsd:enumeration value="UNKNOWN"/>
            <xsd:enumeration value="KNOWN"/>
            <xsd:enumeration value="SERVICE_TEMPORARILY_NOT_AVAILABLE"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="NameResultSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="TOO_SHORT"/>
            <xsd:enumeration value="NOT_CHECKED"/>
            <xsd:enumeration value="NON_MATCHING"/>
            <xsd:enumeration value="MISTYPED"/>
            <xsd:enumeration value="MATCHING"/>
        </xsd:restriction>
    </xsd:simpleType>
    
    <xsd:simpleType name="AccountStatusSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="ACTIVE"/>
            <xsd:enumeration value="INACTIVE"/>
            <xsd:enumeration value="UNKNOWN"/>
         </xsd:restriction>
    </xsd:simpleType>

    <xsd:simpleType name="AccountTypeSimpleType">
        <xsd:restriction base="xsd:token">
            <xsd:enumeration value="NATURAL_PERSON"/>
            <xsd:enumeration value="ORGANISATION"/>
            <xsd:enumeration value="UNKNOWN"/>
         </xsd:restriction>
    </xsd:simpleType>
    

    <!--                          COMPLEX TYPES                              -->
 
    <!--                          ROOT ELEMENT TYPE                          -->
    <xsd:complexType name="IBANCheckInterfaceType">
        <xsd:choice maxOccurs="unbounded" minOccurs="0">
            <xsd:element name="IBANCheckTransactionRequest" type="IBANCheckTransactionRequestType" maxOccurs="unbounded"/>
            <xsd:element name="IBANCheckBatchResponse" type="IBANCheckBatchResponseType" minOccurs="0" maxOccurs="1"/>
            <xsd:element name="IBANCheckTransactionResponse" type="IBANCheckTransactionResponseType" maxOccurs="unbounded"/>
            <xsd:element name="IBANCheckErrorResponse" type="IBANCheckErrorResponseType" minOccurs="0" maxOccurs="1"/>
        </xsd:choice>
        <xsd:attributeGroup ref="HeaderAttributes"/>
    </xsd:complexType>
    
    <!--                      COMPLEX TYPES DESCRIBING MAIN DOCUMENTS TYPES  -->
    <xsd:complexType name="IBANCheckTransactionRequestType">
        <xsd:all>
            <xsd:element name="IBAN" type="IBANTokenLength128SimpleType"/>
            <xsd:element name="AssumedName" type="NonEmptyRestrictedTokenLength80SimpleType"/>

			<xsd:element name="DebtorReference" type="DebtorReferenceSimpleType" minOccurs="0"/>

        </xsd:all>
        <xsd:attributeGroup ref="RequestAttributes"/>
    </xsd:complexType>
    
    <xsd:complexType name="IBANCheckBatchResponseType">
        <xsd:sequence>
            <xsd:element name="TransactionRequestBatchID" type="BatchIdentifierSimpleType"/>
            <xsd:element name="Status" type="StatusCodeSimpleType"/>
            <xsd:element name="StatusMessage" type="TokenLength256SimpleType" minOccurs="0"/>
            <xsd:element name="ErrorCount" type="MessageCountSimpleType" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    
    
    <xsd:complexType name="IBANCheckTransactionResponseType">
       <xsd:all>
            <xsd:element name="IBAN" type="IBANTokenLength128SimpleType"/>
            <xsd:element name="AssumedName" type="NonEmptyRestrictedTokenLength80SimpleType"/>
			<xsd:element name="DebtorReference" type="DebtorReferenceSimpleType" minOccurs="0"/>
			
			<xsd:element name="IBANCheckResult" type="IBANCheckResultComplexType"/>
			<xsd:element name="AccountDetails" type="AccountDetailsComplexType" minOccurs="0"/>
         </xsd:all>
        <xsd:attributeGroup ref="RequestAttributes"/>
    </xsd:complexType>
    
    <xsd:complexType name="IBANCheckErrorResponseType">
        <xsd:sequence>
            <xsd:element name="Error" type="ErrorComplexType" maxOccurs="1"/>
        </xsd:sequence>
    </xsd:complexType>

    
    
    
         
    <!--                      OTHER COMPLEX TYPES                            -->    
    <xsd:complexType name="ErrorComplexType">
        <xsd:sequence>
            <xsd:element name="ErrorCode" type="ErrorCodeSimpleType"/>
            <xsd:element name="ErrorMessage" type="TokenLength128SimpleType"/>
            <xsd:element name="ErrorDetail" type="TokenLength256SimpleType" minOccurs="0"/>
            <xsd:element name="Object" type="TokenLength256SimpleType" minOccurs="0"/>
        </xsd:sequence>
    </xsd:complexType>
    
    
    <!-- IBANCheckResult -->
    <xsd:complexType name="IBANCheckResultComplexType">
        <xsd:all>
            <xsd:element name="IBANResult" type="IBANResultSimpleType"/>
            <xsd:element name="NameResult" type="NameResultSimpleType" minOccurs="0"/>
            <xsd:element name="SuggestedName" type="TokenLength256SimpleType" minOccurs="0"/>
            <xsd:element name="AccountStatus" type="AccountStatusSimpleType" minOccurs="0"/>
        </xsd:all>
    </xsd:complexType>
    

	<!-- AccountDetails -->    
    <xsd:complexType name="AccountDetailsComplexType">
        <xsd:all>
            <xsd:element name="AccountType" type="AccountTypeSimpleType" minOccurs="0"/>
            <xsd:element name="IsJointAccount" type="xsd:boolean" minOccurs="0"/>
            <xsd:element name="NumberOfAccountHolders" type="xsd:nonNegativeInteger" minOccurs="0"/>
            <xsd:element name="CountryName" type="TokenLength64SimpleType" minOccurs="0"/>
            <xsd:element name="Municipality" type="TokenLength128SimpleType" minOccurs="0"/>
        </xsd:all>
    </xsd:complexType>
     
    <!--                        ATTRIBUTE GROUPS                             -->
    <xsd:attributeGroup name="HeaderAttributes">
        <xsd:attribute name="mode" type="ModeSimpleType" use="required"/>
        <xsd:attribute name="batchID" type="BatchIdentifierSimpleType"/>
        <xsd:attribute name="senderID" type="IdentifierSimpleType" use="required"/>
        <xsd:attribute name="version" type="VersionSimpleType" default="1.0"/>
        <xsd:attribute name="createDateTime" type="DateTimeSimpleType" use="required"/>
        <xsd:attribute name="messageCount" type="MessageCountSimpleType" use="required"/>
        <xsd:attribute name="type" use="required">
            <xsd:simpleType>
                <xsd:restriction base="xsd:token">
                    <xsd:enumeration value="TransactionRequest"/>
                    <xsd:enumeration value="TransactionResponse"/>
                    <xsd:enumeration value="ErrorResponse"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:attribute>
    </xsd:attributeGroup>
    
    <xsd:attributeGroup name="RequestAttributes">
    	<xsd:attribute name="entranceCode" type="EntranceCodeSimpleType"/>
    </xsd:attributeGroup>
    <!--                            ATTRIBUTES                               -->
    
    <!--                              GROUPS                                 -->
    
    <!--                             ELEMENTS                                -->
    <xsd:element name="IBANCheckInterface" type="IBANCheckInterfaceType"/>
    
</xsd:schema>