emr_ohsp_interface 0.4.0 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/emr_ohsp_interface/emr_ohsp_interface_controller.rb +4 -0
- data/app/services/emr_ohsp_interface/emr_lims_interface_service.rb +10 -5
- data/app/services/emr_ohsp_interface/emr_ohsp_interface_service.rb +176 -1
- data/config/routes.rb +1 -0
- data/lib/emr_ohsp_interface/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 145e8b4a017e7cbec4cc4ace99ca78f853f16bf5048a7043e1c8eba6b5486a54
|
4
|
+
data.tar.gz: 741d47d437d4334b0218b9dbce8cdb328df9839ee68c95a71dc285c780a96425
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b5c9d1df00c1e00065fd95966924a4c28f130cdf9f7302ed7a7b7071288dcce42f9d1995c2e7d22307bd81749abf28879ef40a1c6f9abef4c1cb2990fe20ceb
|
7
|
+
data.tar.gz: 78e83895b4a74c5d45bc1abdd420aff1003380bc0ba474f6b4d64dfb879309ef1989113f56e178c6f6a2fd52a16549810d3a077547d2482cb46b809ecbba1377
|
@@ -14,6 +14,10 @@ class EmrOhspInterface::EmrOhspInterfaceController < ::ApplicationController
|
|
14
14
|
def generate_monthly_idsr_report
|
15
15
|
render json: service.generate_monthly_idsr_report(params[:request],params[:start_date],params[:end_date]);
|
16
16
|
end
|
17
|
+
|
18
|
+
def generate_hmis_15_report
|
19
|
+
render json: service.generate_hmis_15_report(params[:start_date],params[:end_date]);
|
20
|
+
end
|
17
21
|
|
18
22
|
def service
|
19
23
|
EmrOhspInterface::EmrOhspInterfaceService
|
@@ -17,18 +17,23 @@ module EmrOhspInterface
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def get_patient_number
|
20
|
-
query "SELECT
|
20
|
+
get_patient_id = query "SELECT id FROM iblis.patients order by id desc limit 1;"
|
21
|
+
|
22
|
+
get_patient_id.each do |x|
|
23
|
+
return patient_number = x['id']
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
|
21
28
|
end
|
22
29
|
|
23
30
|
def check_patient_number(patient_id)
|
24
|
-
patient_number = ''
|
25
31
|
get_patient_id = query "SELECT patient_number FROM patients WHERE `external_patient_number` ='#{patient_id}'; "
|
26
32
|
|
27
33
|
get_patient_id.each do |x|
|
28
|
-
patient_number = x['patient_number']
|
34
|
+
return patient_number = x['patient_number']
|
29
35
|
end
|
30
36
|
|
31
|
-
patient_number
|
32
37
|
end
|
33
38
|
|
34
39
|
def filterpatient_number(data)
|
@@ -50,7 +55,7 @@ module EmrOhspInterface
|
|
50
55
|
date = time.strftime('%Y-%m-%d %H:%M:%S')
|
51
56
|
lab_details.map do |order_params|
|
52
57
|
if patient_number.blank?
|
53
|
-
patient_number =
|
58
|
+
patient_number = get_patient_number() + 1
|
54
59
|
|
55
60
|
person_data = Person.where('person_id= ?', order_params[:patient_id])[0]
|
56
61
|
address_data = PersonAddress.where('person_id= ?', order_params[:patient_id])[0]
|
@@ -105,7 +105,12 @@ module EmrOhspInterface
|
|
105
105
|
type = EncounterType.find_by_name 'Outpatient diagnosis'
|
106
106
|
collection = {}
|
107
107
|
|
108
|
-
special_indicators = ["Malaria in Pregnancy",
|
108
|
+
special_indicators = ["Malaria in Pregnancy",
|
109
|
+
"HIV New Initiated on ART",
|
110
|
+
"Diarrhoea In Under 5",
|
111
|
+
"Malnutrition In Under 5",
|
112
|
+
"Underweight Newborns < 2500g in Under 5 Cases",
|
113
|
+
"Severe Pneumonia in under 5 cases"]
|
109
114
|
|
110
115
|
diag_map.each do |key,value|
|
111
116
|
options = {"<5yrs"=>nil,">=5yrs"=>nil}
|
@@ -172,6 +177,76 @@ module EmrOhspInterface
|
|
172
177
|
|
173
178
|
collection[key] = options
|
174
179
|
end
|
180
|
+
|
181
|
+
if key.eql?("Diarrhoea In Under 5")
|
182
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
183
|
+
AND encounter_type = ? AND value_coded IN (?)
|
184
|
+
AND concept_id IN(6543, 6542)',
|
185
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
186
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
187
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
188
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
189
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
190
|
+
|
191
|
+
#under_five
|
192
|
+
under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
|
193
|
+
collect{|record| record.person_id}
|
194
|
+
options["<5yrs"] = under_five
|
195
|
+
collection[key] = options
|
196
|
+
end
|
197
|
+
|
198
|
+
|
199
|
+
if key.eql?("Malnutrition In Under 5")
|
200
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
201
|
+
AND encounter_type = ? AND value_coded IN (?)
|
202
|
+
AND concept_id IN(6543, 6542)',
|
203
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
204
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
205
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
206
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
207
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
208
|
+
|
209
|
+
#under_five
|
210
|
+
under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
|
211
|
+
collect{|record| record.person_id}
|
212
|
+
options["<5yrs"] = under_five
|
213
|
+
collection[key] = options
|
214
|
+
end
|
215
|
+
|
216
|
+
|
217
|
+
if key.eql?("Underweight Newborns < 2500g in Under 5 Cases")
|
218
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
219
|
+
AND encounter_type = ? AND value_coded IN (?)
|
220
|
+
AND concept_id IN(6543, 6542)',
|
221
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
222
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
223
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
224
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
225
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
226
|
+
|
227
|
+
#under_five
|
228
|
+
under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
|
229
|
+
collect{|record| record.person_id}
|
230
|
+
options["<5yrs"] = under_five
|
231
|
+
collection[key] = options
|
232
|
+
end
|
233
|
+
|
234
|
+
if key.eql?("Severe Pneumonia in under 5 cases")
|
235
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
236
|
+
AND encounter_type = ? AND value_coded IN (?)
|
237
|
+
AND concept_id IN(6543, 6542)',
|
238
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
239
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
240
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
241
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
242
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
243
|
+
|
244
|
+
#under_five
|
245
|
+
under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
|
246
|
+
collect{|record| record.person_id}
|
247
|
+
options["<5yrs"] = under_five
|
248
|
+
collection[key] = options
|
249
|
+
end
|
175
250
|
end
|
176
251
|
end
|
177
252
|
if request == nil
|
@@ -180,6 +255,106 @@ module EmrOhspInterface
|
|
180
255
|
return collection
|
181
256
|
end
|
182
257
|
|
258
|
+
def generate_hmis_15_report(start_date=nil,end_date=nil)
|
259
|
+
|
260
|
+
diag_map = settings["hmis_15_map"]
|
261
|
+
|
262
|
+
#pull the data
|
263
|
+
type = EncounterType.find_by_name 'Outpatient diagnosis'
|
264
|
+
collection = {}
|
265
|
+
|
266
|
+
special_indicators = ["Malaria - new cases (under 5)",
|
267
|
+
"Malaria - new cases (5 & over)",
|
268
|
+
"HIV confirmed positive (15-49 years) new cases"
|
269
|
+
]
|
270
|
+
|
271
|
+
diag_map.each do |key,value|
|
272
|
+
options = {"ids"=>nil}
|
273
|
+
concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
|
274
|
+
|
275
|
+
if !special_indicators.include?(key)
|
276
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
277
|
+
AND encounter_type = ? AND value_coded IN (?)
|
278
|
+
AND concept_id IN(6543, 6542)',
|
279
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
280
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
281
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
282
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
283
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
284
|
+
|
285
|
+
# #under_five
|
286
|
+
# under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
|
287
|
+
# collect{|record| record.person_id}
|
288
|
+
# options["<5yrs"] = under_five
|
289
|
+
# #above 5 years
|
290
|
+
# over_five = data.select{|record| calculate_age(record["birthdate"]) >=5 }.\
|
291
|
+
# collect{|record| record.person_id}
|
292
|
+
|
293
|
+
# options[">=5yrs"] = over_five
|
294
|
+
|
295
|
+
all = data.collect{|record| record.person_id}
|
296
|
+
|
297
|
+
|
298
|
+
options["ids"] = all
|
299
|
+
|
300
|
+
collection[key] = options
|
301
|
+
else
|
302
|
+
if key.eql?("Malaria - new cases (under 5)")
|
303
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
304
|
+
AND encounter_type = ? AND value_coded IN (?)
|
305
|
+
AND concept_id IN(6543, 6542)',
|
306
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
307
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
308
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
309
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
310
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
311
|
+
|
312
|
+
under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
|
313
|
+
collect{|record| record["person_id"]}
|
314
|
+
|
315
|
+
options["ids"] = under_five
|
316
|
+
|
317
|
+
collection[key] = options
|
318
|
+
|
319
|
+
end
|
320
|
+
|
321
|
+
if key.eql?("Malaria - new cases (5 & over)")
|
322
|
+
data = Encounter.where('encounter_datetime BETWEEN ? AND ?
|
323
|
+
AND encounter_type = ? AND value_coded IN (?)
|
324
|
+
AND concept_id IN(6543, 6542)',
|
325
|
+
start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
|
326
|
+
end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
|
327
|
+
joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
|
328
|
+
INNER JOIN person p ON p.person_id = encounter.patient_id').\
|
329
|
+
select('encounter.encounter_type, obs.value_coded, p.*')
|
330
|
+
|
331
|
+
over_and_five = data.select{|record| calculate_age(record["birthdate"]) >= 5 }.\
|
332
|
+
collect{|record| record["person_id"]}
|
333
|
+
|
334
|
+
options["ids"] = over_and_five
|
335
|
+
|
336
|
+
collection[key] = options
|
337
|
+
end
|
338
|
+
|
339
|
+
if key.eql?("HIV confirmed positive (15-49 years) new cases")
|
340
|
+
data = ActiveRecord::Base.connection.select_all(
|
341
|
+
"SELECT * FROM temp_earliest_start_date
|
342
|
+
WHERE date_enrolled BETWEEN '#{start_date}' AND '#{end_date}'
|
343
|
+
AND date_enrolled = earliest_start_date
|
344
|
+
GROUP BY patient_id" ).to_hash
|
345
|
+
|
346
|
+
over_and_15_49 = data.select{|record| calculate_age(record["birthdate"]) >= 15 && calculate_age(record["birthdate"]) <=49 }.\
|
347
|
+
collect{|record| record["patient_id"]}
|
348
|
+
|
349
|
+
options["ids"] = over_and_15_49
|
350
|
+
|
351
|
+
collection[key] = options
|
352
|
+
end
|
353
|
+
end
|
354
|
+
end
|
355
|
+
collection
|
356
|
+
end
|
357
|
+
|
183
358
|
# helper menthod
|
184
359
|
def months_generator
|
185
360
|
months = Hash.new
|
data/config/routes.rb
CHANGED
@@ -5,4 +5,5 @@ EmrOhspInterface::Engine.routes.draw do
|
|
5
5
|
get '/get_months', to: 'emr_ohsp_interface#months_generator'
|
6
6
|
get '/generate_weekly_idsr_report', to: 'emr_ohsp_interface#generate_weekly_idsr_report'
|
7
7
|
get '/generate_monthly_idsr_report', to: 'emr_ohsp_interface#generate_monthly_idsr_report'
|
8
|
+
get '/generate_hmis_15_report', to: 'emr_ohsp_interface#generate_hmis_15_report'
|
8
9
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: emr_ohsp_interface
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Justin Manda and Petros Kayange
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-01-20 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -120,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
120
|
- !ruby/object:Gem::Version
|
121
121
|
version: '0'
|
122
122
|
requirements: []
|
123
|
-
rubygems_version: 3.
|
123
|
+
rubygems_version: 3.2.32
|
124
124
|
signing_key:
|
125
125
|
specification_version: 4
|
126
126
|
summary: This in a gem that facilitates interfacing of EMR, One Health Surveillance
|