Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import uk.nhs.adaptors.gp2gp.ehr.mapper.parameters.CodeableConceptCdTemplateParameters;
import uk.nhs.adaptors.gp2gp.ehr.utils.CodeSystemsUtil;
import uk.nhs.adaptors.gp2gp.ehr.utils.CodeableConceptMappingUtils;
import uk.nhs.adaptors.gp2gp.ehr.utils.TemplateUtils;

Expand Down Expand Up @@ -63,17 +64,14 @@ public String mapCodeableConceptToCd(CodeableConcept codeableConcept) {

builder.mainCodeSystem(SNOMED_SYSTEM_CODE);

if (descriptionExtensions.isPresent()) {
var mainCode = getMainCode(descriptionExtensions.get(), snomedCodeCoding.get());
mainCode.ifPresent(builder::mainCode);
var mainCode = getMainCode(descriptionExtensions, snomedCodeCoding.get());
mainCode.ifPresent(builder::mainCode);

var mainDisplayName = getMainDisplayName(descriptionExtensions.get(), snomedCodeCoding.get());
mainDisplayName.ifPresent(builder::mainDisplayName);
var mainDisplayName = getMainDisplayName(descriptionExtensions, snomedCodeCoding.get());
mainDisplayName.ifPresent(builder::mainDisplayName);

if (codeableConcept.hasText()) {
builder.mainOriginalText(codeableConcept.getText());
}
}
builder.mainOriginalText(codeableConcept.getText());
builder.translations(getNonSnomedCodeCodings(codeableConcept));

return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build());
}
Expand Down Expand Up @@ -329,6 +327,20 @@ private Optional<Coding> getSnomedCodeCoding(CodeableConcept codeableConcept) {
.findFirst();
}

private List<Coding> getNonSnomedCodeCodings(CodeableConcept codeableConcept) {
var nonSnomedCodeCodings = codeableConcept.getCoding()
.stream()
.filter(coding -> !isSnomed(coding))
.toList();

for (Coding coding : nonSnomedCodeCodings) {
var hl7CodeSystem = CodeSystemsUtil.getHl7code(coding.getSystem());
coding.setSystem(hl7CodeSystem);
}

return nonSnomedCodeCodings;
}

private Optional<String> findOriginalText(CodeableConcept codeableConcept, Optional<Coding> coding) {
if (coding.isPresent()) {
if (codeableConcept.hasText()) {
Expand Down Expand Up @@ -457,30 +469,33 @@ private String buildNullFlavourCodeableConceptCd(CodeableConcept codeableConcept
return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build());
}

private Optional<String> getMainCode(List<Extension> descriptionExtensions, Coding snomedCodeCoding) {
var descriptionCode = descriptionExtensions.stream()
.filter(descriptionExt -> DESCRIPTION_ID.equals(descriptionExt.getUrl()))
.map(description -> description.getValue().toString())
.findFirst();
private Optional<String> getMainCode(Optional<List<Extension>> descriptionExtensions, Coding snomedCodeCoding) {
if (descriptionExtensions.isPresent()) {
var descriptionCode = descriptionExtensions.get().stream()
.filter(descriptionExt -> DESCRIPTION_ID.equals(descriptionExt.getUrl()))
.map(description -> description.getValue().toString())
.findFirst();

if (descriptionCode.isPresent()) {
return descriptionCode;
if (descriptionCode.isPresent()) {
return descriptionCode;
}
}

return Optional.ofNullable(snomedCodeCoding.getCode());
}

private Optional<String> getMainDisplayName(List<Extension> descriptionExtensions, Coding snomedCodeCoding) {
var descriptionDisplayName = descriptionExtensions.stream()
.filter(descriptionExt -> DESCRIPTION_DISPLAY.equals(descriptionExt.getUrl()))
.map(description -> description.getValue().toString())
.findFirst();
private Optional<String> getMainDisplayName(Optional<List<Extension>> descriptionExtensions, Coding snomedCodeCoding) {
if (descriptionExtensions.isPresent()) {
var descriptionDisplayName = descriptionExtensions.get().stream()
.filter(descriptionExt -> DESCRIPTION_DISPLAY.equals(descriptionExt.getUrl()))
.map(description -> description.getValue().toString())
.findFirst();

if (descriptionDisplayName.isPresent()) {
return descriptionDisplayName;
if (descriptionDisplayName.isPresent()) {
return descriptionDisplayName;
}
}

return Optional.ofNullable(snomedCodeCoding.getDisplay());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
import org.hl7.fhir.dstu3.model.Coding;

import java.util.List;

@Getter
@Setter
Expand All @@ -12,5 +15,6 @@ public class CodeableConceptCdTemplateParameters {
private String mainCodeSystem;
private String mainDisplayName;
private String mainOriginalText;
private List<Coding> translations;
private boolean nullFlavor;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
<code{{#nullFlavor}} nullFlavor="UNK"{{/nullFlavor}}{{^nullFlavor}} code="{{mainCode}}" codeSystem="{{mainCodeSystem}}" displayName="{{mainDisplayName}}"{{/nullFlavor}}>
{{#translations}}
<translation code="{{code}}" codeSystem="{{system}}" displayName="{{display}}" />
{{/translations}}
{{#mainOriginalText}}
<originalText>{{mainOriginalText}}</originalText>
{{/mainOriginalText}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,43 @@ public void When_MappingStubbedCodeableConcept_Expect_HL7CdObjectXml(String inpu
.isEqualToIgnoringWhitespace(expectedOutput);
}

@Test
void When_MappingCodeableConceptWithNonSnomedCodeSystems_Expect_ManifestedXmlContainsTranslationsForThoseCodes() {
var inputJson = """
{
"resourceType" : "Observation",
"code": {
"coding": [
{
"system": "http://snomed.info/sct",
"code": "123456",
"display": "Endometriosis of uterus"
},
{
"system": "http://read.info/readv2",
"code": "READ0",
"display": "Read V2 Code Display"
},
{
"system": "http://read.info/ctv3",
"code": "READ1",
"display": "Read CTV3 Code Display"
}
]
}
}""";
var expectedOutputXml = """
<code code="123456" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Endometriosis of uterus">
<translation code="READ0" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Read V2 Code Display" />
<translation code="READ1" codeSystem="2.16.840.1.113883.2.1.3.2.4.14" displayName="Read CTV3 Code Display" />
</code>""";
var codeableConcept = fhirParseService.parseResource(inputJson, Observation.class).getCode();

var outputMessageXml = codeableConceptCdMapper.mapCodeableConceptToCd(codeableConcept);

assertThat(outputMessageXml).isEqualToIgnoringWhitespace(expectedOutputXml);
}

@ParameterizedTest
@MethodSource("getTestArgumentsActualProblem")
public void When_MappingStubbedCodeableConceptForActualProblemHeader_Expect_HL7CdObjectXml(String inputJson, String outputXml)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@
"resourceType" : "Observation",
"code": {
"coding": [
{
"system": "http://blah.info/blahsomecodesystem",
"code": "X%^^%",
"display": "Display for invalid code/system",
"userSelected": true
},
{
"extension": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@
"resourceType" : "Observation",
"code": {
"coding": [
{
"system": "http://blah.info/blahsomecodesystem",
"code": "X%^^%",
"display": "Display for invalid code/system",
"userSelected": true
},
{
"extension": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,6 @@
"resourceType" : "Observation",
"code": {
"coding": [
{
"system": "http://blah.info/blahsomecodesystem",
"code": "X%^^%",
"display": "Display for invalid code/system",
"userSelected": true
},
{
"extension": [
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,7 @@
"resourceType" : "Observation",
"code": {
"coding": [
{
"system": "http://blah.info/blahsomecodesystem",
"code": "F%^^%",
"display": "Happy puppet syndrome",
"userSelected": true
}, {
{
"extension": [
{
"url": "https://fhir.nhs.uk/STU3/StructureDefinition/Extension-coding-sctdescid",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="Mapped-From-Observation/B7F05EA7-A1A4-48C0-9C4C-CDB5768796B2"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
</code>
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
</code>
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="Mapped-From-Observation/B7F05EA7-A1A4-48C0-9C4C-CDB5768796B2"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
</code>
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
</code>
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="Mapped-From-Observation/6E30A9E3-FF9A-4868-8FCD-7DAC26A16E78"/>
<code code="2551971000000110" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum oestradiol level">
</code>
<translation code="4465.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum oestradiol level" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2551971000000110" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum oestradiol level">
</code>
<translation code="4465.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum oestradiol level" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="Mapped-From-Observation/D0A358C9-4833-4827-B14B-E8515C25CB12"/>
<code code="2563401000000119" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum ACTH (adrenocorticotrophic hormone) level">
</code>
<translation code="4483.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum ACTH" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2563401000000119" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum ACTH (adrenocorticotrophic hormone) level">
</code>
<translation code="4483.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum ACTH" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="257472014" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="International normalised ratio">
</code>
<translation code="42QE.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="International normalised ratio" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="257472014" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="International normalised ratio">
</code>
<translation code="42QE.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="International normalised ratio" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="Mapped-From-Observation/6E30A9E3-FF9A-4868-8FCD-7DAC26A16E78"/>
<code code="2551971000000110" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum oestradiol level">
</code>
<translation code="4465.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum oestradiol level" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<low value="19971020"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2551971000000110" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum oestradiol level">
</code>
<translation code="4465.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum oestradiol level" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<low value="19971020"/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
<CompoundStatement classCode="BATTERY" moodCode="EVN">
<id root="Mapped-From-Observation/B7F05EA7-A1A4-48C0-9C4C-CDB5768796B2"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
Expand All @@ -12,6 +13,7 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2551971000000110" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum oestradiol level">
<translation code="4465.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum oestradiol level" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
Expand All @@ -22,6 +24,7 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="Mapped-From-Observation/TestResult-WithRelatedMember-WhichIsntAFilingComment"/>
<code code="2551971000000110" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Serum oestradiol level">
<translation code="4465.00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Serum oestradiol level" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
<CompoundStatement classCode="CLUSTER" moodCode="EVN">
<id root="Mapped-From-Observation/B7F05EA7-A1A4-48C0-9C4C-CDB5768796B2"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
</code>
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand All @@ -12,7 +13,8 @@
<ObservationStatement classCode="OBS" moodCode="EVN">
<id root="random-unmapped-id"/>
<code code="2564081000000118" codeSystem="2.16.840.1.113883.2.1.3.2.4.15" displayName="Urine pregnancy test">
</code>
<translation code="465..00" codeSystem="2.16.840.1.113883.2.1.6.2" displayName="Urine pregnancy test" />
</code>
<statusCode code="COMPLETE"/>
<effectiveTime>
<center value="20100223"/>
Expand Down
Loading