<StructureDefinition xmlns="http://hl7.org/fhir">
  <id value="KPI-dotbase" />
  <url value="https://simplifier.net/kpi-dotbase/KPI" />
  <version value="0.0.1" />
  <name value="KPI" />
  <title value="KPI Definition" />
  <status value="draft" />
  <experimental value="true" />
  <date value="2024-03-09" />
  <publisher value="dotbase" />
  <description value="This profile defines KPI as a profile of the FHIR Observation" />
  <fhirVersion value="4.0.1" />
  <kind value="resource" />
  <abstract value="false" />
  <type value="Observation" />
  <baseDefinition value="http://hl7.org/fhir/StructureDefinition/Observation" />
  <derivation value="constraint" />
  <differential>
    <element id="Observation.basedOn">
      <path value="Observation.basedOn" />
      <max value="0" />
    </element>
    <element id="Observation.partOf">
      <path value="Observation.partOf" />
      <max value="0" />
    </element>
    <element id="Observation.category">
      <path value="Observation.category" />
      <comment value="A category for a general KPI should be provided. Additionally more sub-categories of the KPI can be added." />
      <min value="1" />
      <max value="*" />
      <constraint>
        <key value="Observation-category" />
        <severity value="error" />
        <human value="At least one category code must be 'Observation'" />
        <expression value="category.where(coding.code='Observation').exists()" />
      </constraint>
    </element>
    <element id="Observation.subject">
      <path value="Observation.subject" />
      <comment value="FHIR R4 does not support organization references in &quot;subject&quot;, this changes with R5." />
      <max value="0" />
    </element>
    <element id="Observation.focus">
      <path value="Observation.focus" />
      <comment value="Used to reference the organization in regard to the KPI. FHIR R4 does not support organization references in &quot;subject&quot;, this changes with R5." />
      <min value="1" />
      <max value="1" />
      <type>
        <code value="Reference" />
        <targetProfile value="http://hl7.org/fhir/StructureDefinition/Organization" />
      </type>
    </element>
    <element id="Observation.encounter">
      <path value="Observation.encounter" />
      <max value="0" />
    </element>
    <element id="Observation.effective[x]">
      <path value="Observation.effective[x]" />
      <comment value="Observation period of the KPI" />
      <min value="1" />
      <max value="1" />
      <type>
        <code value="Period" />
      </type>
    </element>
    <element id="Observation.effective[x].start">
      <path value="Observation.effective[x].start" />
      <min value="1" />
      <max value="1" />
    </element>
    <element id="Observation.performer">
      <path value="Observation.performer" />
      <comment value="If the observing organization of the KPI differs to the one provided in &quot;focus&quot;, an observing organization can be referenced." />
      <min value="0" />
      <max value="1" />
      <type>
        <code value="Reference" />
        <targetProfile value="http://hl7.org/fhir/StructureDefinition/Organization" />
      </type>
    </element>
    <element id="Observation.value[x]">
      <path value="Observation.value[x]" />
      <comment value="Value of type valueQuantity of the KPI" />
      <min value="0" />
      <max value="1" />
      <type>
        <code value="Quantity" />
      </type>
      <constraint>
        <key value="value-or-dataAbsentReason" />
        <severity value="error" />
        <human value="Either valueQuantity or dataAbsentReason should be present" />
        <expression value="exists(%resource.valueQuantity) or exists(%resource.dataAbsentReason)" />
      </constraint>
    </element>
    <element id="Observation.dataAbsentReason">
      <path value="Observation.dataAbsentReason" />
      <comment value="If value creation failed, a reason for the absent must be provided" />
      <min value="0" />
      <max value="1" />
    </element>
    <element id="Observation.bodySite">
      <path value="Observation.bodySite" />
      <max value="0" />
    </element>
    <element id="Observation.specimen">
      <path value="Observation.specimen" />
      <max value="0" />
    </element>
    <element id="Observation.device">
      <path value="Observation.device" />
      <max value="0" />
    </element>
    <element id="Observation.referenceRange">
      <path value="Observation.referenceRange" />
      <comment value="In context of KPIs this property provides information about key values or ranges of the KPI" />
      <min value="0" />
      <max value="*" />
    </element>
    <element id="Observation.referenceRange.type">
      <path value="Observation.referenceRange.type" />
      <comment value="Type of the referenceRange, e.g. range, baseline, target" />
      <min value="1" />
      <max value="1" />
    </element>
    <element id="Observation.referenceRange.text">
      <path value="Observation.referenceRange.text" />
      <comment value="Description about the referenceRange" />
      <min value="0" />
      <max value="1" />
    </element>
    <element id="Observation.component">
      <path value="Observation.component" />
      <max value="0" />
    </element>
  </differential>
</StructureDefinition>