<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
	<xsd:annotation>
		<xsd:documentation xml:lang="EN">
			Schema for GLORIEN Cashier Process-Validation
		</xsd:documentation>
	</xsd:annotation>

	<!-- Root
		Every Element is required
		"company" sets the company information
		"meta" sets payment information
		"discount" sets process-discount information,
			can be empty
		"order" contains a list of articles
	-->
	<xsd:element name="process">
		<xsd:complexType>
		    <xsd:sequence>
		        <xsd:element name="company" type="companyDef"/>
		        <xsd:element name="meta" type="metaDef"/>
				<xsd:element name="discount" type="discountDef"/>
		        <xsd:element name="order" type="orderDef"/>
		    </xsd:sequence>
		</xsd:complexType>
	</xsd:element>
	
	<!-- Company
		Every Element is required but can be empty
		Attribute "id" is required and refers to database "company_id"
	-->
	<xsd:complexType name="companyDef">
	    <xsd:sequence>
		    <xsd:element name="name" type="xsd:string"/>
			<xsd:element name="ceo" type="xsd:string"/>
			<xsd:element name="title" type="xsd:string"/>
			<xsd:element name="address1" type="xsd:string"/>
			<xsd:element name="address2" type="xsd:string"/>
			<xsd:element name="postcode" type="xsd:string"/>
			<xsd:element name="city" type="xsd:string"/>
			<xsd:element name="telephone" type="xsd:string"/>
			<xsd:element name="homepage" type="xsd:string"/>
			<xsd:element name="number" type="xsd:string"/>
			<xsd:element name="cashier" type="cashierDef"/>
	    </xsd:sequence>
		<xsd:attribute name="id" type="xsd:integer" use="required"/>
	</xsd:complexType>

	<!-- Meta
		Every Element is required
		"author" sets author information
		"date" sets the date of this process
		"price" sets price information
		"discountprice" sets discount-price information
		"given" contains a list of payments
		"back" sets money to given back
		"taxes" contains a list of tax-rates
		Attribute "id" is required and is current order-id
	-->
	<xsd:complexType name="metaDef">
	    <xsd:sequence>
		    <xsd:element name="author" type="authorDef"/>
			<xsd:element name="date" type="xsd:string"/>
			<xsd:element name="price" type="price"/>
			<xsd:element name="discountprice" type="discountpriceDef"/>
			<xsd:element name="given" type="givenDef"/>
			<xsd:element name="back" type="price"/>
			<xsd:element name="taxes" type="taxesDef"/>
	    </xsd:sequence>
		<xsd:attribute name="id" type="xsd:integer" use="required"/>
	</xsd:complexType>

	<!-- Discount Definition -->
	<xsd:complexType name="discountDef">
		<xsd:simpleContent>
			<xsd:extension base="xsd:string">
				<xsd:attribute name="type" type="discounts" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>
	
	<!-- Order Definition -->
	<xsd:complexType name="orderDef">
		<xsd:sequence>
			<xsd:element name="articles" type="articlesDef"/>
		</xsd:sequence>
		<xsd:attribute name="id" type="xsd:integer" use="required"/>
	</xsd:complexType>

	<!-- Cashier Definition -->
	<xsd:complexType name="cashierDef">
		<xsd:simpleContent>
			<xsd:extension base="xsd:string">
				<xsd:attribute name="id" type="xsd:integer" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>

	<!-- Author Definition -->
	<xsd:complexType name="authorDef">
		<xsd:simpleContent>
			<xsd:extension base="xsd:integer">
				<xsd:attribute name="name" type="xsd:string" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>

	<!-- Discount-Price Definition -->
	<xsd:complexType name="discountpriceDef">
		<xsd:simpleContent>
			<xsd:extension base="price">
				<xsd:attribute name="value" type="price" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>
	
	<!-- Given Definition
		Contains Cash, Card an Present Payment
		Attribute "value" represents whole given Money
	-->
	<xsd:complexType name="givenDef">
		<xsd:sequence>
			<xsd:element name="cash" type="price"/>
			<xsd:element name="card" type="price"/>
			<xsd:element name="present" type="price"/>
		</xsd:sequence>
		<xsd:attribute name="value" type="price" use="required"/>
	</xsd:complexType>	

	<!-- Tax Defintion
		Contains a list of tax-rates
		Presents haven't a Tax-Rate
	-->
	<xsd:complexType name="taxesDef">
		<xsd:sequence>
			<xsd:element name="tax" type="taxDef" minOccurs="0" maxOccurs="unbounded"/>
		</xsd:sequence>
	</xsd:complexType>
	
	<!-- Tax Rate Definition -->
	<xsd:complexType name="taxDef">
		<xsd:simpleContent>
			<xsd:extension base="price">
				<xsd:attribute name="rate" type="xsd:integer" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>
	
	<!-- Articles Definition
		Contains a list of min 1 Article
	-->
	<xsd:complexType name="articlesDef">
		<xsd:sequence>
			<xsd:element name="article" type="articleDef" minOccurs="1" maxOccurs="unbounded"/>
		</xsd:sequence>
	</xsd:complexType>	

	<!-- Article Definition
		"count" sets Article quantity
		"name" sets name of the Article
		"info" sets short description of the Article
		"price" sets price information
		"tax" sets tax information
		"discount" sets discount information
		Attriute "id" represents Aritlce id
	-->
	<xsd:complexType name="articleDef">
		<xsd:sequence>
			<xsd:element name="count" type="xsd:integer"/>
			<xsd:element name="name" type="xsd:string"/>
			<xsd:element name="info" type="xsd:string"/>
			<xsd:element name="price" type="priceDef"/>
			<xsd:element name="tax" type="xsd:integer"/>
			<xsd:element name="discount" type="articlediscountDef"/>
		</xsd:sequence>
		<xsd:attribute name="id" type="xsd:string" use="required"/>
	</xsd:complexType>	

	<!-- Price Definition -->
	<xsd:complexType name="priceDef">
		<xsd:simpleContent>
			<xsd:extension base="xsd:string">
				<xsd:attribute name="value" type="xsd:string" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>

	<!-- Article Discount Definition -->
	<xsd:complexType name="articlediscountDef">
		<xsd:simpleContent>
			<xsd:extension base="xsd:string">
				<xsd:attribute name="type" type="discounts" use="required"/>
				<xsd:attribute name="value" type="xsd:string" use="required"/>
			</xsd:extension>
	    </xsd:simpleContent>
	</xsd:complexType>

	<!-- Type Definition: Discounts
		Empty represents no Discount
		"NONE" represents Non-Discountable
		"Prozent" represents Percentage
		"Bar" represents Cash
	-->
	<xsd:simpleType name="discounts">
		<xsd:restriction base="xsd:string">
			<xsd:enumeration value=""/>
			<xsd:enumeration value="NONE"/>
			<xsd:enumeration value="Prozent"/>
		    <xsd:enumeration value="Bar"/>
		</xsd:restriction>
	</xsd:simpleType>
	
	<!-- Type Definition: Price
		Germany Number Format 123,11
	-->
	<xsd:simpleType name="price">
		<xsd:restriction base="xsd:string">
			<xsd:pattern value="([0-9]+,[0-9]{2})?" />
		</xsd:restriction>
	</xsd:simpleType>
</xsd:schema>
