<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://plapi.enhance.com/service/account"
            xmlns="http://plapi.enhance.com/service/account"
            xmlns:auth="http://plapi.enhance.com/credentials"
            xmlns:tns="http://plapi.enhance.com/service/account">

    <xsd:annotation>
        <xsd:documentation xml:lang="en">
         Account schema for PLM-J
         &#169; 2006 Enhance Interactive
        </xsd:documentation>
    </xsd:annotation>

    <xsd:import namespace="http://plapi.enhance.com/credentials"
                schemaLocation="credentials.xsd"/>

    <xsd:simpleType name="status-type">
      <xsd:restriction base="xsd:string">
        <xsd:enumeration value="active"/>
        <xsd:enumeration value="inactive"/>
      </xsd:restriction>
    </xsd:simpleType>

    <xsd:element name="accounts">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="account" type="tns:account" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:complexType name="account">
      <xsd:sequence/>
      <xsd:attribute name="id" use="optional" type="xsd:int"/>
      <xsd:attribute name="name" use="optional" type="xsd:string"/>
      <xsd:attribute name="auto-renew" use="optional" type="xsd:decimal"/>
      <xsd:attribute name="daily-cap" use="optional" type="xsd:decimal"/>
      <xsd:attribute name="balance" use="optional" type="xsd:decimal"/>
      <xsd:attribute name="credit-card-id" use="optional" type="xsd:int"/>
      <xsd:attribute name="status" use="optional" type="tns:status-type"/>
    </xsd:complexType>

    <xsd:complexType name="deposit">
      <xsd:sequence/>
      <xsd:attribute name="account-id" use="required" type="xsd:int"/>
      <xsd:attribute name="credit-card-id" use="optional" type="xsd:int"/>
      <xsd:attribute name="currency" use="required" type="xsd:string"/>
      <xsd:attribute name="amount" use="required" type="xsd:decimal"/>
    </xsd:complexType>

    <xsd:element name="receipt" type="tns:receipt"/>
    <xsd:complexType name="receipt">
      <xsd:sequence/>
      <xsd:attribute name="account-id" use="required" type="xsd:int"/>
      <xsd:attribute name="credit-card-number" use="required" type="xsd:string"/>
      <xsd:attribute name="balance" use="required" type="xsd:decimal"/>
    </xsd:complexType>

    <xsd:complexType name="street">
      <xsd:sequence/>
      <xsd:attribute name="number" use="required" type="xsd:string"/>
      <xsd:attribute name="unit" use="optional" type="xsd:string"/>
      <xsd:attribute name="postal-code" use="optional" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="region">
      <xsd:sequence/>
      <xsd:attribute name="city" use="required" type="xsd:string"/>
      <xsd:attribute name="state" use="optional" type="xsd:string"/>
      <xsd:attribute name="province" use="optional" type="xsd:string"/>
      <xsd:attribute name="country" use="required" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="address">
      <xsd:sequence>
        <xsd:element name="street" type="tns:street"/>
        <xsd:element name="region" type="tns:region"/>
      </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="credit-card">
      <xsd:sequence>
        <xsd:element name="address" use="required" type="tns:address"/>
      </xsd:sequence>

      <xsd:attribute name="id" use="optional" type="xsd:int"/>
      <xsd:attribute name="account-id" use="required" type="xsd:int"/>
      <xsd:attribute name="type" use="required" type="xsd:string"/>
      <xsd:attribute name="cvv" use="required" type="xsd:int"/>
      <xsd:attribute name="number" use="required" type="xsd:string"/>
      <xsd:attribute name="name" use="required" type="xsd:string"/>
      <xsd:attribute name="expiration" use="required" type="xsd:string"/>
    </xsd:complexType>

    <xsd:complexType name="user">
      <xsd:sequence/>
      <xsd:attribute name="id" use="optional" type="xsd:int"/>
      <xsd:attribute name="email" use="optional" type="xsd:string"/>
      <xsd:attribute name="password" use="optional" type="xsd:string"/>
      <xsd:attribute name="name" use="optional" type="xsd:string"/>
    </xsd:complexType>

    <!-- operational wrapper documents -->
    <xsd:element name="createAccountRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="createAccountResponse">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="updateAccountRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="updateAccountResponse">
      <xsd:complexType>
        <xsd:sequence/>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="fetchAccountRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="fetchAccountResponse">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="cancelAccountRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="cancelAccountResponse">
        <xsd:complexType>
            <xsd:sequence/>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="listAccountsRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="listAccountsResponse">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="account" type="tns:account" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="createUserRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="user" type="tns:user"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="createUserResponse">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="user" type="tns:user"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="updateUserRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="user" type="tns:user"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="updateUserResponse">
      <xsd:complexType>
        <xsd:sequence/>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="grantAccessRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="user" type="tns:user"/>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="grantAccessResponse">
      <xsd:complexType>
        <xsd:sequence/>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="revokeAccessRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="user" type="tns:user"/>
          <xsd:element name="account" type="tns:account"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="revokeAccessResponse">
      <xsd:complexType>
        <xsd:sequence/>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="addFundsRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="deposit" type="tns:deposit"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="addFundsResponse">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="receipt" type="tns:receipt"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="addCreditCardRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="credit-card" type="tns:credit-card"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="addCreditCardResponse">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credit-card" type="tns:credit-card"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="updateCreditCardRequest">
      <xsd:complexType>
        <xsd:sequence>
          <xsd:element name="credentials" type="auth:credentials"/>
          <xsd:element name="credit-card" type="auth:credentials"/>
        </xsd:sequence>
      </xsd:complexType>
    </xsd:element>

    <xsd:element name="updateCreditCardResponse">
      <xsd:complexType>
        <xsd:sequence/>
      </xsd:complexType>
    </xsd:element>
</xsd:schema>
