<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:apx="http://service.apx.com/ScheduleData" targetNamespace="http://service.apx.com/ScheduleData" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<!-- Non-empty string -->
	<xs:simpleType name="NonEmptyString">
		<xs:restriction base="xs:string">
			<xs:minLength value="1"/>
			<xs:whiteSpace value="replace"/>
			<xs:pattern value=".*[^\s].*"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="NonNegativeDecimal">
		<xs:restriction base="xs:decimal">
			<xs:minInclusive value="0.00"/>
			<xs:totalDigits value="10"/>
			<xs:fractionDigits value="3"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Pricedecimal">
		<xs:restriction base="xs:decimal">
			<xs:totalDigits value="10"/>
			<xs:fractionDigits value="4"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="MWdecimal">
		<xs:restriction base="xs:decimal">
			<xs:totalDigits value="10"/>
			<xs:fractionDigits value="3"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- ControlArea-->
	<xs:simpleType name="Region">
		<xs:restriction base="xs:string">
			<xs:enumeration value="ISONE"/>
			<xs:enumeration value="MISO"/>
			<xs:enumeration value="NYISO"/>
			<xs:enumeration value="PJM"/>
			<xs:enumeration value="SPP"/>
		</xs:restriction>
	</xs:simpleType>

  <!-- ParameterType-->
	<xs:complexType name="ParameterType">
		<xs:attribute name="IntervalEndGmt" type="xs:dateTime" use="optional">
      <xs:annotation>
        <xs:documentation source="ISO local interval ending time converted to GMT"/>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="Value" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="Status" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="Message" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<!--Parameter Tables-->
	<xs:complexType name="TableValueType">
		<xs:choice>
			<xs:element name="TwoColumns">
        <xs:annotation>
          <xs:documentation>Used in some ISOs for Bid Curves or Ramp Rate Curves</xs:documentation>
        </xs:annotation>
        <xs:complexType>
					<xs:sequence>
						<xs:element name="Row" maxOccurs="unbounded">
							<xs:complexType>
								<xs:attribute name="Id" type="xs:byte" use="required"/>
								<xs:attribute name="X" type="xs:decimal" use="required"/>
								<xs:attribute name="Y" type="xs:decimal" use="required"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:element name="ThreeColumns">
        <xs:annotation>
          <xs:documentation>Used in some ISOs for Ramp Rate Curves with three columns, e.g. SPP MW/rate/emergency rate</xs:documentation>
        </xs:annotation>
        <xs:complexType>
					<xs:sequence>
						<xs:element name="Row" maxOccurs="unbounded">
							<xs:complexType>
								<xs:attribute name="Id" type="xs:byte" use="required"/>
								<xs:attribute name="X" type="xs:decimal" use="required"/>
								<xs:attribute name="Y1" type="xs:decimal" use="required"/>
								<xs:attribute name="Y2" type="xs:decimal" use="required"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:element name="Factors">
        <xs:annotation>
          <xs:documentation>Used for distribution factors or other 2-column non-curve sets</xs:documentation>
        </xs:annotation>
        <xs:complexType>
					<xs:sequence>
						<xs:element name="Factor" maxOccurs="unbounded">
							<xs:complexType>
								<xs:attribute name="Id" type="xs:byte" use="required"/>
								<xs:attribute name="Name" type="xs:string" use="required"/>
								<xs:attribute name="X" type="xs:decimal" use="required"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:choice>
    <xs:attribute name="IntervalEndGmt" type="xs:dateTime" use="required">
      <xs:annotation>
        <xs:documentation source="ISO local interval ending time converted to GMT"/>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="Status" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<!-- Resource Parameters-->
	<xs:complexType name="ResourceParameters">
		<xs:choice maxOccurs="unbounded">
			<xs:element name="Value" type="apx:ParameterType"/>
			<xs:element name="TableValue" type="apx:TableValueType"/>
		</xs:choice>
    <xs:attribute name="MarketParticipant" type="apx:NonEmptyString" use="required"/>
    <xs:attribute name="Location" type="apx:NonEmptyString" use="required"/>
		<xs:attribute name="ParameterType" type="xs:string" use="required"/>
    <xs:attribute name="ReferenceCode" type="apx:NonEmptyString" use="optional"/>
    <xs:attribute name="IntervalLength" use="optional" default="PT1H">      
			<xs:simpleType>
				<xs:restriction base="xs:duration">
					<xs:enumeration value="P1D"/>
					<xs:enumeration value="PT1H"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
	</xs:complexType>
  
	<!--     ==========================
		    Bilateral Schedule Specific parts 
	           ==========================   -->
	<!-- BilateralScheduleDetail -->
	<xs:complexType name="BilateralScheduleDetail">
    <xs:attribute name="IntervalEndGmt" type="xs:dateTime" use="required">
      <xs:annotation>
        <xs:documentation source="ISO local interval ending time converted to GMT"/>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="MW" type="apx:NonNegativeDecimal" use="optional"/>
		<xs:attribute name="CounterPartyMW" type="apx:NonNegativeDecimal" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="Status" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="Message" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<!-- BilateralSchedule-->
	<xs:complexType name="BilateralSchedules">
    <xs:annotation>
      <xs:documentation>In most ISOs, ReferenceCode attribute alone will identify the contract to schedule--other attributes not needed.</xs:documentation>
    </xs:annotation>
    <xs:sequence minOccurs="0" maxOccurs="unbounded">
			<xs:element name="BilateralScheduleDetail" type="apx:BilateralScheduleDetail"/>
		</xs:sequence>
    <xs:attribute name="MarketParticipant" type="apx:NonEmptyString" use="required"/>
    <xs:attribute name="IntervalLength" use="optional" default="PT1H">
			<xs:simpleType>
				<xs:annotation>
					<xs:documentation>Represents how long each interval in ScheduleDetail is.</xs:documentation>
				</xs:annotation>
				<xs:restriction base="xs:duration">
					<xs:enumeration value="PT15M"/>
					<xs:enumeration value="PT1H"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="Transaction" type="xs:string" use="optional"/>
		<xs:attribute name="Location" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="SinkLocation" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="CounterParty" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="TradeName" type="apx:NonEmptyString" use="optional"/>
    <xs:attribute name="ReferenceCode" type="apx:NonEmptyString" use="optional">
    <xs:annotation>
      <xs:documentation>This is the ISO code for the bilateral contract--if used, other attributes not needed</xs:documentation>
    </xs:annotation>
    </xs:attribute>
    <xs:attribute name="DependOnTradeName" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="ExternalId" type="apx:NonEmptyString" use="optional"/>
	</xs:complexType>
  
	<!--   ==========================
			 BidOffer Specific parts 
	        ===========================     -->
	<!-- CurveType -->
	<xs:simpleType name="CurveType">
		<xs:restriction base="xs:NMTOKEN">
			<xs:enumeration value="Block"/>
			<xs:enumeration value="Slope"/>
			<xs:enumeration value="Fixed"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- BidCurve-->
	<xs:complexType name="BidCurve">
		<xs:attribute name="MW" type="apx:MWdecimal" use="optional"/>
		<xs:attribute name="Price" type="apx:Pricedecimal" use="optional"/>
	</xs:complexType>
	<!--  SelfScheduleType -->
	<xs:complexType name="SelfScheduleType">
    <xs:attribute name="IntervalEndGmt" type="xs:dateTime" use="required">
      <xs:annotation>
        <xs:documentation source="ISO local interval ending time converted to GMT"/>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="MW" type="apx:MWdecimal" use="optional"/>
		<xs:attribute name="Price" type="apx:Pricedecimal" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only (post-market price). Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="Status" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
		<xs:attribute name="Message" type="apx:NonEmptyString" use="optional">
			<xs:annotation>
				<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
			</xs:annotation>
		</xs:attribute>
	</xs:complexType>
	<!-- MarketScheduleType-->
	<xs:complexType name="MarketScheduleType">
		<xs:sequence minOccurs="0" maxOccurs="unbounded">
			<xs:element name="Curve">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="CurvePoint" type="apx:BidCurve" maxOccurs="16"/>
					</xs:sequence>
					<xs:attribute name="LinkedHours" type="apx:NonEmptyString" use="optional"/>
					<xs:attribute name="CurveType" type="apx:CurveType" use="optional"/>
          <xs:attribute name="IntervalEndGmt" type="xs:dateTime" use="required">
            <xs:annotation>
				      <xs:documentation source="ISO local interval ending time converted to GMT"/>
			      </xs:annotation>
          </xs:attribute>
          <xs:attribute name="CoOptimizedWithAS" type="xs:boolean" use="optional"/>
          <xs:attribute name="Reason" type="apx:NonEmptyString" use="optional"/>
          <xs:attribute name="Status" type="apx:NonEmptyString" use="optional">
						<xs:annotation>
							<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
						</xs:annotation>
					</xs:attribute>
					<xs:attribute name="Message" type="apx:NonEmptyString" use="optional">
						<xs:annotation>
							<xs:documentation>Used by Outbound methods only. Do not Submit</xs:documentation>
						</xs:annotation>
					</xs:attribute>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
	<!-- SubmitBid -->
	<xs:complexType name="BidsOffers">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element name="SelfSchedule">
				<xs:complexType>
					<xs:sequence minOccurs="0" maxOccurs="unbounded">
						<xs:element name="Schedule" type="apx:SelfScheduleType"/>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:element name="MarketSchedule">
				<xs:complexType>
					<xs:complexContent>
						<xs:extension base="apx:MarketScheduleType">
							<xs:attribute name="LinkedOfferID" type="apx:NonEmptyString" use="optional"/>
						</xs:extension>
					</xs:complexContent>
				</xs:complexType>
			</xs:element>
		</xs:choice>
    <xs:attribute name="MarketParticipant" type="apx:NonEmptyString" use="required"/>
    <xs:attribute name="IntervalLength" use="optional" default="PT1H">
			<xs:simpleType>
				<xs:restriction base="xs:duration">
					<xs:enumeration value="PT5M"/>
					<xs:enumeration value="PT15M"/>
					<xs:enumeration value="PT1H"/>
				</xs:restriction>
			</xs:simpleType>
		</xs:attribute>
		<xs:attribute name="Transaction" type="xs:string" use="required"/>
		<xs:attribute name="Location" type="apx:NonEmptyString" use="required"/>
    <xs:attribute name="SinkLocation" type="apx:NonEmptyString" use="optional">
      <xs:annotation>
        <xs:documentation>Only use for source/sink transactions</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="LinkId" type="apx:NonEmptyString" use="optional"/>
    <xs:attribute name="WheelId" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="ReferenceCode" type="apx:NonEmptyString" use="optional">
    <xs:annotation>
      <xs:documentation>Used to identify the Schedule ID in PJM and ISONE</xs:documentation>
    </xs:annotation>
    </xs:attribute>
    <xs:attribute name="SupportingResource" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="NERCTag" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="ExternalId" type="apx:NonEmptyString" use="optional"/>
		<xs:attribute name="ExpirationDateTime" type="xs:dateTime" use="optional"/>
    <xs:attribute name="MultiHourBlock" type="apx:NonEmptyString" use="optional"/>
    <xs:attribute name="OasisId" type="apx:NonEmptyString" use="optional"/>
  </xs:complexType>
  
	<!-- Common API parent element-->
	<xs:complexType name="Header">
    <xs:choice minOccurs="0" maxOccurs="1">
			<xs:element name="MarketBidData">
				<xs:complexType>
					<xs:choice minOccurs="0" maxOccurs="unbounded">
						<xs:element name="BidsOffers" type="apx:BidsOffers"/>
						<xs:element name="ResourceParameters" type="apx:ResourceParameters"/>
					</xs:choice>
          <xs:attribute name="Date" type="xs:date" use="required"/>
          <xs:attribute name="EndDate" type="xs:date" use="optional"/>
				</xs:complexType>
			</xs:element>
      <xs:element name="MarketTradeData">
        <xs:complexType>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="BilateralSchedules" type="apx:BilateralSchedules"/>
          </xs:choice>
          <xs:attribute name="Date" type="xs:date" use="required"/>
          <xs:attribute name="EndDate" type="xs:date" use="optional"/>
        </xs:complexType>
      </xs:element>
    </xs:choice>
		<xs:attribute name="Version" type="xs:decimal" use="optional" default="2.1"/>
		<xs:attribute name="SourceSystem" type="apx:NonEmptyString" use="required"/>
		<xs:attribute name="CreateDate" type="xs:dateTime" use="required"/>
    <xs:attribute name="Region" type="apx:Region" use="required"/>
  </xs:complexType>
  
	<!-- Entry Points:-->
	<!-- Submit should not include status elements -->
	<xs:element name="Submit">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="apx:Header">
					<xs:attribute name="SubmitToISO" type="xs:boolean" use="optional" default="false"/>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
	<!-- Result includes status elements -->
	<xs:element name="Response">
		<xs:complexType>
			<xs:complexContent>
				<xs:extension base="apx:Header">
					<xs:attribute name="FileStatus" type="apx:NonEmptyString" use="optional">
						<xs:annotation>
							<xs:documentation>Used by Outbound GetStatus responses only. Do not Submit or expect in GetScheduleData responses</xs:documentation>
						</xs:annotation>
					</xs:attribute>
					<xs:attribute name="MarketStatus" type="apx:NonEmptyString" use="optional">
						<xs:annotation>
							<xs:documentation>Used by Outbound GetScheduleData responses only. Do not Submit or expect in GetStatus responses</xs:documentation>
						</xs:annotation>
					</xs:attribute>
				</xs:extension>
			</xs:complexContent>
		</xs:complexType>
	</xs:element>
  
</xs:schema>
