@@ -50,38 +50,29 @@ public class CodeableConceptCdMapper {
5050 private static final String OTHER_CATEGORY_DESCRIPTION = "Other category" ;
5151
5252 public String mapCodeableConceptToCd (CodeableConcept codeableConcept ) {
53- var builder = CodeableConceptCdTemplateParameters .builder ();
54- var mainCode = findMainCode (codeableConcept );
53+ Optional <Coding > snomedCodeCoding = getSnomedCodeCoding (codeableConcept );
5554
56- builder .nullFlavor (mainCode .isEmpty ());
55+ if (snomedCodeCoding .isEmpty ()) {
56+ return buildNullFlavourCodeableConceptCd (codeableConcept , snomedCodeCoding );
57+ }
5758
58- if (mainCode .isPresent ()) {
59- var extension = retrieveDescriptionExtension (mainCode .get ())
60- .map (Extension ::getExtension )
61- .orElse (Collections .emptyList ());
59+ var builder = CodeableConceptCdTemplateParameters .builder ();
6260
63- builder .mainCodeSystem (SNOMED_SYSTEM_CODE );
61+ var descriptionExtensions = retrieveDescriptionExtension (snomedCodeCoding .get ())
62+ .map (Extension ::getExtension );
6463
65- Optional <String > code = extension .stream ()
66- .filter (descriptionExt -> DESCRIPTION_ID .equals (descriptionExt .getUrl ()))
67- .map (description -> description .getValue ().toString ())
68- .findFirst ()
69- .or (() -> Optional .ofNullable (mainCode .get ().getCode ()));
70- code .ifPresent (builder ::mainCode );
64+ builder .mainCodeSystem (SNOMED_SYSTEM_CODE );
7165
72- Optional < String > displayName = extension . stream ()
73- . filter ( displayExtension -> DESCRIPTION_DISPLAY . equals ( displayExtension . getUrl ()))
74- . map ( description -> description . getValue (). toString ())
75- . findFirst ()
76- . or (() -> Optional . ofNullable ( mainCode . get (). getDisplay () ));
77- displayName .ifPresent (builder ::mainDisplayName );
66+ if ( descriptionExtensions . isPresent ()) {
67+ var mainCode = getMainCode ( descriptionExtensions . get (), snomedCodeCoding . get ());
68+ mainCode . ifPresent ( builder :: mainCode );
69+
70+ var mainDisplayName = getMainDisplayName ( descriptionExtensions . get (), snomedCodeCoding . get ());
71+ mainDisplayName .ifPresent (builder ::mainDisplayName );
7872
7973 if (codeableConcept .hasText ()) {
8074 builder .mainOriginalText (codeableConcept .getText ());
8175 }
82- } else {
83- var originalText = findOriginalText (codeableConcept , mainCode );
84- originalText .ifPresent (builder ::mainOriginalText );
8576 }
8677
8778 return TemplateUtils .fillTemplate (CODEABLE_CONCEPT_CD_TEMPLATE , builder .build ());
@@ -92,7 +83,7 @@ public String mapCodeableConceptToCd(CodeableConcept codeableConcept) {
9283 // we have agreed to use the Concept ID rather than Description Id for medications which will avoided the degradation.
9384 public String mapCodeableConceptForMedication (CodeableConcept codeableConcept ) {
9485 var builder = CodeableConceptCdTemplateParameters .builder ();
95- var mainCode = findMainCode (codeableConcept );
86+ var mainCode = getSnomedCodeCoding (codeableConcept );
9687
9788 builder .nullFlavor (mainCode .isEmpty ());
9889
@@ -127,7 +118,7 @@ public String mapCodeableConceptForMedication(CodeableConcept codeableConcept) {
127118 public String mapCodeableConceptToCdForAllergy (CodeableConcept codeableConcept , AllergyIntolerance .AllergyIntoleranceClinicalStatus
128119 allergyIntoleranceClinicalStatus ) {
129120 var builder = CodeableConceptCdTemplateParameters .builder ();
130- var mainCode = findMainCode (codeableConcept );
121+ var mainCode = getSnomedCodeCoding (codeableConcept );
131122
132123 builder .nullFlavor (mainCode .isEmpty ());
133124
@@ -177,7 +168,7 @@ public String mapCodeableConceptToCdForTransformedActualProblemHeader(CodeableCo
177168
178169 public String mapCodeableConceptToCdForBloodPressure (CodeableConcept codeableConcept ) {
179170 var builder = CodeableConceptCdTemplateParameters .builder ();
180- var mainCode = findMainCode (codeableConcept );
171+ var mainCode = getSnomedCodeCoding (codeableConcept );
181172
182173 builder .nullFlavor (mainCode .isEmpty ());
183174 var originalText = findOriginalText (codeableConcept , mainCode );
@@ -238,7 +229,7 @@ public String getCdForTopic() {
238229 }
239230
240231 public String mapToCdForTopic (CodeableConcept relatedProblem , String title ) {
241- var mainCode = findMainCode (relatedProblem );
232+ var mainCode = getSnomedCodeCoding (relatedProblem );
242233
243234 if (mainCode .isEmpty ()) {
244235 return mapToCdForTopic (title );
@@ -251,7 +242,7 @@ public String mapToCdForTopic(CodeableConcept relatedProblem, String title) {
251242 }
252243
253244 public String mapToCdForTopic (CodeableConcept relatedProblem ) {
254- var mainCode = findMainCode (relatedProblem );
245+ var mainCode = getSnomedCodeCoding (relatedProblem );
255246
256247 if (mainCode .isEmpty ()) {
257248 return getCdForTopic ();
@@ -331,7 +322,7 @@ private Optional<Coding> findPrescribingAgency(CodeableConcept codeableConcept)
331322 .findFirst ();
332323 }
333324
334- private Optional <Coding > findMainCode (CodeableConcept codeableConcept ) {
325+ private Optional <Coding > getSnomedCodeCoding (CodeableConcept codeableConcept ) {
335326 return codeableConcept .getCoding ()
336327 .stream ()
337328 .filter (this ::isSnomed )
@@ -358,9 +349,11 @@ private Optional<String> findOriginalText(CodeableConcept codeableConcept, Optio
358349 }
359350 }
360351
361- private Optional <String > findOriginalTextForAllergy (CodeableConcept codeableConcept , Optional <Coding > coding ,
362- AllergyIntolerance .AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus ) {
363-
352+ private Optional <String > findOriginalTextForAllergy (
353+ CodeableConcept codeableConcept ,
354+ Optional <Coding > coding ,
355+ AllergyIntolerance .AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus
356+ ) {
364357 if (!allergyIntoleranceClinicalStatus .toCode ().isEmpty ()) {
365358 if (RESOLVED_CLINICAL_STATUS .equals (allergyIntoleranceClinicalStatus .toCode ())) {
366359 if (coding .isPresent ()) {
@@ -428,29 +421,66 @@ private Optional<Extension> retrieveDescriptionExtension(Coding coding) {
428421 }
429422
430423 public String getDisplayFromCodeableConcept (CodeableConcept codeableConcept ) {
431- return findMainCode (codeableConcept )
424+ return getSnomedCodeCoding (codeableConcept )
432425 .map (cc -> findDisplayText (cc ).orElse (StringUtils .EMPTY ))
433426 .orElse (StringUtils .EMPTY );
434427 }
435428
436429 public String mapToNullFlavorCodeableConcept (CodeableConcept codeableConcept ) {
437430
438431 var builder = CodeableConceptCdTemplateParameters .builder ().nullFlavor (true );
439- var mainCode = findMainCode (codeableConcept );
432+ var mainCode = getSnomedCodeCoding (codeableConcept );
440433
441434 var originalText = findOriginalText (codeableConcept , mainCode );
442435 originalText .ifPresent (builder ::mainOriginalText );
443436 return TemplateUtils .fillTemplate (CODEABLE_CONCEPT_CD_TEMPLATE , builder .build ());
444437 }
445438
446- public String mapToNullFlavorCodeableConceptForAllergy (CodeableConcept codeableConcept ,
447- AllergyIntolerance .AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus ) {
448-
439+ public String mapToNullFlavorCodeableConceptForAllergy (
440+ CodeableConcept codeableConcept ,
441+ AllergyIntolerance .AllergyIntoleranceClinicalStatus allergyIntoleranceClinicalStatus
442+ ) {
449443 var builder = CodeableConceptCdTemplateParameters .builder ().nullFlavor (true );
450- var mainCode = findMainCode (codeableConcept );
444+ var mainCode = getSnomedCodeCoding (codeableConcept );
451445
452446 var originalText = findOriginalTextForAllergy (codeableConcept , mainCode , allergyIntoleranceClinicalStatus );
453447 originalText .ifPresent (builder ::mainOriginalText );
454448 return TemplateUtils .fillTemplate (CODEABLE_CONCEPT_CD_TEMPLATE , builder .build ());
455449 }
450+
451+ private String buildNullFlavourCodeableConceptCd (CodeableConcept codeableConcept , Optional <Coding > snomedCode ) {
452+ var builder = CodeableConceptCdTemplateParameters .builder ();
453+ builder .nullFlavor (true );
454+ var originalText = findOriginalText (codeableConcept , snomedCode );
455+ originalText .ifPresent (builder ::mainOriginalText );
456+
457+ return TemplateUtils .fillTemplate (CODEABLE_CONCEPT_CD_TEMPLATE , builder .build ());
458+ }
459+
460+ private Optional <String > getMainCode (List <Extension > descriptionExtensions , Coding snomedCodeCoding ) {
461+ var descriptionCode = descriptionExtensions .stream ()
462+ .filter (descriptionExt -> DESCRIPTION_ID .equals (descriptionExt .getUrl ()))
463+ .map (description -> description .getValue ().toString ())
464+ .findFirst ();
465+
466+ if (descriptionCode .isPresent ()) {
467+ return descriptionCode ;
468+ }
469+
470+ return Optional .ofNullable (snomedCodeCoding .getCode ());
471+ }
472+
473+ private Optional <String > getMainDisplayName (List <Extension > descriptionExtensions , Coding snomedCodeCoding ) {
474+ var descriptionDisplayName = descriptionExtensions .stream ()
475+ .filter (descriptionExt -> DESCRIPTION_DISPLAY .equals (descriptionExt .getUrl ()))
476+ .map (description -> description .getValue ().toString ())
477+ .findFirst ();
478+
479+ if (descriptionDisplayName .isPresent ()) {
480+ return descriptionDisplayName ;
481+ }
482+
483+ return Optional .ofNullable (snomedCodeCoding .getDisplay ());
484+ }
485+
456486}
0 commit comments