<?xml version="1.0"?>
<!-- 
  sedex envelope and receipt for sedex adapter v2.0 or newer.
  
  $Id: eCH-0090-2-0.xsd,v 1.3 2009-03-20 12:55:18 tqn Exp $

  Changes since v 1.0:
  - namespace URN changed.
  - envelope: pattern in participantIdType allows additional functional code for sedex
    system ids (i.e. 0-sedex-*)
  - receipt: status code is now a numeric range to allow for introduction
    of additional status codes without changing the XML schema.
  - new version number attributes for envelope and receipt
-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
	xmlns:eCH-0090="http://www.ech.ch/xmlns/eCH-0090/2"
	targetNamespace="http://www.ech.ch/xmlns/eCH-0090/2"
	elementFormDefault="qualified">

  <xs:simpleType name="messageIdType">
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Datentyp der Meldungs ID. Zeichenkette mit max. 36 Zeichen, die Ziffern, Buchstaben 
        oder Bindestriche enthalten kann. Die Zeichenkette ist lang genug, um eine UUID 
        (vgl. RFC 4122), einen 64 Bit Integer oder eine Art von Schlüssel darzustellen.
        Beispiele: f81d4fae-7dec-11d0-a765-00a0c91e6bf6, 7F454C4601020100
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="([a-zA-Z]|[0-9]|-){1,36}"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="participantIdType">
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Datentyp der sedex Teilnehmer ID.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:pattern value="T?[1-9]-[0-9A-Z]+-[0-9]+|T?0-sedex-[0-9]"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="messageTypeType">
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Typ des Meldungstyp. 
        Der Meldungstyp definiert die Funktion eines Datenpakets.
        Der Wertebereich ist in Nummerierungsbereiche unterteilt. 
        Der Bereich 0000000 -	0099999 liegt in der Hoheit von eCH und BFS,
        die Bereiche nn00000 - nn99999 in der Hoheit des jeweiligen Kantons,
        wo nn die BFS Nummer des Kantons gemäss historisiertem Gemeindeverzeichnis
        bezeichnet. Der Meldungstyp definiert 
        zusammen mit der Meldungsklasse (messageClass) implizit, welcher Art 
        (Dateityp bzw. XML Schema) die Nutzdaten der Meldung sind. Der Meldungstyp 
        ist zusammen mit senderId und recipientId für das Routing der Meldung relevant.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:int">
      <xs:minInclusive value="0"/>
      <xs:maxInclusive value="2699999"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:complexType name="nameValuePairType">
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Datentyp der die Übergabe von Daten für Testzwecke.
      </xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="name" type="xs:string" />
      <xs:element name="value" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  
	<xs:complexType name="envelopeType">
		<xs:sequence>
		  <xs:element name="messageId" type="eCH-0090:messageIdType" >
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Eindeutige ID der Meldung. Diese ID wird von der sendenden Anwendung vergeben. 
		        Die messageId muss im Kontext der sendenden Anwendung eindeutig sein. Sie dient 
		        der sendenden Anwendung dazu, eine Meldung und eine Antwort auf diese Meldung zu 
		        korrelieren. Im Kontext des sedex Systems ist das Paar (senderId, messageId) eindeutig.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		  <xs:element name="messageType" type="eCH-0090:messageTypeType">
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Meldungstyp. Der Meldungstyp definiert die Funktion eines Datenpakets.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		  <xs:element name="messageClass" type="xs:int">
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Meldungsklasse. Definiert innerhalb eines Meldungstyps die Bedeutung der Meldung. 
		        Die folgenden Werte sind vordefiniert:·	0 = Message. Kennzeichnung der initialen Meldung;
		        1 = Response. Kennzeichnet die Antwort auf eine Meldung;
		        2 = Receipt. Kennzeichnet eine applikatorische Quittung (Empfangsbestätigung), welche 
		        eine empfangende Anwendung der sendenden Anwendung schickt. Eine solche Quittung wird ggf. 
		        geschickt, wenn bis zur Lieferung einer Antwort ein längerer Zeitraum vergehen kann, oder 
		        wenn der Empfänger gar keine Antwort senden wird.; 
		        3 = Error. Kennzeichnet eine Fehlermeldung, welche eine empfangende 
		        Anwendung der sendenden Anwendung schickt;·	4 – 9 = Reserviert für spätere Erweiterungen; 
		        71 – 77 = Reserviert für spätere Erweiterungen. Alle anderen Werte können für spezifische 
		        Bedürfnisse der Anwendungen genutzt werden.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
			  <xs:element name="referenceMessageId" type="eCH-0090:messageIdType" minOccurs="0" >
			    <xs:annotation>
			      <xs:documentation xml:lang="de">
			        Dieses Element wird von einer Anwendung gesetzt, wenn sie einer anderen Anwendung 
			        eine Antwort oder eine Fehlermeldung auf eine Meldung sendet. Das Element enthält 
			        die ID der ursprünglich gesendeten Meldung. Muss gesetzt werden, wenn 
			        messageClass = 1 (Response), = 2 (Receipt) oder 3 (Error) ist.
			      </xs:documentation>
			    </xs:annotation>
			  </xs:element>
		  <xs:element name="senderId" type="eCH-0090:participantIdType">
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Absender der Meldung. Bezeichnet eindeutig die Amtsstelle, welche die Meldung sendet.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		  <xs:element name="recipientId" type="eCH-0090:participantIdType" maxOccurs="unbounded" >
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Empfänger der Meldung. Bezeichnet eindeutig die Amtsstelle, welche die Meldung empfangen soll.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		  <xs:element name="eventDate" type="xs:dateTime" >
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Ereignisdatum.Datum, an dem das Ereignis, auf welches sich die Nutzdaten beziehen, 
		        geschah. Das Ereignisdatum kann von der empfangenden Anwendung als Bestandteil der 
		        Nutzdaten (z.B. Wegzug, Zuzug, Stichtag Datenlieferung für die Statistik, etc.) 
		        betrachtet werden.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		  <xs:element name="messageDate" type="xs:dateTime" >
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Versanddatum.Datum (Zeitstempel), an dem die sendende Anwendung die Meldung dem 
		        Adapter in den Ausgangsorder gelegt hat.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		  <xs:element name="loopback" minOccurs="0">
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Markiert die Meldung als eine Loopbackmeldung, also eine Meldung, die der empfangende 
		        Adapter für den Empfang wie eine herkömmliche Meldung behandelt, sie aber nicht der 
		        empfangenden Anwendung zur Verarbeitung weiterleitet. Dient dazu, Loopback-Test 
		        durchzuführen.
		      </xs:documentation>
		    </xs:annotation>
		    <xs:complexType>
		      <xs:attribute name="authorise" type="xs:boolean" use="required">
		        <xs:annotation>
		          <xs:documentation xml:lang="de">
		            Das Attribut definiert, ob die sedex Berechtigungsprüfung für diese Loopback 
		            Meldung geprüft werden soll. Wird der Wert auf true gesetzt, so kann die
		            Meldung verwendet werden, um zu prüfen, ob ein Sender einem Empfänger eine
		            Meldung eines bestimmten Typs senden darf. Wird der Wert auf false gesetzt,
		            so kann die Meldung für einen reinen Verbindungstest zwischen Adaptern
		            verwendet werden (Ping).
		          </xs:documentation>
		        </xs:annotation>
		      </xs:attribute>
		    </xs:complexType>
		  </xs:element>
		  <xs:element name="testData" type="eCH-0090:nameValuePairType" minOccurs="0" maxOccurs="unbounded">
		    <xs:annotation>
		      <xs:documentation xml:lang="de">
		        Kann von einer sendenden Anwendung für Testzwecke verwendet werden, um den empfangenden 
		        Simulator zu steuern. Die Semantik der übergebenen Wert ist  Sache des empfangenden 
		        Simulators.
		      </xs:documentation>
		    </xs:annotation>
		  </xs:element>
		</xs:sequence>
	  <xs:attribute name="version" use="required">
	    <xs:annotation>
	      <xs:documentation xml:lang="de">
	        Versionsnummer des XML Schemas, welches dieses Element beschreibt.
	      </xs:documentation>
	    </xs:annotation>
	    <xs:simpleType>
	      <xs:restriction base="xs:string">
	        <xs:enumeration value="2.0"/>
	      </xs:restriction>
	    </xs:simpleType>
	  </xs:attribute>
	</xs:complexType>

  <xs:simpleType name="string255Type">
    <xs:annotation>
      <xs:documentation xml:lang="de">
        String mit maximaler Länge 255.
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:maxLength value="255"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:simpleType name="statusCodeType">
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Statuscodes, wie sie in der Quittung vorkommen können, sind dreistellig numerisch
        im Intervall [100,999].
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:int">
      <xs:minInclusive value="100"/>
      <xs:maxInclusive value="999"/>
    </xs:restriction>
  </xs:simpleType>
  
  <xs:complexType name="receiptType">
    <xs:sequence>
      <xs:element name="eventDate" type="xs:dateTime" >
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Zeitpunkt des Ereignisses, welches zu der Quittung führt. Z.B. Zeitpunkt, wann 
            die Meldung beim empfangenden Adapter angekommen ist, oder wann der 
            Übermittlungsfehler aufgetreten ist.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="statusCode" type="eCH-0090:statusCodeType" >
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Status der Meldung: OK oder Fehlercode.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="statusInfo" type="eCH-0090:string255Type" >
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Infotext zum Statuscode. Enthält allfällige weitere Informationen, die für den 
            Systemmenschen interessant sein könnten.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="messageId" type="eCH-0090:messageIdType" >
        <xs:annotation>
          <xs:documentation xml:lang="de">
            ID der Meldung, auf die sich die Quittung bezieht.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="messageType" type="eCH-0090:messageTypeType" >
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Meldetyp der Meldung, auf die sich die Quittung bezieht.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="messageClass" type="xs:int">
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Meldungsklasse der Meldung, auf die sich die Quittung bezieht.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="senderId" type="eCH-0090:participantIdType">
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Absender der Meldung, auf die sich die Quittung bezieht.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
      <xs:element name="recipientId" type="eCH-0090:participantIdType">
        <xs:annotation>
          <xs:documentation xml:lang="de">
            Empfänger der Meldung, auf die sich die Quittung bezieht.
          </xs:documentation>
        </xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="version" use="required">
      <xs:annotation>
        <xs:documentation xml:lang="de">
          Versionsnummer des XML Schemas, welches dieses Element beschreibt.
        </xs:documentation>
      </xs:annotation>
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="2.0"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
  
  <xs:element name="envelope" type="eCH-0090:envelopeType" >
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Umschlag einer sedex Meldung.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  
  <xs:element name="receipt" type="eCH-0090:receiptType" >
    <xs:annotation>
      <xs:documentation xml:lang="de">
        Versandquittung einer sedex Meldung. Versandquittungen werden vom sedex Adapter
        ausgestellt. Sie bestätigen, das eine Meldung auf der Gegenseite angekommen ist,
        oder ob die Meldung nicht ausgeliefert werden konnte. Sie bestätigen aber in
        keinem Fall, dass die Gegenseite die Meldung verarbeitet hat.
      </xs:documentation>
    </xs:annotation>
  </xs:element>
  
</xs:schema>