<?xml version="1.0" encoding="UTF-8"?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://gateway.ixopay.com/Schema/V2/Transaction" targetNamespace="http://gateway.ixopay.com/Schema/V2/Transaction">
    <!-- ROOT ELEMENT -->
    <xs:element name="transaction" type="transactionType">

    </xs:element>

    <!-- ROOT TYPE -->
    <xs:complexType name="transactionType">
        <xs:sequence>
            <xs:element type="xs:string" name="username" minOccurs="1" maxOccurs="1" />
            <xs:element type="xs:string" name="password" minOccurs="1" maxOccurs="1" />
            <xs:element type="languageType" name="language" minOccurs="0" maxOccurs="1" />
            <!-- testMode is deprecated! -->
            <xs:element type="xs:boolean" name="testMode" minOccurs="0" maxOccurs="1" />
            <xs:choice minOccurs="1" maxOccurs="1">
                <xs:element type="debitType" name="debit"/>
                <xs:element type="debitType" name="completeDebit"/>
                <xs:element type="captureType" name="capture"/>
                <xs:element type="deregisterType" name="deregister"/>
                <xs:element type="preauthorizeType" name="preauthorize"/>
                <xs:element type="preauthorizeType" name="completePreauthorize"/>
                <xs:element type="refundType" name="refund"/>
                <xs:element type="registerType" name="register"/>
                <xs:element type="registerType" name="completeRegister"/>
                <xs:element type="voidType" name="void"/>
                <xs:element type="payoutType" name="payout" />
            </xs:choice>
            
        </xs:sequence>
    </xs:complexType>

    <!-- CUSTOM TYPES -->
    <xs:complexType name="extraDataType">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute type="xs:string" name="key" use="required"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>

    <xs:simpleType name="languageType">
        <xs:restriction base="xs:string">
            <xs:length value="2" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="currencyType">
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z][A-Z][A-Z]" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="countryType">
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z][A-Z]" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="amountType">
        <xs:restriction base="xs:decimal">
            <xs:fractionDigits value="3" fixed="true" />
            <xs:maxInclusive value="9999999999.99" fixed="true" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="mandatatoryIdType">
        <xs:restriction base="xs:string">
            <xs:minLength value="1" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="genderType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="M" />
            <xs:enumeration value="F" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="transactionIndicatorType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="SINGLE" /> <!-- single transaction, no recurring, default value if not with register -->
            <xs:enumeration value="INITIAL" /> <!-- initial transaction of a recurring series, default value if with register -->
            <xs:enumeration value="RECURRING" /> <!-- recurring transaction after a inital one -->
            <xs:enumeration value="FIRST-CARDONFILE" /> <!-- card is taken on file with this transaction-->
            <xs:enumeration value="CARDONFILE" /> <!-- card on file transaction -->
            <xs:enumeration value="CARDONFILE-MERCHANT-INITIATED" /> <!-- card on file transaction initiated by merchant -->
            <xs:enumeration value="MOTO" /> <!-- moto transaction-->
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="merchantMetaDataType">
        <xs:restriction base="xs:string">
            <xs:maxLength value="255" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="periodUnitType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="DAY" />
            <xs:enumeration value="WEEK" />
            <xs:enumeration value="MONTH" />
            <xs:enumeration value="YEAR" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="scheduleDateTime">
        <xs:restriction base="xs:string">
            <xs:pattern value="\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [A-Z]{1,5}" /> <!-- YYYY-MM-DD HH:mm:ss T, eg. "2019-12-30 23:59:59 UTC" -->
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="scheduleType">
        <xs:sequence>
            <xs:element type="amountType" name="amount" minOccurs="1" maxOccurs="1"/>
            <xs:element type="currencyType" name="currency" minOccurs="1" maxOccurs="1"/>
            <xs:element type="xs:unsignedInt" name="periodLength" minOccurs="1" maxOccurs="1" />
            <xs:element type="periodUnitType" name="periodUnit" minOccurs="1" maxOccurs="1" />
            <xs:element type="scheduleDateTime" name="startDateTime" minOccurs="0" maxOccurs="1" /> <!-- date for first scheduled payment -->
            <xs:element type="merchantMetaDataType" name="merchantMetaData" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="addToCustomerProfileType">
        <xs:sequence>
            <xs:choice>
                <xs:element type="xs:string" name="profileGuid" minOccurs="1" maxOccurs="1" />
                <xs:element type="xs:string" name="customerIdentification" minOccurs="1" maxOccurs="1" />
            </xs:choice>
            <xs:element type="xs:boolean" name="markAsPreferred" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="customerType">
        <xs:sequence>
            <xs:element type="xs:string" name="identification" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="firstName" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="lastName" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:date" name="birthDate" minOccurs="0" maxOccurs="1" />
            <xs:element type="genderType" name="gender" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="billingAddress1" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="billingAddress2" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="billingCity" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="billingPostcode" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="billingState" minOccurs="0" maxOccurs="1" />
            <xs:element type="countryType" name="billingCountry" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="billingPhone" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingFirstName" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingLastName" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingCompany" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingAddress1" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingAddress2" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingCity" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingPostcode" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingState" minOccurs="0" maxOccurs="1" />
            <xs:element type="countryType" name="shippingCountry" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="shippingPhone" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="company" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="email" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:boolean" name="emailVerified" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="ipAddress" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="nationalId" minOccurs="0" maxOccurs="1" />
            <xs:element type="extraDataType" name="extraData" maxOccurs="unbounded" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="creditCardCustomerType">
        <xs:complexContent>
            <xs:extension base="customerType">
                <xs:sequence>
                    <xs:element type="xs:string" name="number" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="expiryMonth" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="expiryYear" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="startMonth" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="startYear" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="cvv" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="issueNumber" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="type" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="ibanCustomerType">
        <xs:complexContent>
            <xs:extension base="customerType">
                <xs:sequence>
                    <xs:element type="xs:string" name="iban" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="bic" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="mandateId" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:date" name="mandateDate" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- TRANSACTION TYPES -->
    <xs:complexType name="baseTransactionType">
        <xs:sequence>
            <xs:element type="xs:string" name="transactionToken" minOccurs="0" maxOccurs="1" />
            <xs:element type="mandatatoryIdType" name="transactionId" minOccurs="1" maxOccurs="1" />
            <xs:element type="xs:string" name="additionalId1" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="additionalId2" minOccurs="0" maxOccurs="1" />
            <xs:choice>
                <xs:element type="customerType" name="customer" minOccurs="0" maxOccurs="1" />
                <xs:element type="creditCardCustomerType" name="creditCardCustomer" minOccurs="0" maxOccurs="1" />
                <xs:element type="ibanCustomerType" name="ibanCustomer" minOccurs="0" maxOccurs="1" />
            </xs:choice>
            <xs:element type="extraDataType" name="extraData" minOccurs="0" maxOccurs="unbounded" />
            <xs:element type="merchantMetaDataType" name="merchantMetaData" minOccurs="0" maxOccurs="1" />
            <xs:element type="requestType" name="request" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="baseTransactionWithReferenceType">
        <xs:complexContent>
            <xs:extension base="baseTransactionType">
                <xs:sequence>
                    <xs:element type="xs:string" name="referenceTransactionId" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="referenceCustomerId" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="referenceId2" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="referenceId3" minOccurs="0" maxOccurs="1" />
                    <xs:element type="xs:string" name="referenceId4" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:group name="amountableGroup">
        <xs:sequence>
            <xs:element type="amountType" name="amount" minOccurs="0" maxOccurs="1"/>
            <xs:element type="currencyType" name="currency" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
    </xs:group>
    <xs:group name="offsiteGroup">
        <xs:sequence>
            <xs:element type="xs:string" name="description" minOccurs="0" maxOccurs="1"/>
            <xs:element type="xs:anyURI" name="successUrl" minOccurs="0" maxOccurs="1"/>
            <xs:element type="xs:anyURI" name="cancelUrl" minOccurs="0" maxOccurs="1"/>
            <xs:element type="xs:anyURI" name="errorUrl" minOccurs="0" maxOccurs="1"/>
            <xs:element type="xs:anyURI" name="callbackUrl" minOccurs="0" maxOccurs="1"/>
        </xs:sequence>
    </xs:group>

    <xs:complexType name="itemType">
        <xs:sequence>
            <xs:element type="xs:string" name="identification" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="name" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:string" name="description" minOccurs="0" maxOccurs="1" />
            <xs:element type="xs:decimal" name="quantity" minOccurs="0" maxOccurs="1" />
            <xs:element type="amountType" name="price" minOccurs="0" maxOccurs="1" />
            <xs:element type="currencyType" name="currency" minOccurs="0" maxOccurs="1" />
            <xs:element type="extraDataType" name="extraData" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="itemsType">
        <xs:sequence>
            <xs:element type="itemType" name="item" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>
    <xs:group name="itemsGroup">
        <xs:sequence>
            <xs:element type="itemsType" name="items" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:group>
    <!--
    <xs:simpleType name="updateType">
        <xs:restriction base="xs:string">
            <xs:enumeration value="UPDATE" />
            <xs:enumeration value="CANCEL" />
        </xs:restriction>
    </xs:simpleType>
    -->

    <xs:complexType name="debitType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType">
                <xs:sequence>
                    <xs:group ref="amountableGroup" />
                    <xs:group ref="offsiteGroup" />
                    <xs:group ref="itemsGroup" />
                    <xs:element type="xs:boolean" name="withRegister" minOccurs="0" maxOccurs="1" />
                    <xs:element type="transactionIndicatorType" name="transactionIndicator" minOccurs="0" maxOccurs="1" />
                    <xs:element type="scheduleType" name="startSchedule" minOccurs="0" maxOccurs="1" />
                    <xs:element type="addToCustomerProfileType" name="addToCustomerProfile" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
                <!-- <xs:attribute type="updateType" name="update" use="optional" /> -->
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="preauthorizeType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType">
                <xs:sequence>
                    <xs:group ref="amountableGroup" />
                    <xs:group ref="offsiteGroup" />
                    <xs:group ref="itemsGroup" />
                    <xs:element type="xs:boolean" name="withRegister" minOccurs="0" maxOccurs="1" />
                    <xs:element type="transactionIndicatorType" name="transactionIndicator" minOccurs="0" maxOccurs="1" />
                    <xs:element type="scheduleType" name="startSchedule" minOccurs="0" maxOccurs="1" />
                    <xs:element type="addToCustomerProfileType" name="addToCustomerProfile" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
                <!-- <xs:attribute type="updateType" name="update" use="optional" /> -->
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="registerType">
        <xs:complexContent>
            <xs:extension base="baseTransactionType">
                <xs:sequence>
                    <xs:group ref="offsiteGroup" />
                    <xs:element type="transactionIndicatorType" name="transactionIndicator" minOccurs="0" maxOccurs="1" />
                    <xs:element type="scheduleType" name="startSchedule" minOccurs="0" maxOccurs="1" />
                    <xs:element type="addToCustomerProfileType" name="addToCustomerProfile" minOccurs="0" maxOccurs="1" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="captureType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType">
                <xs:sequence>
                    <xs:group ref="amountableGroup" />
                    <xs:group ref="itemsGroup" />
                </xs:sequence>
                <!-- <xs:attribute type="updateType" name="update" use="optional" /> -->
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="voidType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType">
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="refundType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType">
                <xs:sequence>
                    <xs:group ref="amountableGroup" />
                    <xs:element type="xs:string" name="description" minOccurs="0" maxOccurs="1"/>
                    <xs:element type="xs:anyURI" name="callbackUrl" minOccurs="0" maxOccurs="1"/>
                    <xs:group ref="itemsGroup" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    <xs:complexType name="deregisterType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType" />
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="payoutType">
        <xs:complexContent>
            <xs:extension base="baseTransactionWithReferenceType">
                <xs:sequence>
                    <xs:group ref="amountableGroup" />
                    <xs:group ref="offsiteGroup" />
                    <xs:group ref="itemsGroup" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <!-- REQUEST TYPE -->
    <xs:complexType name="requestType">
        <xs:sequence>
            <xs:element type="extraDataType" name="getParam" minOccurs="0" maxOccurs="unbounded" />
            <xs:element type="extraDataType" name="postParam" minOccurs="0" maxOccurs="unbounded" />
            <xs:element type="extraDataType" name="requestHeader" minOccurs="0" maxOccurs="unbounded" />
            <xs:element type="xs:string" name="requestBody" minOccurs="0" maxOccurs="1" />
        </xs:sequence>
    </xs:complexType>

    

</xs:schema>
