<?xml version="1.0" encoding="utf-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
  xmlns:fee="urn:ietf:params:xml:ns:epp:fee-1.0"
  xmlns:eppcom="urn:ietf:params:xml:ns:eppcom-1.0"
  xmlns:domain="urn:ietf:params:xml:ns:domain-1.0"
  targetNamespace="urn:ietf:params:xml:ns:epp:fee-1.0"
  elementFormDefault="qualified">

  <import namespace="urn:ietf:params:xml:ns:eppcom-1.0" />
  <import namespace="urn:ietf:params:xml:ns:domain-1.0" />

  <annotation>
    <documentation>
      Extensible Provisioning Protocol v1.0 Fee Extension
    </documentation>
  </annotation>

  <!-- Child elements found in EPP commands and responses -->
  <element name="check" type="fee:checkType" />
  <element name="chkData" type="fee:chkDataType" />
  <element name="create" type="fee:transformCommandType" />
  <element name="creData" type="fee:transformResultType" />
  <element name="renew" type="fee:transformCommandType" />
  <element name="renData" type="fee:transformResultType" />
  <element name="transfer" type="fee:transformCommandType" />
  <element name="trnData" type="fee:transformResultType" />
  <element name="update" type="fee:transformCommandType" />
  <element name="updData" type="fee:transformResultType" />
  <element name="delData" type="fee:transformResultType" />

  <!-- client <check> command -->
  <complexType name="checkType">
    <sequence>
      <element name="currency" type="fee:currencyType"
        minOccurs="0" />
      <element name="command" type="fee:commandType"
        minOccurs="1" maxOccurs="unbounded" />
    </sequence>
  </complexType>

  <complexType name="objectIdentifierType">
    <simpleContent>
      <extension base="eppcom:labelType">
        <attribute name="element"
        type="NMTOKEN" default="name" />
      </extension>
    </simpleContent>
  </complexType>

  <!-- server <check> result -->
  <complexType name="chkDataType">
    <sequence>
      <element name="currency" type="fee:currencyType" />
      <element name="cd" type="fee:objectCDType"
        maxOccurs="unbounded" />
    </sequence>
  </complexType>   

  <complexType name="objectCDType">
    <sequence>
      <element name="objID" type="fee:objectIdentifierType" />
      <element name="class" type="token" minOccurs="0" />
      <element name="command" type="fee:commandDataType"
        minOccurs="0" maxOccurs="unbounded" />
      <element name="reason" type="fee:reasonType" minOccurs="0" />
    </sequence>
    <attribute name="avail" type="boolean" default="1" />
  </complexType>

  <!-- general transform (create, renew, update, transfer) command -->
  <complexType name="transformCommandType">
    <sequence>
      <element name="currency" type="fee:currencyType"
        minOccurs="0" />
      <element name="fee" type="fee:feeType"
        maxOccurs="unbounded" />
      <element name="credit" type="fee:creditType"
        minOccurs="0" maxOccurs="unbounded" />
    </sequence>
  </complexType>

  <!-- general transform (create, renew, update) result -->
  <complexType name="transformResultType">
    <sequence>
      <element name="currency" type="fee:currencyType"
        minOccurs="0" />
      <element name="period" type="domain:periodType"
        minOccurs="0" />
      <element name="fee" type="fee:feeType"
        minOccurs="0" maxOccurs="unbounded" />
      <element name="credit" type="fee:creditType"
        minOccurs="0" maxOccurs="unbounded" />
      <element name="balance" type="fee:balanceType"
        minOccurs="0" />
      <element name="creditLimit" type="fee:creditLimitType"
        minOccurs="0" />
    </sequence>
  </complexType>

  <!-- common types -->
  <simpleType name="currencyType">
    <restriction base="string">
      <pattern value="[A-Z]{3}" />
    </restriction>
  </simpleType>
  
  <complexType name="commandType">
    <sequence>
      <element name="period" type="domain:periodType"
        minOccurs="0" maxOccurs="1" />
    </sequence>
    <attribute name="name" type="fee:commandEnum" use="required"/>
    <attribute name="customName" type="token"/>
    <attribute name="phase" type="token" />
    <attribute name="subphase" type="token" />
  </complexType>

  <complexType name="commandDataType">
    <complexContent>
      <extension base="fee:commandType">
        <sequence>
          <element name="fee" type="fee:feeType"
            minOccurs="0" maxOccurs="unbounded" />
          <element name="credit" type="fee:creditType"
            minOccurs="0" maxOccurs="unbounded" />
          <element name="reason" type="fee:reasonType"
            minOccurs="0" />
        </sequence>
        <attribute name="standard" type="boolean" default="0" />
      </extension>
    </complexContent>
  </complexType>

  <complexType name="reasonType">
    <simpleContent>
      <extension base="token">
        <attribute name="lang" type="language" default="en"/>
      </extension>
    </simpleContent>
  </complexType>

  <simpleType name="commandEnum">
    <restriction base="token">
      <enumeration value="create"/>
      <enumeration value="delete"/>
      <enumeration value="renew"/>
      <enumeration value="update"/>
      <enumeration value="transfer"/>
      <enumeration value="restore"/>
      <enumeration value="custom"/>
    </restriction>
  </simpleType>
  
  <simpleType name="nonNegativeDecimal">
    <restriction base="decimal">
      <minInclusive value="0" />
    </restriction>
  </simpleType>

  <simpleType name="negativeDecimal">
    <restriction base="decimal">
      <maxInclusive value="0" />
    </restriction>
  </simpleType>

  <complexType name="feeType">
    <simpleContent>
      <extension base="fee:nonNegativeDecimal">
        <attribute name="description"/>
        <attribute name="lang" type="language" default="en"/>
        <attribute name="refundable" type="boolean" />
        <attribute name="grace-period" type="duration" />
        <attribute name="applied">
          <simpleType>
            <restriction base="token">
              <enumeration value="immediate" />
              <enumeration value="delayed" />
            </restriction>
          </simpleType>
        </attribute>
      </extension>
    </simpleContent>
  </complexType>

  <complexType name="creditType">
    <simpleContent>
      <extension base="fee:negativeDecimal">
        <attribute name="description"/>
        <attribute name="lang" type="language" default="en"/>
      </extension>
    </simpleContent>
  </complexType>

  <simpleType name="balanceType">
    <restriction base="decimal" />
  </simpleType>

  <simpleType name="creditLimitType">
    <restriction base="decimal" />
  </simpleType>

</schema>