StructureMap-cda2fhirAmbReport

Sourcehl7.fhir.it.cda2fhir#current:CDA to FHIR Maps (v4.0.1)
resourceTypeStructureMap
idcda2fhirAmbReport
canonicalhttp://hl7.it/fhir/cda2fhir/StructureMap/cda2fhirAmbReport
version0.1.0
statusdraft
publisherHL7 Italy
namecda2fhirAmbReport
date2023-06-12T14:05:19+00:00
jurisdictionsit
Usages(none)

    
/// url = 
    
    'http://hl7.it/fhir/cda2fhir/StructureMap/cda2fhirAmbReport'

    
/// name = 
    
    'cda2fhirAmbReport'

    
/// status = 
    
    'draft'


    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/List
    " 
    alias 
List     as 
    produced

    uses
     "
    http://hl7.org/fhir/StructureDefinition/Practitioner
    " 
    alias 
Practitioner     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


    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 
    e4
    , 
 e4.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e4.resource =     create
    (
    'DocumentReference'
    )
     as 
    DocumentReference
    , 
 DocumentReference.id =     uuid
    (
    )
     as 
    uuid4
    , 
 e4.fullUrl =     append
    (
    'https://example/DocumentReference/'
    , 
    uuid4
    )
    , 
 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"
    ;

            }
     "record"
    ;

          }
     "recPat"
    ;

        }
     "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    
 ->     
 bundle.entry     as 
    e
    , 
 e.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e.resource =     create
    (
    'DiagnosticReport'
    )
     as 
    diagnosticReport
    , 
 diagnosticReport.id =     uuid
    (
    )
     as 
    uuid1
    , 
 e.fullUrl =     append
    (
    'https://example/DiagnosticReport/'
    , 
    uuid1
    )
    , 
 request.url =     'DiagnosticReport'
     then
     {

    cda.code    
 ->     
diagnosticReport.code     "diagnosticCode"
    ;

    cda    
 ->     
diagnosticReport.status =     'registered'
     "stats"
    ;

    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
    , 
    diagnosticReport
    )
    ;

              }
    ;

            }
    ;

          }
     "body"
    ;

        }
    ;

      }
     "diagnostic"
    ;

    }


    group 
ClinicalDocumentSection    (
    source
     cda
     : 
ClinicalDocument,     source
     src
     : 
Section,     target
     patient
     : 
Patient,     target
     tgt
,     target
     bundle
     : 
Bundle,     target
     enc
     : 
Encounter,     target
     dReport
     : 
DiagnosticReport    )
     {

  src.title     as 
    t
    
 ->     
tgt.title =     (
t.dataString    )
    ;

  src.code    
 ->     
tgt.code    ;

  src    
 ->     
 tgt.entry =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/DiagnosticReport/' + %dReport.id    )
     "reference"
    ;

  src.entry     as 
    entry
     then
     {

    src.text     as 
    cdaText
    
 ->     
tgt.text     as 
    fhirText
     then
     {

      cdaText    
 ->     
fhirText.status =     'generated'
     "narrativeStatus"
    ;

      cdaText     as 
    t
    
 ->     
fhirText.div =     t
     "narrativeText"
    ;

        }
     "cdaText"
    ;

    entry     then 
DiagnosticReportFunction    (
    src
    , 
    entry
    , 
    dReport
    , 
    bundle
    , 
    enc
    , 
    patient
    )
     "dreport"
    ;

      }
    ;

  src     where 
src.entry.exists().not()     then 
DiagnosticReportFunction    (
    src
    , 
    cda
    , 
    dReport
    , 
    bundle
    , 
    enc
    , 
    patient
    )
     "narrative"
    ;

  src.component     as 
    component
     then
     {

    component.section     as 
    sec
    
 ->     
tgt.section     as 
    tgtSection
     then 
ClinicalDocumentSection    (
    cda
    , 
    sec
    , 
    patient
    , 
    tgtSection
    , 
    bundle
    , 
    enc
    , 
    dReport
    )
    ;

      }
    ;

    }


    group 
DiagnosticReportFunction    (
    source
     section
     : 
section,     source
     src
     : 
entry,     target
     dReport
     : 
DiagnosticReport,     target
     bundle
     : 
Bundle,     target
     encounter
     : 
Encounter,     target
     patient
     : 
Patient    )
     {

  src.observation     as 
    observation
     then
     {

    section     where 
code.code = '29299-5'    
 ->     
 bundle.entry     as 
    e1
    , 
 e1.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e1.resource =     create
    (
    'Observation'
    )
     as 
    obs1
    , 
 obs1.id =     uuid
    (
    )
     as 
    uuid1
    , 
 e1.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid1
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs1.id    )
     then 
Observation    (
    observation
    , 
    patient
    , 
    encounter
    , 
    obs1
    , 
    bundle
    )
     "QuesitoDiagnostico"
    ;

    section     where 
code.code = '11329-0'    
 ->     
 bundle.entry     as 
    e2
    , 
 e2.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e2.resource =     create
    (
    'Observation'
    )
     as 
    obs2
    , 
 obs2.id =     uuid
    (
    )
     as 
    uuid2
    , 
 e2.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid2
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs2.id    )
     then
     {

      section    
 ->     
 obs2.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

      section    
 ->     
 obs2.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

      section    
 ->     
obs2.status =     'final'
     "STatusobse"
    ;

      section.code    
 ->     
obs2.code    ;

      observation.statusCode     as 
    s
     then
     {

        s.code     as 
    cos
    
 ->     
obs2.status =     translate
    (
    cos
    , 
    '#OBSstatus'
    , 
    'code'
    )
     "codeS"
    ;

          }
     "status"
    ;

      section.component     as 
    component
     then
     {

        component.section     as 
    section
     then
     {

          section.code     where 
code = '10160-0'     then
     {

            section.entry     as 
    entry
     then
     {

              entry.substanceAdministration     as 
    subAdmin
    
 ->     
 bundle.entry     as 
    e11
    , 
 e11.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e11.resource =     create
    (
    'MedicationStatement'
    )
     as 
    medicationstatement
    , 
 medicationstatement.id =     uuid
    (
    )
     as 
    uuid11
    , 
 e11.fullUrl =     append
    (
    'https://example/MedicationStatement/'
    , 
    uuid11
    )
    , 
 request.url =     'MedicationStatement'
    , 
 obs2.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/MedicationStatement/' + %medicationstatement.id    )
     then 
MedicationStatement    (
    subAdmin
    , 
    medicationstatement
    , 
    patient
    , 
    encounter
    , 
    bundle
    )
     "creat"
    ;

                }
    ;

              }
     "sectionCode"
    ;

          section.code     where 
code = '48765-2'     then
     {

            section    
 ->     
 bundle.entry     as 
    e4
    , 
 e4.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e4.resource =     create
    (
    'List'
    )
     as 
    list1
    , 
 list1.id =     uuid
    (
    )
     as 
    uuid4
    , 
 e4.fullUrl =     append
    (
    'https://example/List/'
    , 
    uuid4
    )
    , 
 request.url =     'List'
    , 
 obs2.focus =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/List/' + %list1.id    )
     then
     {

              section    
 ->     
 list1.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

              section    
 ->     
list1.status =     'current'
     "listatus"
    ;

              section    
 ->     
list1.mode =     'working'
     "lstmod"
    ;

              section    
 ->     
 list1.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

              section    
 ->     
list1.entry     as 
    entryList1
     then
     {

                section.entry     as 
    entry
     then
     {

                  entry.act     as 
    act1
    
 ->     
 bundle.entry     as 
    e5
    , 
 e5.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e5.resource =     create
    (
    'AllergyIntolerance'
    )
     as 
    allergy
    , 
 allergy.id =     uuid
    (
    )
     as 
    uuid5
    , 
 e5.fullUrl =     append
    (
    'https://example/AllergyIntolerance/'
    , 
    uuid5
    )
    , 
 request.url =     'AllergyIntolerance'
    , 
 entryList1.item =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/AllergyIntolerance/' + %allergy.id    )
     then 
allergyFunction    (
    act1
    , 
    allergy
    , 
    patient
    , 
    encounter
    )
     "allergy"
    ;

                    }
     "entryAll"
    ;

                  }
     "entryList"
    ;

                }
     "section"
    ;

              }
     "conditionAllergie"
    ;

            }
    ;

          }
     "subSection"
    ;

      section.entry     as 
    entry
     then
     {

        entry.observation    
 ->     
 bundle.entry     as 
    e3
    , 
 e3.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e3.resource =     create
    (
    'Condition'
    )
     as 
    condition
    , 
 condition.id =     uuid
    (
    )
     as 
    uuid3
    , 
 e3.fullUrl =     append
    (
    'https://example/Condition/'
    , 
    uuid3
    )
    , 
 request.url =     'Condition'
    , 
 obs2.focus =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Condition/' + %condition.id    )
     then 
ConditionFunction    (
    observation
    , 
    condition
    , 
    patient
    , 
    encounter
    , 
    bundle
    )
     "condition"
    ;

        entry.organizer     as 
    organizer
     then
     {

          section    
 ->     
 bundle.entry     as 
    e11
    , 
 e11.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e11.resource =     create
    (
    'List'
    )
     as 
    list11
    , 
 list11.id =     uuid
    (
    )
     as 
    uuid11
    , 
 e11.fullUrl =     append
    (
    'https://example/List/'
    , 
    uuid11
    )
    , 
 request.url =     'List'
    , 
 obs2.focus =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/List/' + %list11.id    )
     then
     {

            section    
 ->     
 list11.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

            section    
 ->     
list11.status =     'current'
     "liststat"
    ;

            section    
 ->     
list11.mode =     'working'
     "listmd"
    ;

            section    
 ->     
 list11.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

            organizer    
 ->     
list11.entry     as 
    entryList2
     then
     {

              organizer    
 ->     
 bundle.entry     as 
    e12
    , 
 e12.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e12.resource =     create
    (
    'FamilyMemberHistory'
    )
     as 
    familyMember
    , 
 familyMember.id =     uuid
    (
    )
     as 
    uuid12
    , 
 e12.fullUrl =     append
    (
    'https://example/FamilyMemberHistory/'
    , 
    uuid12
    )
    , 
 request.url =     'FamilyMemberHistory'
    , 
 entryList2.item =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/FamilyMemberHistory/' + %familyMember.id    )
     then 
FamilyMemberFunction    (
    organizer
    , 
    familyMember
    , 
    patient
    )
     "family"
    ;

                }
     "org"
    ;

              }
     "List"
    ;

            }
    ;

          }
    ;

        }
     "StoriaClinica1"
    ;

    section     where 
code.code = '30954-2'    
 ->     
 bundle.entry     as 
    e4
    , 
 e4.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e4.resource =     create
    (
    'Observation'
    )
     as 
    obs4
    , 
 obs4.id =     uuid
    (
    )
     as 
    uuid4
    , 
 e4.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid4
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs4.id    )
     then 
Observation    (
    observation
    , 
    patient
    , 
    encounter
    , 
    obs4
    , 
    bundle
    )
     "PrecedentiEsamiEseguiti"
    ;

    section     where 
code.code = '29548-5'    
 ->     
 bundle.entry     as 
    e5
    , 
 e5.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e5.resource =     create
    (
    'Observation'
    )
     as 
    obs5
    , 
 obs5.id =     uuid
    (
    )
     as 
    uuid5
    , 
 e5.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid5
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs5.id    )
     then 
Observation    (
    observation
    , 
    patient
    , 
    encounter
    , 
    obs5
    , 
    bundle
    )
     "Diagnosi"
    ;

      }
     "entryObs"
    ;

  src.act     as 
    act
     then
     {

    section     where 
code.code = '62387-6'    
 ->     
 dReport.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     then
     {

      act.code    
 ->     
encounter.type     "type"
    ;

      act.effectiveTime     as 
    effectiveTime
    
 ->     
encounter.period     as 
    period
     then
     {

        effectiveTime    
 ->     
period.start =     create
    (
    'dateTime'
    )
     as 
    start
     then 
TSDateTime    (
    effectiveTime
    , 
    start
    )
     "val"
    ;

          }
     "period"
    ;

      act    
 ->     
 bundle.entry     as 
    e10
    , 
 e10.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e10.resource =     create
    (
    'Procedure'
    )
     as 
    procedureRes
    , 
 procedureRes.id =     uuid
    (
    )
     as 
    uuid10
    , 
 e10.fullUrl =     append
    (
    'https://example/Procedure/'
    , 
    uuid10
    )
    , 
 request.url =     'Procedure'
    , 
 encounter.reasonReference =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Procedure/' + %procedureRes.id    )
     then
     {

        act    
 ->     
 procedureRes.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

        act    
 ->     
 procedureRes.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

        act.statusCode    
 ->     
procedureRes.status     "status1"
    ;

        act     where 
statusCode.exists().not()    
 ->     
procedureRes.status =     'unknown'
     "status2"
    ;

        act.entryRelationship     as 
    entryRel
     then
     {

          entryRel.procedure     as 
    proc
    
 ->     
 bundle.entry     as 
    e9
    , 
 e9.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e9.resource =     create
    (
    'Procedure'
    )
     as 
    procedure2
    , 
 procedure2.id =     uuid
    (
    )
     as 
    uuid9
    , 
 e9.fullUrl =     append
    (
    'https://example/Procedure/'
    , 
    uuid9
    )
    , 
 request.url =     'Procedure'
    , 
 procedureRes.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Procedure/' + %procedure2.id    )
     then 
Procedure    (
    proc
    , 
    patient
    , 
    encounter
    , 
    procedure2
    , 
    bundle
    )
     "procedurePrestazioni"
    ;

          entryRel.substanceAdministration     as 
    subAdmin
    
 ->     
 bundle.entry     as 
    e8
    , 
 e8.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e8.resource =     create
    (
    'MedicationAdministration'
    )
     as 
    medAdmin
    , 
 medAdmin.id =     uuid
    (
    )
     as 
    uuid8
    , 
 e8.fullUrl =     append
    (
    'https://example/MedicationAdministration/'
    , 
    uuid8
    )
    , 
 request.url =     'MedicationAdministration'
    , 
 procedureRes.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/MedicationAdministration/' + %medAdmin.id    )
     then 
MedicationAdministration    (
    subAdmin
    , 
    patient
    , 
    encounter
    , 
    medAdmin
    , 
    bundle
    )
     "farmacPrestazioni"
    ;

          entryRel.observation     as 
    entryRobs
    
 ->     
 bundle.entry     as 
    e7
    , 
 e7.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e7.resource =     create
    (
    'Observation'
    )
     as 
    obs7
    , 
 obs7.id =     uuid
    (
    )
     as 
    uuid7
    , 
 e7.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid7
    )
    , 
 request.url =     'Observation'
    , 
 procedureRes.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs7.id    )
     then 
ObservationPrest    (
    entryRobs
    , 
    patient
    , 
    encounter
    , 
    obs7
    , 
    bundle
    )
     "osservazioniPrestazioni"
    ;

          entryRel.act     as 
    act2
    
 ->     
 bundle.entry     as 
    e6
    , 
 e6.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e6.resource =     create
    (
    'Procedure'
    )
     as 
    procedure3
    , 
 procedure3.id =     uuid
    (
    )
     as 
    uuid6
    , 
 e6.fullUrl =     append
    (
    'https://example/Procedure/'
    , 
    uuid6
    )
    , 
 request.url =     'Procedure'
    , 
 procedureRes.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Procedure/' + %procedure3.id    )
     then 
Procedure    (
    act2
    , 
    patient
    , 
    encounter
    , 
    procedure3
    , 
    bundle
    )
     "procedureGenerichePrestazioni"
    ;

            }
     "Relationship"
    ;

          }
     "proceduraMadre"
    ;

        }
     "Prestazioni"
    ;

    section     where 
code.code = '80615-8'    
 ->     
 bundle.entry     as 
    e12
    , 
 e12.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e12.resource =     create
    (
    'Observation'
    )
     as 
    obs12
    , 
 obs12.id =     uuid
    (
    )
     as 
    uuid12
    , 
 e12.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid12
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs12.id    )
     then 
Observation    (
    act
    , 
    patient
    , 
    encounter
    , 
    obs12
    , 
    bundle
    )
     "Followup"
    ;

      }
     "entryAct"
    ;

  src.substanceAdministration     as 
    substanceadmin
     then
     {

    section     where 
code.code = '93341-6'    
 ->     
 bundle.entry     as 
    e6
    , 
 e6.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e6.resource =     create
    (
    'MedicationRequest'
    )
     as 
    medre1
    , 
 medre1.id =     uuid
    (
    )
     as 
    uuid6
    , 
 e6.fullUrl =     append
    (
    'https://example/MedicationRequest/'
    , 
    uuid6
    )
    , 
 request.url =     'MedicationRequest'
    , 
 dReport.basedOn =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/MedicationRequest/' + %medre1.id    )
     then 
MedicationRequest    (
    substanceadmin
    , 
    patient
    , 
    encounter
    , 
    medre1
    , 
    bundle
    )
     "TerapiaFarmacologicaConsigliata"
    ;

      }
     "substanceadmin"
    ;
     // 
    src.substanceAdministration

  section     where 
section.entry.exists().not()     then
     {

    section     where 
(code.code = '48765-2')    
 ->     
 bundle.entry     as 
    e2
    , 
 e2.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e2.resource =     create
    (
    'Observation'
    )
     as 
    obs1
    , 
 obs1.id =     uuid
    (
    )
     as 
    uuid2
    , 
 e2.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid2
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs1.id    )
     then
     {

      section    
 ->     
 obs1.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

      section    
 ->     
 obs1.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

      section    
 ->     
obs1.status =     'final'
     "STatusobse"
    ;

      section.code    
 ->     
obs1.code    ;

      section.statusCode     as 
    s
     then
     {

        s.code     as 
    cos
    
 ->     
obs1.status =     translate
    (
    cos
    , 
    '#OBSstatus'
    , 
    'code'
    )
     "codeS"
    ;

          }
     "status"
    ;

      section.text     as 
    text
    
 ->     
 bundle.entry     as 
    e5
    , 
 e5.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e5.resource =     create
    (
    'AllergyIntolerance'
    )
     as 
    allergy
    , 
 allergy.id =     uuid
    (
    )
     as 
    uuid5
    , 
 e5.fullUrl =     append
    (
    'https://example/AllergyIntolerance/'
    , 
    uuid5
    )
    , 
 request.url =     'AllergyIntolerance'
    , 
 obs1.focus =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/AllergyIntolerance/' + %allergy.id    )
     then
     {

        section    
 ->     
 allergy.patient =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

        section    
 ->     
 allergy.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

        section    
 ->     
allergy.clinicalStatus     as 
    clinicalStatus
     then
     {

          section    
 ->     
clinicalStatus.coding =     create
    (
    'Coding'
    )
     as 
    coding
     then
     {

            section    
 ->     
coding.code =     'active'
     "code"
    ;

            section    
 ->     
coding.system =     'http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical'
     "system"
    ;

              }
     "coding"
    ;

            }
     "status"
    ;

        text    
 ->     
allergy.note     as 
    note
     then
     {

          text     as 
    t
    
 ->     
note.text =     create
    (
    'string'
    )
     as 
    textNote
     then 
EDstring    (
    t
    , 
    textNote
    )
     "note"
    ;

            }
     "narrative"
    ;

          }
     "allergytext"
    ;

        }
     "allergyAct"
    ;

    section     where 
(code.code = '93341-6')     then
     {

      section.text     as 
    text
    
 ->     
 bundle.entry     as 
    e13
    , 
 e13.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e13.resource =     create
    (
    'MedicationRequest'
    )
     as 
    obs13
    , 
 obs13.id =     uuid
    (
    )
     as 
    uuid13
    , 
 e13.fullUrl =     append
    (
    'https://example/MedicationRequest/'
    , 
    uuid13
    )
    , 
 request.url =     'MedicationRequest'
    , 
 dReport.basedOn =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/MedicationRequest/' + %obs13.id    )
     then
     {

        section    
 ->     
 obs13.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

        section    
 ->     
 obs13.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

        section    
 ->     
obs13.intent =     'order'
     "intent"
    ;

        section     where 
statusCode.exists().not()    
 ->     
obs13.status =     'unknown'
     "st"
    ;

        text    
 ->     
obs13.note     as 
    note
     then
     {

          text     as 
    t
    
 ->     
note.text =     create
    (
    'string'
    )
     as 
    textNote
     then 
EDstring    (
    t
    , 
    textNote
    )
     "note"
    ;

            }
     "note"
    ;

        section    
 ->     
obs13.medication =     create
    (
    'CodeableConcept'
    )
     as 
    code
     then
     {

          section    
 ->     
code.text =     'string'
     "string"
    ;

            }
     "code"
    ;

          }
     "txtsec"
    ;

        }
     "MedicationRequest"
    ;

    section     where 
(code.code = '55110-1').not() and (code.code = '93341-6').not() and (code.code = '48765-2').not()     then
     {

      section.text     as 
    text
    
 ->     
 bundle.entry     as 
    e13
    , 
 e13.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e13.resource =     create
    (
    'Observation'
    )
     as 
    obs13
    , 
 obs13.id =     uuid
    (
    )
     as 
    uuid13
    , 
 e13.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid13
    )
    , 
 request.url =     'Observation'
    , 
 dReport.result =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs13.id    )
     then
     {

        section    
 ->     
 obs13.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

        section    
 ->     
 obs13.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

        section    
 ->     
obs13.status =     'preliminary'
     "obsst"
    ;

        section.code    
 ->     
obs13.code     "obscde"
    ;

        section    
 ->     
obs13.status =     'final'
     "statusS"
    ;

        text    
 ->     
obs13.note     as 
    note
     then
     {

          text     as 
    t
    
 ->     
note.text =     create
    (
    'string'
    )
     as 
    textNote
     then 
EDstring    (
    t
    , 
    textNote
    )
     "note"
    ;

            }
     "narrative"
    ;

          }
     "txtsec"
    ;

        }
     "NonConclusion"
    ;

    section     where 
(code.code = '55110-1')     then
     {

      section.text     as 
    t
    
 ->     
dReport.conclusion =     create
    (
    'string'
    )
     as 
    textConclusion
     then 
EDstring    (
    t
    , 
    textConclusion
    )
     "conc"
    ;

        }
     "conclusion"
    ;

      }
     "whereCond"
    ;

    }


    group 
Observation    (
    source
     cda
     : 
observation,     target
     patient
     : 
Patient,     target
     encounter
     : 
Encounter,     target
     ob
     : 
Observation,     target
     bundle
     : 
Bundle    )
     {

  cda    
 ->     
 ob.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  cda    
 ->     
 ob.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  cda.code    
 ->     
ob.code    ;

  cda    
 ->     
ob.status =     'final'
     "Stats"
    ;

  cda.value     : 
INT     as 
    int
    
 ->     
ob.value =     (
int.value    )
    ;
     // 
    value datatype

  cda.value     : 
ST     as 
    st
    
 ->     
 ob.value =     create
    (
    'string'
    )
    , 
 ob.value =     (
st.dataString    )
    ;

  cda.value     : 
BL     as 
    boolean
    
 ->     
ob.value =     (
boolean.value    )
     "boolean"
    ;

  cda.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.value    )
    ;

          }
    ;

      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'
    )
    ;

          }
     "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.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'
    )
    ;

              }
    ;

            }
    ;

          }
    ;

        }
     "coding"
    ;

      }
     "val"
    ;

  cda.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.value    )
    ;

          }
    ;

      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'
    )
    ;

          }
     "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.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'
    )
    ;

              }
    ;

            }
    ;

          }
    ;

        }
     "coding"
    ;

      }
     "val"
    ;

  cda.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"
    ;

  cda.effectiveTime     as 
    effectiveTime
     where 
(value.exists())    
 ->     
ob.effective =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    effectiveTime
    , 
    value
    )
     "value1"
    ;

  cda.effectiveTime     as 
    effectiveTime
     where 
(low.exists())    
 ->     
ob.effective =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    effectiveTime
    , 
    value
    )
     "valuePeriod"
    ;

  cda.text     as 
    text
    
 ->     
ob.note     as 
    note
     then
     {

    text.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
     "text"
    ;

      }
     "note"
    ;

  cda.statusCode     as 
    s
     then
     {

    s.code     as 
    cos
    
 ->     
ob.status =     translate
    (
    cos
    , 
    '#OBSstatus'
    , 
    'code'
    )
     "codeS"
    ;

      }
     "status"
    ;

    }


    group 
ConditionFunction    (
    source
     src
     : 
cdaElement,     target
     tgt
     : 
Condition,     target
     patient
     : 
patient,     target
     encounter
     : 
encounter,     target
     bundle
     : 
Bundle    )
     {

  src.code    
 ->     
tgt.category    ;

  src    
 ->     
 tgt.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  src    
 ->     
 tgt.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  src.statusCode     as 
    stscode
    
 ->     
tgt.verificationStatus     as 
    verifstatus
     then
     {

    stscode     as 
    codeS
    
 ->     
verifstatus.coding =     create
    (
    'Coding'
    )
     as 
    coding
     then
     {

      codeS.code    
 ->     
coding.code =     'confirmed'
    ;

      codeS    
 ->     
coding.system =     'http://terminology.hl7.org/CodeSystem/condition-ver-status'
     "system"
    ;

      codeS    
 ->     
coding.display =     cast
    (
    'Confirmed'
    , 
    'string'
    )
     "display"
    ;

        }
     "coding"
    ;

      }
     "verifstatus"
    ;

  src.effectiveTime     as 
    effectiveTime
    
 ->     
tgt.onset =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    effectiveTime
    , 
    value
    )
     "valuePeriod"
    ;

  src.value    
 ->     
tgt.code    ;

  src.entryRelationship     as 
    entryRelationship
     then
     {

    entryRelationship.observation     as 
    obsentry
     then
     {

      obsentry.code     where 
code = '89261-2'     then
     {

        obsentry    
 ->     
 tgt.evidence     as 
    evidence
    , 
 bundle.entry     as 
    e1
    , 
 e1.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e1.resource =     create
    (
    'Observation'
    )
     as 
    obsy
    , 
 obsy.id =     uuid
    (
    )
     as 
    uuid1
    , 
 e1.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid1
    )
    , 
 request.url =     'Observation'
    , 
 evidence.detail =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obsy.id    )
     then 
Observation    (
    obsentry
    , 
    patient
    , 
    encounter
    , 
    obsy
    , 
    bundle
    )
     "observation"
    ;

          }
     "observation"
    ;

      obsentry.code     where 
code = '33999-4'     then
     {

        obsentry.value     as 
    value
    
 ->     
tgt.clinicalStatus     as 
    clinicalstatus
     then
     {

          value     as 
    val
    
 ->     
clinicalstatus.coding =     create
    (
    'Coding'
    )
     as 
    coding
     then
     {

            val     where 
(code = 'LA9041-0')    
 ->     
coding.code =     'resolved'
     "code"
    ;

            val     where 
(code = 'LA18632-2')    
 ->     
coding.code =     'inactive'
     "code"
    ;

            val     where 
(code = 'LA16666-2')    
 ->     
coding.code =     'active'
     "code"
    ;

            val    
 ->     
coding.system =     'http://terminology.hl7.org/CodeSystem/condition-clinical'
     "system"
    ;

            val.displayName     as 
    display
    
 ->     
coding.display =     cast
    (
    display
    , 
    'string'
    )
     "display"
    ;

              }
     "coding"
    ;

          obsentry.text     as 
    text
     then
     {

            text.reference     as 
    reference
    
 ->     
clinicalstatus.text =     (
reference.value    )
     "text"
    ;

              }
    ;

            }
     "clinicalstatus"
    ;

          }
     "clinicalStatus2"
    ;

        }
     "EntryRelObsevation"
    ;

      }
     "entryR"
    ;

    }


    group 
Procedure    (
    source
     src
     : 
procedure,     target
     patient
     : 
Patient,     target
     encounter
     : 
Encounter,     target
     tgt
     : 
Procedure,     target
     bundle
     : 
Bundle    )
     {

  src    
 ->     
 tgt.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  src    
 ->     
 tgt.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  src.statusCode    
 ->     
tgt.status     "status1"
    ;

  src     where 
statusCode.exists().not()    
 ->     
tgt.status =     'unknown'
     "status2"
    ;

  src.id    
 ->     
tgt.identifier    ;

  src.code    
 ->     
tgt.code    ;

  src.effectiveTime     as 
    effectiveTime
     where 
(value.exists())    
 ->     
tgt.performed =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    effectiveTime
    , 
    value
    )
     "value1"
    ;

  src.effectiveTime     as 
    effectiveTime
     where 
(low.exists())    
 ->     
tgt.performed =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    effectiveTime
    , 
    value
    )
     "valuePeriod"
    ;

  src.methodCode     as 
    methodCode
    
 ->     
tgt.extension     as 
    ext1
     then 
ITMethodExt    (
    methodCode
    , 
    ext1
    )
    ;

  src.participant     as 
    participant
     then
     {

    participant.participantRole     as 
    participantRole
    
 ->     
tgt.performer     as 
    performer
     then
     {

      participantRole.playingDevice     as 
    device
    
 ->     
 bundle.entry     as 
    e2
    , 
 e2.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e2.resource =     create
    (
    'Device'
    )
     as 
    deviceRes
    , 
 deviceRes.id =     uuid
    (
    )
     as 
    uuid2
    , 
 e2.fullUrl =     append
    (
    'https://example/Device/'
    , 
    uuid2
    )
    , 
 request.url =     'Device'
    , 
 performer.actor =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Device/' + %deviceRes.id    )
     then
     {

        device.manufacturerModelName     as 
    manufacturerModelName
     then
     {

          manufacturerModelName.displayName     as 
    displayName
    
 ->     
deviceRes.manufacturer =     cast
    (
    displayName
    , 
    'string'
    )
     "manuf"
    ;

            }
     "manufacturer"
    ;

        device.code    
 ->     
deviceRes.type    ;

          }
     "device"
    ;

        }
    ;

      }
    ;

  src.entryRelationship     as 
    entryR
     then
     {

    entryR.observation     as 
    observation
    
 ->     
 bundle.entry     as 
    e3
    , 
 e3.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e3.resource =     create
    (
    'Observation'
    )
     as 
    obs1
    , 
 obs1.id =     uuid
    (
    )
     as 
    uuid3
    , 
 e3.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid3
    )
    , 
 request.url =     'Observation'
    , 
 tgt.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs1.id    )
     then 
Observation    (
    observation
    , 
    patient
    , 
    encounter
    , 
    obs1
    , 
    bundle
    )
     "Parametri"
    ;

    entryR.act     as 
    act
     then
     {

      act.text     as 
    text
    
 ->     
tgt.note     as 
    note
     then
     {

        text.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
     "text"
    ;

          }
     "note"
    ;

        }
    ;

      }
     "entryRelProcedure"
    ;

    }


    group 
ITMethodExt    (
    source
     src
,     target
     ext
    )
     {

  src    
 ->     
ext.url =     'http://hl7.org/fhir/StructureDefinition/procedure-method'
     "url"
    ;

  src    
 ->     
ext.value =     create
    (
    'CodeableConcept'
    )
     as 
    value
     then 
CECodeableConcept    (
    src
    , 
    value
    )
     "value"
    ;

    }


    group 
MedicationAdministration    (
    source
     src
     : 
substanceAdministration,     target
     patient
     : 
Patient,     target
     encounter
     : 
Encounter,     target
     tgt
     : 
MedicationAdministration,     target
     bundle
     : 
Bundle    )
     {

  src    
 ->     
 tgt.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  src    
 ->     
 tgt.context =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  src.statusCode    
 ->     
tgt.status     "status1"
    ;

  src     where 
statusCode.exists().not()    
 ->     
tgt.status =     'unknown'
     "status2"
    ;

  src.id    
 ->     
tgt.identifier    ;

  src.effectiveTime     as 
    effectiveTime
     where 
(value.exists())    
 ->     
tgt.effective =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    effectiveTime
    , 
    value
    )
     "value1"
    ;

  src.effectiveTime     as 
    effectiveTime
     where 
(low.exists())    
 ->     
tgt.effective =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    effectiveTime
    , 
    value
    )
     "valuePeriod"
    ;

  src    
 ->     
tgt.dosage     as 
    dosage
     then
     {

    src.routeCode    
 ->     
dosage.route     "route"
    ;

    src.repeatNumber     as 
    repeatNumber
    
 ->     
dosage.rate =     create
    (
    'SimpleQuantity'
    )
     as 
    value
     then 
PQQuantity    (
    repeatNumber
    , 
    value
    )
     "repQ"
    ;

    src.approachSiteCode    
 ->     
dosage.site     "site"
    ;

    src.targetSiteCode    
 ->     
dosage.site     "site"
    ;

      }
     "dosage"
    ;

  src.consumable     as 
    consumable
    
 ->     
 bundle.entry     as 
    e1
    , 
 e1.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e1.resource =     create
    (
    'Medication'
    )
     as 
    medication
    , 
 medication.id =     uuid
    (
    )
     as 
    uuid1
    , 
 e1.fullUrl =     append
    (
    'https://example/Medication/'
    , 
    uuid1
    )
    , 
 request.url =     'Medication'
    , 
 tgt.medication =     create
    (
    'Reference'
    )
     as 
    medref
    , 
 medref.reference =     (
'https://example/Medication/' + %medication.id    )
     then 
Medication    (
    src
    , 
    medication
    , 
    patient
    , 
    bundle
    )
     "medication"
    ;

  src.participant     as 
    participant
     then
     {

    participant.participantRole     as 
    participantRole
    
 ->     
tgt.performer     as 
    performer
     then
     {

      participantRole.device     as 
    device
    
 ->     
 bundle.entry     as 
    e2
    , 
 e2.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e2.resource =     create
    (
    'Device'
    )
     as 
    deviceRes
    , 
 deviceRes.id =     uuid
    (
    )
     as 
    uuid2
    , 
 e2.fullUrl =     append
    (
    'https://example/Device/'
    , 
    uuid2
    )
    , 
 request.url =     'Device'
    , 
 performer.actor =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Device/' + %deviceRes.id    )
     then
     {

        device.ManufacturerModelName     as 
    ManufacturerModelName
     then
     {

          ManufacturerModelName.code    
 ->     
deviceRes.manufacturer     "manuf"
    ;

            }
     "manufacturer"
    ;

          }
    ;

        }
    ;

      }
    ;

  src.entryRelationship     as 
    entryR
     then
     {

    entryR.observation     as 
    observation
    
 ->     
 bundle.entry     as 
    e3
    , 
 e3.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e3.resource =     create
    (
    'Observation'
    )
     as 
    obs1
    , 
 obs1.id =     uuid
    (
    )
     as 
    uuid3
    , 
 e3.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid3
    )
    , 
 request.url =     'Observation'
    , 
 tgt.partOf =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs1.id    )
     then 
Observation    (
    observation
    , 
    patient
    , 
    encounter
    , 
    obs1
    , 
    bundle
    )
     "Parametri"
    ;

    entryR.act     as 
    act
     then
     {

      act.text     as 
    text
    
 ->     
tgt.note     as 
    note
     then
     {

        text.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
     "text"
    ;

          }
     "note"
    ;

        }
    ;

      }
     "entryRelMedication"
    ;

  src     where 
(src.doseQuantity.exists() or src.rateQuantity.exists())    
 ->     
 bundle.entry     as 
    e1
    , 
 e1.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e1.resource =     create
    (
    'MedicationRequest'
    )
     as 
    medicationRq
    , 
 medicationRq.id =     uuid
    (
    )
     as 
    uuid1
    , 
 e1.fullUrl =     append
    (
    'https://example/MedicationRequest/'
    , 
    uuid1
    )
    , 
 request.url =     'MedicationRequest'
    , 
 tgt.request =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/MedicationRequest/' + %medicationRq.id    )
     then 
MedicationRequest    (
    src
    , 
    patient
    , 
    encounter
    , 
    medicationRq
    , 
    bundle
    )
     "medRequ"
    ;

  src.text     as 
    text
    
 ->     
tgt.note     as 
    note
     then
     {

    text    
 ->     
note.text     "text"
    ;

      }
     "note"
    ;

    }


    group 
ObservationPrest    (
    source
     src
     : 
observation,     target
     patient
     : 
Patient,     target
     encounter
     : 
Encounter,     target
     tgt
     : 
Observation,     target
     bundle
     : 
Bundle    )
     {

  src    
 ->     
 tgt.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  src    
 ->     
 tgt.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  src.statusCode     as 
    s
     then
     {

    s.code     as 
    cos
    
 ->     
tgt.status =     translate
    (
    cos
    , 
    '#OBSstatus'
    , 
    'code'
    )
     "codeS"
    ;

      }
     "status"
    ;

  src.id    
 ->     
tgt.identifier    ;

  src.code    
 ->     
tgt.code    ;

  src.effectiveTime     as 
    effectiveTime
     where 
(value.exists())    
 ->     
tgt.perfomed =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    effectiveTime
    , 
    value
    )
     "value1"
    ;

  src.effectiveTime     as 
    effectiveTime
     where 
(low.exists())    
 ->     
tgt.perfomed =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    effectiveTime
    , 
    value
    )
     "valuePeriod"
    ;

  src.methodCode    
 ->     
tgt.method    ;

  src.participant     as 
    participant
     then
     {

    participant.participantRole     as 
    participantRole
     then
     {

      participantRole.device     as 
    device
    
 ->     
 bundle.entry     as 
    e2
    , 
 e2.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e2.resource =     create
    (
    'Device'
    )
     as 
    deviceRes
    , 
 deviceRes.id =     uuid
    (
    )
     as 
    uuid2
    , 
 e2.fullUrl =     append
    (
    'https://example/Device/'
    , 
    uuid2
    )
    , 
 request.url =     'Device'
    , 
 tgt.device =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Device/' + %deviceRes.id    )
     then
     {

        device.ManufacturerModelName     as 
    ManufacturerModelName
     then
     {

          ManufacturerModelName.code    
 ->     
deviceRes.manufacturer     "manuf"
    ;

            }
     "manufacturer"
    ;

          }
    ;

        }
    ;

      }
    ;

  src.entryRelationship     as 
    entryR
     then
     {

    entryR.observation     as 
    observation
    
 ->     
 bundle.entry     as 
    e3
    , 
 e3.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e3.resource =     create
    (
    'Observation'
    )
     as 
    obs1
    , 
 obs1.id =     uuid
    (
    )
     as 
    uuid3
    , 
 e3.fullUrl =     append
    (
    'https://example/Observation/'
    , 
    uuid3
    )
    , 
 request.url =     'Observation'
    , 
 tgt.hasMember =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Observation/' + %obs1.id    )
     then 
Observation    (
    observation
    , 
    patient
    , 
    encounter
    , 
    obs1
    , 
    bundle
    )
     "Parametri"
    ;

    entryR.act     as 
    act
     then
     {

      act.text     as 
    text
    
 ->     
tgt.note     as 
    note
     then
     {

        text.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
     "text"
    ;

          }
     "note"
    ;

        }
    ;

      }
     "entryRelOsservazioni"
    ;

    }


    group 
MedicationRequest    (
    source
     src
     : 
substanceAdministration,     target
     patient
     : 
Patient,     target
     encounter
     : 
Encounter,     target
     tgt
     : 
MedicationRequest,     target
     bundle
     : 
Bundle    )
     {

  src    
 ->     
 tgt.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;
     // 
    default  + mandatory

  src    
 ->     
 tgt.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  src    
 ->     
tgt.intent =     'order'
     "intent"
    ;

  src     where 
statusCode.exists().not()    
 ->     
tgt.status =     'unknown'
     "st"
    ;

  src.statusCode     as 
    sc
     then
     {

    sc.code     as 
    cos
    
 ->     
tgt.status =     translate
    (
    cos
    , 
    '#MedicationStatusMap'
    , 
    'code'
    )
     "codeS"
    ;

      }
     "status"
    ;

  src.text     as 
    txt
    
 ->     
tgt.note     as 
    note
     then
     {

    txt.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
     "text"
    ;

      }
     "note"
    ;

  src.effectiveTime     : 
IVL_TS     as 
    eff
    
 ->     
tgt.dosageInstruction =     create
    (
    'Dosage'
    )
     as 
    dosage
     then
     {

    eff    
 ->     
dosage.timing =     create
    (
    'Timing'
    )
     as 
    timing
     then
     {

      eff    
 ->     
timing.repeat     as 
    rep
     then
     {

        eff     as 
    eff
     where 
(value.exists())    
 ->     
rep.bounds =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    eff
    , 
    value
    )
     "value1"
    ;

        eff     as 
    eff
     where 
(low.exists())    
 ->     
rep.bounds =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    eff
    , 
    value
    )
     "valuePeriod"
    ;

          }
     "rep"
    ;

        }
     "timing"
    ;

      }
     "period"
    ;

  src.effectiveTime     : 
EIVL_TS     as 
    effe
    
 ->     
tgt.dosageInstruction =     create
    (
    'Dosage'
    )
     as 
    dosage
     then
     {

    effe    
 ->     
dosage.timing =     create
    (
    'Timing'
    )
     as 
    timing
     then
     {

      effe    
 ->     
timing.repeat     as 
    rep
     then
     {

        effe.eventCode     as 
    ev
    
 ->     
rep.when =     (
ev.code    )
    ;

          }
     "rep"
    ;

        }
     "timing"
    ;

      }
     "period"
    ;

  src.effectiveTime     : 
IVL_TS     as 
    eff
    
 ->     
 tgt.dosageInstruction =     create
    (
    'Dosage'
    )
     as 
    dosage
    , 
 dosage.timing =     create
    (
    'Timing'
    )
     as 
    timing
    , 
 timing.event =     (
eff.value    )
     "tim"
    ;

  src.effectiveTime     : 
PIVL_TS     as 
    eff
    
 ->     
tgt.dosageInstruction =     create
    (
    'Dosage'
    )
     as 
    dosage
     then
     {

    eff    
 ->     
dosage.timing =     create
    (
    'Timing'
    )
     as 
    timing
     then 
periodTiming    (
    eff
    , 
    timing
    )
     "cod"
    ;

      }
     "eff"
    ;

  src     where 
(src.doseQuantity.exists() or src.rateQuantity.exists())     then
     {

    src    
 ->     
tgt.dosageInstruction =     create
    (
    'Dosage'
    )
     as 
    dosageInstruction
     then
     {

      src.doseQuantity     as 
    doseQuant
     then
     {

        doseQuant.originalText     as 
    ot
     then
     {

          ot.reference    
 ->     
dosageInstruction.text    ;

            }
     "ot"
    ;

        doseQuant    
 ->     
dosageInstruction.doseAndRate     as 
    dosageRate
     then
     {

          doseQuant    
 ->     
dosageRate.dose =     create
    (
    'Range'
    )
     as 
    d
     then
     {

            doseQuant    
 ->     
d.low =     create
    (
    'SimpleQuantity'
    )
     as 
    l
     then
     {

              doseQuant.low     as 
    lo
    
 ->     
l.value =     (
lo.value    )
    ;

              doseQuant.low     as 
    lo
    
 ->     
l.unit =     (
lo.unit    )
    ;

                }
     "low"
    ;

            doseQuant    
 ->     
d.high =     create
    (
    'SimpleQuantity'
    )
     as 
    h
     then
     {

              doseQuant.high     as 
    hi
    
 ->     
h.value =     (
hi.value    )
    ;

              doseQuant.high     as 
    hi
    
 ->     
h.unit =     (
hi.unit    )
    ;

                }
     "low"
    ;

              }
     "d"
    ;

            }
     "dosageRate"
    ;

          }
    ;

      src.rateQuantity     as 
    rateQuantity
     then
     {

        rateQuantity.originalText     as 
    ot
     then
     {

          ot.reference    
 ->     
dosageInstruction.text    ;

            }
     "ot"
    ;

        rateQuantity    
 ->     
dosageInstruction.doseAndRate     as 
    dosageRate
     then
     {

          rateQuantity    
 ->     
dosageRate.rate =     create
    (
    'Range'
    )
     as 
    d
     then
     {

            rateQuantity    
 ->     
d.low =     create
    (
    'SimpleQuantity'
    )
     as 
    l
     then
     {

              rateQuantity.low     as 
    lo
    
 ->     
l.value =     (
lo.value    )
    ;

              rateQuantity.low     as 
    lo
    
 ->     
l.unit =     (
lo.unit    )
    ;

                }
     "low"
    ;

            rateQuantity    
 ->     
d.high =     create
    (
    'SimpleQuantity'
    )
     as 
    h
     then
     {

              rateQuantity.high     as 
    hi
    
 ->     
h.value =     (
hi.value    )
    ;

              rateQuantity.high     as 
    hi
    
 ->     
h.unit =     (
hi.unit    )
    ;

                }
     "high"
    ;

              }
     "r"
    ;

            }
     "dosageRate"
    ;

          }
     "rate"
    ;

      src.routeCode    
 ->     
dosageInstruction.route     "route"
    ;

      src.approachSiteCode    
 ->     
dosageInstruction.site     "site"
    ;

      src.targetSiteCode    
 ->     
dosageInstruction.site     "site"
    ;

        }
     "dosageIn"
    ;

      }
     "condition"
    ;

  src.consumable     as 
    consumable
    
 ->     
 bundle.entry     as 
    e1
    , 
 e1.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'POST'
    , 
 e1.resource =     create
    (
    'Medication'
    )
     as 
    medication
    , 
 medication.id =     uuid
    (
    )
     as 
    uuid1
    , 
 e1.fullUrl =     append
    (
    'https://example/Medication/'
    , 
    uuid1
    )
    , 
 request.url =     'Medication'
    , 
 tgt.medication =     create
    (
    'Reference'
    )
     as 
    medref
    , 
 medref.reference =     (
'https://example/Medication/' + %medication.id    )
     then 
Medication    (
    src
    , 
    medication
    , 
    patient
    , 
    bundle
    )
     "medication"
    ;

  src.entryRelationship     as 
    entryRelationship
     then
     {

    entryRelationship.supply     as 
    supply
    
 ->     
tgt.dispenseRequest     as 
    dispenseRequest
     then
     {

      supply.quantity     as 
    quantityCDA
    
 ->     
dispenseRequest.quantity     as 
    quantityFHIR
     then
     {

        quantityCDA    
 ->     
quantityFHIR.value =     (
quantityCDA.value    )
     "value"
    ;

          }
    ;

        }
    ;

      }
     "entryR"
    ;

  src.participant     as 
    participant
     then
     {

    participant     then 
Practitioner    (
    participant
    , 
    tgt
    , 
    bundle
    )
     "function"
    ;

    participant.effectiveTime    
 ->     
tgt.authoredOn     "autor"
    ;

      }
     "Partecipant"
    ;

    }


    group 
periodTiming    (
    source
     effectiveTime
     : 
PIVL_TS,     target
     timing
     : 
Timing    )
     {

  effectiveTime    
 ->     
timing.repeat     as 
    r
     then
     {

    effectiveTime.period     as 
    p
    
 ->     
r.period =     (
p.value    )
    ;

    effectiveTime.period     as 
    p
    
 ->     
r.periodUnit =     (
p.unit    )
    ;

      }
     "repeat"
    ;

    }


    group 
Medication    (
    source
     src
     : 
cda,     target
     tgt
     : 
Medication,     target
     patient
     : 
Patient,     target
     bundle
     : 
Bundle    )
     {

  src.consumable     as 
    consumable
     then
     {

    consumable.manufacturedProduct     as 
    manufacturedProduct
     then
     {

      manufacturedProduct.manufacturedMaterial     as 
    manufacturedMaterial
     then
     {

        manufacturedMaterial.code    
 ->     
tgt.code     "CE"
    ;

        src.administrationUnitCode    
 ->     
tgt.form     "form"
    ;

          }
     "material"
    ;

        }
     "product"
    ;

      }
    ;

  src.entryRelationship     as 
    entryR
     then
     {

    entryR.observation     as 
    observation
     then
     {

      observation.code     where 
displayName = 'Grammatura'    
 ->     
tgt.ingredient     as 
    ingredient
     then
     {

        src.consumable     as 
    consumable
     then
     {

          consumable.manufacturedProduct     as 
    manufacturedProduct
     then
     {

            manufacturedProduct.manufacturedMaterial     as 
    manufacturedMaterial
     then
     {

              manufacturedMaterial.code     as 
    code
    
 ->     
ingredient.item =     create
    (
    'CodeableConcept'
    )
     as 
    value
     then 
CECodeableConcept    (
    code
    , 
    value
    )
     "CE"
    ;

                }
     "material"
    ;

              }
     "product"
    ;

            }
    ;

        observation.value     as 
    value
    
 ->     
ingredient.strength     as 
    strength
     then
     {

          value    
 ->     
strength.numerator     as 
    numerator
     then
     {

            value    
 ->     
numerator.value =     (
value.value    )
     "valueN"
    ;

              }
     "numerator"
    ;

          value    
 ->     
strength.denominator     as 
    denominator
     then
     {

            value    
 ->     
denominator.value =     1
     "valueD"
    ;

              }
     "denominator"
    ;

            }
     "strenght"
    ;

          }
     "ingredient"
    ;

      observation.code     where 
displayName = 'Quantità nella Confezione'     then
     {

        observation.value     as 
    value
    
 ->     
tgt.amount     as 
    amount
     then
     {

          value    
 ->     
amount.numerator     as 
    numerator
     then
     {

            value    
 ->     
numerator.value =     (
value.value    )
     "valueN"
    ;

              }
     "numerator"
    ;

          value    
 ->     
amount.denominator     as 
    denominator
     then
     {

            value    
 ->     
denominator.value =     1
     "valueD"
    ;

              }
     "denominator"
    ;

            }
     "amount"
    ;

          }
     "quantita"
    ;

        }
     "obs"
    ;

      }
     "entryR"
    ;

    }


    group 
MedicationStatement    (
    source
     src
     : 
subAdmin,     target
     tgt
     : 
MedicationStatement,     target
     patient
     : 
Patient,     target
     encounter
     : 
Encounter,     target
     bundle
     : 
Bundle    )
     {

  src    
 ->     
 tgt.subject =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  src.statusCode    
 ->     
tgt.status    ;

  src     where 
statusCode.exists().not()    
 ->     
tgt.status =     'unknown'
     "notpresent"
    ;

  src.consumable     as 
    consumable
     then
     {

    consumable.manufacturedProduct     as 
    manufacturedProduct
     then
     {

      manufacturedProduct.manufacturedMaterial     as 
    manufacturedMaterial
     then
     {

        manufacturedMaterial.code     as 
    code
    
 ->     
tgt.medication =     create
    (
    'CodeableConcept'
    )
     as 
    ce
     then 
CECodeableConcept    (
    code
    , 
    ce
    )
     "CE"
    ;

          }
     "material"
    ;

        }
     "product"
    ;

      }
    ;

    }


    group 
FamilyMemberFunction    (
    source
     src
     : 
organizer,     target
     tgt
     : 
FamilyMemberHistory,     target
     patient
     : 
patient    )
     {

  src    
 ->     
 tgt.patient =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "patReference"
    ;

  src.statusCode    
 ->     
tgt.status    ;

  src.effectiveTime     as 
    effectiveTime
    
 ->     
tgt.date =     create
    (
    'date'
    )
     as 
    value
     then 
TSDateTime    (
    effectiveTime
    , 
    value
    )
     "date"
    ;

  src.subject     as 
    subject
     then
     {

    subject.relatedSubject     as 
    relatedSubject
     then
     {

      relatedSubject.code    
 ->     
tgt.relationship     "relationshipCode"
    ;

      relatedSubject.subject     as 
    subject
    
 ->     
tgt.sex     as 
    sex
     then
     {

        subject.administrativeGenderCode     as 
    administrativeGenderCode
    
 ->     
sex.coding     as 
    coding
     then
     {

          administrativeGenderCode.code     as 
    sexCode
    
 ->     
coding.code =     translate
    (
    sexCode
    , 
    '#cm-v3-administrative-gender'
    , 
    'code'
    )
     "gender"
    ;

          administrativeGenderCode    
 ->     
coding.system =     'http://hl7.org/fhir/administrative-gender'
     "system"
    ;

            }
     "coding"
    ;

          }
    ;

        }
     "relatedSub"
    ;

      }
     "relationship"
    ;

  src.component     as 
    component
    
 ->     
tgt.condition     as 
    condition
     then
     {

    component.observation     as 
    observation
     then
     {

      observation.code    
 ->     
condition.code    ;

      observation.text     as 
    text
    
 ->     
tgt.note     as 
    note
     then
     {

        text.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
     "value"
    ;

          }
     "reference"
    ;

      observation.statusCode    
 ->     
tgt.status    ;

      observation     where 
observation.effectiveTime.exists()     then
     {

        observation.effectiveTime     as 
    effectiveTime
    
 ->     
tgt.condition =     create
    (
    'BackboneElement'
    )
     as 
    condition
     then
     {

          observation.code    
 ->     
condition.code    ;

          observation.value    
 ->     
condition.outcome     "codeable"
    ;

          effectiveTime    
 ->     
condition.onset =     create
    (
    'Period'
    )
     as 
    period
     then
     {

            effectiveTime    
 ->     
period.start =     create
    (
    'dateTime'
    )
     as 
    start
     then 
TSDateTime    (
    effectiveTime
    , 
    start
    )
     "val"
    ;

              }
     "efft"
    ;

            }
     "effttemp"
    ;

          }
     "cont"
    ;
     // 
    observation.effectiveTime as effectiveTime -> condition.onset = create('Period') as value then IVLTSPeriod(effectiveTime, value) "valuePeriod";

      observation.value    
 ->     
condition.outcome     "codeable"
    ;

      observation.entryRelationship     as 
    entryR
     then
     {

        entryR.observation     as 
    obs
     then
     {

          obs     where 
(code.code = '35267-4')     then
     {

            obs.value     as 
    value
    
 ->     
condition.onset =     create
    (
    'Age'
    )
     as 
    Age
     then
     {

              value.value     as 
    valueAge
    
 ->     
Age.value =     valueAge
     "age"
    ;

              value.unit     as 
    unit
    
 ->     
Age.code =     unit
    ;

              value.unit     as 
    unit
    
 ->     
Age.unit =     unit
    ;

              value    
 ->     
Age.system =     'http://unitsofmeasure.org'
     "system"
    ;

                }
    ;

              }
     "insorgenza"
    ;

          obs     where 
(code.code = '39016-1')     then
     {

            obs.value     as 
    value
    
 ->     
tgt.deceased =     create
    (
    'Age'
    )
     as 
    Age
     then
     {

              value.value     as 
    valueAge
    
 ->     
Age.value =     valueAge
     "age"
    ;

              value.unit     as 
    unit
    
 ->     
Age.code =     unit
    ;

              value.unit     as 
    unit
    
 ->     
Age.unit =     unit
    ;

              value    
 ->     
Age.system =     'http://unitsofmeasure.org'
     "system"
    ;

                }
    ;

              }
     "death"
    ;

            }
     "obser"
    ;

          }
     "EntryRel"
    ;

        }
    ;

      }
    ;

    }


    group 
allergyFunction    (
    source
     src
     : 
cdaElement,     target
     tgt
     : 
AllergyIntolerance,     target
     patient
     : 
patient,     target
     encounter
     : 
encounter    )
     {

  src    
 ->     
 tgt.patient =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Patient/' + %patient.id    )
     "reference"
    ;

  src    
 ->     
 tgt.encounter =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Encounter/' + %encounter.id    )
     "reference"
    ;

  src.entryRelationship     as 
    entryRelationship1
     then
     {

    entryRelationship1.observation     as 
    observation1
     then
     {

      observation1.effectiveTime     as 
    effectiveTime
    
 ->     
tgt.onset =     create
    (
    'Period'
    )
     as 
    value
     then 
IVLTSPeriod    (
    effectiveTime
    , 
    value
    )
     "valuePeriod"
    ;

      observation1.value     as 
    code
     then
     {

        code.code     as 
    code1
    
 ->     
tgt.type =     translate
    (
    code1
    , 
    '#AllergyTypeMap'
    , 
    'code'
    )
     "type"
    ;

        code.code     as 
    code1
    
 ->     
tgt.category =     translate
    (
    code1
    , 
    '#AllergyCategoryMap'
    , 
    'code'
    )
     "category"
    ;

          }
     "code"
    ;

      observation1.participant     as 
    participant
    
 ->     
tgt.reaction     as 
    reaction
     then
     {

        observation1.entryRelationship     as 
    entryRelationship2
     where 
(typeCode = 'MFST')     then
     {

          entryRelationship2.observation     as 
    observation2
     then
     {

            observation2.value    
 ->     
reaction.manifestation     "manifestation"
    ;

            observation2.effectiveTime     as 
    effectiveTime
     then
     {

              effectiveTime.low     as 
    low
    
 ->     
reaction.onset =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    low
    , 
    value
    )
     "valuePeriodLow"
    ;

                }
     "low"
    ;

              }
     "observ2"
    ;

            }
     "entryR2"
    ;

        participant.participantRole     as 
    participantRole
     then
     {

          participantRole.playingEntity     as 
    playingEntity
     then
     {

            playingEntity.code    
 ->     
reaction.substance     "reaction"
    ;

              }
    ;

            }
    ;

          }
    ;

      observation1.entryRelationship     as 
    entryRelationship2
     where 
(typeCode = 'MFST')     then
     {

        entryRelationship2.observation     as 
    observation2
     where 
observation1.participant.exists().not()    
 ->     
tgt.reaction     as 
    reaction
     then
     {

          observation2.value    
 ->     
reaction.manifestation     "manifestation"
    ;

          observation2.effectiveTime     as 
    effectiveTime
     then
     {

            effectiveTime.low     as 
    low
    
 ->     
reaction.onset =     create
    (
    'dateTime'
    )
     as 
    value
     then 
TSDateTime    (
    low
    , 
    value
    )
     "valuePeriodLow"
    ;

              }
     "low"
    ;

            }
     "observ2"
    ;

          }
     "entryR2"
    ;

      observation1.entryRelationship     as 
    entryRelationship3
     where 
(typeCode = 'SUBJ')     then
     {

        entryRelationship3.observation     as 
    observation3
     then
     {

          observation3.value     as 
    value
     then
     {

            value.code     as 
    c
    
 ->     
tgt.criticality =     translate
    (
    c
    , 
    '#CricalityMap'
    , 
    'code'
    )
     "value"
    ;

              }
     "criticality"
    ;

            }
     "observ3"
    ;

        entryRelationship3.act     as 
    act
    
 ->     
tgt.note     as 
    note
     then
     {

          act.text     as 
    text
     then
     {

            text.reference     as 
    reference
    
 ->     
note.text =     (
reference.value    )
    ;

              }
     "note"
    ;

            }
    ;

          }
     "entryR3"
    ;

      observation1.entryRelationship     as 
    entryRelationship4
     where 
(typeCode = 'REFR')     then
     {

        entryRelationship4.observation     as 
    observation4
     then
     {

          observation4.value     as 
    value
    
 ->     
tgt.clinicalStatus     as 
    clinicalStatus
     then
     {

            value     as 
    valu
    
 ->     
clinicalStatus.coding =     create
    (
    'Coding'
    )
     as 
    coding
     then
     {

              valu     where 
(code = 'LA9041-0')    
 ->     
coding.code =     'resolved'
     "code"
    ;

              valu     where 
(code = 'LA18632-2')    
 ->     
coding.code =     'inactive'
     "code"
    ;

              valu     where 
(code = 'LA16666-2')    
 ->     
coding.code =     'active'
     "code"
    ;

              valu    
 ->     
coding.system =     'http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical'
     "system"
    ;

              valu.displayName     as 
    display
    
 ->     
coding.display =     cast
    (
    display
    , 
    'string'
    )
     "display"
    ;

                }
     "coding"
    ;

              }
     "clinicalStatus"
    ;

            }
     "observ4"
    ;

          }
     "entryR4"
    ;

        }
    ;

      }
     "entryrelationship"
    ;

    }


    group 
Practitioner    (
    source
     src
     : 
participant,     target
     tgt
     : 
MedicationRequest,     target
     bundle
     : 
Bundle    )
     {

  src    
 ->     
 bundle.entry     as 
    e22
    , 
 e22.request =     create
    (
    'BackboneElement'
    )
     as 
    request
    , 
 request.method =     'PUT'
    , 
 e22.resource =     create
    (
    'Practitioner'
    )
     as 
    practitioner1
     then
     {

    src.participantRole     as 
    practr
     then
     {

      practr.id     as 
    id
    
 ->     
practitioner1.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
     "ext"
    ;

        id.assigningAuthorityName     as 
    s
    
 ->     
 identifier.assigner     as 
    a
    , 
 a.display =     s
    ;

        id.root     as 
    r
     then
     {

          id.extension     as 
    ext
    
 ->     
 practitioner1.id =     (
r + '-' + ext    )
     as 
    uuid22
    , 
 e22.fullUrl =     append
    (
    'https://example/Practitioner/'
    , 
    uuid22
    )
    , 
 tgt.requester =     create
    (
    'Reference'
    )
     as 
    reference
    , 
 reference.reference =     (
'https://example/Practitioner/' + %practitioner1.id    )
     "id"
    ;

            }
     "r"
    ;

          }
     "identifier"
    ;

      practr.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"
    ;

      practr.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"
    ;

      practr    
 ->     
practitioner1.meta     as 
    meta
     then
     {

        practr    
 ->     
meta.tag =     create
    (
    'Coding'
    )
     as 
    coding
     then
     {

          practr    
 ->     
coding.system =     'http://algoritmodiscoring'
     "system"
    ;

          practr    
 ->     
coding.code =     'ClinicalDocument/body/TerapiaFarmacologicaConsigliata/participant'
     "code"
    ;

            }
     "coding"
    ;

          }
     "meta"
    ;

      practr.addr    
 ->     
practitioner1.address    ;

      practr.telecom    
 ->     
practitioner1.telecom    ;

      practr.playingEntity     as 
    plentity
     then
     {

        plentity.name    
 ->     
practitioner1.name    ;

        plentity.birthTime     as 
    birthTime
     then
     {

          birthTime.value     as 
    date
    
 ->     
practitioner1.birthDate =     truncate
    (
    date
    , 
    10
    )
    ;

            }
     "birth"
    ;

          }
     "partname"
    ;

        }
     "resurceCreation"
    ;

      }
     "practitionerCreate"
    ;

    }


  

Produced 08 Sep 2023