88import static uk .nhs .adaptors .gp2gp .ehr .mapper .CommentType .LABORATORY_RESULT_COMMENT ;
99import static uk .nhs .adaptors .gp2gp .ehr .mapper .diagnosticreport .ObservationMapper .NARRATIVE_STATEMENT_TEMPLATE ;
1010
11+ import java .util .ArrayList ;
1112import java .util .Collections ;
1213import java .util .List ;
1314import java .util .Optional ;
@@ -69,13 +70,17 @@ public class DiagnosticReportMapper {
6970 private final ConfidentialityService confidentialityService ;
7071
7172 public String mapDiagnosticReportToCompoundStatement (DiagnosticReport diagnosticReport ) {
72- List <Specimen > specimens = fetchSpecimens (diagnosticReport );
7373 List <Observation > observations = fetchObservations (diagnosticReport );
74+ List <Specimen > specimens = fetchSpecimens (diagnosticReport , observations );
7475 final IdMapper idMapper = messageContext .getIdMapper ();
7576 markObservationsAsProcessed (idMapper , observations );
7677
78+ observations = fixOrphanedTestResults (observations , specimens , diagnosticReport );
79+
80+ final List <Observation > finalObservations = observations ;
81+
7782 String mappedSpecimens = specimens .stream ()
78- .map (specimen -> specimenMapper .mapSpecimenToCompoundStatement (specimen , observations , diagnosticReport ))
83+ .map (specimen -> specimenMapper .mapSpecimenToCompoundStatement (specimen , finalObservations , diagnosticReport ))
7984 .collect (Collectors .joining ());
8085
8186 String reportLevelNarrativeStatements = prepareReportLevelNarrativeStatements (diagnosticReport , observations );
@@ -109,39 +114,62 @@ private String fetchExtensionId(List<Identifier> identifiers) {
109114 .orElse (StringUtils .EMPTY );
110115 }
111116
112- private List <Specimen > fetchSpecimens (DiagnosticReport diagnosticReport ) {
117+ private List <Specimen > fetchSpecimens (DiagnosticReport diagnosticReport , List < Observation > observations ) {
113118
114- //if there are any orphan observations, add a dummy specimen to each of them
119+ // If there are any orphan observations, add a dummy specimen to each of them
115120
116- if (!diagnosticReport .hasSpecimen ()) {
117- return Collections .singletonList (generateDefaultSpecimen (diagnosticReport ));
118- }
121+ List <Specimen > specimens = new ArrayList <>();
119122
120- fixOrphanedTestResults (diagnosticReport );
123+ if (hasOrphanedTestResults (observations )) {
124+ specimens .add (generateDefaultSpecimen (diagnosticReport ));
125+ }
121126
122127 InputBundle inputBundleHolder = messageContext .getInputBundleHolder ();
123- return diagnosticReport .getSpecimen ()
124- .stream ()
125- .map (specimenReference -> inputBundleHolder .getResource (specimenReference .getReferenceElement ()))
126- .flatMap (Optional ::stream )
127- .map (Specimen .class ::cast )
128- .collect (Collectors .toList ());
128+ List <Specimen > preExistingSpecimens = diagnosticReport .getSpecimen ()
129+ .stream ()
130+ .map (specimenReference -> inputBundleHolder .getResource (specimenReference .getReferenceElement ()))
131+ .flatMap (Optional ::stream )
132+ .map (Specimen .class ::cast )
133+ .collect (Collectors .toList ());
134+
135+ specimens .addAll (preExistingSpecimens );
136+
137+ return specimens ;
138+
129139 }
130140
131- private void fixOrphanedTestResults (DiagnosticReport diagnosticReport ) {
141+ private boolean hasOrphanedTestResults (List <Observation > observations ) {
142+ for (Observation observation : observations ) {
143+ if (!observation .hasSpecimen ()){
144+ return true ;
145+ }
146+ }
147+
148+ return false ;
149+ }
132150
151+ private List <Observation > fixOrphanedTestResults (List <Observation > observations , List <Specimen > specimens , DiagnosticReport diagnosticReport ) {
133152
134- if (diagnosticReport .hasResult ()){
135- List <Reference > results = diagnosticReport .getResult ();
136- List <Reference > specimens = diagnosticReport .getSpecimen ();
137- for (Reference specimen : specimens ){
153+ Specimen dummySpecimen = new Specimen ();
138154
155+ for (Specimen specimen : specimens ) {
156+ if (specimen .getId ().contains (DUMMY_SPECIMEN_ID_PREFIX )){
157+ dummySpecimen = specimen ;
158+ break ;
139159 }
140- for (Reference result : results ) {
141- //
142- //check each test result one by one, and if it doesn't have a dummy assigned to it, assign it.
160+ }
161+
162+ for (Observation observation : observations ) {
163+ if (!observation .hasSpecimen ()){
164+ Reference dummySpecimenReference = new Reference ();
165+ dummySpecimenReference .setReference (dummySpecimen .getId ());
166+ dummySpecimenReference .setResource (dummySpecimen );
167+
168+ observation .setSpecimen (dummySpecimenReference );
143169 }
144170 }
171+
172+ return observations ;
145173 }
146174
147175 private Specimen generateDefaultSpecimen (DiagnosticReport diagnosticReport ) {
@@ -156,10 +184,6 @@ private Specimen generateDefaultSpecimen(DiagnosticReport diagnosticReport) {
156184 }
157185
158186 private List <Observation > fetchObservations (DiagnosticReport diagnosticReport ) {
159- if (!diagnosticReport .hasResult ()) {
160- return Collections .singletonList (generateDefaultObservation (diagnosticReport ));
161- }
162-
163187 InputBundle inputBundleHolder = messageContext .getInputBundleHolder ();
164188 return diagnosticReport .getResult ().stream ()
165189 .map (Reference ::getReferenceElement )
0 commit comments