WHO Digital Documentation of COVID-19 Certificates (DDCC)
1.0.0 - CI Build International flag

WHO Digital Documentation of COVID-19 Certificates (DDCC), published by WHO. This guide is not an authorized publication; it is the continuous build for version 1.0.0 built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/WorldHealthOrganization/ddcc/tree/main and changes regularly. See the Directory of published versions

StructureMap:

Official URL: http://smart.who.int/ddcc/StructureMap/CertDCCtoCoreDataSet Version: 1.0.0
Draft as of 2024-10-17 Computable Name: CertDCCtoCoreDataSet

Structure map transforming CertDCC logical model to bundle of Core Data Set logical model

Generated Narrative: StructureMap CertDCCtoCoreDataSet

map "http://smart.who.int/ddcc/StructureMap/CertDCCtoCoreDataSet" = "CertDCCtoCoreDataSet"

// Structure map transforming CertDCC logical model to bundle of Core Data Set logical model

uses "http://smart.who.int/ddcc/StructureDefinition/CertDCC" alias CWTPayload as source
uses "http://hl7.org/fhir/StructureDefinition/Bundle" alias DDCCBundle as target
uses "http://smart.who.int/ddcc/StructureDefinition/DDCCCoreDataSet" alias DDCC as target
uses "http://smart.who.int/ddcc/StructureDefinition/DDCCCoreDataSetVS" alias DDCCVS as target
uses "http://smart.who.int/ddcc/StructureDefinition/DDCCCoreDataSetTR" alias DDCCTR as target

group CertDCCtoCoreDataSet(source src : CWTPayload, target ddccBundle : DDCCBundle) {
  src.-260 as hcert then {
    hcert.1 as dcc then {
      dcc.v as v ->  ddccBundle.entry as outentry,  create('http://smart.who.int/ddcc/StructureDefinition/DDCCCoreDataSetVS') as ddcc then {
        v then DCCtoCoreDataSet(dcc, ddcc) "set DDCC";
        v -> ddcc.certificate as certificate then CertDCCtoCoreDataSetCertificate(src, dcc, v, certificate) "set certificate";
        v -> ddcc.vaccination as vaccination then VtoCoreDataSetVS(v, vaccination) "set vaccination";
        v -> outentry.resource = ddcc "set outentry";
      };
      dcc.t as t ->  ddccBundle.entry as outentry,  create('http://smart.who.int/ddcc/StructureDefinition/DDCCCoreDataSetTR') as ddcc then {
        t then DCCtoCoreDataSet(dcc, ddcc) "set DDCC";
        t -> ddcc.certificate as certificate then CertDCCtoCoreDataSetCertificate(src, dcc, t, certificate) "set certificate";
        t -> ddcc.test as test then TtoCoreDataSetTR(t, test) "set test";
        t -> outentry.resource = ddcc "set outentry";
      };
    } "eu_DCC_v1";
  } "hcert";
}

group DCCtoCoreDataSet(source dcc, target ddcc : DDCC) {
  dcc.dob as birthDate -> ddcc.birthDate = birthDate "set birthDate";
  dcc.nam as nam then {
    nam.gn as given -> ddcc.name = (given.replaceMatches('$', ' ')) "set given name";
    nam.fn as family ->  ddcc.name as tName,  ddcc.name = append(tName, family) "add family name";
  };
}

group CertDCCtoCoreDataSetCertificate(source src : CWTPayload, source dcc, source g, target certificate) {
  src -> certificate.period = create('Period') as period then CwtToPeriod(src, period) "set period";
  dcc.ver as ver -> certificate.version = ver "set version";
  g.ci as ci ->  certificate.hcid as hcid,  hcid.value = ci "set hcid";
  g.is as is ->  certificate.issuer = create('Reference') as issuer,  issuer.display = is "set issuer";
}

group CwtToPeriod(source src : CWTPayload, target tgt : Period) {
  src.6 as iat ->  append(iat, ' seconds') as epoch,  tgt.start = (@1970-01-01T00:00:00.000+00:00 + epoch.toQuantity()) "set period start";
  src.4 as exp ->  append(exp, ' seconds') as epoch,  tgt.end = (@1970-01-01T00:00:00.000+00:00 + epoch.toQuantity()) "set period end";
}

group VtoCoreDataSetVS(source v, target vaccination) {
  v.tg as tg ->  vaccination.disease as coding,  coding.system = 'http://snomed.info/sct',  coding.code = tg "set target disease";
  v.vp as vp ->  vaccination.vaccine as coding,  coding.system = 'https://ec.europa.eu/health/documents/community-register/html/',  coding.code = vp "set vaccine";
  v.mp as mp then {
    mp ->  vaccination.brand as coding,  coding.system = 'https://id.uvci.eu/valuesets/vaccine-medicinal-product.json',  coding.code = mp "set default brand";
    mp -> c('https://ec.europa.eu/health/documents/community-register/html/', mp) as coded then {
      mp where coded.memberOf('http://smart.who.int/ddcc/ValueSet/vaccine-covid19-euur') -> vaccination.brand = translate(coded, 'http://smart.who.int/ddcc/ConceptMap/vaccine-covid19-euur-to-icd11', 'Coding') "translate COVID19 brand";
    } "coding";
  };
  v.ma as ma ->  vaccination.maholder as coding,  coding.system = 'https://id.uvci.eu/valuesets/vaccine-mah-manf.json',  coding.code = ma "set maholder";
  v.dt as date -> vaccination.date = date "set date";
  v.dn as dose -> vaccination.dose = dose "set dose";
  v.sd as totalDoses -> vaccination.totalDoses = totalDoses "set totalDoses";
  v.co as co ->  vaccination.country as coding,  coding.code = co,  coding.system = 'urn:iso:std:iso:3166' "set country";
}

group TtoCoreDataSetTR(source t, target test) {
  t.tg as tg then {
    tg ->  test.pathogen as coding,  coding.system = 'http://snomed.info/sct',  coding.code = tg "set default pathogen";
    tg -> c('http://snomed.info/sct', tg) as coded then {
      tg where coded.memberOf('http://smart.who.int/ddcc/ValueSet/lab-test-pathogen-covid19-snomed') -> test.pathogen = translate(coded, 'http://smart.who.int/ddcc/ConceptMap/lab-test-pathogen-snomed-to-icd11', 'Coding') "translate COVID19 pathogen";
    } "coding";
  };
  t.tt as tt then {
    tt ->  test.type as coding,  coding.system = 'http://loinc.org',  coding.code = tt "set default type";
    tt -> c('http://loinc.org', tt) as coded then {
      tt where coded.memberOf('http://smart.who.int/ddcc/ValueSet/lab-test-type-covid19-loinc') -> test.type = translate(coded, 'http://smart.who.int/ddcc/ConceptMap/lab-test-type-covid19-loinc-to-icd11', 'Coding') "translate COVID19 type";
    } "coding";
  };
  t.nm as nm ->  test.brand as coding,  coding.system = 'https://id.uvci.eu/valuesets/test-manf.json',  coding.code = nm "set brand";
  t.ma as ma ->  test.manufacturer as coding,  coding.system = 'https://covid-19-diagnostics.jrc.ec.europa.eu/devices',  coding.code = ma "set manufacturer";
  t.sc as date -> test.date = date "set date";
  t.tr as tr then {
    tr ->  test.result as coding,  coding.system = 'http://snomed.info/sct',  coding.code = tr "set default result";
    tr -> c('http://snomed.info/sct', tr) as coded then {
      tr where coded.memberOf('http://smart.who.int/ddcc/ValueSet/lab-test-qual-result-snomed') -> test.result = translate(coded, 'http://smart.who.int/ddcc/ConceptMap/lab-test-qual-result-snomed-to-icd11', 'Coding') "translate COVID19 result";
    } "coding";
  };
  t.tc as tc ->  test.centre as coding,  coding.code = tc "set centre";
  t.co as co ->  test.country as coding,  coding.code = co,  coding.system = 'urn:iso:std:iso:3166' "set country";
}