CDA to FHIR Maps
0.1.0 - ci-build Italy flag

CDA to FHIR Maps, published by HL7 Italy. This guide is not an authorized publication; it is the continuous build for version 0.1.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/hl7-it/cda2fhir/ and changes regularly. See the Directory of published versions

StructureMap: CDA to FHIR - LAB

Official URL: http://hl7.it/fhir/cda2fhir/StructureMap/cda2fhirLabReport Version: 0.1.0
Draft as of 2024-04-11 Computable Name: cda2fhirLabReport
map "http://hl7.it/fhir/cda2fhir/StructureMap/cda2fhirLabReport" = "cda2fhirLabReport"

uses "http://hl7.org/fhir/cda/StructureDefinition/ClinicalDocument" alias ClinicalDocument as source
uses "http://hl7.org/fhir/cda/StructureDefinition/AssignedAuthor" alias AssignedAuthor as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/AssignedEntity" alias AssignedEntity as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/AssociatedEntity" alias AssociatedEntity as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/CustodianOrganization" alias CustodianOrganization as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/OrganizationPartOf" alias OrganizationPartOf as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/Organization" alias rapresentedOrganization as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/Section" alias Section as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/PatientRole" alias PatientRole as queried
uses "http://hl7.org/fhir/cda/StructureDefinition/AD" alias AD as source
uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias Bundle as target
uses "http://hl7.org/fhir/StructureDefinition/Composition" alias Composition as produced
uses "http://hl7.org/fhir/StructureDefinition/Patient" alias Patient as produced
uses "http://hl7.org/fhir/StructureDefinition/Encounter" alias Encounter as produced
uses "http://hl7.org/fhir/StructureDefinition/Person" alias Patient as produced
uses "http://hl7.org/fhir/StructureDefinition/Practitioner" alias Practitioner as produced
uses "http://hl7.org/fhir/StructureDefinition/Specimen" alias Specimen as produced
uses "http://hl7.org/fhir/StructureDefinition/Procedure" alias Procedure as produced
uses "http://hl7.org/fhir/StructureDefinition/Organization" alias Organization as produced
uses "http://hl7.org/fhir/cda/StructureDefinition/Act" alias Act as produced
uses "http://hl7.org/fhir/cda/StructureDefinition/IVL-PQ" alias IVL_PQ as source
uses "http://hl7.org/fhir/cda/StructureDefinition/PQ" alias PQ as source
uses "http://hl7.org/fhir/StructureDefinition/SimpleQuantity" alias SimpleQuantity as target
uses "http://hl7.org/fhir/cda/StructureDefinition/Organizer" alias Organizer as source

imports "http://hl7.it/fhir/cda2fhir/StructureMap/cda2fhirDataTypes"
imports "http://hl7.it/fhir/cda2fhir/StructureMap/cda2fhirHeader"

group CdaToBundle(source cda : ClinicalDocument, target bundle : Bundle) {
  cda ->  bundle.entry as e,  e.request = create('BackboneElement') as request,  request.method = 'POST',  e.resource = create('Composition') as composition,  composition.id = uuid() as uuid1,  e.fullUrl = append('https://example/Composition/', uuid1),  request.url = 'Composition',  bundle.entry as e2,  e2.request = create('BackboneElement') as requestPAT,  requestPAT.method = 'PUT',  e2.resource = create('Patient') as patient,  patient.id = uuid() as uuid2,  e2.fullUrl = append('https://example/Patient/', uuid2),  bundle.entry as e3,  e3.request = create('BackboneElement') as request,  request.method = 'POST',  e3.resource = create('Encounter') as encounter,  encounter.id = uuid() as uuid3,  e3.fullUrl = append('https://example/Encounter/', uuid3),  request.url = 'Encounter',  bundle.entry as e6,  e6.request = create('BackboneElement') as request,  request.method = 'POST',  e6.resource = create('DocumentReference') as DocumentReference,  DocumentReference.id = uuid() as uuid6,  e6.fullUrl = append('https://example/DocumentReference/', uuid6),  request.url = 'DocumentReference' then {
    cda then ClinicalDocumentToBundle(cda, patient, composition, encounter, bundle, DocumentReference) "cdatobundle";
    cda.recordTarget as recordTarget then {
      recordTarget.patientRole as patient then {
        patient.id as id -> patient.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext1 -> identifier.value = ext1 "value";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
        } "idfr";
        patient.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') or (root = '2.16.840.1.113883.2.9.4.3.7') or (root = '2.16.840.1.113883.2.9.4.3.3') or (root = '2.16.840.1.113883.2.9.4.3.17') or (root = '2.16.840.1.113883.2.9.4.3.18') or (root = '2.16.840.1.113883.2.9.2.10.4.1.1') or (root = '2.16.840.1.113883.2.9.2.20.4.1.1') or (root = '2.16.840.1.113883.2.9.2.30.4.1.1') or (root = '2.16.840.1.113883.2.9.2.41.4.1.1') or (root = '2.16.840.1.113883.2.9.2.42.4.1.1') or (root = '2.16.840.1.113883.2.9.2.50.4.1.1') or (root = '2.16.840.1.113883.2.9.2.60.4.1.1') or (root = '2.16.840.1.113883.2.9.2.70.4.1.1') or (root = '2.16.840.1.113883.2.9.2.80.4.1.1') or (root = '2.16.840.1.113883.2.9.2.90.4.1.1') or (root = '2.16.840.1.113883.2.9.2.100.4.1.1') or (root = '2.16.840.1.113883.2.9.2.110.4.1.1') or (root = '2.16.840.1.113883.2.9.2.120.4.1.1') or (root = '2.16.840.1.113883.2.9.2.130.4.1.1') or (root = '2.16.840.1.113883.2.9.2.140.4.1.1') or (root = '2.16.840.1.113883.2.9.2.150.4.1.1') or (root = '2.16.840.1.113883.2.9.2.160.4.1.1') or (root = '2.16.840.1.113883.2.9.2.170.4.1.1') or (root = '2.16.840.1.113883.2.9.2.180.4.1.1') or (root = '2.16.840.1.113883.2.9.2.190.4.1.1') or (root = '2.16.840.1.113883.2.9.2.200.4.1.1') or (root = '2.16.840.1.113883.2.9.2.10.4.1') or (root = '2.16.840.1.113883.2.9.2.20.4.1') or (root = '2.16.840.1.113883.2.9.2.30.4.1') or (root = '2.16.840.1.113883.2.9.2.41.4.1') or (root = '2.16.840.1.113883.2.9.2.42.4.1') or (root = '2.16.840.1.113883.2.9.2.50.4.1') or (root = '2.16.840.1.113883.2.9.2.60.4.1') or (root = '2.16.840.1.113883.2.9.2.70.4.1') or (root = '2.16.840.1.113883.2.9.2.80.4.1') or (root = '2.16.840.1.113883.2.9.2.90.4.1') or (root = '2.16.840.1.113883.2.9.2.100.4.1') or (root = '2.16.840.1.113883.2.9.2.110.4.1') or (root = '2.16.840.1.113883.2.9.2.120.4.1') or (root = '2.16.840.1.113883.2.9.2.130.4.1') or (root = '2.16.840.1.113883.2.9.2.140.4.1') or (root = '2.16.840.1.113883.2.9.2.150.4.1') or (root = '2.16.840.1.113883.2.9.2.160.4.1') or (root = '2.16.840.1.113883.2.9.2.170.4.1') or (root = '2.16.840.1.113883.2.9.2.180.4.1') or (root = '2.16.840.1.113883.2.9.2.190.4.1') or (root = '2.16.840.1.113883.2.9.2.200.4.1') or (root = '2.16.840.1.113883.2.9.4.3.15') then {
          id.extension as ext -> requestPAT.url = append('Patient?identifier=', ext) "UUID";
        } "ext";
      } "record";
    } "patient";
  } "ClinicalDocumentToBody";
}

group ClinicalDocumentToBundle(source cda : ClinicalDocument, target patient : Patient, target composition : Composition, target encounter : Encounter, target bundle : Bundle, target documentreference : DocumentReference) {
  cda -> bundle.id = uuid() "id";
  cda.id -> bundle.identifier "identifier";
  cda -> bundle.type = 'transaction' "type";
  cda -> bundle.timestamp = (timestamp.now()) "date";
  cda then ClinicalDocumentComposition(cda, composition, patient, encounter, bundle, documentreference) "composition";
  cda.component as component then {
    component.structuredBody as body then {
      body.component as component then {
        component.section as srcSection then {
          srcSection.code -> composition.section as tgtSection then ClinicalDocumentSection(cda, srcSection, patient, tgtSection, bundle, encounter, documentreference);
        };
      };
    } "body";
  };
}

group ClinicalDocumentSection(source cda : ClinicalDocument, source src : Section, target patient : Patient, target tgt, target bundle : Bundle, target enc : Encounter, target documentreference : DocumentReference) {
  src.title as t -> tgt.title = (t.dataString);
  src.code -> tgt.code;
  src.text as cdaText -> tgt.text as fhirText then {
    cdaText -> fhirText.status = 'generated' "narrativeStatus";
    cdaText as t -> fhirText.div = t "narrativeText";
  } "cdaText";
  src.entry as entry1 ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('DiagnosticReport') as DiagnosticReport,  DiagnosticReport.id = uuid() as uuid1,  e1.fullUrl = append('https://example/DiagnosticReport/', uuid1),  request.url = 'DiagnosticReport',  tgt.entry = create('Reference') as reference,  reference.reference = ('https://example/DiagnosticReport/' + %DiagnosticReport.id) then {
    entry1.act as act1 then Act(act1, patient, DiagnosticReport, enc, bundle);
  };
  src.component as component then {
    component.section as sec -> tgt.section as tgtSection then ClinicalDocumentSection(cda, sec, patient, tgtSection, bundle, enc, documentreference);
  };
}

group Observation(source obs : Observation, target patient : Patient, target encounter : Encounter, target ob : Observation, target bundle : Bundle) {
  obs ->  ob.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
  obs ->  ob.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
  obs.code -> ob.code;
  obs.statusCode as statusc where (code = 'completed') -> ob.status = 'final';
  obs.statusCode as statusc where (code = 'active') -> ob.status = 'registered';
  obs.statusCode as statusc where (code = 'aborted') -> ob.status = 'cancelled';
  obs.statusCode as statusc where (code = 'suspended') -> ob.status = 'partial';
  obs.effectiveTime as effectiveTime -> ob.effective = create('dateTime') as value then TSDateTime(effectiveTime, value) "value2";
  obs where effectiveTime.low.exists() or effectiveTime.high.exists() then {
    obs.effectiveTime as eff -> ob.effective = create('Period') as period then IVLTSPeriod(eff, period);
  } "where";
  obs.interpretationCode -> ob.interpretation;
  obs.methodCode -> ob.method;
  obs.value : INT as int -> ob.value = (int.value);
  obs.value : BL as boolean -> ob.value = (boolean.value) "boolean";
  obs.value : CE as val then {
    val -> ob.value = create('CodeableConcept') as ce then {
      val.originalText as originalText then {
        originalText.reference as reference -> ce.text = reference;
      } "originltext";
      val -> ce.coding as coding then {
        val.code as code -> coding.code = cast(code, 'string');
        val.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        val.displayName as display -> coding.display = cast(display, 'string');
        val.codeSystemVersion as version -> coding.version = cast(version, 'string');
      } "code";
      val.translation as translation -> ce.coding as coding then {
        translation.code as code -> coding.code = cast(code, 'string');
        translation.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        translation.displayName as display -> coding.display = cast(display, 'string');
        translation.codeSystemVersion as version -> coding.version = cast(version, 'string');
        translation.qualifier as qualifier then {
          qualifier.value as value -> ce.coding as coding then {
            value.code as code -> coding.code = cast(code, 'string');
            value.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
            value.displayName as display -> coding.display = cast(display, 'string');
            value.codeSystemVersion as version -> coding.version = cast(version, 'string');
          };
        };
      };
    } "coding";
  } "val";
  obs.value : CD as val then {
    val -> ob.value = create('CodeableConcept') as ce then {
      val.originalText as originalText then {
        originalText.reference as reference -> ce.text = reference;
      } "originltext";
      val -> ce.coding as coding then {
        val.code as code -> coding.code = cast(code, 'string');
        val.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        val.displayName as display -> coding.display = cast(display, 'string');
        val.codeSystemVersion as version -> coding.version = cast(version, 'string');
      } "code";
      val.translation as translation -> ce.coding as coding then {
        translation.code as code -> coding.code = cast(code, 'string');
        translation.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        translation.displayName as display -> coding.display = cast(display, 'string');
        translation.codeSystemVersion as version -> coding.version = cast(version, 'string');
        translation.qualifier as qualifier then {
          qualifier.value as value -> ce.coding as coding then {
            value.code as code -> coding.code = cast(code, 'string');
            value.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
            value.displayName as display -> coding.display = cast(display, 'string');
            value.codeSystemVersion as version -> coding.version = cast(version, 'string');
          };
        };
      };
    } "coding";
  } "val";
  obs.value : PQ as val then {
    val -> ob.value = create('Quantity') as quantity then {
      val.value as value -> quantity.value = value;
      val.unit as unit -> quantity.unit = unit;
    } "quantity";
  } "valueQuantity";
  obs.value : ST as value ->  ob.value = create('string'),  ob.value = (value.dataString);
  // Note e commenti
  obs.entryRelationship as entryRelationship then {
    entryRelationship.act as act then {
      act.text as text then {
        text.reference as reference -> ob.note as note then {
          reference -> note.text = (reference.value) "reference";
        };
      };
    } "Act";
  };
  // subject
  obs.subject as sbj then {
    sbj.relatedSubject as relatedSubj -> patient.extension as extension2 then ExtSubjectAnimal(relatedSubj, extension2);
  };
  // performer
  obs.performer as performer ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid1,  e1.fullUrl = append('https://example/PractitionerRole/', uuid1),  request.url = 'PractitionerRole' then {
    performer ->  ob.performer = create('Reference') as reference,  reference.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
      performer.assignedEntity as entity then {
        entity.code -> practitionerRole.code;
        entity ->  bundle.entry as e2,  e2.request = create('BackboneElement') as request,  request.method = 'PUT',  e2.resource = create('Practitioner') as practitioner then {
          entity -> practitioner.meta as meta then {
            entity -> meta.tag = create('Coding') as coding then {
              entity -> coding.system = 'http://algoritmodiscoring' "system";
              entity -> coding.code = 'ClinicalDocument/body/observation/performer' "code";
            } "coding";
          } "meta";
          entity.id as id -> practitioner.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              entity -> request.url = append('Practitioner?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e2.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "performer";
            } "r";
          } "identifier";
          entity.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          entity.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
          entity.addr -> practitioner.address;
          entity.telecom -> practitioner.telecom;
          entity.assignedPerson as person then {
            person.name -> practitioner.name;
            person.birthTime as birthTime then {
              birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
            } "birth";
          } "name";
          // organization
          entity.representedOrganization as representedOrganization ->  bundle.entry as e3,  e3.request = create('BackboneElement') as request,  request.method = 'PUT',  e3.resource = create('Organization') as organization then {
            representedOrganization -> organization.meta as meta then {
              representedOrganization -> meta.tag = create('Coding') as coding then {
                representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
                representedOrganization -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization' "code";
              } "coding";
            } "meta";
            representedOrganization.id as id -> organization.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e3.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "aut";
              } "r";
            } "identifier";
            representedOrganization.name as v -> organization.name = (v.other);
            representedOrganization.telecom -> organization.telecom;
            representedOrganization.addr -> organization.address;
            representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e4,  e4.request = create('BackboneElement') as request,  e4.resource = create('Organization') as organization1,  request.method = 'PUT' then {
              OrgPartOf -> organization1.meta as meta then {
                OrgPartOf -> meta.tag = create('Coding') as coding then {
                  OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
                  OrgPartOf -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization/asOrganizationPartOf' "code";
                } "coding";
              } "meta";
              OrgPartOf.id as id -> organization1.identifier as identifier then {
                id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                id.extension as ext -> identifier.value = ext then {
                  OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
                } "ext";
                id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                id.root as r then {
                  id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e4.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
                } "r";
              } "identifier";
              OrgPartOf.code -> organization1.type;
              OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
              OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'PUT',  e5.resource = create('Organization') as organization2 then {
                wholeOrgan -> organization2.meta as meta then {
                  wholeOrgan -> meta.tag = create('Coding') as coding then {
                    wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                    wholeOrgan -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization/wholeOrganization' "code";
                  } "coding";
                } "meta";
                wholeOrgan.id as id -> organization2.identifier as identifier then {
                  id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                  id.extension as ext -> identifier.value = ext then {
                    wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
                  } "ext";
                  id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                  id.root as r then {
                    id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid5,  e5.fullUrl = append('https://example/Organization/', uuid5),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
                  } "r";
                } "identifier";
                wholeOrgan.name as v -> organization2.name = (v.other);
                wholeOrgan.telecom -> organization2.telecom;
                wholeOrgan.addr -> organization2.address;
              };
            } "OrgPartOf";
          };
        } "practitioner";
      } "entity";
    } "practitionerRole";
  };
  // author
  obs.author as srcAuthor ->  bundle.entry as e6,  e6.request = create('BackboneElement') as request,  request.method = 'POST',  e6.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid6,  e6.fullUrl = append('https://example/PractitionerRole/', uuid6),  request.url = 'PractitionerRole',  ob.performer = create('Reference') as referenceaut,  referenceaut.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
    srcAuthor.assignedAuthor as assignedAuthor then {
      assignedAuthor.code as codice -> practitionerRole.code as code2 then CECodeableConcept(codice, code2);
      assignedAuthor ->  bundle.entry as e7,  e7.request = create('BackboneElement') as request,  request.method = 'PUT',  e7.resource = create('Practitioner') as practitioner,  practitioner.id = uuid() as uuid7 then {
        srcAuthor.functionCode -> practitionerRole.code;
        assignedAuthor -> practitioner.meta as meta then {
          assignedAuthor -> meta.tag = create('Coding') as coding then {
            assignedAuthor -> coding.system = 'http://algoritmodiscoring' "system";
            assignedAuthor -> coding.code = 'ClinicalDocument/body/observation/author' "code";
          } "coding";
        } "meta";
        assignedAuthor.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            assignedAuthor -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e7.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "aut";
          } "r";
          assignedAuthor.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          assignedAuthor.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
        } "identifier";
        assignedAuthor.addr -> practitioner.address;
        assignedAuthor.telecom -> practitioner.telecom;
        // person
        assignedAuthor.assignedPerson as person then {
          person.name -> practitioner.name;
          person.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "ASSAUth";
      // organization
      assignedAuthor.representedOrganization as representedOrganization ->  bundle.entry as e8,  e8.request = create('BackboneElement') as request,  request.method = 'PUT',  e8.resource = create('Organization') as organization then {
        representedOrganization -> organization.meta as meta then {
          representedOrganization -> meta.tag = create('Coding') as coding then {
            representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
            representedOrganization -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization' "code";
          } "coding";
        } "meta";
        representedOrganization.id as id -> organization.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e8.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "org";
          } "r";
        } "identifier";
        representedOrganization.name as v -> organization.name = (v.other);
        representedOrganization.telecom -> organization.telecom;
        representedOrganization.addr -> organization.address;
        representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e9,  e9.request = create('BackboneElement') as request,  request.method = 'PUT',  e9.resource = create('Organization') as organization1 then {
          OrgPartOf -> organization1.meta as meta then {
            OrgPartOf -> meta.tag = create('Coding') as coding then {
              OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
              OrgPartOf -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization/asOrganizationPartOf' "code";
            } "coding";
          } "meta";
          OrgPartOf.id as id -> organization1.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e9.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
            } "r";
          } "identifier";
          OrgPartOf.code -> organization1.type;
          OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
          OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e10,  e10.request = create('BackboneElement') as request,  request.method = 'PUT',  e10.resource = create('Organization') as organization2 then {
            wholeOrgan -> organization2.meta as meta then {
              wholeOrgan -> meta.tag = create('Coding') as coding then {
                wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                wholeOrgan -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
              } "coding";
            } "meta";
            wholeOrgan.id as id -> organization2.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid4,  e10.fullUrl = append('https://example/Organization/', uuid4),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
              } "r";
            } "identifier";
            wholeOrgan.name as v -> organization2.name = (v.other);
            wholeOrgan.telecom -> organization2.telecom;
            wholeOrgan.addr -> organization2.address;
          };
        } "OrgPartOf";
      };
      // device
      assignedAuthor.assignedAuthoringDevice as assignedAuthoringDevice ->  bundle.entry as e11,  e11.request = create('BackboneElement') as request,  request.method = 'POST',  e11.resource = create('Device') as device,  device.id = uuid() as uuid11,  e11.fullUrl = append('https://example/Device/', uuid11),  request.url = 'Device',  tgt.author = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
        assignedAuthoringDevice.templateId -> device.identifier;
        assignedAuthoringDevice.code -> device.type;
        assignedAuthoringDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        assignedAuthoringDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      } "Device";
    };
  };
  // participant person
  obs.participant as participant where (typeCode != 'DEV') ->  ob.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) then {
    participant -> encounter.participant as FhirParticipant then {
      participant as p -> FhirParticipant.type as type then {
        p -> type.coding as coding then {
          p -> coding.code = (p.typeCode) "codice";
          p -> coding.system = 'http://terminology.hl7.org/CodeSystem/v3-ParticipationType' "system";
        } "codeType";
      } "type";
    } "fhirParticipant";
    participant.participantRole as participantRole ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid12,  e12.fullUrl = append('https://example/PractitionerRole/', uuid12),  request.url = 'PractitionerRole',  encounter.participant = create('BackboneElement') as participant1,  participant1.individual = create('Reference') as referencepart,  referencepart.reference = ('https://example/Practitioner/' + %practitionerRole.id) then {
      // participant.time -> participant1.period;
      participant.time as time1 -> participant1.period = create('Period') as period then {
        time1 -> period.start = create('dateTime') as start then TSDateTime(time1, start) "val";
      };
      participant.time as time1 -> participant1.period = create('Period') as period then IVLTSPeriod(time1, period);
      participant.functionCode -> practitionerRole.code;
      // non mappa i 2 precedenti
      participantRole ->  bundle.entry as e13,  e13.request = create('BackboneElement') as request,  request.method = 'PUT',  e13.resource = create('Practitioner') as practitioner then {
        participantRole -> practitioner.meta as meta then {
          participantRole -> meta.tag = create('Coding') as coding then {
            participantRole -> coding.system = 'http://algoritmodiscoring' "system";
            participantRole -> coding.code = 'ClinicalDocument/body/observation/participant' "code";
          } "coding";
        } "meta";
        participantRole.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            participantRole -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid4,  e13.fullUrl = append('https://example/Practitioner/', uuid4),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "org";
          } "r";
        } "identifier";
        participantRole.code -> practitionerRole.code;
        participantRole.addr -> practitioner.address;
        participantRole.telecom -> practitioner.telecom;
        participantRole.playingEntity as playingEntity then {
          playingEntity.name -> practitioner.name;
          playingEntity.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "practitioner";
    } "partRole";
  } "participantEncounter";
  // participant device
  obs.participant as devParticipant where (typeCode = 'DEV') ->  bundle.entry as e14,  e14.request = create('BackboneElement') as request,  request.method = 'POST',  e14.resource = create('Device') as device,  device.id = uuid() as uuid14,  e14.fullUrl = append('https://example/Device/', uuid14),  request.url = 'Device',  ob.device = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
    devParticipant.participantRole as participantRoleDev then {
      participantRoleDev.playingDevice as playingDevice then {
        playingDevice.code -> device.type;
        playingDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        playingDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      };
    } "participantRoleDev";
  } "devParticipant";
  // observationMedia
  obs.entryRelationship as er then {
    er.observationMedia as obsMedia ->  bundle.entry as e15,  e15.request = create('BackboneElement') as request,  request.method = 'POST',  e15.resource = create('Media') as media1,  media1.id = uuid() as uuid15,  e15.fullUrl = append('https://example/Media/', uuid15),  request.url = 'Media',  ob.derivedFrom = create('Reference') as reference,  reference.reference = ('https://example/Media/' + %media1.id) then {
      obsMedia -> media1.content = create('Attachment') as Attachment then {
        obsMedia -> media1.status = 'unknown' "status";
        obsMedia.value as valueMedia then {
          valueMedia.mediaType as type -> Attachment.contentType = type "type";
          valueMedia -> Attachment.data = (valueMedia.dataBase64Binary) "data";
        } "valuemedia";
      } "Attachment";
    } "media";
  } "observationMedia";
  // referenceRange
  obs.referenceRange as refRange -> ob.referenceRange = create('BackboneElement') as ref then {
    refRange.observationRange as obsRange then {
      obsRange.value : ST as value ->  ref.text = create('string'),  ref.text = (value.dataString);
      obsRange -> ref.low = create('Quantity') as Low then {
        obsRange.value : IVL_PQ as v then {
          v.low as l1 then {
            l1.value as decValue -> Low.value = decValue;
            l1.unit as Unit -> Low.unit = Unit;
          } "decValue";
          v -> ref.high = create('Quantity') as high then {
            v.high as h1 then {
              h1.value as decValue1 -> high.value = decValue1;
              h1.unit as Unit1 -> high.unit = Unit1;
            } "decValue";
          } "high";
        } "IVL-PQ";
        obsRange.interpretationCode -> ref.type;
        obsRange.precondition as precondition then {
          precondition.criterion as criterion then {
            criterion.code -> ref.appliesTo "appliesTo";
            criterion.value : IVL_PQ as v then {
              v.high as l1 then {
                l1 -> ref.age = create('Quantity') as age then {
                  l1 -> age.high as high then {
                    l1.value as decValue -> high.value = decValue;
                    l1.unit as Unit1 -> high.unit = Unit1;
                  } "high";
                } "age";
              } "low";
            } "v";
          };
        };
      } "obsRange";
    } "refRange";
  } "ref";
}

group Observation2(source obs : Observation, target patient : Patient, target encounter : Encounter, target ob : Observation, target bundle : Bundle, source cda : Act, target specimenp : Specimen) {
  obs ->  ob.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
  obs ->  ob.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
  obs.code -> ob.code;
  obs.statusCode as statusc where (code = 'completed') -> ob.status = 'final';
  obs.statusCode as statusc where (code = 'active') -> ob.status = 'registered';
  obs.statusCode as statusc where (code = 'aborted') -> ob.status = 'cancelled';
  obs.statusCode as statusc where (code = 'suspended') -> ob.status = 'partial';
  obs.effectiveTime as effectiveTime -> ob.effective = create('dateTime') as value then TSDateTime(effectiveTime, value) "value2";
  obs where effectiveTime.low.exists() or effectiveTime.high.exists() then {
    obs.effectiveTime as eff -> ob.effective = create('Period') as period then IVLTSPeriod(eff, period);
  } "where";
  obs.interpretationCode -> ob.interpretation;
  obs.methodCode -> ob.method;
  obs.value : INT as int -> ob.value = (int.value);
  obs.value : BL as boolean -> ob.value = (boolean.value) "boolean";
  obs.value : CE as val then {
    val -> ob.value = create('CodeableConcept') as ce then {
      val.originalText as originalText then {
        originalText.reference as reference -> ce.text = reference;
      } "originltext";
      val -> ce.coding as coding then {
        val.code as code -> coding.code = cast(code, 'string');
        val.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        val.displayName as display -> coding.display = cast(display, 'string');
        val.codeSystemVersion as version -> coding.version = cast(version, 'string');
      } "code";
      val.translation as translation -> ce.coding as coding then {
        translation.code as code -> coding.code = cast(code, 'string');
        translation.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        translation.displayName as display -> coding.display = cast(display, 'string');
        translation.codeSystemVersion as version -> coding.version = cast(version, 'string');
        translation.qualifier as qualifier then {
          qualifier.value as value -> ce.coding as coding then {
            value.code as code -> coding.code = cast(code, 'string');
            value.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
            value.displayName as display -> coding.display = cast(display, 'string');
            value.codeSystemVersion as version -> coding.version = cast(version, 'string');
          };
        };
      };
    } "coding";
  } "val";
  obs.value : PQ as val then {
    val -> ob.value = create('Quantity') as quantity then {
      val.value as value -> quantity.value = value;
      val.unit as unit -> quantity.unit = unit;
    } "quantity";
  } "valueQuantity";
  obs.value : ST as value ->  ob.value = create('string'),  ob.value = (value.dataString);
  // Note e commenti
  obs.entryRelationship as entryRelationship then {
    entryRelationship.act as act then {
      act.text as text then {
        text.reference as reference -> ob.note as note then {
          reference -> note.text = (reference.value) "reference";
        };
      };
    } "Act";
  };
  // subject
  obs.subject as sbj then {
    sbj.relatedSubject as relatedSubj -> patient.extension as extension2 then ExtSubjectAnimal(relatedSubj, extension2);
  };
  cda where cda.entryRelationship.act.exists() then {
    // specimen
    obs.specimen as spmn then {
      spmn.specimenRole as specimenRole then {
        specimenRole.id as id then {
          id.extension as extobs then {
            cda.entryRelationship as entryRelationship then {
              entryRelationship.act as a then {
                a.specimen as sp then {
                  sp.specimenRole as spr then {
                    spr.id where (extension = extobs) ->  bundle.entry as e4o,  e4o.request = create('BackboneElement') as request,  request.method = 'POST',  e4o.resource = create('Specimen') as specimen,  specimen.id = uuid() as uuid4o,  e4o.fullUrl = append('https://example/Specimen/', uuid4o),  request.url = 'Specimen',  ob.specimen = create('Reference') as reference,  reference.reference = ('https://example/Specimen/' + %specimen.id) then {
                      spr ->  specimen.parent = create('Reference') as reference,  reference.reference = ('https://example/Specimen/' + %specimenp.id) "reference";
                      spr.id -> specimen.identifier;
                      specimenRole.specimenPlayingEntity as spent then {
                        spent.code -> specimen.type;
                      } "ent";
                      spr.specimenPlayingEntity as specimenPlayingEntity then {
                        specimenPlayingEntity.code -> specimen.type;
                      };
                      a -> specimen.collection = create('BackboneElement') as collection then {
                        a.effectiveTime as effectivetime -> collection.collected = create('dateTime') as value then TSDateTime(effectivetime, value) "value";
                        a where effectiveTime.low.exists() or effectiveTime.high.exists() then {
                          a.effectiveTime as eff -> collection.collected = create('Period') as period then IVLTSPeriod(eff, period);
                        } "where";
                        a.participant as participant ->  bundle.entry as e10,  e10.request = create('BackboneElement') as request,  request.method = 'PUT',  e10.resource = create('Practitioner') as practitioner,  practitioner.id = uuid() as uuid11,  e10.fullUrl = append('https://example/Practitioner/', uuid11),  collection.collector = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) then {
                          participant.participantRole as participantRole then {
                            participantRole -> practitioner.meta as meta then {
                              participantRole -> meta.tag = create('Coding') as coding then {
                                participantRole -> coding.system = 'http://algoritmodiscoring' "system";
                                participantRole -> coding.code = 'ClinicalDocument/body/act/participant' "code";
                              } "coding";
                            } "meta";
                            participantRole.id as id -> practitioner.identifier as identifier then {
                              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                              id.extension as ext -> identifier.value = ext then {
                                participantRole -> request.url = append('Practitioner?identifier=', ext) "UUID";
                              } "ext";
                              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                            } "identifier";
                            participantRole.addr -> practitioner.address;
                            participantRole.playingEntity as playingEntity then {
                              playingEntity.name -> practitioner.name;
                            };
                          };
                        };
                      } "collection";
                    } "cont";
                  } "spr";
                } "sp";
              } "a";
            } "en";
          } "extobs";
        };
      };
    };
  } "conditionactexists";
  cda where cda.entryRelationship.act.exists().not() and (obs.specimen.specimenRole.specimenPlayingEntity.code.code != specimenp.type.coding.code) then {
    obs.specimen as spmn ->  bundle.entry as e4o,  e4o.request = create('BackboneElement') as request,  request.method = 'POST',  e4o.resource = create('Specimen') as specimen,  specimen.id = uuid() as uuid4o,  e4o.fullUrl = append('https://example/Specimen/', uuid4o),  request.url = 'Specimen',  ob.specimen = create('Reference') as reference,  reference.reference = ('https://example/Specimen/' + %specimen.id) then {
      spmn.specimenRole as specimenRole then {
        specimenRole.id -> specimen.identifier;
        specimenRole.specimenPlayingEntity as specimenPlayingEntity then {
          specimenPlayingEntity.code -> specimen.type;
        };
      };
    };
  } "wherenotexists";
  // performer
  obs.performer as performer ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid1,  e1.fullUrl = append('https://example/PractitionerRole/', uuid1),  request.url = 'PractitionerRole' then {
    performer ->  ob.performer = create('Reference') as reference,  reference.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
      performer.assignedEntity as entity then {
        entity.code -> practitionerRole.code;
        entity ->  bundle.entry as e2,  e2.request = create('BackboneElement') as request,  request.method = 'PUT',  e2.resource = create('Practitioner') as practitioner then {
          entity -> practitioner.meta as meta then {
            entity -> meta.tag = create('Coding') as coding then {
              entity -> coding.system = 'http://algoritmodiscoring' "system";
              entity -> coding.code = 'ClinicalDocument/body/observation/performer' "code";
            } "coding";
          } "meta";
          entity.id as id -> practitioner.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              entity -> request.url = append('Practitioner?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e2.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "performer";
            } "r";
          } "identifier";
          entity.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          entity.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
          entity.addr -> practitioner.address;
          entity.telecom -> practitioner.telecom;
          entity.assignedPerson as person then {
            person.name -> practitioner.name;
            person.birthTime as birthTime then {
              birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
            } "birth";
          } "name";
          // organization
          entity.representedOrganization as representedOrganization ->  bundle.entry as e3,  e3.request = create('BackboneElement') as request,  request.method = 'PUT',  e3.resource = create('Organization') as organization then {
            representedOrganization -> organization.meta as meta then {
              representedOrganization -> meta.tag = create('Coding') as coding then {
                representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
                representedOrganization -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization' "code";
              } "coding";
            } "meta";
            representedOrganization.id as id -> organization.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e3.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "aut";
              } "r";
            } "identifier";
            representedOrganization.name as v -> organization.name = (v.other);
            representedOrganization.telecom -> organization.telecom;
            representedOrganization.addr -> organization.address;
            representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e4,  e4.request = create('BackboneElement') as request,  e4.resource = create('Organization') as organization1,  request.method = 'PUT' then {
              OrgPartOf -> organization1.meta as meta then {
                OrgPartOf -> meta.tag = create('Coding') as coding then {
                  OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
                  OrgPartOf -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization/asOrganizationPartOf' "code";
                } "coding";
              } "meta";
              OrgPartOf.id as id -> organization1.identifier as identifier then {
                id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                id.extension as ext -> identifier.value = ext then {
                  OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
                } "ext";
                id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                id.root as r then {
                  id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e4.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
                } "r";
              } "identifier";
              OrgPartOf.code -> organization1.type;
              OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
              OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'PUT',  e5.resource = create('Organization') as organization2 then {
                wholeOrgan -> organization2.meta as meta then {
                  wholeOrgan -> meta.tag = create('Coding') as coding then {
                    wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                    wholeOrgan -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization/wholeOrganization' "code";
                  } "coding";
                } "meta";
                wholeOrgan.id as id -> organization2.identifier as identifier then {
                  id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                  id.extension as ext -> identifier.value = ext then {
                    wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
                  } "ext";
                  id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                  id.root as r then {
                    id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid5,  e5.fullUrl = append('https://example/Organization/', uuid5),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
                  } "r";
                } "identifier";
                wholeOrgan.name as v -> organization2.name = (v.other);
                wholeOrgan.telecom -> organization2.telecom;
                wholeOrgan.addr -> organization2.address;
              };
            } "OrgPartOf";
          };
        } "practitioner";
      } "entity";
    } "practitionerRole";
  };
  // author
  obs.author as srcAuthor ->  bundle.entry as e6,  e6.request = create('BackboneElement') as request,  request.method = 'POST',  e6.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid6,  e6.fullUrl = append('https://example/PractitionerRole/', uuid6),  request.url = 'PractitionerRole',  ob.performer = create('Reference') as referenceaut,  referenceaut.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
    srcAuthor.assignedAuthor as assignedAuthor then {
      assignedAuthor.code as codice -> practitionerRole.code as code2 then CECodeableConcept(codice, code2);
      assignedAuthor ->  bundle.entry as e7,  e7.request = create('BackboneElement') as request,  request.method = 'PUT',  e7.resource = create('Practitioner') as practitioner,  practitioner.id = uuid() as uuid7 then {
        srcAuthor.functionCode -> practitionerRole.code;
        assignedAuthor -> practitioner.meta as meta then {
          assignedAuthor -> meta.tag = create('Coding') as coding then {
            assignedAuthor -> coding.system = 'http://algoritmodiscoring' "system";
            assignedAuthor -> coding.code = 'ClinicalDocument/body/observation/author' "code";
          } "coding";
        } "meta";
        assignedAuthor.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            assignedAuthor -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e7.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "aut";
          } "r";
          assignedAuthor.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          assignedAuthor.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
        } "identifier";
        assignedAuthor.addr -> practitioner.address;
        assignedAuthor.telecom -> practitioner.telecom;
        // person
        assignedAuthor.assignedPerson as person then {
          person.name -> practitioner.name;
          person.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "ASSAUth";
      // organization
      assignedAuthor.representedOrganization as representedOrganization ->  bundle.entry as e8,  e8.request = create('BackboneElement') as request,  request.method = 'PUT',  e8.resource = create('Organization') as organization then {
        representedOrganization -> organization.meta as meta then {
          representedOrganization -> meta.tag = create('Coding') as coding then {
            representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
            representedOrganization -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization' "code";
          } "coding";
        } "meta";
        representedOrganization.id as id -> organization.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e8.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "org";
          } "r";
        } "identifier";
        representedOrganization.name as v -> organization.name = (v.other);
        representedOrganization.telecom -> organization.telecom;
        representedOrganization.addr -> organization.address;
        representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e9,  e9.request = create('BackboneElement') as request,  request.method = 'PUT',  e9.resource = create('Organization') as organization1 then {
          OrgPartOf -> organization1.meta as meta then {
            OrgPartOf -> meta.tag = create('Coding') as coding then {
              OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
              OrgPartOf -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization/asOrganizationPartOf' "code";
            } "coding";
          } "meta";
          OrgPartOf.id as id -> organization1.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e9.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
            } "r";
          } "identifier";
          OrgPartOf.code -> organization1.type;
          OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
          OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e10,  e10.request = create('BackboneElement') as request,  request.method = 'PUT',  e10.resource = create('Organization') as organization2 then {
            wholeOrgan -> organization2.meta as meta then {
              wholeOrgan -> meta.tag = create('Coding') as coding then {
                wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                wholeOrgan -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
              } "coding";
            } "meta";
            wholeOrgan.id as id -> organization2.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid4,  e10.fullUrl = append('https://example/Organization/', uuid4),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
              } "r";
            } "identifier";
            wholeOrgan.name as v -> organization2.name = (v.other);
            wholeOrgan.telecom -> organization2.telecom;
            wholeOrgan.addr -> organization2.address;
          };
        } "OrgPartOf";
      };
      // device
      assignedAuthor.assignedAuthoringDevice as assignedAuthoringDevice ->  bundle.entry as e11,  e11.request = create('BackboneElement') as request,  request.method = 'POST',  e11.resource = create('Device') as device,  device.id = uuid() as uuid11,  e11.fullUrl = append('https://example/Device/', uuid11),  request.url = 'Device',  tgt.author = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
        assignedAuthoringDevice.templateId -> device.identifier;
        assignedAuthoringDevice.code -> device.type;
        assignedAuthoringDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        assignedAuthoringDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      } "Device";
    };
  };
  // participant person
  obs.participant as participant where (typeCode != 'DEV') ->  ob.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) then {
    participant -> encounter.participant as FhirParticipant then {
      participant as p -> FhirParticipant.type as type then {
        p -> type.coding as coding then {
          p -> coding.code = (p.typeCode) "codice";
          p -> coding.system = 'http://terminology.hl7.org/CodeSystem/v3-ParticipationType' "system";
        } "codeType";
      } "type";
    } "fhirParticipant";
    participant.participantRole as participantRole ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid12,  e12.fullUrl = append('https://example/PractitionerRole/', uuid12),  request.url = 'PractitionerRole',  encounter.participant = create('BackboneElement') as participant1,  participant1.individual = create('Reference') as referencepart,  referencepart.reference = ('https://example/Practitioner/' + %practitionerRole.id) then {
      // participant.time -> participant1.period;
      participant.time as time1 -> participant1.period = create('Period') as period then {
        time1 -> period.start = create('dateTime') as start then TSDateTime(time1, start) "val";
      };
      participant.time as time1 -> participant1.period = create('Period') as period then IVLTSPeriod(time1, period);
      participant.functionCode -> practitionerRole.code;
      // non mappa i 2 precedenti
      participantRole ->  bundle.entry as e13,  e13.request = create('BackboneElement') as request,  request.method = 'PUT',  e13.resource = create('Practitioner') as practitioner then {
        participantRole -> practitioner.meta as meta then {
          participantRole -> meta.tag = create('Coding') as coding then {
            participantRole -> coding.system = 'http://algoritmodiscoring' "system";
            participantRole -> coding.code = 'ClinicalDocument/body/observation/participant' "code";
          } "coding";
        } "meta";
        participantRole.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            participantRole -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid4,  e13.fullUrl = append('https://example/Practitioner/', uuid4),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "org";
          } "r";
        } "identifier";
        participantRole.code -> practitionerRole.code;
        participantRole.addr -> practitioner.address;
        participantRole.telecom -> practitioner.telecom;
        participantRole.playingEntity as playingEntity then {
          playingEntity.name -> practitioner.name;
          playingEntity.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "practitioner";
    } "partRole";
  } "participantEncounter";
  // participant device
  obs.participant as devParticipant where (typeCode = 'DEV') ->  bundle.entry as e14,  e14.request = create('BackboneElement') as request,  request.method = 'POST',  e14.resource = create('Device') as device,  device.id = uuid() as uuid14,  e14.fullUrl = append('https://example/Device/', uuid14),  request.url = 'Device',  ob.device = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
    devParticipant.participantRole as participantRoleDev then {
      participantRoleDev.playingDevice as playingDevice then {
        playingDevice.code -> device.type;
        playingDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        playingDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      };
    } "participantRoleDev";
  } "devParticipant";
  // observationMedia
  obs.entryRelationship as er then {
    er.observationMedia as obsMedia ->  bundle.entry as e15,  e15.request = create('BackboneElement') as request,  request.method = 'POST',  e15.resource = create('Media') as media1,  media1.id = uuid() as uuid15,  e15.fullUrl = append('https://example/Media/', uuid15),  request.url = 'Media',  ob.derivedFrom = create('Reference') as reference,  reference.reference = ('https://example/Media/' + %media1.id) then {
      obsMedia -> media1.content = create('Attachment') as Attachment then {
        obsMedia -> media1.status = 'unknown' "status";
        obsMedia.value as valueMedia then {
          valueMedia.mediaType as type -> Attachment.contentType = type "type";
          valueMedia -> Attachment.data = (valueMedia.dataBase64Binary) "data";
        } "valuemedia";
      } "Attachment";
    } "media";
  } "observationMedia";
  // referenceRange
  obs.referenceRange as refRange -> ob.referenceRange = create('BackboneElement') as ref then {
    refRange.observationRange as obsRange then {
      obsRange.value : ST as value ->  ref.text = create('string'),  ref.text = (value.dataString);
      obsRange -> ref.low = create('Quantity') as Low then {
        obsRange.value : IVL_PQ as v then {
          v.low as l1 then {
            l1.value as decValue -> Low.value = decValue;
            l1.unit as Unit -> Low.unit = Unit;
          } "decValue";
          v -> ref.high = create('Quantity') as high then {
            v.high as h1 then {
              h1.value as decValue1 -> high.value = decValue1;
              h1.unit as Unit1 -> high.unit = Unit1;
            } "decValue";
          } "high";
        } "IVL-PQ";
        obsRange.interpretationCode -> ref.type;
        obsRange.precondition as precondition then {
          precondition.criterion as criterion then {
            criterion.code -> ref.appliesTo "appliesTo";
            criterion.value : IVL_PQ as v then {
              v.high as l1 then {
                l1 -> ref.age = create('Quantity') as age then {
                  l1 -> age.high as high then {
                    l1.value as decValue -> high.value = decValue;
                    l1.unit as Unit1 -> high.unit = Unit1;
                  } "high";
                } "age";
              } "low";
            } "v";
          };
        };
      } "obsRange";
    } "refRange";
  } "ref";
}

group Observation3(source obs : Observation, target patient : Patient, target encounter : Encounter, target ob : Observation, target bundle : Bundle, source cda : Act) {
  obs ->  ob.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
  obs ->  ob.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
  obs.code -> ob.code;
  obs.statusCode as statusc where (code = 'completed') -> ob.status = 'final';
  obs.statusCode as statusc where (code = 'active') -> ob.status = 'registered';
  obs.statusCode as statusc where (code = 'aborted') -> ob.status = 'cancelled';
  obs.statusCode as statusc where (code = 'suspended') -> ob.status = 'partial';
  obs.effectiveTime as effectiveTime -> ob.effective = create('dateTime') as value then TSDateTime(effectiveTime, value) "value2";
  obs where effectiveTime.low.exists() or effectiveTime.high.exists() then {
    obs.effectiveTime as eff -> ob.effective = create('Period') as period then IVLTSPeriod(eff, period);
  } "where";
  obs.interpretationCode -> ob.interpretation;
  obs.methodCode -> ob.method;
  obs.value : INT as int -> ob.value = (int.value);
  obs.value : BL as boolean -> ob.value = (boolean.value) "boolean";
  obs.value : CE as val then {
    val -> ob.value = create('CodeableConcept') as ce then {
      val.originalText as originalText then {
        originalText.reference as reference -> ce.text = reference;
      } "originltext";
      val -> ce.coding as coding then {
        val.code as code -> coding.code = cast(code, 'string');
        val.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        val.displayName as display -> coding.display = cast(display, 'string');
        val.codeSystemVersion as version -> coding.version = cast(version, 'string');
      } "code";
      val.translation as translation -> ce.coding as coding then {
        translation.code as code -> coding.code = cast(code, 'string');
        translation.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
        translation.displayName as display -> coding.display = cast(display, 'string');
        translation.codeSystemVersion as version -> coding.version = cast(version, 'string');
        translation.qualifier as qualifier then {
          qualifier.value as value -> ce.coding as coding then {
            value.code as code -> coding.code = cast(code, 'string');
            value.codeSystem as system -> coding.system = translate(system, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri');
            value.displayName as display -> coding.display = cast(display, 'string');
            value.codeSystemVersion as version -> coding.version = cast(version, 'string');
          };
        };
      };
    } "coding";
  } "val";
  obs.value : PQ as val then {
    val -> ob.value = create('Quantity') as quantity then {
      val.value as value -> quantity.value = value;
      val.unit as unit -> quantity.unit = unit;
    } "quantity";
  } "valueQuantity";
  obs.value : ST as value ->  ob.value = create('string'),  ob.value = (value.dataString);
  // Note e commenti
  obs.entryRelationship as entryRelationship then {
    entryRelationship.act as act then {
      act.text as text then {
        text.reference as reference -> ob.note as note then {
          reference -> note.text = (reference.value) "reference";
        };
      };
    } "Act";
  };
  // subject
  obs.subject as sbj then {
    sbj.relatedSubject as relatedSubj -> patient.extension as extension2 then ExtSubjectAnimal(relatedSubj, extension2);
  };
  // specimen
  obs.specimen as spmn ->  bundle.entry as e4o,  e4o.request = create('BackboneElement') as request,  request.method = 'POST',  e4o.resource = create('Specimen') as specimen,  specimen.id = uuid() as uuid4o,  e4o.fullUrl = append('https://example/Specimen/', uuid4o),  request.url = 'Specimen',  ob.specimen = create('Reference') as reference,  reference.reference = ('https://example/Specimen/' + %specimen.id) then {
    spmn.specimenRole as specimenRole then {
      specimenRole.id as id -> specimen.identifier;
      specimenRole.specimenPlayingEntity as specimenPlayingEntity then {
        specimenPlayingEntity.code -> specimen.type;
      };
    };
  };
  // performer
  obs.performer as performer ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid1,  e1.fullUrl = append('https://example/PractitionerRole/', uuid1),  request.url = 'PractitionerRole' then {
    performer ->  ob.performer = create('Reference') as reference,  reference.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
      performer.assignedEntity as entity then {
        entity.code -> practitionerRole.code;
        entity ->  bundle.entry as e2,  e2.request = create('BackboneElement') as request,  request.method = 'PUT',  e2.resource = create('Practitioner') as practitioner then {
          entity -> practitioner.meta as meta then {
            entity -> meta.tag = create('Coding') as coding then {
              entity -> coding.system = 'http://algoritmodiscoring' "system";
              entity -> coding.code = 'ClinicalDocument/body/observation/performer' "code";
            } "coding";
          } "meta";
          entity.id as id -> practitioner.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              entity -> request.url = append('Practitioner?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e2.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "performer";
            } "r";
          } "identifier";
          entity.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          entity.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
          entity.addr -> practitioner.address;
          entity.telecom -> practitioner.telecom;
          entity.assignedPerson as person then {
            person.name -> practitioner.name;
            person.birthTime as birthTime then {
              birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
            } "birth";
          } "name";
          // organization
          entity.representedOrganization as representedOrganization ->  bundle.entry as e3,  e3.request = create('BackboneElement') as request,  request.method = 'PUT',  e3.resource = create('Organization') as organization then {
            representedOrganization -> organization.meta as meta then {
              representedOrganization -> meta.tag = create('Coding') as coding then {
                representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
                representedOrganization -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization' "code";
              } "coding";
            } "meta";
            representedOrganization.id as id -> organization.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e3.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "aut";
              } "r";
            } "identifier";
            representedOrganization.name as v -> organization.name = (v.other);
            representedOrganization.telecom -> organization.telecom;
            representedOrganization.addr -> organization.address;
            representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e4,  e4.request = create('BackboneElement') as request,  e4.resource = create('Organization') as organization1,  request.method = 'PUT' then {
              OrgPartOf -> organization1.meta as meta then {
                OrgPartOf -> meta.tag = create('Coding') as coding then {
                  OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
                  OrgPartOf -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization/asOrganizationPartOf' "code";
                } "coding";
              } "meta";
              OrgPartOf.id as id -> organization1.identifier as identifier then {
                id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                id.extension as ext -> identifier.value = ext then {
                  OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
                } "ext";
                id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                id.root as r then {
                  id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e4.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
                } "r";
              } "identifier";
              OrgPartOf.code -> organization1.type;
              OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
              OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'PUT',  e5.resource = create('Organization') as organization2 then {
                wholeOrgan -> organization2.meta as meta then {
                  wholeOrgan -> meta.tag = create('Coding') as coding then {
                    wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                    wholeOrgan -> coding.code = 'ClinicalDocument/body/observation/performer/representedOrganization/wholeOrganization' "code";
                  } "coding";
                } "meta";
                wholeOrgan.id as id -> organization2.identifier as identifier then {
                  id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                  id.extension as ext -> identifier.value = ext then {
                    wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
                  } "ext";
                  id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                  id.root as r then {
                    id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid5,  e5.fullUrl = append('https://example/Organization/', uuid5),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
                  } "r";
                } "identifier";
                wholeOrgan.name as v -> organization2.name = (v.other);
                wholeOrgan.telecom -> organization2.telecom;
                wholeOrgan.addr -> organization2.address;
              };
            } "OrgPartOf";
          };
        } "practitioner";
      } "entity";
    } "practitionerRole";
  };
  // author
  obs.author as srcAuthor ->  bundle.entry as e6,  e6.request = create('BackboneElement') as request,  request.method = 'POST',  e6.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid6,  e6.fullUrl = append('https://example/PractitionerRole/', uuid6),  request.url = 'PractitionerRole',  ob.performer = create('Reference') as referenceaut,  referenceaut.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
    srcAuthor.assignedAuthor as assignedAuthor then {
      assignedAuthor.code as codice -> practitionerRole.code as code2 then CECodeableConcept(codice, code2);
      assignedAuthor ->  bundle.entry as e7,  e7.request = create('BackboneElement') as request,  request.method = 'PUT',  e7.resource = create('Practitioner') as practitioner,  practitioner.id = uuid() as uuid7 then {
        srcAuthor.functionCode -> practitionerRole.code;
        assignedAuthor -> practitioner.meta as meta then {
          assignedAuthor -> meta.tag = create('Coding') as coding then {
            assignedAuthor -> coding.system = 'http://algoritmodiscoring' "system";
            assignedAuthor -> coding.code = 'ClinicalDocument/body/observation/author' "code";
          } "coding";
        } "meta";
        assignedAuthor.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            assignedAuthor -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e7.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "aut";
          } "r";
          assignedAuthor.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          assignedAuthor.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
        } "identifier";
        assignedAuthor.addr -> practitioner.address;
        assignedAuthor.telecom -> practitioner.telecom;
        // person
        assignedAuthor.assignedPerson as person then {
          person.name -> practitioner.name;
          person.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "ASSAUth";
      // organization
      assignedAuthor.representedOrganization as representedOrganization ->  bundle.entry as e8,  e8.request = create('BackboneElement') as request,  request.method = 'PUT',  e8.resource = create('Organization') as organization then {
        representedOrganization -> organization.meta as meta then {
          representedOrganization -> meta.tag = create('Coding') as coding then {
            representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
            representedOrganization -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization' "code";
          } "coding";
        } "meta";
        representedOrganization.id as id -> organization.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e8.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "org";
          } "r";
        } "identifier";
        representedOrganization.name as v -> organization.name = (v.other);
        representedOrganization.telecom -> organization.telecom;
        representedOrganization.addr -> organization.address;
        representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e9,  e9.request = create('BackboneElement') as request,  request.method = 'PUT',  e9.resource = create('Organization') as organization1 then {
          OrgPartOf -> organization1.meta as meta then {
            OrgPartOf -> meta.tag = create('Coding') as coding then {
              OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
              OrgPartOf -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization/asOrganizationPartOf' "code";
            } "coding";
          } "meta";
          OrgPartOf.id as id -> organization1.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e9.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
            } "r";
          } "identifier";
          OrgPartOf.code -> organization1.type;
          OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
          OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e10,  e10.request = create('BackboneElement') as request,  request.method = 'PUT',  e10.resource = create('Organization') as organization2 then {
            wholeOrgan -> organization2.meta as meta then {
              wholeOrgan -> meta.tag = create('Coding') as coding then {
                wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                wholeOrgan -> coding.code = 'ClinicalDocument/body/observation/author/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
              } "coding";
            } "meta";
            wholeOrgan.id as id -> organization2.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid4,  e10.fullUrl = append('https://example/Organization/', uuid4),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
              } "r";
            } "identifier";
            wholeOrgan.name as v -> organization2.name = (v.other);
            wholeOrgan.telecom -> organization2.telecom;
            wholeOrgan.addr -> organization2.address;
          };
        } "OrgPartOf";
      };
      // device
      assignedAuthor.assignedAuthoringDevice as assignedAuthoringDevice ->  bundle.entry as e11,  e11.request = create('BackboneElement') as request,  request.method = 'POST',  e11.resource = create('Device') as device,  device.id = uuid() as uuid11,  e11.fullUrl = append('https://example/Device/', uuid11),  request.url = 'Device',  tgt.author = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
        assignedAuthoringDevice.templateId -> device.identifier;
        assignedAuthoringDevice.code -> device.type;
        assignedAuthoringDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        assignedAuthoringDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      } "Device";
    };
  };
  // participant person
  obs.participant as participant where (typeCode != 'DEV') ->  ob.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) then {
    participant -> encounter.participant as FhirParticipant then {
      participant as p -> FhirParticipant.type as type then {
        p -> type.coding as coding then {
          p -> coding.code = (p.typeCode) "codice";
          p -> coding.system = 'http://terminology.hl7.org/CodeSystem/v3-ParticipationType' "system";
        } "codeType";
      } "type";
    } "fhirParticipant";
    participant.participantRole as participantRole ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid12,  e12.fullUrl = append('https://example/PractitionerRole/', uuid12),  request.url = 'PractitionerRole',  encounter.participant = create('BackboneElement') as participant1,  participant1.individual = create('Reference') as referencepart,  referencepart.reference = ('https://example/Practitioner/' + %practitionerRole.id) then {
      // participant.time -> participant1.period;
      participant.time as time1 -> participant1.period = create('Period') as period then {
        time1 -> period.start = create('dateTime') as start then TSDateTime(time1, start) "val";
      };
      participant.time as time1 -> participant1.period = create('Period') as period then IVLTSPeriod(time1, period);
      participant.functionCode -> practitionerRole.code;
      // non mappa i 2 precedenti
      participantRole ->  bundle.entry as e13,  e13.request = create('BackboneElement') as request,  request.method = 'PUT',  e13.resource = create('Practitioner') as practitioner then {
        participantRole -> practitioner.meta as meta then {
          participantRole -> meta.tag = create('Coding') as coding then {
            participantRole -> coding.system = 'http://algoritmodiscoring' "system";
            participantRole -> coding.code = 'ClinicalDocument/body/observation/participant' "code";
          } "coding";
        } "meta";
        participantRole.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            participantRole -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid4,  e13.fullUrl = append('https://example/Practitioner/', uuid4),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "org";
          } "r";
        } "identifier";
        participantRole.code -> practitionerRole.code;
        participantRole.addr -> practitioner.address;
        participantRole.telecom -> practitioner.telecom;
        participantRole.playingEntity as playingEntity then {
          playingEntity.name -> practitioner.name;
          playingEntity.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "practitioner";
    } "partRole";
  } "participantEncounter";
  // participant device
  obs.participant as devParticipant where (typeCode = 'DEV') ->  bundle.entry as e14,  e14.request = create('BackboneElement') as request,  request.method = 'POST',  e14.resource = create('Device') as device,  device.id = uuid() as uuid14,  e14.fullUrl = append('https://example/Device/', uuid14),  request.url = 'Device',  ob.device = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
    devParticipant.participantRole as participantRoleDev then {
      participantRoleDev.playingDevice as playingDevice then {
        playingDevice.code -> device.type;
        playingDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        playingDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      };
    } "participantRoleDev";
  } "devParticipant";
  // observationMedia
  obs.entryRelationship as er then {
    er.observationMedia as obsMedia ->  bundle.entry as e15,  e15.request = create('BackboneElement') as request,  request.method = 'POST',  e15.resource = create('Media') as media1,  media1.id = uuid() as uuid15,  e15.fullUrl = append('https://example/Media/', uuid15),  request.url = 'Media',  ob.derivedFrom = create('Reference') as reference,  reference.reference = ('https://example/Media/' + %media1.id) then {
      obsMedia -> media1.content = create('Attachment') as Attachment then {
        obsMedia -> media1.status = 'unknown' "status";
        obsMedia.value as valueMedia then {
          valueMedia.mediaType as type -> Attachment.contentType = type "type";
          valueMedia -> Attachment.data = (valueMedia.dataBase64Binary) "data";
        } "valuemedia";
      } "Attachment";
    } "media";
  } "observationMedia";
  // referenceRange
  obs.referenceRange as refRange -> ob.referenceRange = create('BackboneElement') as ref then {
    refRange.observationRange as obsRange then {
      obsRange.value : ST as value ->  ref.text = create('string'),  ref.text = (value.dataString);
      obsRange -> ref.low = create('Quantity') as Low then {
        obsRange.value : IVL_PQ as v then {
          v.low as l1 then {
            l1.value as decValue -> Low.value = decValue;
            l1.unit as Unit -> Low.unit = Unit;
          } "decValue";
          v -> ref.high = create('Quantity') as high then {
            v.high as h1 then {
              h1.value as decValue1 -> high.value = decValue1;
              h1.unit as Unit1 -> high.unit = Unit1;
            } "decValue";
          } "high";
        } "IVLPQ";
        obsRange.interpretationCode -> ref.type;
        obsRange.precondition as precondition then {
          precondition.criterion as criterion then {
            criterion.code -> ref.appliesTo "appliesTo";
            criterion.value : IVL_PQ as v then {
              v.high as l1 then {
                l1 -> ref.age = create('Quantity') as age then {
                  l1 -> age.high as high then {
                    l1.value as decValue -> high.value = decValue;
                    l1.unit as Unit1 -> high.unit = Unit1;
                  } "high";
                } "age";
              } "low";
            } "v";
          };
        };
      } "obsRange";
    } "refRange";
  } "ref";
}

group Act(source cda : Act, target pat : Patient, target ac : DiagnosticReport, target enc : Encounter, target bundle : Bundle) {
  cda.code -> ac.code;
  cda where cda.statusCode.exists().not() then {
    cda -> ac.status = 'final' "statuscode";
  } "status";
  cda.statusCode as statusc where (code = 'completed') -> ac.status = 'final';
  cda.statusCode as statusc where (code = 'active') -> ac.status = 'registered';
  cda.statusCode as statusc where (code = 'aborted') -> ac.status = 'cancelled';
  cda.statusCode as statusc where (code = 'suspended') -> ac.status = 'partial';
  cda.effectiveTime as effectiveTime -> ac.effective = create('dateTime') as value then TSDateTime(effectiveTime, value) "value3";
  cda where effectiveTime.low.exists() or effectiveTime.high.exists() then {
    cda.effectiveTime as eff -> ac.effective = create('Period') as period then IVLTSPeriod(eff, period);
  } "where";
  cda ->  ac.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %pat.id) "reference";
  cda ->  ac.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %enc.id) "reference";
  // specimen
  cda where cda.specimen.exists() then {
    cda.specimen as src ->  bundle.entry as e4,  e4.request = create('BackboneElement') as request,  request.method = 'POST',  e4.resource = create('Specimen') as specimen,  specimen.id = uuid() as uuid4,  e4.fullUrl = append('https://example/Specimen/', uuid4),  request.url = 'Specimen',  ac.specimen = create('Reference') as reference,  reference.reference = ('https://example/Specimen/' + %specimen.id) then {
      src.specimenRole as specimenRole then {
        specimenRole.id -> specimen.identifier;
        specimenRole.specimenPlayingEntity as specimenPlayingEntity then {
          specimenPlayingEntity.code -> specimen.type;
        };
      } "SpecimenRole";
      src ->  specimen.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
      cda.entryRelationship as entryRelationship then {
        entryRelationship.observation as observation then {
          observation ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('Observation') as obs,  obs.id = uuid() as uuid13,  e12.fullUrl = append('https://example/Observation/', uuid13),  request.url = 'Observation',  ac.result = create('Reference') as reference,  reference.reference = ('https://example/Observation/' + %obs.id) then {
            observation then Observation2(observation, pat, enc, obs, bundle, cda, specimen) "ORG";
            // procedure
            cda.entryRelationship as entryRelationship1 then {
              entryRelationship1.procedure as proc ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'POST',  e5.resource = create('Procedure') as procedure,  procedure.id = uuid() as uuid5,  e5.fullUrl = append('https://example/Procedure/', uuid5),  request.url = 'Procedure',  obs.partOf = create('Reference') as reference,  reference.reference = ('https://example/Procedure/' + %procedure.id) then {
                proc ->  procedure.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
                proc ->  procedure.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
                proc where proc.statusCode.exists().not() then {
                  proc -> procedure.status = 'unknown' "statuscode";
                } "status";
                proc.statusCode as statusc where (code = 'completed') -> procedure.status = 'completed';
                proc.statusCode as statusc where (code = 'active') -> procedure.status = 'in-progress';
                proc.statusCode as statusc where (code = 'aborted') -> procedure.status = 'stopped';
                proc.statusCode as statusc where (code = 'suspended') -> procedure.status = 'on-hold';
                proc.statusCode as statusc where (code = 'cancelled') -> procedure.status = 'not-done';
                proc.statusCode as statusc where (code = 'held') -> procedure.status = 'on-hold';
                proc.statusCode as statusc where (code = 'new') -> procedure.status = 'preparation';
                proc.statusCode as statusc where (code = 'obsolete') -> procedure.status = 'entered-in-error';
                proc.statusCode as statusc where (code = 'nullified') -> procedure.status = 'unknown';
                proc.effectiveTime as effectiveTime -> procedure.performed = create('dateTime') as value then TSDateTime(effectiveTime, value) "datetime";
                proc where effectiveTime.low.exists() or effectiveTime.high.exists() then {
                  proc.effectiveTime as eff -> procedure.performed = create('Period') as period then IVLTSPeriod(eff, period);
                } "where";
                proc.targetSiteCode -> procedure.bodySite;
              };
            } "entryRelationshipprocedure";
          } "obs";
        };
        entryRelationship.organizer as organizer then {
          organizer ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('Observation') as obs,  obs.id = uuid() as uuid13,  e12.fullUrl = append('https://example/Observation/', uuid13),  request.url = 'Observation',  ac.result = create('Reference') as reference,  reference.reference = ('https://example/Observation/' + %obs.id) then {
            organizer then Organizer(cda, organizer, pat, enc, obs, bundle) "ORG";
            // procedure
            cda.entryRelationship as entryRelationship1 then {
              entryRelationship1.procedure as proc ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'POST',  e5.resource = create('Procedure') as procedure,  procedure.id = uuid() as uuid5,  e5.fullUrl = append('https://example/Procedure/', uuid5),  request.url = 'Procedure',  obs.partOf = create('Reference') as reference,  reference.reference = ('https://example/Procedure/' + %procedure.id) then {
                proc ->  procedure.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
                proc ->  procedure.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
                proc where proc.statusCode.exists().not() then {
                  proc -> procedure.status = 'unknown' "statuscode";
                } "status";
                proc.statusCode as statusc where (code = 'completed') -> procedure.status = 'completed';
                proc.statusCode as statusc where (code = 'active') -> procedure.status = 'in-progress';
                proc.statusCode as statusc where (code = 'aborted') -> procedure.status = 'stopped';
                proc.statusCode as statusc where (code = 'suspended') -> procedure.status = 'on-hold';
                proc.statusCode as statusc where (code = 'cancelled') -> procedure.status = 'not-done';
                proc.statusCode as statusc where (code = 'held') -> procedure.status = 'on-hold';
                proc.statusCode as statusc where (code = 'new') -> procedure.status = 'preparation';
                proc.statusCode as statusc where (code = 'obsolete') -> procedure.status = 'entered-in-error';
                proc.statusCode as statusc where (code = 'nullified') -> procedure.status = 'unknown';
                proc.effectiveTime as effectiveTime -> procedure.performed = create('dateTime') as value then TSDateTime(effectiveTime, value) "datetime";
                proc where effectiveTime.low.exists() or effectiveTime.high.exists() then {
                  proc.effectiveTime as eff -> procedure.performed = create('Period') as period then IVLTSPeriod(eff, period);
                } "where";
                proc.targetSiteCode -> procedure.bodySite;
              } "pbservation";
            } "entryRelationshiprocedure";
          } "Organizer";
        };
      } "entryRelationshipobservation";
    };
  } "exist";
  cda where cda.specimen.exists().not() then {
    // cda -> bundle.entry as e4, e4.request = create('BackboneElement') as request, request.method = 'POST', e4.resource = create('Specimen') as specimen,  specimen.id = uuid() as uuid4,  e4.fullUrl = append('https://example/Specimen/', uuid4), request.url = 'Specimen' then {
    cda.entryRelationship as entryRelationship then {
      entryRelationship.observation as observation then {
        observation ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('Observation') as obs,  obs.id = uuid() as uuid13,  e12.fullUrl = append('https://example/Observation/', uuid13),  request.url = 'Observation',  ac.result = create('Reference') as reference,  reference.reference = ('https://example/Observation/' + %obs.id) then {
          observation then Observation3(observation, pat, enc, obs, bundle, cda) "ORG";
          // procedure
          cda.entryRelationship as entryRelationship1 then {
            entryRelationship1.procedure as proc ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'POST',  e5.resource = create('Procedure') as procedure,  procedure.id = uuid() as uuid5,  e5.fullUrl = append('https://example/Procedure/', uuid5),  request.url = 'Procedure',  obs.partOf = create('Reference') as reference,  reference.reference = ('https://example/Procedure/' + %procedure.id) then {
              proc ->  procedure.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
              proc ->  procedure.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
              proc where proc.statusCode.exists().not() then {
                proc -> procedure.status = 'unknown' "statuscode";
              } "status";
              proc.statusCode as statusc where (code = 'completed') -> procedure.status = 'completed';
              proc.statusCode as statusc where (code = 'active') -> procedure.status = 'in-progress';
              proc.statusCode as statusc where (code = 'aborted') -> procedure.status = 'stopped';
              proc.statusCode as statusc where (code = 'suspended') -> procedure.status = 'on-hold';
              proc.statusCode as statusc where (code = 'cancelled') -> procedure.status = 'not-done';
              proc.statusCode as statusc where (code = 'held') -> procedure.status = 'on-hold';
              proc.statusCode as statusc where (code = 'new') -> procedure.status = 'preparation';
              proc.statusCode as statusc where (code = 'obsolete') -> procedure.status = 'entered-in-error';
              proc.statusCode as statusc where (code = 'nullified') -> procedure.status = 'unknown';
              proc.effectiveTime as effectiveTime -> procedure.performed = create('dateTime') as value then TSDateTime(effectiveTime, value) "datetime";
              proc where effectiveTime.low.exists() or effectiveTime.high.exists() then {
                proc.effectiveTime as eff -> procedure.performed = create('Period') as period then IVLTSPeriod(eff, period);
              } "where";
              proc.targetSiteCode -> procedure.bodySite;
            };
          } "entryRelationshipprocedure";
        } "obs";
      };
      entryRelationship.organizer as organizer then {
        organizer ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('Observation') as obs,  obs.id = uuid() as uuid13,  e12.fullUrl = append('https://example/Observation/', uuid13),  request.url = 'Observation',  ac.result = create('Reference') as reference,  reference.reference = ('https://example/Observation/' + %obs.id) then {
          organizer then Organizer(cda, organizer, pat, enc, obs, bundle) "ORG";
          // procedure
          cda.entryRelationship as entryRelationship1 then {
            entryRelationship1.procedure as proc ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'POST',  e5.resource = create('Procedure') as procedure,  procedure.id = uuid() as uuid5,  e5.fullUrl = append('https://example/Procedure/', uuid5),  request.url = 'Procedure',  obs.partOf = create('Reference') as reference,  reference.reference = ('https://example/Procedure/' + %procedure.id) then {
              proc ->  procedure.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
              proc ->  procedure.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
              proc where proc.statusCode.exists().not() then {
                proc -> procedure.status = 'unknown' "statuscode";
              } "status";
              proc.statusCode as statusc where (code = 'completed') -> procedure.status = 'completed';
              proc.statusCode as statusc where (code = 'active') -> procedure.status = 'in-progress';
              proc.statusCode as statusc where (code = 'aborted') -> procedure.status = 'stopped';
              proc.statusCode as statusc where (code = 'suspended') -> procedure.status = 'on-hold';
              proc.statusCode as statusc where (code = 'cancelled') -> procedure.status = 'not-done';
              proc.statusCode as statusc where (code = 'held') -> procedure.status = 'on-hold';
              proc.statusCode as statusc where (code = 'new') -> procedure.status = 'preparation';
              proc.statusCode as statusc where (code = 'obsolete') -> procedure.status = 'entered-in-error';
              proc.statusCode as statusc where (code = 'nullified') -> procedure.status = 'unknown';
              proc.effectiveTime as effectiveTime -> procedure.performed = create('dateTime') as value then TSDateTime(effectiveTime, value) "datetime";
              proc where effectiveTime.low.exists() or effectiveTime.high.exists() then {
                proc.effectiveTime as eff -> procedure.performed = create('Period') as period then IVLTSPeriod(eff, period);
              } "where";
              proc.targetSiteCode -> procedure.bodySite;
            } "pbservation";
          } "entryRelationshiprocedure";
        } "Organizer";
      };
    } "entryRelationshipobservation";
  } "existnot";
  // PARTICIPANT
  cda.participant as part where (typeCode != 'DEV') -> enc.participant as participant then {
    part -> participant.type as type then {
      part -> type.coding as coding then {
        part -> coding.code = (part.typeCode) "codice";
        part -> coding.system = 'http://terminology.hl7.org/CodeSystem/v3-ParticipationType' "system";
      } "codeType";
    } "type";
    part.participantRole as participantRole -> participant.individual = create('Reference') as reference then {
      participantRole ->  bundle.entry as e,  e.request = create('BackboneElement') as request,  request.method = 'PUT',  e.resource = create('Practitioner') as practitioner then {
        part.time as time1 -> participant.period = create('Period') as period then {
          time1 -> period.start = create('dateTime') as start then TSDateTime(time1, start) "val";
        };
        part.time as time1 -> participant.period = create('Period') as period then IVLTSPeriod(time1, period);
        participantRole -> practitioner.meta as meta then {
          participantRole -> meta.tag = create('Coding') as coding then {
            participantRole -> coding.system = 'http://algoritmodiscoring' "system";
            participantRole -> coding.code = 'ClinicalDocument/body/act/participant' "code";
          } "coding";
        } "meta";
        participantRole.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            participantRole -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid4,  e.fullUrl = append('https://example/Practitioner/', uuid4),  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "org";
          } "r";
        } "identifier";
        participantRole.addr -> practitioner.address;
        participantRole.playingEntity as playingEntity then {
          playingEntity.name -> practitioner.name;
        };
      } "participanRoleBund";
    };
  };
  // PERFORMER
  cda.performer as performer ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid1,  e1.fullUrl = append('https://example/PractitionerRole/', uuid1),  request.url = 'PractitionerRole',  ac.performer = create('Reference') as reference,  reference.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
    performer.assignedEntity as assignedEntity then {
      assignedEntity.code as codice -> practitionerRole.code;
      assignedEntity ->  bundle.entry as e2,  e2.request = create('BackboneElement') as request,  request.method = 'PUT',  e2.resource = create('Practitioner') as practitioner then {
        assignedEntity.code -> practitionerRole.code;
        assignedEntity -> practitioner.meta as meta then {
          assignedEntity -> meta.tag = create('Coding') as coding then {
            assignedEntity -> coding.system = 'http://algoritmodiscoring' "system";
            assignedEntity -> coding.code = 'ClinicalDocument/body/act/performer' "code";
          } "coding";
        } "meta";
        assignedEntity.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            assignedEntity -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid4,  e2.fullUrl = append('https://example/Practitioner/', uuid4),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "pra";
          } "r";
        } "identifier";
        assignedEntity.addr -> practitioner.address;
        assignedEntity.telecom -> practitioner.telecom;
        assignedEntity.assignedPerson as person then {
          person.name -> practitioner.name;
          person.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "ASSAUth";
      assignedEntity.representedOrganization as representedOrganization ->  bundle.entry as e3,  e3.request = create('BackboneElement') as request,  request.method = 'PUT',  e3.resource = create('Organization') as organization then {
        representedOrganization -> organization.meta as meta then {
          representedOrganization -> meta.tag = create('Coding') as coding then {
            representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
            representedOrganization -> coding.code = 'ClinicalDocument/body/act/representedOrganization' "code";
          } "coding";
        } "meta";
        representedOrganization.id as id -> organization.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  organization.id = (r + '-' + ext) as uuid2,  e3.fullUrl = append('https://example/Organization/', uuid2),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid2) "org";
          } "r";
        } "identifier";
        representedOrganization.name as v -> organization.name = (v.other);
        representedOrganization.telecom -> organization.telecom;
        representedOrganization.addr -> organization.address;
        representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e4,  e4.request = create('BackboneElement') as request,  request.method = 'PUT',  e4.resource = create('Organization') as organization1 then {
          OrgPartOf -> organization1.meta as meta then {
            OrgPartOf -> meta.tag = create('Coding') as coding then {
              OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
              OrgPartOf -> coding.code = 'ClinicalDocument/body/act/representedOrganization/asOrganizationPartOf' "code";
            } "coding";
          } "meta";
          OrgPartOf.id as id -> organization1.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid3,  organization1.id = uuid() as uuid3,  e4.fullUrl = append('https://example/Organization/', uuid3),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
            } "r";
          } "identifier";
          OrgPartOf.code -> organization1.type;
          OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
          OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e10bis,  e10bis.request = create('BackboneElement') as request,  request.method = 'PUT',  e10bis.resource = create('Organization') as organization2 then {
            OrgPartOf -> organization2.meta as meta then {
              OrgPartOf -> meta.tag = create('Coding') as coding then {
                OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
                OrgPartOf -> coding.code = 'ClinicalDocument/body/act/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
              } "coding";
            } "meta";
            wholeOrgan.id as id -> organization2.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid5,  e10bis.fullUrl = append('https://example/Organization/', uuid5),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
              } "r";
            } "identifier";
            wholeOrgan.name as v -> organization2.name = (v.other);
            wholeOrgan.telecom -> organization2.telecom;
            wholeOrgan.addr -> organization2.address;
          };
        } "OrgPartOf";
      };
    } "performer";
  };
  // AUTHOR
  cda.author as srcAuthor ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'POST',  e5.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid6,  e5.fullUrl = append('https://example/PractitionerRole/', uuid6),  request.url = 'PractitionerRole',  ac.performer = create('Reference') as reference,  reference.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
    srcAuthor.assignedAuthor as assignedAuthor then {
      assignedAuthor.code as codice -> practitionerRole.code;
      assignedAuthor ->  bundle.entry as e7,  e7.request = create('BackboneElement') as request,  request.method = 'PUT',  e7.resource = create('Practitioner') as practitioner then {
        srcAuthor.functionCode -> practitionerRole.code;
        assignedAuthor.code -> practitionerRole.code;
        assignedAuthor -> practitioner.meta as meta then {
          assignedAuthor -> meta.tag = create('Coding') as coding then {
            assignedAuthor -> coding.system = 'http://algoritmodiscoring' "system";
            assignedAuthor -> coding.code = 'ClinicalDocument/body/act/author' "code";
          } "coding";
        } "meta";
        assignedAuthor.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            assignedAuthor -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e7.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "aut";
          } "r";
        } "identifier";
        assignedAuthor.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
          id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
        } "2";
        assignedAuthor.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
          id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
        } "diverso";
        assignedAuthor.addr -> practitioner.address;
        assignedAuthor.telecom -> practitioner.telecom;
        // person
        assignedAuthor.assignedPerson as person then {
          person.name -> practitioner.name;
          person.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "ASSAUth";
      // organization
      assignedAuthor.representedOrganization as representedOrganization ->  bundle.entry as e8,  e8.request = create('BackboneElement') as request,  request.method = 'PUT',  e8.resource = create('Organization') as organization then {
        representedOrganization -> organization.meta as meta then {
          representedOrganization -> meta.tag = create('Coding') as coding then {
            representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
            representedOrganization -> coding.code = 'ClinicalDocument/body/act/author/representedOrganization' "code";
          } "coding";
        } "meta";
        representedOrganization.id as id -> organization.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  organization.id = (r + '-' + ext) as uuid8,  e8.fullUrl = append('https://example/Organization/', uuid8),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid8) "org";
          } "r";
        } "identifier";
        representedOrganization.name as v -> organization.name = (v.other);
        representedOrganization.telecom -> organization.telecom;
        representedOrganization.addr -> organization.address;
        representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e9,  e9.request = create('BackboneElement') as request,  request.method = 'PUT',  e9.resource = create('Organization') as organization1 then {
          OrgPartOf -> organization1.meta as meta then {
            OrgPartOf -> meta.tag = create('Coding') as coding then {
              OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
              OrgPartOf -> coding.code = 'ClinicalDocument/body/act/author/representedOrganization/asOrganizationPartOf' "code";
            } "coding";
          } "meta";
          OrgPartOf.id as id -> organization1.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid9,  e9.fullUrl = append('https://example/Organization/', uuid9),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
            } "r";
          } "identifier";
          OrgPartOf.code -> organization1.type;
          OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
          OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e10,  e10.request = create('BackboneElement') as request,  request.method = 'PUT',  e10.resource = create('Organization') as organization2 then {
            wholeOrgan -> organization2.meta as meta then {
              wholeOrgan -> meta.tag = create('Coding') as coding then {
                wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                wholeOrgan -> coding.code = 'ClinicalDocument/body/act/author/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
              } "coding";
            } "meta";
            wholeOrgan.id as id -> organization2.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid10,  e10.fullUrl = append('https://example/Organization/', uuid10),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
              } "r";
            } "identifier";
            wholeOrgan.name as v -> organization2.name = (v.other);
            wholeOrgan.telecom -> organization2.telecom;
            wholeOrgan.addr -> organization2.address;
          };
        } "OrgPartOf";
      };
    } "author";
  };
  // <!--entryRelationship per la gestione delle note e commenti-->
  cda.entryRelationship as entryRelationship then {
    entryRelationship.act as act then {
      act.text as text then {
        text.reference as reference -> ac.conclusion = (reference.value);
      };
    } "Act";
  };
}

group Organizer(source cda : Act, source org : Organizer, target patient : Patient, target encounter : Encounter, target observation : Observation, target bundle : Bundle) {
  org ->  observation.subject = create('Reference') as reference,  reference.reference = ('https://example/Patient/' + %patient.id) "reference";
  org ->  observation.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) "reference";
  org.code -> observation.code;
  org where org.code.exists().not() then {
    cda.code -> observation.code;
  } "act";
  org.statusCode as statusc where (code = 'completed') -> observation.status = 'final';
  org.statusCode as statusc where (code = 'active') -> observation.status = 'registered';
  org.statusCode as statusc where (code = 'aborted') -> observation.status = 'cancelled';
  org.statusCode as statusc where (code = 'suspended') -> observation.status = 'partial';
  org.effectiveTime as effectiveTime -> observation.effective = create('dateTime') as value then TSDateTime(effectiveTime, value) "value2";
  org where effectiveTime.low.exists() or effectiveTime.high.exists() then {
    org.effectiveTime as eff -> observation.effective = create('Period') as period then IVLTSPeriod(eff, period);
  } "where";
  // specimen
  org.specimen as spmn ->  bundle.entry as e4o,  e4o.request = create('BackboneElement') as request,  request.method = 'POST',  e4o.resource = create('Specimen') as specimen,  specimen.id = uuid() as uuid4o,  e4o.fullUrl = append('https://example/Specimen/', uuid4o),  request.url = 'Specimen',  observation.specimen = create('Reference') as reference,  reference.reference = ('https://example/Specimen/' + %specimen.id) then {
    spmn.specimenRole as specimenRole then {
      specimenRole.id as id -> specimen.identifier;
      specimenRole.specimenPlayingEntity as specimenPlayingEntity then {
        specimenPlayingEntity.code -> specimen.type;
      };
    };
  };
  // subject
  org.subject as sbj then {
    sbj.relatedSubject as relatedSubj -> patient.extension as extension2 then ExtSubjectAnimal(relatedSubj, extension2);
  };
  // performer
  org.performer as performer ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid1,  e1.fullUrl = append('https://example/PractitionerRole/', uuid1),  request.url = 'PractitionerRole' then {
    performer ->  observation.performer = create('Reference') as reference,  reference.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
      performer.assignedEntity as entity then {
        entity.code -> practitionerRole.code;
        entity ->  bundle.entry as e2,  e2.request = create('BackboneElement') as request,  request.method = 'PUT',  e2.resource = create('Practitioner') as practitioner then {
          entity -> practitioner.meta as meta then {
            entity -> meta.tag = create('Coding') as coding then {
              entity -> coding.system = 'http://algoritmodiscoring' "system";
              entity -> coding.code = 'ClinicalDocument/body/organizer/performer' "code";
            } "coding";
          } "meta";
          entity.id as id -> practitioner.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              entity -> request.url = append('Practitioner?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e2.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "aut";
            } "r";
          } "identifier";
          entity.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "2";
          entity.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
            id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "diverso";
          entity.addr -> practitioner.address;
          entity.telecom -> practitioner.telecom;
          entity.assignedPerson as person then {
            person.name -> practitioner.name;
            person.birthTime as birthTime then {
              birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
            } "birth";
          } "name";
          entity.representedOrganization as representedOrganization ->  bundle.entry as e3,  e3.request = create('BackboneElement') as request,  request.method = 'PUT',  e3.resource = create('Organization') as organization then {
            representedOrganization -> organization.meta as meta then {
              representedOrganization -> meta.tag = create('Coding') as coding then {
                representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
                representedOrganization -> coding.code = 'ClinicalDocument/body/organizer/performer/representedOrganization' "code";
              } "coding";
            } "meta";
            representedOrganization.id as id -> organization.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization.id = (r + '-' + ext) as uuid3,  e3.fullUrl = append('https://example/Organization/', uuid3),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid3) "aut";
              } "r";
            } "identifier";
            representedOrganization.name as v -> organization.name = (v.other);
            representedOrganization.telecom -> organization.telecom;
            representedOrganization.addr -> organization.address;
            representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e4,  e4.request = create('BackboneElement') as request,  request.method = 'PUT',  e4.resource = create('Organization') as organization1 then {
              OrgPartOf -> organization1.meta as meta then {
                OrgPartOf -> meta.tag = create('Coding') as coding then {
                  OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
                  OrgPartOf -> coding.code = 'ClinicalDocument/body/organizer/performer/representedOrganization/asOrganizationPartOf' "code";
                } "coding";
              } "meta";
              OrgPartOf.id as id -> organization1.identifier as identifier then {
                id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                id.extension as ext -> identifier.value = ext then {
                  OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
                } "ext";
                id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                id.root as r then {
                  id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid4,  e4.fullUrl = append('https://example/Organization/', uuid4),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "org";
                } "r";
              } "identifier";
              OrgPartOf.code -> organization1.type;
              OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
              OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e5,  e5.request = create('BackboneElement') as request,  request.method = 'PUT',  e5.resource = create('Organization') as organization2 then {
                wholeOrgan -> organization2.meta as meta then {
                  wholeOrgan -> meta.tag = create('Coding') as coding then {
                    wholeOrgan -> coding.system = 'http://algoritmodiscoring' "system";
                    wholeOrgan -> coding.code = 'ClinicalDocument/body/organizer/performer/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
                  } "coding";
                } "meta";
                wholeOrgan.id as id -> organization2.identifier as identifier then {
                  id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
                  id.extension as ext -> identifier.value = ext then {
                    wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
                  } "ext";
                  id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
                  id.root as r then {
                    id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid4,  e5.fullUrl = append('https://example/Organization/', uuid4),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "org";
                  } "r";
                } "identifier";
                wholeOrgan.name as v -> organization2.name = (v.other);
                wholeOrgan.telecom -> organization2.telecom;
                wholeOrgan.addr -> organization2.address;
              };
            } "OrgPartOf";
          };
        } "practitioner";
      } "entity";
    } "practitionerRole";
  };
  // author
  org.author as srcAuthor ->  bundle.entry as e6,  e6.request = create('BackboneElement') as request,  request.method = 'POST',  e6.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid6,  e6.fullUrl = append('https://example/PractitionerRole/', uuid6),  request.url = 'PractitionerRole',  observation.performer = create('Reference') as referenceaut,  referenceaut.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) then {
    // srcAuthor.time as time -> tgt.date;
    srcAuthor.assignedAuthor as assignedAuthor then {
      assignedAuthor.code as codice -> practitionerRole.code as code2 then CECodeableConcept(codice, code2);
      assignedAuthor ->  bundle.entry as e7,  e7.request = create('BackboneElement') as request,  request.method = 'PUT',  e7.resource = create('Practitioner') as practitioner then {
        srcAuthor.functionCode -> practitionerRole.code;
        // assignedAuthor.code -> practitionerRole.code;
        assignedAuthor -> practitioner.meta as meta then {
          assignedAuthor -> meta.tag = create('Coding') as coding then {
            assignedAuthor -> coding.system = 'http://algoritmodiscoring' "system";
            assignedAuthor -> coding.code = 'ClinicalDocument/body/organizer/author' "code";
          } "coding";
        } "meta";
        assignedAuthor.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            assignedAuthor -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid7,  e7.fullUrl = append('https://example/Practitioner/', uuid7),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "aut";
          } "r";
        } "identifier";
        assignedAuthor.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
          id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
        } "2";
        assignedAuthor.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
          id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
        } "diverso";
        assignedAuthor.addr -> practitioner.address;
        assignedAuthor.telecom -> practitioner.telecom;
        // person
        assignedAuthor.assignedPerson as person then {
          person.name -> practitioner.name;
          person.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "ASSAUth";
      // organization
      assignedAuthor.representedOrganization as representedOrganization ->  bundle.entry as e8,  e8.request = create('BackboneElement') as request,  request.method = 'PUT',  e8.resource = create('Organization') as organization then {
        representedOrganization -> organization.meta as meta then {
          representedOrganization -> meta.tag = create('Coding') as coding then {
            representedOrganization -> coding.system = 'http://algoritmodiscoring' "system";
            representedOrganization -> coding.code = 'ClinicalDocument/body/organizer/author/representedOrganization' "code";
          } "coding";
        } "meta";
        representedOrganization.id as id -> organization.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            representedOrganization -> request.url = append('Organization?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  organization.id = (r + '-' + ext) as uuid8,  e8.fullUrl = append('https://example/Organization/', uuid8),  practitionerRole.organization = create('Reference') as referenceOrg,  referenceOrg.reference = append('https://example/Organization/', uuid8) "aut";
          } "r";
        } "identifier";
        representedOrganization.name as v -> organization.name = (v.other);
        representedOrganization.telecom -> organization.telecom;
        representedOrganization.addr -> organization.address;
        representedOrganization.asOrganizationPartOf as OrgPartOf ->  bundle.entry as e9,  e9.request = create('BackboneElement') as request,  request.method = 'PUT',  e9.resource = create('Organization') as organization1 then {
          OrgPartOf -> organization1.meta as meta then {
            OrgPartOf -> meta.tag = create('Coding') as coding then {
              OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
              OrgPartOf -> coding.code = 'ClinicalDocument/body/organizer/author/representedOrganization/asOrganizationPartOf' "code";
            } "coding";
          } "meta";
          OrgPartOf.id as id -> organization1.identifier as identifier then {
            id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
            id.extension as ext -> identifier.value = ext then {
              OrgPartOf -> request.url = append('Organization?identifier=', ext) "UUID";
            } "ext";
            id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
            id.root as r then {
              id.extension as ext ->  organization1.id = (r + '-' + ext) as uuid9,  e9.fullUrl = append('https://example/Organization/', uuid9),  organization.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization1.id) "aut";
            } "r";
          } "identifier";
          OrgPartOf.code -> organization1.type;
          OrgPartOf.statusCode as status where (value = 'active') ->  organization1.active = create('boolean'),  organization1.active = 'true';
          OrgPartOf.wholeOrganization as wholeOrgan ->  bundle.entry as e10,  e10.request = create('BackboneElement') as request,  request.method = 'PUT',  e10.resource = create('Organization') as organization2 then {
            OrgPartOf -> organization2.meta as meta then {
              OrgPartOf -> meta.tag = create('Coding') as coding then {
                OrgPartOf -> coding.system = 'http://algoritmodiscoring' "system";
                OrgPartOf -> coding.code = 'ClinicalDocument/body/organizer/author/representedOrganization/asOrganizationPartOf/wholeOrganization' "code";
              } "coding";
            } "meta";
            wholeOrgan.id as id -> organization2.identifier as identifier then {
              id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
              id.extension as ext -> identifier.value = ext then {
                wholeOrgan -> request.url = append('Organization?identifier=', ext) "UUID";
              } "ext";
              id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
              id.root as r then {
                id.extension as ext ->  organization2.id = (r + '-' + ext) as uuid10,  e10.fullUrl = append('https://example/Organization/', uuid10),  organization1.partOf = create('Reference') as reference,  reference.reference = ('https://example/Organization/' + %organization2.id) "aut";
              } "r";
            } "identifier";
            wholeOrgan.name as v -> organization2.name = (v.other);
            wholeOrgan.telecom -> organization2.telecom;
            wholeOrgan.addr -> organization2.address;
          };
        } "OrgPartOf";
      };
      // device
      assignedAuthor.assignedAuthoringDevice as assignedAuthoringDevice ->  bundle.entry as e11,  e11.request = create('BackboneElement') as request,  request.method = 'POST',  e11.resource = create('Device') as device,  device.id = uuid() as uuid11,  e11.fullUrl = append('https://example/Device/', uuid11),  request.url = 'Device',  tgt.author = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
        assignedAuthoringDevice.templateId -> device.identifier;
        assignedAuthoringDevice.code -> device.type;
        assignedAuthoringDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        assignedAuthoringDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      } "Device";
    };
  };
  // participant person
  org.participant as participant where (typeCode != 'DEV') ->  observation.encounter = create('Reference') as reference,  reference.reference = ('https://example/Encounter/' + %encounter.id) then {
    participant -> encounter.participant as FhirParticipant then {
      participant as p -> FhirParticipant.type as type then {
        p -> type.coding as coding then {
          p -> coding.code = (p.typeCode) "codice";
          p -> coding.system = 'http://terminology.hl7.org/CodeSystem/v3-ParticipationType' "system";
        } "codeType";
      } "type";
    } "fhirParticipant";
    participant.participantRole as participantRole ->  bundle.entry as e12,  e12.request = create('BackboneElement') as request,  request.method = 'POST',  e12.resource = create('PractitionerRole') as practitionerRole,  practitionerRole.id = uuid() as uuid12,  e12.fullUrl = append('https://example/PractitionerRole/', uuid12),  request.url = 'PractitionerRole',  encounter.participant = create('BackboneElement') as participant1 then {
      // participant.time -> participant1.period;
      participant.time as time1 -> participant1.period = create('Period') as period then {
        time1 -> period.start = create('dateTime') as start then TSDateTime(time1, start) "val";
      };
      participant.time as time1 -> participant1.period = create('Period') as period then IVLTSPeriod(time1, period);
      participant.functionCode -> practitionerRole.code;
      // non mappa i 2 precedenti
      participantRole ->  bundle.entry as e13,  e13.request = create('BackboneElement') as request,  request.method = 'PUT',  e13.resource = create('Practitioner') as practitioner then {
        participantRole ->  participant1.individual = create('Reference') as referencepart,  referencepart.reference = ('https://example/PractitionerRole/' + %practitionerRole.id) "par";
        participantRole -> practitioner.meta as meta then {
          participantRole -> meta.tag = create('Coding') as coding then {
            participantRole -> coding.system = 'http://algoritmodiscoring' "system";
            participantRole -> coding.code = 'ClinicalDocument/body/organizer/participant' "code";
          } "coding";
        } "meta";
        participantRole.id as id -> practitioner.identifier as identifier then {
          id.root as r -> identifier.system = translate(r, 'http://hl7.org/fhir/ConceptMap/special-oid2uri', 'uri') "root1";
          id.extension as ext -> identifier.value = ext then {
            participantRole -> request.url = append('Practitioner?identifier=', ext) "UUID";
          } "ext";
          id.assigningAuthorityName as s ->  identifier.assigner as a,  a.display = s;
          id.root as r then {
            id.extension as ext ->  practitioner.id = (r + '-' + ext) as uuid2,  e13.fullUrl = append('https://example/Practitioner/', uuid2),  practitionerRole.practitioner = create('Reference') as reference,  reference.reference = ('https://example/Practitioner/' + %practitioner.id) "part";
          } "r";
        } "identifier";
        participantRole.id as id where (root = '2.16.840.1.113883.2.9.4.3.2') then {
          id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
        } "2";
        participantRole.id as id where (root != '2.16.840.1.113883.2.9.4.3.2') then {
          id.extension as ext -> request.url = append('Practitioner?identifier=', ext) "UUID";
        } "diverso";
        participantRole.code -> practitionerRole.code;
        participantRole.addr -> practitioner.address;
        participantRole.telecom -> practitioner.telecom;
        participantRole.playingEntity as playingEntity then {
          playingEntity.name -> practitioner.name;
          playingEntity.birthTime as birthTime then {
            birthTime.value as date -> practitioner.birthDate = truncate(date, 10);
          } "birth";
        } "name";
      } "practitioner";
    } "partRole";
  } "participantEncounter";
  // participant device
  org.participant as devParticipant where (typeCode = 'DEV') ->  bundle.entry as e14,  e14.request = create('BackboneElement') as request,  request.method = 'POST',  e14.resource = create('Device') as device,  device.id = uuid() as uuid14,  e14.fullUrl = append('https://example/Device/', uuid14),  request.url = 'Device',  observation.device = create('Reference') as reference,  reference.reference = ('https://example/Device/' + %device.id) then {
    devParticipant.participantRole as participantRoleDev then {
      participantRoleDev.playingDevice as playingDevice then {
        playingDevice.code -> device.type;
        playingDevice.manufacturerModelName as manufacturerModelName then {
          manufacturerModelName as m -> device.manufacturer = (m.displayName) "displayRule";
        } "manufacturer";
        playingDevice.softwareName as softwareName -> device.deviceName as deviceName then {
          softwareName -> deviceName.type = 'other' "typeName";
          softwareName as s -> deviceName.name = (s.displayName) "name";
        } "deviceName";
      };
    } "participantRoleDev";
  } "devParticipant";
  org.component as component then {
    component.observation as observation ->  bundle.entry as e,  e.request = create('BackboneElement') as request,  request.method = 'POST',  e.resource = create('Observation') as observationhasmember,  observationhasmember.id = uuid() as uuid2,  e.fullUrl = append('https://example/Observation/', uuid2),  request.url = 'Observation',  observation.hasMember = create('Reference') as reference,  reference.reference = ('https://example/Observation/' + %observationhasmember.id) then Observation(observation, patient, encounter, observationhasmember, bundle) "OBS";
  } "componentobservation";
  org.component as component then {
    component.organizer as organizer ->  bundle.entry as e1,  e1.request = create('BackboneElement') as request,  request.method = 'POST',  e1.resource = create('Observation') as observationorganizer,  observationorganizer.id = uuid() as uuid3,  e1.fullUrl = append('https://example/Observation/', uuid3),  request.url = 'Observation',  observation.hasMember = create('Reference') as reference,  reference.reference = ('https://example/Observation/' + %observationorganizer.id) then {
      organizer then Organizer(cda, organizer, patient, encounter, observationorganizer, bundle) "ORG";
    };
  } "componentorganizer";
  // observationMedia
  org.component as component then {
    component.observationMedia as obsMedia ->  bundle.entry as e15,  e15.request = create('BackboneElement') as request,  request.method = 'POST',  e15.resource = create('Media') as media1,  media1.id = uuid() as uuid15,  e15.fullUrl = append('https://example/Media/', uuid15),  request.url = 'Media',  observation.derivedFrom = create('Reference') as reference,  reference.reference = ('https://example/Media/' + %media1.id) then {
      obsMedia -> media1.content = create('Attachment') as Attachment then {
        obsMedia -> media1.status = 'unknown' "status";
        obsMedia.value as valueMedia then {
          valueMedia.mediaType as type -> Attachment.contentType = type "type";
          valueMedia -> Attachment.data = (valueMedia.dataBase64Binary) "data";
        } "valuemedia";
      } "Attachment";
    } "obsmedia";
  };
  // note
  org.component as component then {
    component.act as act then {
      act.text as text then {
        text.reference as reference -> observation.note as note then {
          reference -> note.text = (reference.value) "reference";
        } "note";
      };
    } "componentact";
  };
}

group ExtSubjectAnimal(source src : relatedSubject, target ext : Extension) {
  src -> ext.url = 'http://hl7.org/fhir/StructureDefinition/patient-animal' "url";
  src.code as code ->  ext.extension as ext,  ext.url = 'species',  ext.value = create('CodeableConcept') as code1 then CECodeableConcept(code, code1);
}