﻿<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified"
  attributeFormDefault="qualified"
  xmlns:sch ="http://www.ascc.net/xml/schematron">
  <xs:annotation>
    <xs:appinfo>
      <sch:title>ADR Validation - Message</sch:title>
    </xs:appinfo>
  </xs:annotation>
  <xs:element name="ImportCollection" type="ImportCollectionType"/>
  <xs:complexType name="ImportCollectionType">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="50" name="MessageItem" type="MessageItemType">
        <xs:annotation>
          <xs:appinfo>
            <sch:pattern id="001" Name="ProcessObjectRequired">
              <sch:rule context="MessageItem">
                <sch:report test="count(MFR) = 0 and count(POC) = 0 and count(Foreclosure) = 0 and count(Object) = 0 and count(ObjectSubscriberID) = 0">
                  Process object (MFR, POC, Foreclosure or Object ObjectSubscriberID) must be provided
                </sch:report>
              </sch:rule>
            </sch:pattern>
            <sch:pattern id="002" Name="ProcessObjectMFR">
              <sch:rule context="MessageItem">
                <sch:report test="count(MFR) = 1 and (count(POC) = 1 or count(Foreclosure) = 1 or (count(Object) = 1 and count(ObjectSubscriberID) = 1))">
                  Only one process object can be provided
                </sch:report>
              </sch:rule>
            </sch:pattern>
            <sch:pattern id="003" Name="ProcessObjectPOC">
              <sch:rule context="MessageItem">
                <sch:report test="count(POC) = 1 and (count(MFR) = 1 or count(Foreclosure) = 1 or (count(Object) = 1 and count(ObjectSubscriberID) = 1))">
                  Only one process object can be provided
                </sch:report>
              </sch:rule>
            </sch:pattern>
            <sch:pattern id="004" Name="ProcessObjectForeclosure">
              <sch:rule context="MessageItem">
                <sch:report test="count(Foreclosure) = 1 and (count(MFR) = 1 or count(POC) = 1 or (count(Object) = 1 and count(ObjectSubscriberID) = 1))">
                  Only one process object can be provided
                </sch:report>
              </sch:rule>
            </sch:pattern>

            <sch:pattern id="005" Name="ObjectSubscriberIDValidation">
              <sch:rule context="MessageItem">
                <sch:report test="(count(Object) = 1 and count(ObjectSubscriberID) = 0) or (count(Object) = 0 and count(ObjectSubscriberID) = 1)">
                  Both Object and ObjectSubscriberID must be provided when attempting parent lookup
                </sch:report>
              </sch:rule>
            </sch:pattern>
          </xs:appinfo>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="Reference" type="qbo.Reference"/>
  </xs:complexType>
  <xs:complexType name="MessageItemType">
    <xs:all>
      <xs:element name="MFR" type="qboNvarchar50" minOccurs="0" maxOccurs="1"/>
      <xs:element name="POC" type="qboNvarchar50" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Foreclosure" type="qboNvarchar50" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Object" type="qbo.ProcessObject" minOccurs="0" maxOccurs="1"/>
      <xs:element name="ObjectSubscriberID" type="qbo.SubscriberID" minOccurs="0" maxOccurs="1"/>
      <xs:element name="Message" type="qboNvarchar50" minOccurs="1" maxOccurs="1"/>
      <xs:element name="Template" type="qbo.MessageTemplate" minOccurs="1" maxOccurs="1"/>
      <xs:element name="BodyText" type="qboText" minOccurs="1" maxOccurs="1"/>

    </xs:all>
    <xs:attribute name="Reference" type="qbo.Reference"/>
  </xs:complexType>

  <!--Custom Types-->
  <xs:simpleType name="qbo.ProcessObject">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Bankruptcy" />
      <xs:enumeration value="Foreclosure" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="qbo.MessageTemplate">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Attorney Message">
        <xs:annotation>
          <xs:documentation>Applies to Foreclosure, Bankruptcy</xs:documentation>
        </xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>

  <!--Simple Types-->
  <xs:simpleType name="qboNvarchar50">
    <xs:annotation>
      <xs:documentation>string with a maximum length of 50</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="50" />
      <xs:whiteSpace value="collapse" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="qboDateOptionalTime">
    <xs:annotation>
      <xs:documentation>
        Accepts date or dateTime value. Acceptable formats are:
        YYYY-MM-DD
        YYYY-MM-DDTHH:MM:SS
        YYYY-MM-DDTHH:MM:SS+HH:MM
        YYYY-MM-DDTHH:MM:SS-HH:MM
        YYYY-MM-DDTHH:MM:SSZ
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:whiteSpace value="collapse" />
      <xs:pattern value="[\d]{4}-[\d]{2}-[\d]{2}" />
      <xs:pattern value="[\d]{4}-[\d]{2}-[\d]{2}T{1}[\d]{2}:[\d]{2}" />
      <xs:pattern value="[\d]{4}-[\d]{2}-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}Z" />
      <xs:pattern value="[\d]{4}-[\d]{2}-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}" />
      <xs:pattern value="[\d]{4}-[\d]{2}-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}\+[\d]{2}:[\d]{2}" />
      <xs:pattern value="[\d]{4}-[\d]{2}-[\d]{2}T[\d]{2}:[\d]{2}:[\d]{2}\-[\d]{2}:[\d]{2}" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="qbo.SubscriberID">
    <xs:restriction base="xs:string">
      <xs:maxLength value="255" />
      <xs:whiteSpace value="collapse" />
      <xs:pattern value=".+-{1}.+-{1}.+" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="qboText">
    <xs:annotation>
      <xs:documentation>qbo Text Field</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="qbo.Reference">
    <xs:annotation>
      <xs:documentation>Used as refernce to foreign entity. Length 1 - 50</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:minLength value="1" />
      <xs:maxLength value="50" />
      <xs:whiteSpace value="collapse" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

