<?xml version = "1.0" encoding = "utf-8"?>
<xs:schema xmlns="com.ramco.visualwf" targetNamespace="com.ramco.visualwf" xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified" attributeFormDefault="unqualified">
	
	<!--Root Node-->
	<xs:element name="authinfo">
		<xs:annotation>
			<xs:documentation>
				"authinfo" is the root node
				"@n" contains the task name (CAT Key) for which information is attached
				"@success" contains true/false
				"@message" contains any error message to be returned to client
				"states" has zero or more State (This contains only the final states of the authorization task)
				"dateranges" has zero or more Date Range
				"interstates" has zero or more Intermediate State (This contains only the intermediate states of the authorization task)
				"paths" has zero or more Path
				"pathstates" has zero or more Path State
			</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:sequence>
				<xs:element name="states" minOccurs="1" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="state" type="State" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="dateranges" minOccurs="1" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="daterange" type="DateRange" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="interstates" minOccurs="1" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="istate" type="InterState" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="paths" minOccurs="1" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="path" type="Path" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="pathstates" minOccurs="1" maxOccurs="1">
					<xs:complexType>
						<xs:sequence>
							<xs:element name="pstate" type="PathState" minOccurs="0" maxOccurs="unbounded"/>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:sequence>
			<xs:attribute name="n" type="xs:string" use="optional"/>
			<xs:attribute name="success" type="EnumTrueFalse" use="required"/>
			<xs:attribute name="message" type="xs:string" use="required"/>			
		</xs:complexType>
	</xs:element>

	<!--Complex Types-->
	<xs:complexType name="State">
		<xs:annotation>
			<xs:documentation>
				State Complex Type
				"@sn" contains state name
				"@sd" contains state description
			</xs:documentation>
		</xs:annotation>
		<xs:attribute name="sn" type="xs:string" use="required"/>
		<xs:attribute name="sd" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="DateRange">
		<xs:annotation>
			<xs:documentation>
				DateRange Complex Type
				"@ef" Effective From
				"@et" Effective To
				"@ac" Active Status of Date Range
			</xs:documentation>
		</xs:annotation>
		<xs:attribute name="ef" type="xs:string" use="required"/>
		<xs:attribute name="et" type="xs:string" use="required"/>
		<xs:attribute name="etd" type="xs:string" use="required"/>
		<xs:attribute name="ac" type="EnumYesNo" use="required"/>
	</xs:complexType>
	<xs:complexType name="InterState">
		<xs:annotation>
			<xs:documentation>
				InterState Complex Type
				"@sn" contains state name
				"@sd" contains state description
				"@ss" contains state sequence
			</xs:documentation>
		</xs:annotation>
		<xs:attribute name="sn" type="xs:string" use="required"/>
		<xs:attribute name="sd" type="xs:string" use="required"/>
		<xs:attribute name="ss" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="Path">
		<xs:annotation>
			<xs:documentation>
				Path Complex Type
				"@ef" Effective From
				"@et" Effective To
				"@pn" contains path name
				"@pd" contains path description
				"@rd" contains RuleDriven (1/0)
			</xs:documentation>
		</xs:annotation>
		<xs:attribute name="ef" type="xs:string" use="required"/>
		<xs:attribute name="et" type="xs:string" use="required"/>		
		<xs:attribute name="pn" type="xs:string" use="required"/>
		<xs:attribute name="pd" type="xs:string" use="required"/>
		<xs:attribute name="rd" type="xs:string" use="required"/>
	</xs:complexType>
	<xs:complexType name="PathState">
		<xs:annotation>
			<xs:documentation>
				PathState Complex Type
				"@pn" contains path name (Path Name is key since, Path Name is unique for CAT Key. Hence Effective From, Effective To not required)
				"@sn" contains state name
				"@ss" contains state sequence
				"@sm" contains state mandatory
				"@as" Y indicates application state, N indicates workflow state
			</xs:documentation>
		</xs:annotation>
		<xs:sequence>
			<xs:element name ="shi" minOccurs="1" maxOccurs="1">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="stakeholder" minOccurs="1" maxOccurs="1">
							<xs:complexType>
								<xs:annotation>
									<xs:documentation>
										stakeholder Complex Type
										"@ubc" indicates User Basis Code
									</xs:documentation>
								</xs:annotation>
								<xs:sequence>
									<xs:element name="udets" minOccurs="1" maxOccurs="1">
										<xs:complexType>
											<xs:sequence>
												<xs:element name="udet" minOccurs="0" maxOccurs="unbounded">
													<xs:complexType>
														<xs:annotation>
															<xs:documentation>
																udet(User Details) Complex Type
																"@appreq" indicates State Approval Required (Yes,No)
																"@pou" indicates Proxy OU description
																"@pun" indicates Proxy User Name
																"@uou" indicates User OU description
																"@un" indicates User Name
																"@up" indicates User Profile Name
															</xs:documentation>
														</xs:annotation>
														<xs:attribute name="appreq" type="xs:string" use="required"/>
														<xs:attribute name="pou" type="xs:string" use="required"/>
														<xs:attribute name="pun" type="xs:string" use="required"/>
														<xs:attribute name="uou" type="xs:string" use="required"/>
														<xs:attribute name="un" type="xs:string" use="required"/>
														<xs:attribute name="up" type="xs:string" use="required"/>
													</xs:complexType>
												</xs:element>
												
											</xs:sequence>
										</xs:complexType>
									</xs:element>
									<xs:element name="rdets" minOccurs="1" maxOccurs="1">
										<xs:complexType>
											<xs:sequence>
												<xs:element name="rdet" minOccurs="0" maxOccurs="unbounded">
													<xs:complexType>
														<xs:annotation>
															<xs:documentation>
																rdet(Resource Rule details) Complex Type
																"@rid" indicates Resource Rule Id
																"@rdec" indicates Resource Rule description
															</xs:documentation>
														</xs:annotation>
														<xs:attribute name="rid" type="xs:string" use="required"/>
														<xs:attribute name="rdec" type="xs:string" use="required"/>
													</xs:complexType>
												</xs:element>
											</xs:sequence>
										</xs:complexType>
									</xs:element>
									<xs:element name="spdets" minOccurs="1" maxOccurs="1">
										<xs:complexType>
											<xs:sequence>
												<xs:element name="spdet" minOccurs="0" maxOccurs="unbounded">
													<xs:complexType>
														<xs:annotation>
															<xs:documentation>
																spdet(Resource Sp details) Complex Type
																"@spn" indicates Resource Sp name
																"@spdec" indicates Resource Sp description
															</xs:documentation>
														</xs:annotation>														
														<xs:attribute name="spn" type="xs:string" use="required"/>
														<xs:attribute name="spdec" type="xs:string" use="required"/>
													</xs:complexType>
												</xs:element>
											</xs:sequence>
										</xs:complexType>
									</xs:element>
								</xs:sequence>								
								<xs:attribute name="ubc" type="xs:string" use="required"/>
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
			<xs:element name="notifications" minOccurs="1" maxOccurs="1">
				<xs:complexType>
					<xs:sequence>
						<xs:element name="ndets" minOccurs="1" maxOccurs="1">
							<xs:complexType>
								<xs:sequence>
									<xs:element name="ndet" minOccurs="0" maxOccurs="unbounded">
										<xs:complexType>
											<xs:annotation>
												<xs:documentation>
													ndet(Notification details) Complex Type
													"@mdesc" indicates Message description
													"@msds" indicates Message Delivery State
													"@ntype" indicates Notification Type
													"@msid" indicates Message Id
													"@enbl" indicates Notification enabled state
												</xs:documentation>
											</xs:annotation>
											<xs:attribute name="mdesc" type="xs:string" use="required"/>
											<xs:attribute name="msds" type="xs:string" use="required"/>
											<xs:attribute name="ntype" type="xs:string" use="required"/>
											<xs:attribute name="msid" type="xs:string" use="required"/>
											<xs:attribute name="enbl" type="xs:string" use="required"/>											
										</xs:complexType>
									</xs:element>
								</xs:sequence>								
							</xs:complexType>
						</xs:element>
					</xs:sequence>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
		<xs:attribute name="pn" type="xs:string" use="required"/>
		<xs:attribute name="sn" type="xs:string" use="required"/>
		<xs:attribute name="ss" type="xs:string" use="required"/>
		<xs:attribute name="sm" type="xs:string" use="required"/>
		<xs:attribute name="as" type="EnumYesNo" use="required"/>
	</xs:complexType>
	
	<!--Enumerations-->
	<xs:simpleType name="EnumRuleDriven">
		<xs:annotation>
			<xs:documentation>
				EnumRuleDriven Enumeration
				"1" Rule Driven
				"0" Default 
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:enumeration value="1" />
			<xs:enumeration value="0" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="EnumTrueFalse">
		<xs:annotation>
			<xs:documentation>
				EnumTrueFalse Enumeration
				"true" Request processed successfully
				"false" Request processed with failure
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:enumeration value="true" />
			<xs:enumeration value="false" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="EnumYesNo">
		<xs:annotation>
			<xs:documentation>
				EnumYesNo Enumeration
				"Y" Yes
				"N" No
			</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:enumeration value="Y" />
			<xs:enumeration value="N" />
		</xs:restriction>
	</xs:simpleType>
</xs:schema>