diff --git a/service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/CodeableConceptCdMapper.java b/service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/CodeableConceptCdMapper.java index 4b93e96c1..4a9efea3a 100644 --- a/service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/CodeableConceptCdMapper.java +++ b/service/src/main/java/uk/nhs/adaptors/gp2gp/ehr/mapper/CodeableConceptCdMapper.java @@ -81,35 +81,31 @@ public String mapCodeableConceptToCd(CodeableConcept codeableConcept) { // we have agreed to use the Concept ID rather than Description Id for medications which will avoided the degradation. public String mapCodeableConceptForMedication(CodeableConcept codeableConcept) { var builder = CodeableConceptCdTemplateParameters.builder(); - var mainCode = getSnomedCodeCoding(codeableConcept); + var snomedCodeCoding = getSnomedCodeCoding(codeableConcept); - builder.nullFlavor(mainCode.isEmpty()); + if (snomedCodeCoding.isEmpty()) { + return buildNullFlavourCodeableConceptCd(codeableConcept, snomedCodeCoding); + } - if (mainCode.isPresent()) { - var extension = retrieveDescriptionExtension(mainCode.get()) - .map(Extension::getExtension) - .orElse(Collections.emptyList()); + var extension = retrieveDescriptionExtension(snomedCodeCoding.get()) + .map(Extension::getExtension) + .orElse(Collections.emptyList()); - builder.mainCodeSystem(SNOMED_SYSTEM_CODE); + builder.mainCodeSystem(SNOMED_SYSTEM_CODE); - Optional code = Optional.ofNullable(mainCode.get().getCode()); - code.ifPresent(builder::mainCode); + Optional code = Optional.ofNullable(snomedCodeCoding.get().getCode()); + code.ifPresent(builder::mainCode); - Optional displayName = extension.stream() - .filter(displayExtension -> DESCRIPTION_DISPLAY.equals(displayExtension.getUrl())) - .map(description -> description.getValue().toString()) - .findFirst() - .or(() -> Optional.ofNullable(mainCode.get().getDisplay())); - displayName.ifPresent(builder::mainDisplayName); + Optional displayName = extension.stream() + .filter(displayExtension -> DESCRIPTION_DISPLAY.equals(displayExtension.getUrl())) + .map(description -> description.getValue().toString()) + .findFirst() + .or(() -> Optional.ofNullable(snomedCodeCoding.get().getDisplay())); + displayName.ifPresent(builder::mainDisplayName); - if (codeableConcept.hasText()) { - builder.mainOriginalText(codeableConcept.getText()); - } - } else { - var originalText = findOriginalText(codeableConcept, mainCode); - originalText.ifPresent(builder::mainOriginalText); - } + builder.mainOriginalText(codeableConcept.getText()); + builder.translations(getNonSnomedCodeCodings(codeableConcept)); return TemplateUtils.fillTemplate(CODEABLE_CONCEPT_CD_TEMPLATE, builder.build()); } diff --git a/service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/MedicationStatementMapperTest.java b/service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/MedicationStatementMapperTest.java index 402fd1655..fdf5b3ebc 100644 --- a/service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/MedicationStatementMapperTest.java +++ b/service/src/test/java/uk/nhs/adaptors/gp2gp/ehr/mapper/MedicationStatementMapperTest.java @@ -131,7 +131,9 @@ private static Stream resourceFileParams() { Arguments.of("mr-with-extension-status-reason-with-text.json", "medication-statement-with-status-reason-text.xml"), Arguments.of("mr-with-no-recorder-reference.json", "medication-statement-with-no-participant.xml"), Arguments.of("mr-with-invalid-recorder-resource-type.json", "medication-statement-with-no-participant.xml"), - Arguments.of("medication-request-special-character-in-code.json", "medication-statement-with-xml-escaped-text-values.xml") + Arguments.of("medication-request-special-character-in-code.json", "medication-statement-with-xml-escaped-text-values.xml"), + Arguments.of("mr-referencing-medication-with-non-snomed-codes.json", "ms-with-material-coding-containing-translations.xml"), + Arguments.of("mr-referencing-medication-with-no-snomed-code.json", "ms-with-material-coding-containing-null-flavor-code.xml") ); } diff --git a/service/src/test/resources/ehr/mapper/medication_request/fhir-bundle.json b/service/src/test/resources/ehr/mapper/medication_request/fhir-bundle.json index 23ae3b922..473022575 100644 --- a/service/src/test/resources/ehr/mapper/medication_request/fhir-bundle.json +++ b/service/src/test/resources/ehr/mapper/medication_request/fhir-bundle.json @@ -22,6 +22,51 @@ } } }, + { + "resource": { + "resourceType": "Medication", + "id": "21", + "code": { + "coding": [ + { + "system": "http://snomed.info/sct", + "code": "430127000", + "display": "Oral Form Oxycodone (product)" + }, + { + "system": "http://read.info/readv2", + "code": "READ0", + "display": "Display for Read V2" + }, + { + "system": "http://read.info/ctv3", + "code": "READ1", + "display": "Display for Read CTV3" + } + ] + } + } + }, + { + "resource": { + "resourceType": "Medication", + "id": "22", + "code": { + "coding": [ + { + "system": "http://read.info/readv2", + "code": "READ0", + "display": "Display for Read V2" + }, + { + "system": "http://read.info/ctv3", + "code": "READ1", + "display": "Display for Read CTV3" + } + ] + } + } + }, { "resource": { "resourceType":"MedicationRequest", diff --git a/service/src/test/resources/ehr/mapper/medication_request/mr-referencing-medication-with-no-snomed-code.json b/service/src/test/resources/ehr/mapper/medication_request/mr-referencing-medication-with-no-snomed-code.json new file mode 100644 index 000000000..a81fb1b80 --- /dev/null +++ b/service/src/test/resources/ehr/mapper/medication_request/mr-referencing-medication-with-no-snomed-code.json @@ -0,0 +1,59 @@ +{ + "resourceType":"MedicationRequest", + "id":"3377543D-5B1B-4C4F-BFF6-9F7BC3A1C3B8", + "meta":{ + "profile":[ + "https://fhir.nhs.uk/STU3/StructureDefinition/CareConnect-GPC-MedicationRequest-1" + ] + }, + "extension":[ + { + "url": "https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-MedicationRepeatInformation-1", + "extension": [ + { + "url": "numberOfRepeatPrescriptionsAllowed", + "valuePositiveInt": 12 + }, + { + "url": "numberOfRepeatPrescriptionsIssued", + "valuePositiveInt": 11 + } + ] + } + ], + "identifier":[ + { + "system":"https://fhir.nhs.uk/Id/cross-care-setting-identifier", + "value":"f2489066-7082-11eb-bb13-00505692d4aa" + } + ], + "status":"active", + "intent":"order", + "medicationReference":{ + "reference":"Medication/22" + }, + "subject":{ + "reference":"Patient/2" + }, + "authoredOn":"2017-11-10T00:00:00+00:00", + "recorder":{ + "reference":"Practitioner/1" + }, + "dosageInstruction":[ + { + "text":"1 tablet once a day", + "patientInstruction":"Take in morning" + } + ], + "dispenseRequest":{ + "validityPeriod":{ + "start":"2017-11-10T00:00:00+00:00", + "end":"2018-08-15T00:00:00+01:00" + } + }, + "basedOn": [ + { + "reference": "MedicationRequest/D66D84C9-C073-4EDF-8C2C-F309A83C3DC7" + } + ] +} diff --git a/service/src/test/resources/ehr/mapper/medication_request/mr-referencing-medication-with-non-snomed-codes.json b/service/src/test/resources/ehr/mapper/medication_request/mr-referencing-medication-with-non-snomed-codes.json new file mode 100644 index 000000000..4d836806d --- /dev/null +++ b/service/src/test/resources/ehr/mapper/medication_request/mr-referencing-medication-with-non-snomed-codes.json @@ -0,0 +1,59 @@ +{ + "resourceType":"MedicationRequest", + "id":"3377543D-5B1B-4C4F-BFF6-9F7BC3A1C3B8", + "meta":{ + "profile":[ + "https://fhir.nhs.uk/STU3/StructureDefinition/CareConnect-GPC-MedicationRequest-1" + ] + }, + "extension":[ + { + "url": "https://fhir.nhs.uk/STU3/StructureDefinition/Extension-CareConnect-GPC-MedicationRepeatInformation-1", + "extension": [ + { + "url": "numberOfRepeatPrescriptionsAllowed", + "valuePositiveInt": 12 + }, + { + "url": "numberOfRepeatPrescriptionsIssued", + "valuePositiveInt": 11 + } + ] + } + ], + "identifier":[ + { + "system":"https://fhir.nhs.uk/Id/cross-care-setting-identifier", + "value":"f2489066-7082-11eb-bb13-00505692d4aa" + } + ], + "status":"active", + "intent":"order", + "medicationReference":{ + "reference":"Medication/21" + }, + "subject":{ + "reference":"Patient/2" + }, + "authoredOn":"2017-11-10T00:00:00+00:00", + "recorder":{ + "reference":"Practitioner/1" + }, + "dosageInstruction":[ + { + "text":"1 tablet once a day", + "patientInstruction":"Take in morning" + } + ], + "dispenseRequest":{ + "validityPeriod":{ + "start":"2017-11-10T00:00:00+00:00", + "end":"2018-08-15T00:00:00+01:00" + } + }, + "basedOn": [ + { + "reference": "MedicationRequest/D66D84C9-C073-4EDF-8C2C-F309A83C3DC7" + } + ] +} diff --git a/service/src/test/resources/ehr/mapper/medication_request/ms-with-material-coding-containing-null-flavor-code.xml b/service/src/test/resources/ehr/mapper/medication_request/ms-with-material-coding-containing-null-flavor-code.xml new file mode 100644 index 000000000..1149977e2 --- /dev/null +++ b/service/src/test/resources/ehr/mapper/medication_request/ms-with-material-coding-containing-null-flavor-code.xml @@ -0,0 +1,52 @@ + + + + + + + + + + + + + Display for Read V2 + + + + + + + + + + + + + Unk UoM + + + + + + + + + + Patient Instruction: Take in morning + + + + + + + 1 tablet once a day + + + + + + + + + \ No newline at end of file diff --git a/service/src/test/resources/ehr/mapper/medication_request/ms-with-material-coding-containing-translations.xml b/service/src/test/resources/ehr/mapper/medication_request/ms-with-material-coding-containing-translations.xml new file mode 100644 index 000000000..c97a511ca --- /dev/null +++ b/service/src/test/resources/ehr/mapper/medication_request/ms-with-material-coding-containing-translations.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + Unk UoM + + + + + + + + + + Patient Instruction: Take in morning + + + + + + + 1 tablet once a day + + + + + + + + + \ No newline at end of file