3
3
import org .apache .log4j .Logger ;
4
4
import org .bahmni .module .shrclient .mapper .EncounterMapper ;
5
5
import org .bahmni .module .shrclient .util .FhirRestClient ;
6
+ import org .hl7 .fhir .instance .model .*;
6
7
import org .hl7 .fhir .instance .model .Encounter ;
8
+ import org .hl7 .fhir .instance .model .Enumeration ;
7
9
import org .ict4h .atomfeed .client .domain .Event ;
8
10
import org .ict4h .atomfeed .client .service .EventWorker ;
11
+ import org .openmrs .*;
12
+ import org .openmrs .ConceptMap ;
9
13
import org .openmrs .api .EncounterService ;
10
14
15
+ import java .util .*;
11
16
import java .util .regex .Matcher ;
12
17
import java .util .regex .Pattern ;
13
18
@@ -17,11 +22,15 @@ public class ShrEncounterCreator implements EventWorker {
17
22
private EncounterService encounterService ;
18
23
private EncounterMapper encounterMapper ;
19
24
private FhirRestClient fhirRestClient ;
25
+ private Map <String , String > severityCodes = new HashMap <String , String >();
20
26
21
27
public ShrEncounterCreator (EncounterService encounterService , EncounterMapper encounterMapper , FhirRestClient fhirRestClient ) {
22
28
this .encounterService = encounterService ;
23
29
this .encounterMapper = encounterMapper ;
24
30
this .fhirRestClient = fhirRestClient ;
31
+
32
+ severityCodes .put ("Moderate" , "6736007" );
33
+ severityCodes .put ("Severe" , "24484000" );
25
34
}
26
35
27
36
@ Override
@@ -37,14 +46,94 @@ public void process(Event event) {
37
46
Encounter encounter = encounterMapper .map (openMrsEncounter );
38
47
log .debug ("Encounter: [ " + encounter + "]" );
39
48
40
- fhirRestClient .post ("/encounter" , encounter );
49
+ Composition composition = getComposition (openMrsEncounter , encounter );
50
+ fhirRestClient .post ("/encounter" , composition );
41
51
42
52
} catch (Exception e ) {
43
53
log .error ("Error while processing patient sync event." , e );
44
54
throw new RuntimeException (e );
45
55
}
46
56
}
47
57
58
+ private List <Condition > getConditions (org .openmrs .Encounter openMrsEncounter , Encounter encounter ) {
59
+ Set <Obs > allObs = openMrsEncounter .getAllObs (true );
60
+ List <Condition > diagnoses = new ArrayList <Condition >();
61
+ for (Obs obs : allObs ) {
62
+ if (obs .getConcept ().getConceptClass ().getName ().equalsIgnoreCase ("Diagnosis" )) {
63
+ Condition condition = new Condition ();
64
+ condition .setEncounter (encounter .getIndication ());
65
+ condition .setSubject (encounter .getSubject ());
66
+ condition .setAsserter (getParticipant (encounter ));
67
+ //TODO find diagnosis status by iterating through the obs
68
+ condition .setStatus (new Enumeration <Condition .ConditionStatus >(Condition .ConditionStatus .confirmed ));
69
+ condition .setCategory (getDiagnosisCategory ());
70
+ condition .setSeverity (getDiagnosisSeverity ());
71
+ DateTime onsetDate = new DateTime ();
72
+ onsetDate .setValue (new DateAndTime (obs .getObsDatetime ()));
73
+ condition .setOnset (onsetDate );
74
+ condition .setCode (getDiagnosisCode (obs ));
75
+ diagnoses .add (condition );
76
+ }
77
+ }
78
+ return diagnoses ;
79
+ }
80
+
81
+ private CodeableConcept getDiagnosisCode (Obs obs ) {
82
+ CodeableConcept diagnosisCode = new CodeableConcept ();
83
+ Coding coding = diagnosisCode .addCoding ();
84
+ //TODO to change to reference term code
85
+ Concept obsConcept = obs .getConcept ();
86
+ coding .setCodeSimple (getReferenceCode (obsConcept ));
87
+ //TODO: put in the right URL. To be mapped
88
+ coding .setSystemSimple ("http://192.168.33.18/openmrs/ws/rest/v1/concept/" + obsConcept .getUuid ());
89
+ coding .setDisplaySimple (obsConcept .getDisplayString ());
90
+ return diagnosisCode ;
91
+ }
92
+
93
+ private String getReferenceCode (Concept obsConcept ) {
94
+ Collection <org .openmrs .ConceptMap > conceptMappings = obsConcept .getConceptMappings ();
95
+ for (ConceptMap mapping : conceptMappings ) {
96
+ return mapping .getConceptReferenceTerm ().getCode ();
97
+ }
98
+ return obsConcept .getUuid ();
99
+ }
100
+
101
+ private CodeableConcept getDiagnosisSeverity () {
102
+ CodeableConcept conditionSeverity = new CodeableConcept ();
103
+ Coding coding = conditionSeverity .addCoding ();
104
+ //TODO map from bahmni severity order
105
+ coding .setCodeSimple (severityCodes .get ("Moderate" ));
106
+ coding .setSystemSimple ("http://hl7.org/fhir/vs/condition-severity" );
107
+ coding .setDisplaySimple ("Moderate" );
108
+ return conditionSeverity ;
109
+ }
110
+
111
+ private CodeableConcept getDiagnosisCategory () {
112
+ CodeableConcept conditionCategory = new CodeableConcept ();
113
+ Coding coding = conditionCategory .addCoding ();
114
+ coding .setCodeSimple ("diagnosis" );
115
+ coding .setSystemSimple ("http://hl7.org/fhir/vs/condition-category" );
116
+ coding .setDisplaySimple ("diagnosis" );
117
+ return conditionCategory ;
118
+ }
119
+
120
+ private ResourceReference getParticipant (Encounter encounter ) {
121
+ List <Encounter .EncounterParticipantComponent > participants = encounter .getParticipant ();
122
+ if ((participants != null ) || participants .isEmpty ()) {
123
+ return participants .get (0 ).getIndividual ();
124
+ }
125
+ return null ;
126
+ }
127
+
128
+ private Composition getComposition (org .openmrs .Encounter openMrsEncounter , Encounter encounter ) {
129
+ DateAndTime encounterDateTime = new DateAndTime (openMrsEncounter .getEncounterDatetime ());
130
+ Composition composition = new Composition ().setDateSimple (encounterDateTime );
131
+ composition .setEncounter (encounter .getIndication ());
132
+ composition .setStatus (new Enumeration <Composition .CompositionStatus >(Composition .CompositionStatus .final_ ));
133
+ composition .setIdentifier (new Identifier ().setValueSimple ("Encounter - " + openMrsEncounter .getUuid ()));
134
+ return composition ;
135
+ }
136
+
48
137
Encounter populateEncounter (org .openmrs .Encounter openMrsEncounter ) {
49
138
return new Encounter ();
50
139
}
0 commit comments