﻿<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    
<xs:element name = "CJML">
    <xs:complexType> 
        <xs:sequence>
            <xs:element name="plannedJourney" type="PlannedJourney" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="actualJourney" type="ActualJourney" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="version" type="xs:float"/>
    </xs:complexType>
</xs:element>

    <xs:complexType name="CustomerJourney">
        <xs:sequence>
            <xs:element name="journeyID" type="xs:string"/>
            <xs:element name="journeyTitle" type="xs:string" minOccurs="0"/>
            <xs:element name="journeyShortSummary" type="xs:string" minOccurs="0"/>
            <xs:element name="journeyLongSummary" type="xs:string" minOccurs="0"/>
            <xs:element name="journeyPhases" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="journeyPhase" type="JourneyPhase" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
            <xs:element name="journeyOperators" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="journeyOperator" type="JourneyOperator" minOccurs="0" maxOccurs="unbounded"/>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Actors">
        <xs:sequence>
            <xs:element name="endUser" type="EndUser" minOccurs ="1" maxOccurs="unbounded"/>    
            <xs:element name="serviceProvider" type="ServiceProvider" minOccurs ="1" maxOccurs="unbounded"/>
            <xs:element name="external" type="External" minOccurs ="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="JourneyPhase">
        <xs:sequence>
            <xs:element name="phaseName" type="xs:string" minOccurs="0"/>
            <xs:element name="phaseDescription" type="xs:string" minOccurs="0"/>
        </xs:sequence>
            <xs:attribute name="phaseID" type="xs:ID"/>
            <xs:attribute name="phaseIDref" type="xs:IDREF"/>
    </xs:complexType>

    <xs:complexType name="JourneyOperator">
        <xs:sequence>
            <xs:choice>
                <xs:element name="concurrency" type="Concurrency"/>
                <xs:element name="decision" type="Decision"/>
            </xs:choice>
            <xs:element name="belongsTo" type="JourneyPhase" minOccurs="0"/>
        </xs:sequence>
            <xs:attribute name="operatorID" type="xs:ID"/>
            <xs:attribute name="operatorIDref" type="xs:IDREF"/>
    </xs:complexType>

    <xs:complexType name="Concurrency">
        <xs:sequence>
            <xs:element name="concurrencyPaths" type="xs:integer" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Decision">
        <xs:sequence>
            <xs:element name="decisionPaths" type="xs:integer" minOccurs="0"/>
            <xs:element name="condition" type="xs:string" minOccurs="0"/>
            <xs:element name="decisionMaker" type="Actor" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="AnalyzerResults">
        <xs:sequence>
            <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="PlannedJourney">
        <xs:complexContent>
            <xs:extension base="CustomerJourney">
                <xs:sequence>
                    <xs:element name="actors" type="Actors"/>
                    <xs:element name="touchpoints">
                        <xs:complexType>
                            <xs:choice minOccurs="2" maxOccurs="unbounded">
                                <xs:element name="plannedAction" type="PlannedAction"/>
                                <xs:element name="plannedCommunicationPoint" type="PlannedCommunicationPoint"/>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="comment" type="xs:string" minOccurs="0"/>
                    <xs:element name="journeyLevelAnalysis" type="AnalyzerResults" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="ActualJourney">
        <xs:complexContent>
            <xs:extension base="CustomerJourney">
                <xs:sequence>
                    <xs:element name="journeyStatus" minOccurs="0">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="inProgress"/>
                                <xs:enumeration value="completed"/>
                                <xs:enumeration value="aborted"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                    <xs:element name="plannedReference" type="xs:string" minOccurs="0"/>
                    <xs:element name="complianceContent" type="xs:boolean" minOccurs="0"/>
                    <xs:element name="complianceSequence" type="xs:boolean" minOccurs="0"/>
                    <xs:element name="complianceTiming" type="xs:boolean" minOccurs="0"/>
                    <xs:element name="journeyExperience" type="EndUserExperience" minOccurs="0"/>
                    <xs:element name="actors" type="Actors"/>
                    <xs:element name="touchpoints">
                        <xs:complexType>
                            <xs:choice minOccurs="2" maxOccurs="unbounded">
                                <xs:element name="actualAction" type="ActualAction"/>
                                <xs:element name="actualCommunicationPoint" type="ActualCommunicationPoint"/>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="comment" type="xs:string" minOccurs="0"/>
                    <xs:element name="journeyLevelAnalysis" type="AnalyzerResults" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Touchpoint">
        <xs:sequence>
            <xs:element name="touchpointID" type="xs:string"/>
            <xs:element name="uncertainty" minOccurs="0" maxOccurs="4">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="uncertainOccurrence"/>
                        <xs:enumeration value="uncertainNoOfOccurrence"/>
                        <xs:enumeration value="uncertainChannel"/>
                        <xs:enumeration value="uncertainInitiator"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="object" type="Object" minOccurs ="0" maxOccurs="unbounded"/>
            <xs:element name="system" type="BackendSystem" minOccurs ="0" maxOccurs="unbounded"/>
            <xs:element name="belongsTo" type="JourneyPhase" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="PlannedTouchpoint">
        <xs:complexContent>
            <xs:extension base="Touchpoint">
                 <xs:sequence/>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <xs:complexType name="ActualTouchpoint">
        <xs:complexContent>
            <xs:extension base="Touchpoint">
                <xs:sequence>
                    <xs:element name="compliance" minOccurs="0">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="planned"/>
                                <xs:enumeration value="adhoc"/>
                                <xs:enumeration value="missing"/>
                                <xs:enumeration value="failing"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                 </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="PlannedAction">
        <xs:complexContent>
            <xs:extension base="PlannedTouchpoint">
                <xs:sequence>
                    <xs:element name="initiator" type="Initiator"/>
                    <xs:element name="deltaTime" type="xs:duration"/>
                    <xs:element name="touchpointDuration" type="xs:duration"/>
                    <xs:element name="comment" type="xs:string" minOccurs="0"/>
                    <xs:element name="touchpointLevelAnalysis" type="AnalyzerResults" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
    
    <xs:complexType name="ActualAction">
        <xs:complexContent>
            <xs:extension base="ActualTouchpoint">
                <xs:sequence>
                    <xs:element name="initiator" type="Initiator"/>
                    <xs:element name="timestamps">
                        <xs:complexType>
                            <xs:choice>
                                <xs:sequence>
                                    <xs:element name="timeStarted" type="xs:dateTime"/>
                                    <xs:element name="timeCompleted" type="xs:dateTime" minOccurs="0"/>
                                </xs:sequence>
                                <xs:element name="timeCompleted" type="xs:dateTime"/>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="touchpointExperience" type="EndUserExperience" minOccurs="0"/>
                    <xs:element name="comment" type="xs:string" minOccurs="0"/>
                    <xs:element name="touchpointLevelAnalysis" type="AnalyzerResults" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
  </xs:complexType>


    <xs:complexType name="PlannedCommunicationPoint">
        <xs:complexContent>
            <xs:extension base="PlannedTouchpoint">
                <xs:sequence>
                    <xs:element name="initiator" type="Initiator"/>
                    <xs:element name="receiver" type="Receiver"/>
                    <xs:element name="channel" type="Channel"/>
                    <xs:element name="message" type="Message" minOccurs="0"/>
                    <xs:element name="deltaTime" type="xs:duration"/>
                    <xs:element name="touchpointDuration" type="xs:duration"/>
                    <xs:element name="comment" type="xs:string" minOccurs="0"/>
                    <xs:element name="touchpointLevelAnalysis" type="AnalyzerResults" minOccurs="0"/>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="ActualCommunicationPoint">
        <xs:complexContent>
            <xs:extension base="ActualTouchpoint">
                 <xs:sequence>
                    <xs:element name="initiator" type="Initiator"/>
                    <xs:element name="receiver" type="Receiver"/>
                    <xs:element name="channel" type="Channel"/>
                    <xs:element name="message" type="Message" minOccurs="0"/>
                    <xs:element name="timestamps" minOccurs="0">
                        <xs:complexType>
                            <xs:choice>
                                <xs:choice>
                                    <xs:sequence>
                                        <xs:element name="timeOriginated" type="xs:dateTime"/>
                                        <xs:element name="timeReceived" type="xs:dateTime" minOccurs="0"/>
                                        <xs:element name="timeConsumed" type="xs:dateTime" minOccurs="0"/>  
                                    </xs:sequence>
                                    <xs:sequence>
                                        <xs:element name="timeReceived" type="xs:dateTime"/>
                                        <xs:element name="timeConsumed" type="xs:dateTime" minOccurs="0"/>  
                                    </xs:sequence>
                                    <xs:element name="timeConsumed" type="xs:dateTime"/>
                                </xs:choice>
                                <xs:choice>
                                    <xs:sequence>
                                        <xs:element name="timeStarted" type="xs:dateTime"/>
                                        <xs:element name="timeCompleted" type="xs:dateTime" minOccurs="0"/>
                                    </xs:sequence>
                                    <xs:element name="timeCompleted" type="xs:dateTime"/>
                                </xs:choice>
                            </xs:choice>
                        </xs:complexType>
                    </xs:element>
                    <xs:element name="touchpointExperience" type="EndUserExperience" minOccurs="0"/>
                    <xs:element name="comment" type="xs:string" minOccurs="0"/>
                    <xs:element name="touchpointLevelAnalysis" type="AnalyzerResults" minOccurs="0"/>   
                 </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <xs:complexType name="Initiator">
        <xs:sequence>
            <xs:element name="refersTo" type="Actor"/>
            <xs:element name="initiatorLabel" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Receiver">
        <xs:sequence>
            <xs:element name="refersTo" type="Actor"/>
            <xs:element name="receiverLabel" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>


    <xs:complexType name="Object">
        <xs:sequence>
            <xs:element name="objectID" type="xs:string"/>
            <xs:element name="objectName" type="xs:string" minOccurs="0"/>
            <xs:element name="objectDescription" type="xs:string" minOccurs="0"/>
            <xs:element name="isVirtual" type="xs:boolean" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="BackendSystem">
        <xs:sequence>
            <xs:element name="systemID" type="xs:string"/>
            <xs:element name="systemName" type="xs:string" minOccurs="0"/>
            <xs:element name="systemDescription" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>


    <xs:complexType name="EndUserExperience">
        <xs:sequence>
            <xs:element name="experienceDescription" type="xs:string" minOccurs="0"/>
            <xs:element name="experienceRating" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:integer">
                        <xs:minInclusive value="1"/>
                        <xs:maxInclusive value="5"/>
                    </xs:restriction> 
                </xs:simpleType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Channel">
        <xs:sequence>
            <xs:element name="channelName" type="Channels"/>
            <xs:element name="comType" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="unicast"/>
                        <xs:enumeration value="multicast"/>
                        <xs:enumeration value="broadcast"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="isSynchronous" type="xs:boolean" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:simpleType name="Channels">
        <xs:restriction base="xs:string">
            <xs:enumeration value="telephone"/>
            <xs:enumeration value="sms"/>
            <xs:enumeration value="email"/>
            <xs:enumeration value="socialMediaMessage"/>
            <xs:enumeration value="messageService"/>
            <xs:enumeration value="chat"/>
            <xs:enumeration value="faceToFace"/>
            <xs:enumeration value="internetViaPC"/>
            <xs:enumeration value="internetViaSmartPhone"/>
            <xs:enumeration value="internetViaTablet"/>
            <xs:enumeration value="appOnPC"/>
            <xs:enumeration value="appOnSmartPhone"/>
            <xs:enumeration value="appOnTablet"/>
            <xs:enumeration value="internet"/>
            <xs:enumeration value="selfServiceMachine"/>
            <xs:enumeration value="letter"/>
            <xs:enumeration value="packageDelivery"/>
            <xs:enumeration value="faxMessage"/>
            <xs:enumeration value="shopCounter"/>
            <xs:enumeration value="serviceDesk"/>
            <xs:enumeration value="paymentChannel"/>
            <xs:enumeration value="unknownChannel"/>
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="Message">
        <xs:sequence>
            <xs:element name="messageContent" type="xs:string" minOccurs="0"/>
            <xs:element name="keyMessageContent" type="xs:string" minOccurs="0"/>
            <xs:element name="derivedMessageContent" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>


    <xs:complexType name="Actor">
        <xs:sequence>
            <xs:element name="actorName" type="xs:string" minOccurs="0"/>
            <xs:element name="actorDescription" type="xs:string" minOccurs="0"/>
            <xs:element name="isVirtual" type="xs:boolean" minOccurs="0"/>
        </xs:sequence>
            <xs:attribute name="actorID" type="xs:ID"/>
            <xs:attribute name="actorIDref" type="xs:IDREF"/>
        
    </xs:complexType>



    <xs:complexType name="EndUser">
        <xs:complexContent>
            <xs:extension base="Actor">
                <xs:sequence>
                    <xs:element name="isMain" type="xs:boolean" minOccurs="0"/>
                    <xs:element name="preferences" type="xs:string" minOccurs="0"/>
                    <xs:element name="frustrations" type="xs:string" minOccurs="0"/>
                    <xs:element name="preferredChannels" type="Channels" minOccurs="0" maxOccurs="unbounded"/>
                    <xs:choice minOccurs="0">
                        <xs:element name="customer" type="Customer"/>
                        <xs:element name="user" type="User"/>
                        <xs:element name="employee" type="Employee"/>
                        <xs:element name="citizen" type="Citizen"/>
                        <xs:element name="patient" type="Patient"/>
                    </xs:choice>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>


    <xs:complexType name="ServiceProvider">
        <xs:complexContent>
            <xs:extension base="Actor">
                <xs:sequence>
                    <xs:element name="companyName" type="xs:string" minOccurs="0"/>
                    <xs:element name="department" type="xs:string" minOccurs="0"/>
                    <xs:element name="position" type="xs:string" minOccurs="0"/>
                    <xs:element name="providerType" minOccurs="0">
                        <xs:simpleType>
                            <xs:restriction base="xs:string">
                                <xs:enumeration value="type1_internal_main"/>
                                <xs:enumeration value="type2_internal_shared"/>
                                <xs:enumeration value="type3_external_thirdParty"/>
                            </xs:restriction>
                        </xs:simpleType>
                    </xs:element>
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="External">
        <xs:complexContent>
            <xs:extension base="Actor"/>
        </xs:complexContent>
    </xs:complexType>

    <xs:complexType name="Customer">
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="User">
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Citizen">
        <xs:sequence>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Patient">
        <xs:sequence>
            <xs:element name="patientType" minOccurs="0">
                <xs:simpleType>
                    <xs:restriction base="xs:string">
                        <xs:enumeration value="inPatient"/>
                        <xs:enumeration value="outPatient"/>
                        <xs:enumeration value="dayCase"/>
                        <xs:enumeration value="dayPatient"/>
                        <xs:enumeration value="ambulatoryEmergencyCare"/>
                        <xs:enumeration value="emergencyCare"/>
                        <xs:enumeration value="intensiveCare"/>
                    </xs:restriction>
                </xs:simpleType>
            </xs:element>
            <xs:element name="diagnosis" type="xs:string" minOccurs="0"/>
            <xs:element name="insuranceName" type="xs:string" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="Employee">
        <xs:sequence>
            <xs:element name="companyName" type="xs:string" minOccurs="0"/>
            <xs:element name="department" type="xs:string" minOccurs="0"/>
            <xs:element name="position" type="xs:string" minOccurs="0"/>
            <xs:element name="yearsExperience" type="xs:integer" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>