CH ORF (R4)
2.0.0-ballot - ballot Switzerland flag

This page is part of the CH ORF (R4) (v2.0.0-ballot: STU 2 Ballot 1) based on FHIR R4. This is the current published version in its permanent home (it will always be available at this URL). For a full list of available versions, see the Directory of published versions

StructureMap: Map ORF

Official URL: http://fhir.ch/ig/ch-orf/StructureMap/OrfQrToBundle Version: 2.0.0-ballot
Draft as of 2023-06-29 Computable Name: OrfQrToBundle

Copyright/Legal: CC0-1.0

map "http://fhir.ch/ig/ch-orf/StructureMap/OrfQrToBundle" = "OrfQrToBundle"

//
// ORF QuestionnaireResponse to Bundle
// 2021-01-11 Oliver Egger, copyright ahdis ag, Apache License 
// QRF Questionnaire: http://fhir.ch/ig/ch-orf/Questionnaire-order-referral-form.html
// QRF QuestionnaireResponse: http://fhir.ch/ig/ch-orf/QuestionnaireResponse-order-referral-form.xml.html
// Bundle: http://fhir.ch/ig/ch-orf/StructureDefinition-ch-orf-document.html

uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QuestionnaireResponse as source
uses "http://hl7.org/fhir/StructureDefinition/BackboneElement" alias BackboneElement as source
uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target
uses "http://hl7.org/fhir/StructureDefinition/Composition" alias Composition as target
uses "http://hl7.org/fhir/StructureDefinition/Patient" alias Patient as target
uses "http://hl7.org/fhir/StructureDefinition/RelatedPerson" alias RelatedPerson as target
uses "http://hl7.org/fhir/StructureDefinition/Organization" alias Organization as target
uses "http://hl7.org/fhir/StructureDefinition/Practitioner" alias Practitioner as target
uses "http://hl7.org/fhir/StructureDefinition/PractitionerRole" alias PractitionerRole as target
uses "http://hl7.org/fhir/StructureDefinition/ServiceRequest" alias ServiceRequest as target
uses "http://hl7.org/fhir/StructureDefinition/Extension" alias Extension as target
uses "http://hl7.org/fhir/StructureDefinition/EpisodeOfCare" alias EpisodeOfCare as target
uses "http://hl7.org/fhir/StructureDefinition/QuestionnaireResponse" alias QuestionnaireResponseTarget as target

group OrfQrToBundle(source qr : QuestionnaireResponse, target bundle : Bundle ) {
      qr -> bundle.identifier as documentIdentifier, documentIdentifier.system = 'urn:ietf:rfc:3986',  uuid() as uuidDoc, documentIdentifier.value = append('urn:uuid:', uuidDoc) "documentIdentifier";
      qr as qrcp -> bundle.entry as e, 
             e.resource = create('Composition') as composition, 
             composition.id = uuid() as uuid,
             e.fullUrl = append('urn:uuid:',uuid),
             bundle.entry as e2, 
             bundle.timestamp = (now()) as timestamp,
             composition.date = timestamp,
             composition.title = 'Order and Referral by Form',
             composition.type as type, type.coding as coding, coding.code = '419891008', coding.system = 'http://snomed.info/sct',
             composition.category as category, category.coding as coding, coding.code = '721963009', coding.system = 'http://snomed.info/sct',
             e2.resource = create('Patient') as patient,
             patient.id = uuid() as uuid2,
             e2.fullUrl = append('urn:uuid:',uuid2),
             bundle.entry as e4, 
             e4.resource = qrcp as questionnaireresp,
             questionnaireresp.id = uuid() as uuid4,
             e4.fullUrl = append('urn:uuid:',uuid4),
             bundle.entry as e5, 
             e5.resource = create('ServiceRequest') as servicerequest, 
             servicerequest.id = uuid() as uuid5,
             e5.fullUrl = append('urn:uuid:',uuid5) then {
               qr.questionnaire as can -> bundle.entry as e6, e6.resource = (can.resolve()) as q, q.id = uuid() as uuid6, e6.fullUrl = append('urn:uuid:',uuid6) then QrToBundle(qr, q, patient, questionnaireresp, servicerequest, composition, bundle) "orfbundle";
             } "orfbundle";
}

group QrToGroups(source qr : QuestionnaireResponse, target patient : Patient, target bundle: Bundle, target composition : Composition, target serviceRequest: ServiceRequest) {
    qr.item as grp where linkId='order' then OrderItems(grp, bundle, composition, serviceRequest) "grporder";
    qr.item as grp where linkId='receiver' then ReceiverInit(grp, bundle, composition, serviceRequest) "receiver";
    qr.item as grp where linkId='initiator' then InitiatorInit(grp, bundle, patient, composition, serviceRequest) "grpinitiator";
    qr.item as grp where linkId='patient' then PatientItems(grp, bundle, patient, composition, serviceRequest) "grppatient";
    qr.item as grp where linkId='requestedEncounter' then RequestedEncounterItems(grp, bundle, patient, serviceRequest) "grprequestedencounter";
    qr.item as grp where linkId='coverage' then Coverage(grp, bundle, patient, serviceRequest) "grprequestedencounter";
    qr.item as grp where linkId='sender' then SenderAuthorInit(grp, bundle, composition, serviceRequest) "grpsender";
    qr.item as grp where linkId='receiverCopy' then ReceiverCopy(grp, bundle, patient, composition, serviceRequest) "receiverCopy";
    qr.item as grp where linkId='appointment' then Appointment(grp, bundle, composition, serviceRequest) "appointment";
    qr.item as grp where linkId='previousResults' then PreviousResults(grp, bundle, serviceRequest) "previousResults";
    qr.item as grp where linkId='antecedentEpisodeOfCare' then AntecedentEpisodeOfCareInit(grp, bundle, patient, composition) "AntecedentEpisodeOfCareInit";
    qr.item as grp where linkId='consent' then Consent(grp, bundle, composition) "consent";
    qr.item as grp where linkId='note' then Note(grp, serviceRequest) "note";
}

group OrderItems(source src : BackboneElement, target bundle: Bundle, target composition, target serviceRequest : ServiceRequest) {

  src.item as item where (linkId.value = 'order.precedentDocumentIdentifier' and answer.exists())   -> composition.extension as ext, ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-precedentdocument',
                                                                        ext.value = create('Identifier') as value, value.system='urn:ietf:rfc:3986', value.value=('urn:uuid:'+item.answer.valueString) "order.precedentDocumentIdentifier"; 

  src.item as item where (linkId.value = 'order.placerOrderIdentifier' and answer.exists()) -> serviceRequest.identifier as value share placer, 
                                                                                   value.type as type, type.coding as coding,
                                                                                   coding.system = 'http://terminology.hl7.org/CodeSystem/v2-0203',
                                                                                   coding.code = 'PLAC',
                                                                                   value.value=(item.answer.valueString) "order.placerOrderIdentifier"; 
  src.item as item where (linkId.value = 'order.placerOrderIdentifierDomain' and answer.exists()) -> serviceRequest.identifier as value share placer, 
                                                                                   value.system=(item.answer.valueString) "order.placerOrderIdentifierDomain"; 
  src.item as item where (linkId.value = 'order.fillerOrderIdentifier' and answer.exists()) -> serviceRequest.identifier as value share filler, 
                                                                                   value.type as type, type.coding as coding,
                                                                                   coding.system = 'http://terminology.hl7.org/CodeSystem/v2-0203',
                                                                                   coding.code = 'FILL',
                                                                                   value.value=(item.answer.valueString) "order.fillerOrderIdentifier"; 
  src.item as item where (linkId.value = 'order.fillerOrderIdentifierDomain' and answer.exists()) -> serviceRequest.identifier as value share filler, 
                                                                                   value.system=(item.answer.valueString) "order.fillerOrderIdentifierDomain"; 

  src.item as item where (linkId.value = 'order.dateTime' and answer.exists()) -> serviceRequest.authoredOn = (item.answer.value);

  src.item as item where (linkId.value = 'order.priority' and answer.exists()) -> serviceRequest.priority = (item.answer.value.code);

  src.item as item where (linkId.value = 'order.notificationContactDocument') then {
      item -> bundle.entry as e4, 
               e4.resource = create('PractitionerRole') as practitionerRoleDataEnterer, 
               practitionerRoleDataEnterer.id = uuid() as uuid4,
               e4.fullUrl = append('urn:uuid:',uuid4),
               composition.extension as extension,
               bundle.entry as e5, 
               e5.resource = create('Practitioner') as practitionerDataEnterer, 
               practitionerDataEnterer.id = uuid() as uuid5,
               e5.fullUrl = append('urn:uuid:',uuid5),
               practitionerRoleDataEnterer.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid5)
//   ,
// FIXME not known here               practitionerRoleDataEnterer.organization = create('Reference') as reference, reference.type='Organization', reference.reference = append('urn:uuid:',uuid3) 
               then {
                     item then UrgentNotificationContactForRequestItems(item, practitionerRoleDataEnterer, practitionerDataEnterer) "data";
                     item then ExtOrfUrgentNotificationContactForRequest(item, practitionerRoleDataEnterer, extension) "extension";
                  } "order.notificationContactDocument.items";
      } "order.notificationContactDocument";
   
   src.item as item where (linkId.value = 'order.notificationContactDocumentResponse') then {
      item -> bundle.entry as e4, 
               e4.resource = create('PractitionerRole') as practitionerRoleDataEnterer, 
               practitionerRoleDataEnterer.id = uuid() as uuid4,
               e4.fullUrl = append('urn:uuid:',uuid4),
               composition.extension as extension,
               bundle.entry as e5, 
               e5.resource = create('Practitioner') as practitionerDataEnterer, 
               practitionerDataEnterer.id = uuid() as uuid5,
               e5.fullUrl = append('urn:uuid:',uuid5),
               practitionerRoleDataEnterer.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid5)
// ,
// FIXME not known here practitionerRoleDataEnterer.organization = create('Reference') as reference, reference.type='Organization', reference.reference = append('urn:uuid:',uuid3) 
               then {
                     item then UrgentNotificationContactForResponseItems(item, practitionerRoleDataEnterer, practitionerDataEnterer) "data";
                     item then ExtOrfUrgentNotificationContactForResponse(item, practitionerRoleDataEnterer, extension) "extension";
                  } "order.notificationContactDocumentResponse.items";
      } "order.notificationContactDocumentResponse";
}

group UrgentNotificationContactForRequestPractitionerItems(source src : BackboneElement, target practitioner: Practitioner) {
   src.item as item where (linkId.value = 'order.notificationContactDocument.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'order.notificationContactDocument.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'order.notificationContactDocument.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "sender.author.practitioner.title"; 
     src.item as item where (linkId.value = 'order.notificationContactDocument.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.phone"; 
   src.item as item where (linkId.value = 'order.notificationContactDocument.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.email"; 
}

group UrgentNotificationContactForRequestItems(source src : BackboneElement, target practitionerRole: practitionerRole, target practitioner : Practitioner) {
   src.item as item where (linkId.value = 'order.notificationContactDocument.practitioner') then UrgentNotificationContactForRequestPractitionerItems(item, practitioner);
}

group ExtOrfUrgentNotificationContactForRequest(source src: BackboneElement, target practitionerRole: PractitionerRole, target ext: Extension) {
  src -> ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-urgentnoficationcontactforthisdocument' "url";
  src -> ext.value = create('Reference') as reference, 
                reference.reference = ('urn:uuid:'+%practitionerRole.id) "practitionerRole";
}

group UrgentNotificationContactForResponsePractitionerItems(source src : BackboneElement, target practitioner: Practitioner) {
   src.item as item where (linkId.value = 'order.notificationContactDocumentResponse.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'order.notificationContactDocumentResponse.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'order.notificationContactDocumentResponse.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "sender.author.practitioner.title"; 
     src.item as item where (linkId.value = 'order.notificationContactDocumentResponse.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.phone"; 
   src.item as item where (linkId.value = 'order.notificationContactDocumentResponse.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.email"; 
}

group UrgentNotificationContactForResponseItems(source src : BackboneElement, target practitionerRole: practitionerRole, target practitioner : Practitioner) {
   src.item as item where (linkId.value = 'order.notificationContactDocumentResponse.practitioner') then UrgentNotificationContactForResponsePractitionerItems(item, practitioner);
}

group ExtOrfUrgentNotificationContactForResponse(source src: BackboneElement, target practitionerRole: PractitionerRole, target ext: Extension) {
  src -> ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-urgentnoficationcontactfortheresponsetothisdocument' "url";
  src -> ext.value = create('Reference') as reference, 
                 reference.reference = ('urn:uuid:'+%practitionerRole.id) "practitionerRole";
}


group ReceiverPractitionerItems(source src : BackboneElement, target practitioner : Practitioner) {
   src.item as item where (linkId.value = 'receiver.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'receiver.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'receiver.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "receiver.practitioner.title"; 
   src.item as item where (linkId.value = 'receiver.practitioner.gln' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "receiver.practitioner.gln"; 
   src.item as item where (linkId.value = 'receiver.practitioner.zsr' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "receiver.practitioner.zsr"; 
   src.item as item where (linkId.value = 'receiver.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "receiver.practitioner.phone"; 
   src.item as item where (linkId.value = 'receiver.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "receiver.practitioner.email"; 
}

group ReceiverOrganizationItems(source src : BackboneElement, target organization : Organization) {
   src.item as item where (linkId.value = 'receiver.organization.name' and answer.exists()) -> organization.name = (item.answer.value);
   src.item as item where (linkId.value = 'receiver.organization.gln' and answer.exists()) -> organization.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "receiver.organization.gln";
   src.item as item where (linkId.value = 'receiver.organization.zsr' and answer.exists()) -> organization.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "receiver.organization.zsr"; 
   src.item as item where (linkId.value = 'receiver.organization.streetAddressLine' and answer.exists()) -> organization.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "receiver.organization.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'receiver.organization.postalCode' and answer.exists()) -> organization.address as address share orgAddress, address.postalCode = (item.answer.value) "receiver.organization.postalCode";
   src.item as item where (linkId.value = 'receiver.organization.city' and answer.exists()) -> organization.address as address share orgAddress, address.city = (item.answer.value) "receiver.organization.city";
   src.item as item where (linkId.value = 'receiver.organization.country' and answer.exists()) -> organization.address as address share orgAddress, address.country = (item.answer.value) "receiver.organization.country";
}

group ReceiverItems(source src : BackboneElement, target bundle: Bundle, target practitionerRole: practitionerRole) {
   src.item as item where (linkId.value = 'receiver.practitioner') -> 
      bundle.entry as e2, 
      e2.resource = create('Practitioner') as practitioner, 
      practitioner.id = uuid() as uuid2,
      practitionerRole.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid2),
      e2.fullUrl = append('urn:uuid:',uuid2) then ReceiverPractitionerItems(item, practitioner);
   src.item as item where (linkId.value = 'receiver.organization') ->
     bundle.entry as e3, 
     e3.resource = create('Organization') as organization, 
     organization.id = uuid() as uuid3,
     practitionerRole.organization = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid3), 
     e3.fullUrl = append('urn:uuid:',uuid3) then ReceiverOrganizationItems(item, organization);
}

group Consent(source src : BackboneElement, target bundle: Bundle, target composition : Composition) {
   src.item as item where (linkId.value = 'consent.statement' and answer.exists()) -> bundle.entry as e, 
          e.resource = create('Consent') as consent,
          consent.status = 'active', 
          consent.scope as scope, scope.coding as coding, coding.code = 'treatment', coding.system= 'http://terminology.hl7.org/CodeSystem/consentscope',
          consent.category as category, category.coding as coding, coding.code = '59284-0', coding.system= 'http://loinc.org',
          consent.policyRule as policyRule, policyRule.coding as coding, coding.code = '385432009', coding.system= 'http://snomed.info/sct',
          consent.id = uuid() as uuid,
          e.fullUrl = append('urn:uuid:',uuid),
          composition.extension as ext, 
          ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-patientconsent',
          ext.value = create('Reference') as reference, 
          consent.extension as extcode,
          extcode.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-consentcode',
          extcode.value = create('CodeableConcept') as cc, cc.coding = (item.answer.value),
          reference.reference = append('urn:uuid:',uuid) then {
            item.answer as answer then {
               answer.item as item where (linkId.value = 'consent.statement.note' and answer.exists())
               -> consent.extension as extnote,
                  extnote.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-consentnote',
                  extnote.value = (item.answer.value) "consent.statement.note";
            } "item.answer";
          } "consent.statement";
}

group ReceiverInit(source src : BackboneElement, target bundle: Bundle, target composition : Composition, target serviceRequest: ServiceRequest) {
   src -> bundle.entry as e, 
          e.resource = create('PractitionerRole') as practitionerRole, 
          practitionerRole.id = uuid() as uuid,
          e.fullUrl = append('urn:uuid:',uuid),
          composition.extension as ext, 
          ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-receiver',
          ext.value = create('Reference') as reference, 
          reference.reference = append('urn:uuid:',uuid) then
          ReceiverItems(src, bundle, practitionerRole) "receiver";
}

group InitiatorItems(source src : BackboneElement, target bundle: Bundle, target patient: Patient, target ext: Extension) {
   src.item as item where (linkId.value = 'initiator.personalrelation' and answer.exists()) -> 
      ext.extension as extension, 
      extension.url = 'ch-orf-personalrelation', 
      extension.value = (item.answer.value) "initiator.personalrelation";
   src.item as item where (linkId.value = 'initiator.legalrelation' and answer.exists()) -> 
      ext.extension as extension, 
      extension.url = 'ch-orf-legalrelation', 
      extension.value = (item.answer.value) "initiator.legalrelation";
   src.item as item where (linkId='initiator.practitionerRole') -> bundle.entry as e4, 
      e4.resource = create('PractitionerRole') as practitionerrole, 
      ext.extension as extension,
      practitionerrole.id = uuid() as uuid4,
      extension.url = 'ch-orf-personorganization',
      extension.value =  create('Reference') as reference, 
      reference.reference = append('urn:uuid:',uuid4),
      e4.fullUrl = append('urn:uuid:',uuid4) then {
         item then InitiatorPractitionerRoleItems(item, bundle, practitionerrole) "data";
      } "InitiatorPractitionerRoleItems";
   src.item as item where (linkId='initiator.relatedPerson') -> bundle.entry as e4, 
            e4.resource = create('RelatedPerson') as relatedPerson,
            ext.extension as extension, 
            extension.url = 'ch-orf-personorganization',
            extension.value =  create('Reference') as reference, 
            relatedPerson.id = uuid() as uuid4,
            reference.reference = append('urn:uuid:',uuid4),
            relatedPerson.patient as reference,
            reference.reference = ('urn:uuid:'+%patient.id),
            e4.fullUrl = append('urn:uuid:',uuid4) then {
               item then InitiatorRelatedPersonItems(item, relatedPerson) "data";
            } "initiator.relatedPerson";
}

group InitiatorRelatedPersonItems(source src : BackboneElement, target relatedPerson: RelatedPerson) {
   src.item as item where (linkId.value = 'initiator.relatedPerson.familyName' and answer.exists()) -> relatedPerson.name as name share name, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'initiator.relatedPerson.givenName' and answer.exists()) -> relatedPerson.name as name share name, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'initiator.relatedPerson.phone' and answer.exists()) then {
      item.answer as answer -> relatedPerson.telecom as value, value.system = 'phone',
                                value.value= (answer.value) "initiator.relatedPerson.phone"; 
   } "phone";
   src.item as item where (linkId.value = 'initiator.relatedPerson.email' and answer.exists()) -> relatedPerson.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "initiator.relatedPerson.email"; 
   src.item as item where (linkId.value = 'initiator.relatedPerson.streetAddressLine' and answer.exists()) -> relatedPerson.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "initiator.relatedPerson.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'initiator.relatedPerson.postalCode' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.postalCode = (item.answer.value) "initiator.relatedPerson.postalCode";
   src.item as item where (linkId.value = 'initiator.relatedPerson.city' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.city = (item.answer.value) "initiator.relatedPerson.city";
   src.item as item where (linkId.value = 'initiator.relatedPerson.country' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.country = (item.answer.value) "initiator.relatedPerson.country";
}


group InitiatorPractitionerRoleItems(source src : BackboneElement, target bundle: Bundle, target practitionerRole: practitionerRole) {
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner') -> 
      bundle.entry as e2, 
      e2.resource = create('Practitioner') as practitioner, 
      practitioner.id = uuid() as uuid2,
      practitionerRole.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid2),
      e2.fullUrl = append('urn:uuid:',uuid2) then InitiatorPractitionerItems(item, practitioner);
   src.item as item where (linkId.value = 'initiator.practitionerRole.organization') ->
     bundle.entry as e3, 
     e3.resource = create('Organization') as organization, 
     organization.id = uuid() as uuid3,
     practitionerRole.organization = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid3), 
     e3.fullUrl = append('urn:uuid:',uuid3) then InitiatorOrganizationItems(item, organization);
}

group InitiatorPractitionerItems(source src : BackboneElement, target practitioner : Practitioner) {
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "initiator.practitionerRole.practitioner.title"; 
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "initiator.practitionerRole.practitioner.phone"; 
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "initiator.practitionerRole.practitioner.email"; 
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.gln' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "receiver.practitioner.gln"; 
   src.item as item where (linkId.value = 'initiator.practitionerRole.practitioner.zsr' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "receiver.practitioner.zsr"; 
}

group InitiatorOrganizationItems(source src : BackboneElement, target organization : Organization) {
   src.item as item where (linkId.value = 'initiator.practitionerRole.organization.name' and answer.exists()) -> organization.name = (item.answer.value);
   src.item as item where (linkId.value = 'initiator.practitionerRole.organization.streetAddressLine' and answer.exists()) -> organization.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "initiator.practitionerRole.organization.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'initiator.practitionerRole.organization.postalCode' and answer.exists()) -> organization.address as address share orgAddress, address.postalCode = (item.answer.value) "initiator.practitionerRole.organization.postalCode";
   src.item as item where (linkId.value = 'initiator.practitionerRole.organization.city' and answer.exists()) -> organization.address as address share orgAddress, address.city = (item.answer.value) "initiator.practitionerRole.organization.city";
   src.item as item where (linkId.value = 'initiator.practitionerRole.organization.country' and answer.exists()) -> organization.address as address share orgAddress, address.country = (item.answer.value) "initiator.practitionerRole.organization.country";
}

group FamilyDoctorInit(source src : BackboneElement, target bundle: Bundle, target patient: Patient, target composition : Composition, target serviceRequest: ServiceRequest) {
  src -> bundle.entry as e4, 
  e4.resource = create('PractitionerRole') as practitionerRole,
  practitionerRole.id = uuid() as uuid4,
  patient.generalPractitioner = create('Reference') as gp, 
  gp.reference = append('urn:uuid:',uuid4),
  e4.fullUrl = append('urn:uuid:',uuid4) then {
     src.item as item where (linkId.value = 'familydoctor.practitioner') -> 
     bundle.entry as e2, 
     e2.resource = create('Practitioner') as practitioner, 
    practitioner.id = uuid() as uuid2,
     practitionerRole.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid2),
     e2.fullUrl = append('urn:uuid:',uuid2) then FamilyDoctorPractitionerItems(item, practitioner);

     src.item as item where (linkId.value = 'familydoctor.organization') ->
     bundle.entry as e3, 
     e3.resource = create('Organization') as organization, 
     organization.id = uuid() as uuid3,
     practitionerRole.organization = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid3), 
     e3.fullUrl = append('urn:uuid:',uuid3) then FamilyDoctorOrganizationItems(item, organization);
 } "FamilyDoctorInit";
}

group FamilyDoctorPractitionerItems(source src : BackboneElement, target practitioner : Practitioner) {
   src.item as item where (linkId.value = 'familydoctor.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'familydoctor.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'familydoctor.practitioner.gln' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "familydoctor.practitioner.gln"; 
   src.item as item where (linkId.value = 'familydoctor.practitioner.zsr' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "familydoctor.practitioner.zsr"; 
   src.item as item where (linkId.value = 'familydoctor.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "familydoctor.practitioner.title"; 
   src.item as item where (linkId.value = 'familydoctor.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "familydoctor.practitioner.phone"; 
   src.item as item where (linkId.value = 'familydoctor.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "familydoctor.practitioner.email"; 
}

group FamilyDoctorOrganizationItems(source src : BackboneElement, target organization : Organization) {
   src.item as item where (linkId.value = 'familydoctor.organization.name' and answer.exists()) -> organization.name = (item.answer.value);
   src.item as item where (linkId.value = 'familydoctor.organization.streetAddressLine' and answer.exists()) -> organization.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "familydoctor.organization.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'familydoctor.organization.postalCode' and answer.exists()) -> organization.address as address share orgAddress, address.postalCode = (item.answer.value) "familydoctor.organization.postalCode";
   src.item as item where (linkId.value = 'familydoctor.organization.city' and answer.exists()) -> organization.address as address share orgAddress, address.city = (item.answer.value) "familydoctor.organization.city";
   src.item as item where (linkId.value = 'familydoctor.organization.country' and answer.exists()) -> organization.address as address share orgAddress, address.country = (item.answer.value) "familydoctor.organization.country";
   src.item as item where (linkId.value = 'familydoctor.organization.gln' and answer.exists()) -> organization.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "familydoctor.organization.gln";
   src.item as item where (linkId.value = 'familydoctor.organization.zsr' and answer.exists()) -> organization.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "familydoctorr.organization.zsr"; 
}

group AntecedentEpisodeOfCareInit(source src : BackboneElement, target bundle: Bundle, target patient: Patient, target composition : Composition) {
   src -> composition.extension as ext, 
          ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-antecedentepisodeofcare',
          bundle.entry as e4, 
          e4.resource = create('EpisodeOfCare') as episodeofcare, 
          episodeofcare.id = uuid() as uuid4,
          e4.fullUrl = ('urn:uuid:'+%uuid4),
          episodeofcare.status = 'finished',
          ext.value = create('Reference') as ref, ref.reference = ('urn:uuid:'+%episodeofcare.id)
          then AntecedentEpisodeOfCareItems(src, bundle, patient, episodeofcare) "AntecedentEpisodeOfCareItems";
}

group AntecedentEpisodeOfCareItems(source src : BackboneElement, target bundle: Bundle, target tgt: Patient, target episodeofcare : EpisodeOfCare) {
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.start' and answer.exists()) -> episodeofcare.statusHistory as statusHistory, statusHistory.status='finished', statusHistory.period as period, period.start = (item.answer.value), period.end = (item.answer.value) then {
        src.item as iteme where (linkId.value = 'antecedentEpisodeOfCare.end' and answer.exists()) -> period.end = (iteme.answer.value) "antecedentEpisodeOfCareEndNotSameAsStart";
   } "antecedentEpisodeOfCare.requestedPeriod.start";
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.managingOrganization') -> 
      bundle.entry as e3, 
          e3.resource = create('Organization') as organization, 
          organization.id = uuid() as uuid3,
          e3.fullUrl = append('urn:uuid:',uuid3),
          episodeofcare.patient = create('Reference') as reference, reference.reference = ('urn:uuid:'+%tgt.id),
          episodeofcare.managingOrganization = create('Reference') as reference, 
          reference.reference = append('urn:uuid:',uuid3) then AntecedentEpisodeOfCareOrganizationItems(item, organization) "antecedentEpisodeOfCare.managingOrganization";
}

group AntecedentEpisodeOfCareOrganizationItems(source src : BackboneElement, target organization : Organization) {
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.managingOrganization.name' and answer.exists()) -> organization.name = (item.answer.value);
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.managingOrganization.streetAddressLine' and answer.exists()) -> organization.address as address share orgAddress then {
      item.answer as answer -> address.line = (answer.value) "antecedentEpisodeOfCareorganization.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.managingOrganization.postalCode' and answer.exists()) -> organization.address as address share orgAddress, address.postalCode = (item.answer.value) "sender.author.organization.postalCode";
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.managingOrganization.city' and answer.exists()) -> organization.address as address share orgAddress, address.city = (item.answer.value) "sender.author.organization.city";
   src.item as item where (linkId.value = 'antecedentEpisodeOfCare.managingOrganization.country' and answer.exists()) -> organization.address as address share orgAddress, address.country = (item.answer.value) "sender.author.organization.country";
}

group InitiatorInit(source src : BackboneElement, target bundle: Bundle, target patient: Patient, target composition : Composition, target serviceRequest: ServiceRequest) {
   src -> composition.extension as ext, 
          ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-initiator'
          then InitiatorItems(src, bundle, patient, ext) "receiver";
}

group PatientItems(source src : BackboneElement, target bundle: Bundle, target tgt: Patient, target composition : Composition, target serviceRequest: ServiceRequest) {
  src.item as grp where linkId='familydoctor' then FamilyDoctorInit(grp, bundle, tgt, composition, serviceRequest) "grpfamily";

  src.item as item then PatientItems(item, bundle, tgt, composition, serviceRequest);
  src.item as item where (linkId.value = 'patient.familyName' and answer.exists()) -> tgt.name as name share patientName,name.family = (item.answer.value);
  src.item as item where (linkId.value = 'patient.maidenName' and answer.exists()) -> tgt.name as name, name.use = 'maiden', name.family = (item.answer.value);
  src.item as item where (linkId.value = 'patient.givenName' and answer.exists()) -> tgt.name as name share patientName, name.given = (item.answer.value);
  src.item as item where (linkId.value = 'patient.localPid' and answer.exists()) -> tgt.identifier as value share localpid, 
                                                                                   value.type as type, type.coding as coding,
                                                                                   coding.system = 'http://terminology.hl7.org/CodeSystem/v2-0203',
                                                                                   coding.code = 'MR',
                                                                                   value.value=(item.answer.valueString) "patient.localPid";
  src.item as item where (linkId.value = 'patient.localPidDomain' and answer.exists()) -> tgt.identifier as value share localpid, 
                                                                                   value.system=(item.answer.valueString) "patient.localPidDomain"; 
  src.item as item where (linkId.value = 'patient.birthDate' and answer.exists()) -> tgt.birthDate = (item.answer.value);
  src.item as item where (linkId.value = 'patient.gender' and answer.exists()) -> tgt.gender = (item.answer.value.code);
  src.item as item where (linkId.value = 'patient.maritalStatus' and answer.exists()) then {
   item.answer as answer then {
      answer.value: Coding as coding -> tgt.maritalStatus as maritalStatus, maritalStatus.coding = coding "maritalStatus"; 
      } "answer";
  } "patient.maritalStatus"; 
  src.item as item where (linkId.value = 'patient.phone' and answer.exists()) then {
   item.answer as answer -> tgt.telecom as value, value.system = 'phone', value.value=(answer.value) "patient.phone";  
  } "patient.phone";
  src.item as item where (linkId.value = 'patient.email' and answer.exists()) -> tgt.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "patient.email"; 
  src.item as item where (linkId.value = 'patient.streetAddressLine' and answer.exists()) -> tgt.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "patient.streetAddressLine";
  } "item.answer";
  src.item as item where (linkId.value = 'patient.postalCode' and answer.exists()) -> tgt.address as address share orgAddress, address.postalCode = (item.answer.value) "patient.postalCode";
  src.item as item where (linkId.value = 'patient.city' and answer.exists()) -> tgt.address as address share orgAddress, address.city = (item.answer.value) "patient.city";
  src.item as item where (linkId.value = 'patient.country' and answer.exists()) -> tgt.address as address share orgAddress, address.country = (item.answer.value) "patient.country";

  src.item as item where (linkId.value = 'patient.languageOfCorrespondence' and answer.exists()) then {
   item.answer as answer then {
      answer.value: Coding as coding -> tgt.communication as communication, communication.preferred = true, communication.language as language, language.coding = coding "languageOfCorrespondence"; 
      } "answer";
  } "patient.languageOfCorrespondence"; 

  src.item as item where (linkId.value = 'patient.contactperson') -> tgt.contact as contact then {
   item.item as item where (linkId.value = 'patient.contactperson.familyName' and answer.exists()) -> contact.name as name share contactName,name.family = (item.answer.value);
   item.item as item where (linkId.value = 'patient.contactperson.givenName' and answer.exists()) -> contact.name as name share contactName, name.given = (item.answer.value);

   src.item as item where (linkId.value = 'patient.contactperson.phone' and answer.exists()) then {
      item.answer as answer -> tgt.telecom as value, value.system = 'phone', value.value=(answer.value) "patient.phone";  
     } "patient.contactperson.phone";
   
   item.item as item where (linkId.value = 'patient.contactperson.email' and answer.exists()) -> contact.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "patient.email"; 
   item.item as item where (linkId.value = 'patient.contactperson.relationship' and answer.exists()) -> contact.relationship as relationship, 
                                                                                   relationship.text=(item.answer.value) "patient.contactperson.relationship"; 
  } "contact";
}

group RequestedEncounterItems(source src : BackboneElement, target bundle: Bundle, target patient: Patient, target serviceRequest : ServiceRequest) {
  src -> bundle.entry as e4, 
                e4.resource = create('Encounter') as encounter, 
                encounter.id = uuid() as uuid4,
                e4.fullUrl = ('urn:uuid:'+%uuid4),
                encounter.status = 'planned',
                serviceRequest.extension as extension,
                encounter.subject = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
                extension.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-requestedencounterdetails',
                extension.value = create('Reference') as reference, reference.reference = ('urn:uuid:'+%uuid4)                
                then {
                  src.item as item where (linkId.value = 'requestedEncounter.class' and answer.exists()) -> 
                      encounter.class = (item.answer.value) "requestedEncounter.class";
                  src.item as item where (linkId.value = 'requestedEncounter.desiredAccommodation' and answer.exists()) -> 
                      encounter.extension as extension,
                      extension.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-desiredaccommodation', 
                      extension.value = (item.answer.value) "requestedEncounter.desiredAccommodation";
   } "RequestedEncounterItems";
 }

 group Coverage(source src : BackboneElement, target bundle: Bundle, target patient: Patient, target serviceRequest : ServiceRequest) {
// coverage.beneficiary
// coverage.beneficiary.ahvn13
     src.item as item where where (linkId.value = 'coverage.beneficiary') then {
      item.item as item where (linkId.value = 'coverage.beneficiary.ahvn13' and answer.exists()) -> 
         patient.identifier as identifier, identifier.system = 'urn:oid:2.16.756.5.32', identifier.value = (item.answer.value) "coverage.beneficiary.ahvn13";
     } "coverage.beneficiary";

//   coverage.kvg	
//   coverage.kvg.name	 
//   coverage.kvg.insuranceCardNumber	
      src.item as item where where (linkId.value = 'coverage.kvg') -> bundle.entry as e4, 
      e4.resource = create('Coverage') as coverage, 
      coverage.id = uuid() as uuid4,
      e4.fullUrl = ('urn:uuid:'+%uuid4),
      serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
      coverage.status = 'active',
      coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
      coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'KVG' then {
         item.item as item where (linkId.value = 'coverage.kvg.name' and answer.exists()) ->
           coverage.payor as payor, payor.reference as refcontained, refcontained.value = '#org', 
           coverage.contained = create('Organization') as organization, organization.id = 'org', organization.name = (item.answer.value) "coverage.kvg.name";
         item.item as item where (linkId.value = 'coverage.kvg.insuranceCardNumber' and answer.exists()) ->
           coverage.identifier as identifier, identifier.type as typeid, typeid.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coverageidentifiertype', coding.code = 'VeKa', 
           identifier.value = (item.answer.value) "coverage.kvg.insuranceCardNumber";
      } "coveragekvg";
//   coverage.uvg	Unfallversicherung (nach UVG)	0..1	group		Definition: Coverage.type
//   coverage.uvg.name	Name der Versicherung	0..1	string		Definition: Coverage.payor
//   coverage.uvg.claimNumber	Schadennummer	0..1	string		Definition: Coverage.identifier
   src.item as item where where (linkId.value = 'coverage.uvg') -> bundle.entry as e4, 
      e4.resource = create('Coverage') as coverage, 
      coverage.id = uuid() as uuid4,
      e4.fullUrl = ('urn:uuid:'+%uuid4),
      serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
      coverage.status = 'active',
      coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
      coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'UVG' then {
         item.item as item where (linkId.value = 'coverage.uvg.name' and answer.exists()) ->
           coverage.payor as payor, payor.reference as refcontained, refcontained.value = '#org', 
           coverage.contained = create('Organization') as organization, organization.id = 'org', organization.name = (item.answer.value) "coverage.uvg.name";
         item.item as item where (linkId.value = 'coverage.uvg.claimNumber' and answer.exists()) ->
           coverage.identifier as identifier, identifier.type as typeid, typeid.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coverageidentifiertype', coding.code = 'Claim', 
           identifier.value = (item.answer.value) "coverage.uvg.claimNumber";
      } "coverageuvg";
//  coverage.vvg	Zusatzversicherung (nach VVG)	0..1	group		Definition: Coverage.type
//  coverage.vvg.name	Name der Versicherung	0..1	string		Definition: Coverage.payor
//  coverage.vvg.insuranceCardNumber	Kennnummer der Versichertenkarte	0..1	string		Definition: Coverage.identifier
 src.item as item where where (linkId.value = 'coverage.vvg') -> bundle.entry as e4, 
      e4.resource = create('Coverage') as coverage, 
      coverage.id = uuid() as uuid4,
      e4.fullUrl = ('urn:uuid:'+%uuid4),
      serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
      coverage.status = 'active',
      coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
      coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'VVG' then {
         item.item as item where (linkId.value = 'coverage.vvg.name' and answer.exists()) ->
           coverage.payor as payor, payor.reference as refcontained, refcontained.value = '#org', 
           coverage.contained = create('Organization') as organization, organization.id = 'org', organization.name = (item.answer.value) "coverage.vvg.name";
         item.item as item where (linkId.value = 'coverage.vvg.insuranceCardNumber' and answer.exists()) ->
           coverage.identifier as identifier, identifier.type as typeid, typeid.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coverageidentifiertype', coding.code = 'VeKa', 
           identifier.value = (item.answer.value) "coverage.vvg.insuranceCardNumber";
      } "coveragevvg";

// coverage.iv	Invalidenversicherung (IV)	0..1	group		Definition: Coverage.type
// coverage.iv.verfuegungsnummer
src.item as item where where (linkId.value = 'coverage.iv') -> bundle.entry as e4, 
   e4.resource = create('Coverage') as coverage, 
   coverage.id = uuid() as uuid4,
   e4.fullUrl = ('urn:uuid:'+%uuid4),
   serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
   coverage.status = 'active',
   coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
   coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'IVG' then {
      item.item as item where (linkId.value = 'coverage.iv.verfuegungsnummer' and answer.exists()) ->
      coverage.identifier as identifier, identifier.type as typeid, typeid.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coverageidentifiertype', coding.code = 'IV', 
      identifier.value = (item.answer.value),
      coverage.payor as payor, payor.reference as refcontained, refcontained.value = '#org', 
      coverage.contained = create('Organization') as organization, organization.id = 'org', organization.name = 'IV' "coverage.iv.verfuegungsnummer";
   } "coverageiv";

 // coverage.mv	Militärversicherung (MV)	0..1	group		Definition: Coverage.type
// coverage.mv.versichertennummer
src.item as item where where (linkId.value = 'coverage.mv') -> bundle.entry as e4, 
   e4.resource = create('Coverage') as coverage, 
   coverage.id = uuid() as uuid4,
   e4.fullUrl = ('urn:uuid:'+%uuid4),
   serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
   coverage.status = 'active',
   coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
   coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'MVG' then {
      item.item as item where (linkId.value = 'coverage.mv.versichertennummer' and answer.exists()) ->
      coverage.identifier as identifier, identifier.type as typeid, typeid.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coverageidentifiertype', coding.code = 'MV', 
      identifier.value = (item.answer.value),
      coverage.payor as payor, payor.reference as refcontained, refcontained.value = '#org', 
      coverage.contained = create('Organization') as organization, organization.id = 'org', organization.name = 'MV' "coverage.mv.versichertennummer";
   } "coveragemv";
      
   // coverage.self	Selbstzahler	0..1	group		Definition: Coverage.type
   // coverage.self.familyName	Name	0..1	string		Definition: Coverage.payor
   // coverage.self.givenName	Vorname	0..1	string		Definition: Coverage.payor
   src.item as item where where (linkId.value = 'coverage.self') then {
      
      item.item as item where (linkId.value = 'coverage.self.patient' and answer.exists() and answer.value) ->
         bundle.entry as e4, 
         e4.resource = create('Coverage') as coverage, 
         coverage.id = uuid() as uuid4,
         e4.fullUrl = ('urn:uuid:'+%uuid4),
         serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
         coverage.status = 'active',
         coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
         coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'Self',
         coverage.payor  as subject, subject.reference = ('urn:uuid:'+%patient.id) "payor";

      item.item as item2 where (linkId.value = 'coverage.self.patientRelatedPerson' and answer.exists() and answer.value) then {        
            item.item as item where (linkId.value = 'coverage.self.relatedPerson') ->
            bundle.entry as e5, 
            e5.resource = create('Coverage') as coverage, 
            coverage.id = uuid() as uuid4,
            e5.fullUrl = ('urn:uuid:'+%uuid4),
            serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
            coverage.status = 'active',
            coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
            coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'Self',
            bundle.entry as e6, 
            e6.resource = create('RelatedPerson') as relatedPerson, 
            relatedPerson.id = uuid() as uuid6,
            e6.fullUrl = append('urn:uuid:',uuid6),
            coverage.payor as subject, subject.reference = ('urn:uuid:'+%relatedPerson.id),
            relatedPerson.patient as reference, reference.reference = ('urn:uuid:'+%patient.id)
            then 
              CoverageRelatedPersonItems(item,relatedPerson) "coverage.self.relatedPerson";
      } "coverage.self.patientrelated.";
   } "self";
 
// coverage.other	Anderer Kostenträger	0..1	group		Definition: Coverage.type
// coverage.other.name	Name des Kostenträgers	0..1	string		Definition: Coverage.payor
// coverage.other.id	Beliebige ID	0..1	string		Definition: Coverage.identifier
// coverage.other.id.note TODO
   src.item as item where where (linkId.value = 'coverage.other') -> bundle.entry as e4, 
   e4.resource = create('Coverage') as coverage, 
   coverage.id = uuid() as uuid4,
   e4.fullUrl = ('urn:uuid:'+%uuid4),
   serviceRequest.insurance as insurance, insurance.reference = ('urn:uuid:'+%uuid4),
   coverage.status = 'active',
   coverage.beneficiary = create('Reference') as subject, subject.reference = ('urn:uuid:'+%patient.id),
   coverage.type as type, type.coding as coding, coding.system = 'http://fhir.ch/ig/ch-orf/CodeSystem/ch-orf-cs-coveragetype', coding.code = 'Other' then {
      item.item as item where (linkId.value = 'coverage.other.name' and answer.exists()) ->
      coverage.payor as payor, payor.reference as refcontained, refcontained.value = '#org', 
      coverage.contained = create('Organization') as organization, organization.id = 'org', organization.name = (item.answer.value) "coverage.other.name";
      item.item as item where (linkId.value = 'coverage.other.id' and answer.exists()) ->
      coverage.identifier as identifier, identifier.value = (item.answer.value) "coverage.other.id";
   } "coveragevvg";
}

group CoverageRelatedPersonItems(source src : BackboneElement, target relatedPerson: RelatedPerson) {
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.familyName' and answer.exists()) -> relatedPerson.name as name share name, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.givenName' and answer.exists()) -> relatedPerson.name as name share name, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.phone' and answer.exists()) then {
      item.answer as answer -> relatedPerson.telecom as value, value.system = 'phone',
                                value.value= (answer.value) "coverage.self.relatedPerson.phone"; 
   } "phone";
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.email' and answer.exists()) -> relatedPerson.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "coverage.self.relatedPerson.email"; 
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.streetAddressLine' and answer.exists()) -> relatedPerson.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "coverage.self.relatedPerson.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.postalCode' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.postalCode = (item.answer.value) "coverage.self.relatedPerson.postalCode";
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.city' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.city = (item.answer.value) "coverage.self.relatedPerson.city";
   src.item as item where (linkId.value = 'coverage.self.relatedPerson.country' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.country = (item.answer.value) "coverage.self.relatedPerson.country";
}


group SenderAuthorPractitionerItems(source src : BackboneElement, target practitioner: Practitioner) {
   src.item as item where (linkId.value = 'sender.author.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'sender.author.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'sender.author.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "sender.author.practitioner.title"; 
   src.item as item where (linkId.value = 'sender.author.practitioner.gln' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.gln"; 
   src.item as item where (linkId.value = 'sender.author.practitioner.zsr' and answer.exists()) -> practitioner.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "recsender.author.practitioner.zsr"; 
   src.item as item where (linkId.value = 'sender.author.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.phone"; 
   src.item as item where (linkId.value = 'sender.author.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.email"; 
}

group SenderAuthorOrganizationItems(source src : BackboneElement, target organization: Organization) {
   src.item as item where (linkId.value = 'sender.author.organization.name' and answer.exists()) -> organization.name = (item.answer.value);
   src.item as item where (linkId.value = 'sender.author.organization.gln' and answer.exists()) -> organization.identifier as value, 
                                                                                   value.system = 'urn:oid:2.51.1.3',
                                                                                   value.value=(item.answer.value) "sender.author.organization.gln";
   src.item as item where (linkId.value = 'sender.author.organization.zsr' and answer.exists()) -> organization.identifier as value, 
                                                                                   value.system = 'urn:oid:2.16.756.5.30.1.123.100.2.1.1',
                                                                                   value.value=(item.answer.value) "sender.author.organization.zsr"; 
   src.item as item where (linkId.value = 'sender.author.organization.streetAddressLine' and answer.exists()) -> organization.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "sender.author.organization.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'sender.author.organization.postalCode' and answer.exists()) -> organization.address as address share orgAddress, address.postalCode = (item.answer.value) "sender.author.organization.postalCode";
   src.item as item where (linkId.value = 'sender.author.organization.city' and answer.exists()) -> organization.address as address share orgAddress, address.city = (item.answer.value) "sender.author.organization.city";
   src.item as item where (linkId.value = 'sender.author.organization.country' and answer.exists()) -> organization.address as address share orgAddress, address.country = (item.answer.value) "sender.author.organization.country";
}

group SenderAuthorItems(source src : BackboneElement, target practitionerRole: practitionerRole, target practitioner : Practitioner, target organization: Organization) {
   src.item as item where (linkId.value = 'sender.author.practitioner') then SenderAuthorPractitionerItems(item, practitioner);
   src.item as item where (linkId.value = 'sender.author.organization') then SenderAuthorOrganizationItems(item, organization);
}

group SenderDataEntererPractitionerItems(source src : BackboneElement, target practitioner: Practitioner) {
   src.item as item where (linkId.value = 'sender.dataenterer.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'sender.dataenterer.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'sender.dataenterer.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.phone"; 
   src.item as item where (linkId.value = 'sender.dataenterer.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "sender.author.practitioner.email"; 
}

group SenderDataEntererItems(source src : BackboneElement, target practitionerRole: practitionerRole, target practitioner : Practitioner, target organization: Organization) {
   src.item as item where (linkId.value = 'sender.dataenterer.practitioner') then SenderDataEntererPractitionerItems(item, practitioner);
}

group ChExtEprDataEnterer(source src: BackboneElement, target practitionerRole: PractitionerRole, target ext: Extension) {
  src -> ext.url = 'http://fhir.ch/ig/ch-core/StructureDefinition/ch-ext-epr-dataenterer' "url";
  src -> ext.extension as ext, ext.url='enterer', ext.value = create('Reference') as reference, 
                 reference.reference = ('urn:uuid:'+%practitionerRole.id) "practitionerRole";
}

group SenderAuthorInit(source src : BackboneElement, target bundle: Bundle, target composition : Composition, target serviceRequest: ServiceRequest) {
   src -> bundle.entry as e, 
          e.resource = create('PractitionerRole') as practitionerRole, 
          practitionerRole.id = uuid() as uuid,
          e.fullUrl = append('urn:uuid:',uuid),
          bundle.entry as e2, 
          e2.resource = create('Practitioner') as practitioner, 
          practitioner.id = uuid() as uuid2,
          e2.fullUrl = append('urn:uuid:',uuid2),
          bundle.entry as e3, 
          e3.resource = create('Organization') as organization, 
          organization.id = uuid() as uuid3,
          e3.fullUrl = append('urn:uuid:',uuid3),
          composition.author = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid),
          serviceRequest.requester = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid),
          practitionerRole.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid2),
          practitionerRole.organization = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid3) then {
             src.item as item where (linkId.value = 'sender.author') then SenderAuthorItems(item, practitionerRole, practitioner, organization) "sender.author";
             src.item as item where (linkId.value = 'sender.dataenterer') then {
               item -> bundle.entry as e4, 
                      e4.resource = create('PractitionerRole') as practitionerRoleDataEnterer, 
                      practitionerRoleDataEnterer.id = uuid() as uuid4,
                      e4.fullUrl = append('urn:uuid:',uuid4),
                      composition.extension as extension,
                      bundle.entry as e5, 
                      e5.resource = create('Practitioner') as practitionerDataEnterer, 
                      practitionerDataEnterer.id = uuid() as uuid5,
                      e5.fullUrl = append('urn:uuid:',uuid5),
                      practitionerRoleDataEnterer.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid5),
                      practitionerRoleDataEnterer.organization = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid3) 
                      then {
                            item then SenderDataEntererItems(item, practitionerRoleDataEnterer, practitionerDataEnterer, organization) "data";
                            item then ChExtEprDataEnterer(item, practitionerRoleDataEnterer, extension) "extension";
                         } "sender.dataenterer.items";
             } "sender.dataenterer";
          } "sender";
}

group ReceiverCopyRelatedPersonItems(source src : BackboneElement, target relatedPerson: RelatedPerson) {
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.familyName' and answer.exists()) -> relatedPerson.name as name share name, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.givenName' and answer.exists()) -> relatedPerson.name as name share name, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.phone' and answer.exists()) then {
      item.answer as answer -> relatedPerson.telecom as value, value.system = 'phone',
                                value.value= (answer.value) "receiverCopy.relatedPerson.phone"; 
   } "phone";
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.email' and answer.exists()) -> relatedPerson.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "receiverCopy.relatedPerson.email"; 
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.streetAddressLine' and answer.exists()) -> relatedPerson.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "receiverCopy.relatedPerson.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.postalCode' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.postalCode = (item.answer.value) "receiverCopy.relatedPerson.postalCode";
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.city' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.city = (item.answer.value) "receiverCopy.relatedPerson.city";
   src.item as item where (linkId.value = 'receiverCopy.relatedPerson.country' and answer.exists()) -> relatedPerson.address as address share orgAddress, address.country = (item.answer.value) "receiverCopy.relatedPerson.country";
}

group ReceiverCopyPractitionerItems(source src : BackboneElement, target practitioner : Practitioner) {
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.practitioner.familyName' and answer.exists()) -> practitioner.name as name share practitionerName, name.family = (item.answer.value);
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.practitioner.givenName' and answer.exists()) -> practitioner.name as name share practitionerName, name.given = (item.answer.value);
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.practitioner.title' and answer.exists()) -> practitioner.name as name share practitionerName, 
                                                                        name.prefix = (item.answer.value) as prefix,
                                                                        prefix.extension as ext, ext.url = 'http://hl7.org/fhir/StructureDefinition/iso21090-EN-qualifier',
                                                                        ext.value = create('code') as value, value.value='AC' "receiverCopy.practitionerRole.practitioner.title"; 
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.practitioner.phone' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'phone',
                                                                                   value.value=(item.answer.value) "receiverCopy.practitionerRole.practitioner.phone"; 
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.practitioner.email' and answer.exists()) -> practitioner.telecom as value, 
                                                                                   value.system = 'email',
                                                                                   value.value=(item.answer.value) "receiverCopy.practitionerRole.practitioner.email"; 
}

group ReceiverCopyOrganizationItems(source src : BackboneElement, target organization : Organization) {
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.organization.name' and answer.exists()) -> organization.name = (item.answer.value);
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.organization.streetAddressLine' and answer.exists()) -> organization.address as address share orgAddress then {
     item.answer as answer -> address.line = (answer.value) "receiverCopy.practitionerRole.organization.streetAddressLine";
   } "item.answer";
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.organization.postalCode' and answer.exists()) -> organization.address as address share orgAddress, address.postalCode = (item.answer.value) "receiverCopy.practitionerRole.organization.postalCode";
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.organization.city' and answer.exists()) -> organization.address as address share orgAddress, address.city = (item.answer.value) "receiverCopy.practitionerRole.organization.city";
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.organization.country' and answer.exists()) -> organization.address as address share orgAddress, address.country = (item.answer.value) "receiverCopy.practitionerRole.organization.country";
}

group ReceiverCopyPractitionerRoleItems(source src : BackboneElement, target bundle: Bundle, target practitionerRole: practitionerRole) {
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.practitioner') -> 
      bundle.entry as e2, 
      e2.resource = create('Practitioner') as practitioner, 
      practitioner.id = uuid() as uuid2,
      practitionerRole.practitioner = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid2),
      e2.fullUrl = append('urn:uuid:',uuid2) then ReceiverCopyPractitionerItems(item, practitioner);
   src.item as item where (linkId.value = 'receiverCopy.practitionerRole.organization') ->
     bundle.entry as e3, 
     e3.resource = create('Organization') as organization, 
     organization.id = uuid() as uuid3,
     practitionerRole.organization = create('Reference') as reference, reference.reference = append('urn:uuid:',uuid3), 
     e3.fullUrl = append('urn:uuid:',uuid3) then ReceiverCopyOrganizationItems(item, organization);
}

group ExtOrfCopyReceiverPatient(source src: BackboneElement, target patient: Patient, target ext: Extension) {
  src -> ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-copyreceiver' "url";
  src -> ext.value = create('Reference') as reference, 
                reference.reference = ('urn:uuid:'+%patient.id) "patient";
}

group ExtOrfCopyReceiver(source src: BackboneElement, target res, target ext: Extension) {
  src -> ext.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-copyreceiver' "url";
  src -> ext.value = create('Reference') as reference, 
                reference.reference = ('urn:uuid:'+%res.id) "organization";
}

group ReceiverCopy(source grp : BackboneElement, target bundle: Bundle, target patient: Patient, target composition : Composition, target serviceRequest: ServiceRequest) {
  grp.item as item where (linkId='receiverCopy.practitionerRole') -> bundle.entry as e4, 
            e4.resource = create('PractitionerRole') as practitionerrole, 
            composition.extension as extension,
            practitionerrole.id = uuid() as uuid4,
            e4.fullUrl = append('urn:uuid:',uuid4) then {
               item then ReceiverCopyPractitionerRoleItems(item, bundle, practitionerrole) "data";
               item then ExtOrfCopyReceiver(item, practitionerrole, extension) "extension";
            } "receiverCopyPractitionerRole1";
   grp.item as item where (linkId='receiverCopy.patient') ->  
            composition.extension as extension then {
               item then ExtOrfCopyReceiver(item, patient, extension) "extension";
            } "receiverCopyPractitionerRole2";
   grp.item as item where (linkId='receiverCopy.relatedPerson') -> bundle.entry as e4, 
            e4.resource = create('RelatedPerson') as relatedPerson, 
            composition.extension as extension,
            relatedPerson.id = uuid() as uuid4,
            relatedPerson.patient as reference,
            reference.reference = ('urn:uuid:'+%patient.id),
            e4.fullUrl = append('urn:uuid:',uuid4) then {
               item then ReceiverCopyRelatedPersonItems(item, relatedPerson) "data";
               item then ExtOrfCopyReceiver(item, relatedPerson, extension) "extension";
            } "receiverCopyPractitionerRole3";
}

group Appointment(source grp : BackboneElement, target bundle: Bundle, target composition : Composition, target serviceRequest: ServiceRequest) {
   grp.item -> bundle.entry as e4, 
   e4.resource = create('Appointment') as appointment, 
   appointment.id = uuid() as uuid4,
   e4.fullUrl = ('urn:uuid:'+%uuid4),
   serviceRequest.extension as extension,
   extension.url = 'http://fhir.ch/ig/ch-orf/StructureDefinition/ch-orf-locationandtime',
   extension.value = create('Reference') as reference, reference.reference = ('urn:uuid:'+%uuid4)                
   then {
      grp.item as item where (linkId.value = 'appointment.status' and answer.value.code='proposed') -> appointment.status = (item.answer.value.code) then {
         grp.item as itemp where (linkId.value = 'appointment.requestedPeriod') then {
           itemp.item as item2 where (linkId.value = 'appointment.requestedPeriod.start' and answer.exists()) -> appointment.requestedPeriod as requestedPeriod, requestedPeriod.start = (item2.answer.value), requestedPeriod.end = (item2.answer.value) then {
           itemp.item as item3 where (linkId.value = 'appointment.requestedPeriod.end' and answer.exists()) -> requestedPeriod.end = (item3.answer.value) "appointment.requestedPeriod.end.if.not.same.as.start";
           } "appointment.requestedPeriod.start";
         } "appointment.requestedPeriod";
      } "proposed";
      grp.item as item where (linkId.value = 'appointment.status' and (answer.value.code='pending' or answer.value.code='booked')) -> appointment.status = (item.answer.value.code) then {
         grp.item as itemp where (linkId.value = 'appointment.requestedPeriod') then {
           itemp.item as item2 where (linkId.value = 'appointment.requestedPeriod.start' and answer.exists()) -> appointment.start = (item2.answer.value), appointment.end = (item2.answer.value) then {
           itemp.item as item3 where (linkId.value = 'appointment.requestedPeriod.end' and answer.exists()) -> appointment.end = (item3.answer.value) "appointment.end.if.not.same.as.start";
           } "appointment.start";
         } "appointment.startend";
      } "pendingorbooked";
      grp.item as item where (linkId.value = 'appointment.patientInstruction' and answer.exists()) -> appointment.patientInstruction = (item.answer.value) "appointment.patientInstruction";
      grp.item as item where (linkId.value = 'appointment.location') then {
         item -> bundle.entry as e5, 
         e5.resource = create('Location') as location, 
         location.id = uuid() as uuid5,
         e5.fullUrl = ('urn:uuid:'+%uuid5),
         appointment.participant as participant, participant.status = 'tentative', participant.actor = create('Reference') as actor, actor.reference = ('urn:uuid:'+%location.id) then {
            item.item as item3 where (linkId.value = 'appointment.location.name' and answer.exists()) -> location.name = (item3.answer.value);
            item.item as item3 where (linkId.value = 'appointment.location.phone' and answer.exists()) -> location.telecom as value, value.system = 'phone', value.value=(item3.answer.value) "appointment.location.phone"; 
            item.item as item3 where (linkId.value = 'appointment.location.email' and answer.exists()) -> location.telecom as value, value.system = 'email', value.value=(item3.answer.value) "appointment.location.email"; 
            item.item as item3 where (linkId.value = 'appointment.location.streetAddressLine' and answer.exists()) -> location.address as address share orgAddress then {
               item.answer as answer -> address.line = (answer.value) "line";
            } "appointment.location.streetAddressLine";
            item.item as item3 where (linkId.value = 'appointment.location.postalCode' and answer.exists()) -> location.address as address share orgAddress, address.postalCode = (item3.answer.value) "appointment.location.postalCode";
            item.item as item3 where (linkId.value = 'appointment.location.city' and answer.exists()) -> location.address as address share orgAddress, address.city = (item3.answer.value) "appointment.location.city";
            item.item as item3 where (linkId.value = 'appointment.location.country' and answer.exists()) -> location.address as address share orgAddress, address.country = (item3.answer.value) "appointment.location.country";
         } "location";
      } "appointment.location";
   } "Appointment";
}

group PreviousResults(source grp : BackboneElement, target bundle: Bundle, target serviceRequest: ServiceRequest) {
   grp.item as item where (linkId='previousResults.attachment' and answer.exists()) then {
      item.answer as answer then {
         answer.value: Attachment as attachment -> 
            bundle.entry as e, 
            e.resource = create('Media') as media, 
            media.id = uuid() as uuid,
            media.status = 'completed',
            e.fullUrl = append('urn:uuid:',uuid), 
            media.content = attachment,
            serviceRequest.supportingInfo as supportingInfo,
            supportingInfo.reference = ('urn:uuid:'+uuid)
            "media"; 
      } "answer";
   } "item";
}

group Note(source grp : BackboneElement, target serviceRequest: ServiceRequest) {
   grp.item as item where (linkId='note.text' and answer.exists()) -> serviceRequest.note as note, note.text = (item.answer.value) "note.text";
}

group QrToBundle(source qr : QuestionnaireResponse, target q: Questionnaire, target patient : Patient, target questionnaireresp: QuestionnaireResponseTarget, target servicerequest: ServiceRequest, target composition : Composition, target bundle : Bundle) {
  qr -> bundle.id = uuid() "id";
  qr -> bundle.type = 'document' "type";
  qr then OrfComposition(qr, q, composition, patient, questionnaireresp, servicerequest, bundle) "composition";
  qr then QrToGroups(qr, patient, bundle, composition, servicerequest) "qrgroups";
}

group OrfComposition(source qr : QuestionnaireResponse, target q: Questionnaire, target tgt : Composition, target patient: Patient, target questionnaireresp: QuestionnaireResponseTarget, target servicerequest: ServiceRequest, target bundle : Bundle) {
  qr -> tgt.status = 'final' "status";
  qr -> tgt.subject = create('Reference') as reference, reference.reference = ('urn:uuid:'+%patient.id) "subject";
  qr -> tgt.section as tgtSection, 
     tgtSection.title = 'Order-Referral', 
     tgtSection.code as code, code.coding as coding, coding.system='http://loinc.org', coding.code='93037-0', coding.display='Portable medical order form',
     tgtSection.entry = create('Reference') as reference, reference.reference = ('urn:uuid:'+%questionnaireresp.id),
     tgtSection.entry = create('Reference') as reference, reference.reference = ('urn:uuid:'+%servicerequest.id),
     tgtSection.entry = create('Reference') as reference, reference.reference = ('urn:uuid:'+%q.id) "sections";
  qr -> servicerequest.status = 'active',
      servicerequest.intent = 'order',
      servicerequest.subject = create('Reference') as reference, reference.reference = ('urn:uuid:'+%patient.id) "servicerequest";
}