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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6d9929d6c572d68a83032faf3e7bcd30beb07c2ad9a6c5936f0da9b4e54e4377
4
- data.tar.gz: a7df28d9f471cfaddecd76174698a83ee8b64172a8bc68ef91ec0751a2535ca4
3
+ metadata.gz: 145e8b4a017e7cbec4cc4ace99ca78f853f16bf5048a7043e1c8eba6b5486a54
4
+ data.tar.gz: 741d47d437d4334b0218b9dbce8cdb328df9839ee68c95a71dc285c780a96425
5
5
  SHA512:
6
- metadata.gz: e74d315683453b6853ecd523abed43953a29a8f7d34d948c11d3a382b0a3fb258c72945fecb685a34328d14ea5990127f61607723fcde62221621f0087f6f389
7
- data.tar.gz: 702c61725fc4db911ab0d51c9cf55bd2bc3414daa5720bc2dd3c3cdfd0e5e57943d4e062bd01ee73aea148f485aaacdb9b262890e3f0b16394cb6783a29ad84e
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 COUNT(*) as 'patient_identify' FROM patients; "
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 = filterpatient_number(get_patient_number) + 1
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","HIV New Initiated on ART"]
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
@@ -1,3 +1,3 @@
1
1
  module EmrOhspInterface
2
- VERSION = '0.4.0'
2
+ VERSION = '0.5.3'
3
3
  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.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: 2021-11-29 00:00:00.000000000 Z
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.0.8
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