<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Schema for the validation report v.280 -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.invoke-software.fr/" targetNamespace="http://www.invoke-software.fr/" attributeFormDefault="unqualified" elementFormDefault="qualified">
    <xs:element name="validation-report">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="referential" type="referential"/>
                <xs:element name="controls" type="controls" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element name="schema" type="schemaReportType" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="reportID" use="optional" type="xs:string"/>
            <xs:attribute name="creationTime" use="optional" type="xs:dateTime"/>
        </xs:complexType>
    </xs:element>

    <xs:simpleType name="controls-global-status">
        <xs:restriction base="xs:string">
            <xs:enumeration value="EMPTY"/>
            <xs:enumeration value="OK"/>
            <xs:enumeration value="WARNING"/>
            <xs:enumeration value="ERROR"/>
        </xs:restriction>
    </xs:simpleType>	
    
    <xs:complexType name="referential">
        <xs:attribute name="identifier" use="optional" type="xs:string"/>
        <xs:attribute name="uuid" use="optional" type="xs:string"/>
    </xs:complexType>
    
    <!-- Checks -->
    <xs:complexType name="controls">
        <xs:sequence>
            <xs:element name="group" minOccurs="0" maxOccurs="unbounded" type="group"/>
        </xs:sequence>
        <xs:attribute name="status" use="required" type="controls-global-status"/>
        <xs:attribute name="invalidChecksLimitReached" use="optional" type="xs:boolean"/>
    </xs:complexType>

    <xs:complexType name="group">
        <xs:sequence>
            <xs:element name="control" minOccurs="0" maxOccurs="unbounded" type="control"/>
        </xs:sequence>
        <xs:attribute name="id" use="required" type="xs:string"/>
        <xs:attribute name="active" use="required" type="xs:boolean"/>
        <xs:attribute name="conditionFormula" use="optional" type="xs:string"/>
    </xs:complexType>
    
    <xs:complexType name="control">
        <xs:sequence>
            <xs:element name="message" minOccurs="0" type="xs:string"/>
            <xs:element name="evals" minOccurs="0" type="evals"/>
        </xs:sequence>
        <xs:attribute name="id" use="required" type="xs:string"/>
        <xs:attribute name="valid" use="optional" type="xs:boolean"/>
        <xs:attribute name="severity" use="required" type="controls-global-status"/>
        <xs:attribute name="evalCount" use="required" type="xs:integer"/>
        <xs:attribute name="formula" use="required" type="xs:string"/>
        <xs:attribute name="executionMs" use="optional" type="xs:integer"/>
        <xs:attribute name="failureLimitReached" use="optional" type="xs:boolean"/>
    </xs:complexType>
    
    <xs:complexType name="evals">
        <xs:sequence>
            <xs:element name="eval" maxOccurs="unbounded" type="eval"/>
        </xs:sequence>
        <xs:attribute name="maxDisplayEvals" use="optional" type="xs:boolean"/>
    </xs:complexType>
    
    <xs:complexType name="eval">
        <xs:sequence>
            <xs:element name="dims" minOccurs="0" type="dims"/>
            <xs:element name="values" minOccurs="0" type="values"/>
            <xs:element name="res" type="res"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="res">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="precision" use="optional" type="xs:decimal"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    
    <xs:complexType name="dims">
        <xs:sequence>
            <xs:element name="dim" maxOccurs="unbounded" type="dim"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="dim">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="prop" use="required" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    
    <xs:complexType name="values">
        <xs:sequence>
            <xs:element name="val" minOccurs="0" maxOccurs="unbounded" type="val"/>
        </xs:sequence>
    </xs:complexType>
    
    <xs:complexType name="val">
        <xs:sequence>
            <!-- Workbook cells linked to this value -->
            <xs:element name="cellRefs" type="cellRefsType" minOccurs="0"/>
            <!-- Other data sources for this value -->
            <xs:element name="source" type="groupValueSource" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="value" use="required" type="xs:string"/>
        <xs:attribute name="selector" use="required" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="groupValueSource">
        <xs:sequence>
            <xs:element name="d" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="id" use="required" type="xs:string"/>
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
            <xs:element name="v" type="xs:string"/>
        </xs:sequence>
        <xs:attribute name="group" use="required" type="xs:string"/>
        <xs:attribute name="value" use="required" type="xs:string"/>
    </xs:complexType>

    <xs:complexType name="cellRefsType">
        <xs:sequence>
            <xs:element name="cell" type="cellRefType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="cellRefType">
        <xs:attribute name="d" use="required" type="xs:integer"/>
        <xs:attribute name="s" use="required" type="xs:integer"/>
        <xs:attribute name="c" use="required" type="xs:integer"/>
        <xs:attribute name="r" use="required" type="xs:integer"/>
    </xs:complexType>
    
    <!-- Schema validations -->
    <xs:complexType name="schemaReportType">
        <xs:sequence>
            <xs:element name="error" type="schemaErrorType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="id" use="required" type="xs:string"/>
        <xs:attribute name="valid" use="required" type="xs:boolean"/>
        <xs:attribute name="errorLimitReached" use="optional" type="xs:boolean"/>
    </xs:complexType>
    
    <xs:complexType name="schemaErrorType">
        <xs:sequence>
            <!-- Workbook cells linked to this error -->
            <xs:element name="cellRefs" type="cellRefsType" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="message" use="optional" type="xs:string"/>
    </xs:complexType>
</xs:schema>