emr_ohsp_interface 2.2.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- require "emr_ohsp_interface/version"
1
+ require 'emr_ohsp_interface/version'
2
2
 
3
3
  module EmrOhspInterface
4
4
  module EmrOhspInterfaceService
@@ -9,7 +9,7 @@ module EmrOhspInterface
9
9
  include EmrOhspInterface::Utils
10
10
 
11
11
  def settings
12
- file = File.read(Rails.root.join("db","idsr_metadata","idsr_ohsp_settings.json"))
12
+ file = File.read(Rails.root.join('db', 'idsr_metadata', 'idsr_ohsp_settings.json'))
13
13
  config = JSON.parse(file)
14
14
  end
15
15
 
@@ -18,96 +18,95 @@ module EmrOhspInterface
18
18
  end
19
19
 
20
20
  def get_ohsp_facility_id
21
- file = File.open(Rails.root.join("db","idsr_metadata","emr_ohsp_facility_map.csv"))
22
- data = CSV.parse(file,headers: true)
21
+ file = File.open(Rails.root.join('db', 'idsr_metadata', 'emr_ohsp_facility_map.csv'))
22
+ data = CSV.parse(file, headers: true)
23
23
  emr_facility_id = Location.current_health_center.id
24
- facility = data.select{|row| row["EMR_Facility_ID"].to_i == emr_facility_id}
25
- ohsp_id = facility[0]["OrgUnit ID"]
24
+ facility = data.select { |row| row['EMR_Facility_ID'].to_i == emr_facility_id }
25
+ ohsp_id = facility[0]['OrgUnit ID']
26
26
  end
27
27
 
28
- def get_ohsp_de_ids(de,type)
29
- #this method returns an array ohsp report line ids
28
+ def get_ohsp_de_ids(de, type)
29
+ # this method returns an array ohsp report line ids
30
30
  result = []
31
- #["waoQ016uOz1", "r1AT49VBKqg", "FPN4D0s6K3m", "zE8k2BtValu"]
31
+ # ["waoQ016uOz1", "r1AT49VBKqg", "FPN4D0s6K3m", "zE8k2BtValu"]
32
32
  # ds, de_id , <5yrs , >=5yrs
33
33
  puts de
34
- if type == "weekly"
35
- file = File.open(Rails.root.join("db","idsr_metadata","idsr_weekly_ohsp_ids.csv"))
34
+ if type == 'weekly'
35
+ file = File.open(Rails.root.join('db', 'idsr_metadata', 'idsr_weekly_ohsp_ids.csv'))
36
36
  else
37
- file = File.open(Rails.root.join("db","idsr_metadata","idsr_monthly_ohsp_ids.csv"))
37
+ file = File.open(Rails.root.join('db', 'idsr_metadata', 'idsr_monthly_ohsp_ids.csv'))
38
38
  end
39
- data = CSV.parse(file,headers: true)
40
- row = data.select{|row| row["Data Element Name"].strip.downcase.eql?(de.downcase.strip)}
41
- ohsp_ds_id = row[0]["Data Set ID"]
39
+ data = CSV.parse(file, headers: true)
40
+ row = data.select { |row| row['Data Element Name'].strip.downcase.eql?(de.downcase.strip) }
41
+ ohsp_ds_id = row[0]['Data Set ID']
42
42
  result << ohsp_ds_id
43
- ohsp_de_id = row[0]["UID"]
43
+ ohsp_de_id = row[0]['UID']
44
44
  result << ohsp_de_id
45
- option1 = row[0]["<5Yrs"]
45
+ option1 = row[0]['<5Yrs']
46
46
  result << option1
47
- option2 = row[0][">=5Yrs"]
47
+ option2 = row[0]['>=5Yrs']
48
48
  result << option2
49
49
 
50
50
  return result
51
51
  end
52
52
 
53
53
  def get_data_set_id(type)
54
- if type == "weekly"
55
- file = File.open(Rails.root.join("db","idsr_metadata","idsr_weekly_ohsp_ids.csv"))
54
+ if type == 'weekly'
55
+ file = File.open(Rails.root.join('db', 'idsr_metadata', 'idsr_weekly_ohsp_ids.csv'))
56
56
  else
57
- file = File.open(Rails.root.join("db","idsr_metadata","idsr_monthly_ohsp_ids.csv"))
57
+ file = File.open(Rails.root.join('db', 'idsr_metadata', 'idsr_monthly_ohsp_ids.csv'))
58
58
  end
59
- data = CSV.parse(file,headers: true)
60
- data_set_id = data.first["Data Set ID"]
59
+ data = CSV.parse(file, headers: true)
60
+ data_set_id = data.first['Data Set ID']
61
61
  end
62
62
 
63
- def generate_weekly_idsr_report(request=nil,start_date=nil,end_date=nil)
63
+ def generate_weekly_idsr_report(request=nil, start_date=nil, end_date=nil)
64
64
 
65
- diag_map = settings["weekly_idsr_map"]
65
+ diag_map = settings['weekly_idsr_map']
66
+ site_id = Location.current.location_id
66
67
 
67
68
  epi_week = weeks_generator.last.first.strip
68
- start_date = weeks_generator.last.last.split("to")[0].strip if start_date.nil?
69
- end_date = weeks_generator.last.last.split("to")[1].strip if end_date.nil?
69
+ start_date = weeks_generator.last.last.split('to')[0].strip if start_date.nil?
70
+ end_date = weeks_generator.last.last.split('to')[1].strip if end_date.nil?
70
71
 
71
- #pull the data
72
+ # pull the data
72
73
  type = EncounterType.find_by_name 'Outpatient diagnosis'
73
74
  collection = {}
74
75
 
75
- diag_map.each do |key,value|
76
- options = {"<5yrs"=>nil,">=5yrs"=>nil}
77
- concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
76
+ diag_map.each do |key, value|
77
+ options = {'<5yrs'=>nil, '>=5yrs'=>nil}
78
+ concept_ids = ConceptName.where(name: value).collect { |cn| cn.concept_id }
78
79
 
79
80
  data = Encounter.where('encounter_datetime BETWEEN ? AND ?
80
81
  AND encounter_type = ? AND value_coded IN (?)
81
- AND concept_id IN(6543, 6542)',
82
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
83
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
84
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
85
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
86
- select('encounter.encounter_type, obs.value_coded, p.*')
87
-
88
- #under_five
89
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
90
- collect{|record| record.person_id}
91
- options["<5yrs"] = under_five
92
- #above 5 years
93
- over_five = data.select{|record| calculate_age(record["birthdate"]) >=5 }.\
94
- collect{|record| record.person_id}
95
-
96
- options[">=5yrs"] = over_five
82
+ AND concept_id IN(6543, 6542) AND encounter.site_id = ?',
83
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
84
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), type.id, concept_ids, site_id)
85
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
86
+ INNER JOIN person p ON p.person_id = encounter.patient_id')
87
+ .select('encounter.encounter_type, obs.value_coded, p.*')
88
+
89
+ # under_five
90
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }
91
+ .collect { |record| record.person_id }
92
+ options['<5yrs'] = under_five
93
+ # above 5 years
94
+ over_five = data.select { |record| calculate_age(record['birthdate']) >=5 }
95
+ .collect { |record| record.person_id }
96
+
97
+ options['>=5yrs'] = over_five
97
98
 
98
99
  collection[key] = options
99
100
  end
100
- if request == nil
101
- response = send_data(collection,"weekly")
102
- end
101
+ response = send_data(collection, 'weekly') if request == nil
103
102
 
104
103
  return collection
105
104
  end
106
105
 
107
- def generate_quarterly_idsr_report(request=nil,start_date=nil,end_date=nil)
106
+ def generate_quarterly_idsr_report(request=nil, start_date=nil, end_date=nil)
108
107
  epi_month = quarters_generator.first.first.strip
109
- start_date = quarters_generator.first.last[1].split("to").first.strip if start_date.nil?
110
- end_date = quarters_generator.first.last[1].split("to").last.strip if end_date.nil?
108
+ start_date = quarters_generator.first.last[1].split('to').first.strip if start_date.nil?
109
+ end_date = quarters_generator.first.last[1].split('to').last.strip if end_date.nil?
111
110
  indicators = [
112
111
  'Diabetes Mellitus',
113
112
  'Cervical Cancer',
@@ -123,11 +122,11 @@ module EmrOhspInterface
123
122
  'Psychosis'
124
123
  ]
125
124
 
126
- diagnosis_concepts = ['Primary Diagnosis','Secondary Diagnosis']
127
- encounters = ['OUTPATIENT DIAGNOSIS','ADMISSION DIAGNOSIS']
125
+ diagnosis_concepts = ['Primary Diagnosis', 'Secondary Diagnosis']
126
+ encounters = ['OUTPATIENT DIAGNOSIS', 'ADMISSION DIAGNOSIS']
128
127
 
129
128
  report_struct = indicators.each_with_object({}) do |indicator, report|
130
- report[indicator.downcase] = ['<5 yrs','>=5 yrs'].each_with_object({}) do |group, sub_report|
129
+ report[indicator] = ['<5 yrs', '>=5 yrs'].each_with_object({}) do |group, sub_report|
131
130
  sub_report[group] = {
132
131
  outpatient_cases: [],
133
132
  inpatient_cases: [],
@@ -138,6 +137,14 @@ module EmrOhspInterface
138
137
  end
139
138
  end
140
139
 
140
+ admitted_patient_died = proc do |patient|
141
+ visit_type = patient['visit_type']
142
+ dead = patient['dead']
143
+
144
+ visit_type == 'ADMISSION DIAGNOSIS' && dead
145
+ end
146
+
147
+
141
148
  diagonised = ActiveRecord::Base.connection.select_all <<~SQL
142
149
  SELECT
143
150
  e.patient_id,
@@ -159,358 +166,315 @@ module EmrOhspInterface
159
166
  AND DATE(e.encounter_datetime) < '#{end_date}'
160
167
  AND obs.concept_id IN (#{ConceptName.where(name: diagnosis_concepts).pluck(:concept_id).join(',')})
161
168
  AND obs.value_coded IN (#{ConceptName.where(name: indicators).pluck(:concept_id).join(',')})
169
+ AND e.site_id = #{Location.current.location_id}
162
170
  GROUP BY
163
- p.person_id, obs.concept_id
171
+ p.person_id
164
172
  SQL
165
173
 
166
174
  malaria_tests = lab_results(test_types: ['Malaria Screening'], start_date: start_date, end_date: end_date)
167
175
 
168
- tested_patient_ids = malaria_tests.map{|patient| patient['patient_id']}
176
+ tested_patient_ids = malaria_tests.map { |patient| patient['patient_id'] }
169
177
 
170
- diagonised.each do |patient|
171
- diagnosis = patient['diagnosis']&.downcase
172
- visit_type = patient['visit_type']
178
+ tested_positive = lambda do |patient|
173
179
  patient_id = patient['patient_id']
174
- birthdate = patient['birthdate']
175
-
176
- five_plus = '>=5 yrs'
177
- less_than_5 = '<5 yrs'
178
-
179
- age_group = birthdate > 5.years.ago ? less_than_5 : five_plus
180
+ return false unless tested_patient_ids.include?(patient_id)
180
181
 
181
- report_struct[diagnosis][age_group][:outpatient_cases] << patient_id if visit_type == 'OUTPATIENT DIAGNOSIS'
182
- report_struct[diagnosis][age_group][:inpatient_cases] << patient_id if visit_type == 'ADMISSION DIAGNOSIS'
183
- report_struct[diagnosis][age_group][:tested_malaria] << patient_id if tested_patient_ids.include?(patient_id)
184
- report_struct[diagnosis][age_group][:tested_positive_malaria] << patient_id if tested_positive(tested_patient_ids, patient)
185
- report_struct[diagnosis][age_group][:inpatient_cases_death] << patient_id if admitted_patient_died(patient)
182
+ results = malaria_tests.find { |test| test['patient_id'] == patient_id }['results']
183
+ ['positive', 'parasites seen'].include?(results)
186
184
  end
187
-
188
- report_struct
189
-
190
- end
191
-
192
- def tested_positive(ids, patient)
193
- patient_id = patient['patient_id']
194
- return false unless ids.include?(patient_id)
185
+ diagonised.each do |patient|
186
+ diagnosis = patient['diagnosis'].titleize
187
+ visit_type = patient['visit_type']
188
+ patient_id = patient['patient_id']
189
+ birthdate = patient['birthdate']
195
190
 
196
- results = malaria_tests.find{|test| test['patient_id'] == patient_id}['results']
197
- ['positive', 'parasites seen'].include?(results)
198
- end
199
-
200
- def admitted_patient_died(patient)
201
- visit_type = patient['visit_type']
202
- dead = patient['dead']
191
+ five_plus = '>=5 yrs'
192
+ less_than_5 = '<5 yrs'
203
193
 
204
- visit_type == 'ADMISSION DIAGNOSIS' && dead
194
+ age_group = birthdate > 5.years.ago ? less_than_5 : five_plus
195
+
196
+ report_struct[diagnosis][age_group][:outpatient_cases] << patient_id if visit_type == 'OUTPATIENT DIAGNOSIS'
197
+ report_struct[diagnosis][age_group][:inpatient_cases] << patient_id if visit_type == 'ADMISSION DIAGNOSIS'
198
+ if tested_patient_ids.include?(patient_id)
199
+ report_struct[diagnosis][age_group][:tested_malaria] << patient_id
200
+ end
201
+ report_struct[diagnosis][age_group][:tested_positive_malaria] << patient_id if tested_positive.call(patient)
202
+ if admitted_patient_died.call(patient)
203
+ report_struct[diagnosis][age_group][:inpatient_cases_death] << patient_id
204
+ end
205
+ end
206
+ report_struct
205
207
  end
206
208
 
207
- #idsr monthly report
208
- def generate_monthly_idsr_report(request=nil,start_date=nil,end_date=nil)
209
- diag_map = settings["monthly_idsr_map"]
209
+ # idsr monthly report
210
+ def generate_monthly_idsr_report(request=nil, start_date=nil, end_date=nil)
211
+ diag_map = settings['monthly_idsr_map']
210
212
  epi_month = months_generator.first.first.strip
211
- start_date = months_generator.first.last[1].split("to").first.strip if start_date.nil?
212
- end_date = months_generator.first.last[1].split("to").last.strip if end_date.nil?
213
+ start_date = months_generator.first.last[1].split('to').first.strip if start_date.nil?
214
+ end_date = months_generator.first.last[1].split('to').last.strip if end_date.nil?
213
215
  type = EncounterType.find_by_name 'Outpatient diagnosis'
214
216
  collection = {}
215
217
 
216
- special_indicators = ["Malaria in Pregnancy",
217
- "HIV New Initiated on ART",
218
- "Diarrhoea In Under 5",
219
- "Malnutrition In Under 5",
220
- "Underweight Newborns < 2500g in Under 5 Cases",
221
- "Severe Pneumonia in under 5 cases"]
218
+ special_indicators = ['Malaria in Pregnancy',
219
+ 'HIV New Initiated on ART',
220
+ 'Diarrhoea In Under 5',
221
+ 'Malnutrition In Under 5',
222
+ 'Underweight Newborns < 2500g in Under 5 Cases',
223
+ 'Severe Pneumonia in under 5 cases']
222
224
 
223
- diag_map.each do |key,value|
224
- options = {"<5yrs"=>nil,">=5yrs"=>nil}
225
- concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
225
+ diag_map.each do |key, value|
226
+ options = {'<5yrs'=>nil, '>=5yrs'=>nil}
227
+ concept_ids = ConceptName.where(name: value).collect { |cn| cn.concept_id }
226
228
  if !special_indicators.include?(key)
227
229
  data = Encounter.where('encounter_datetime BETWEEN ? AND ?
228
230
  AND encounter_type = ? AND value_coded IN (?)
229
- AND concept_id IN(6543, 6542)',
230
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
231
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
232
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
233
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
234
- select('encounter.encounter_type, obs.value_coded, p.*')
235
-
236
- #under_five
237
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
238
- collect{|record| record.person_id}.uniq
239
- options["<5yrs"] = under_five
240
- #above 5 years
241
- over_five = data.select{|record| calculate_age(record["birthdate"]) >=5 }.\
242
- collect{|record| record.person_id}.uniq
243
-
244
- options[">=5yrs"] = over_five
231
+ AND concept_id IN(6543, 6542) AND encounter.site_id = ?',
232
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
233
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), type.id, concept_ids,
234
+ Location.current.location_id)
235
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
236
+ INNER JOIN person p ON p.person_id = encounter.patient_id')
237
+ .select('encounter.encounter_type, obs.value_coded, p.*')
238
+
239
+ # under_five
240
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
241
+ .collect { |record| record.person_id }.uniq
242
+ options['<5yrs'] = under_five
243
+ # above 5 years
244
+ over_five = data.select { |record| calculate_age(record['birthdate']) >=5 }\
245
+ .collect { |record| record.person_id }.uniq
246
+
247
+ options['>=5yrs'] = over_five
245
248
 
246
249
  collection[key] = options
247
250
  else
248
- if key.eql?("Malaria in Pregnancy")
251
+ if key.eql?('Malaria in Pregnancy')
249
252
  mal_patient_id = Encounter.where('encounter_datetime BETWEEN ? AND ?
250
253
  AND encounter_type = ? AND value_coded IN (?)
251
- AND concept_id IN(6543, 6542)',
252
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
253
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
254
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
255
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
256
- select('encounter.encounter_type, obs.value_coded, p.*')
257
-
258
- mal_patient_id= mal_patient_id.collect{|record| record.person_id}
259
- #find those that are pregnant
254
+ AND concept_id IN(6543, 6542) AND encounter.site_id = ?',
255
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
256
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), type.id, concept_ids,
257
+ Location.current.location_id)
258
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
259
+ INNER JOIN person p ON p.person_id = encounter.patient_id')\
260
+ .select('encounter.encounter_type, obs.value_coded, p.*')
261
+
262
+ mal_patient_id= mal_patient_id.collect { |record| record.person_id }
263
+ # find those that are pregnant
260
264
  preg = Observation.where(["concept_id = 6131 AND obs_datetime
261
265
  BETWEEN ? AND ? AND person_id IN(?)
262
266
  AND value_coded =1065",
263
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
264
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),mal_patient_id ])
267
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
268
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), mal_patient_id ])
265
269
 
266
- options[">=5yrs"] = preg.collect{|record| record.person_id} rescue 0
270
+ options['>=5yrs'] = preg.collect { |record| record.person_id } rescue 0
267
271
  collection[key] = options
268
272
  end
269
273
 
270
- if key.eql?("HIV New Initiated on ART")
271
- data = ActiveRecord::Base.connection.select_all(
274
+ if key.eql?('HIV New Initiated on ART')
275
+ data = ActiveRecord::Base.connection.select_all(
272
276
  "SELECT * FROM temp_earliest_start_date
273
277
  WHERE date_enrolled BETWEEN '#{start_date}' AND '#{end_date}'
274
278
  AND date_enrolled = earliest_start_date
275
- GROUP BY patient_id" )
279
+ AND site_id = #{Location.current.location_id}
280
+ GROUP BY patient_id" ).to_a
276
281
 
277
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
278
- collect{|record| record["patient_id"]}
282
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
283
+ .collect { |record| record['patient_id'] }
279
284
 
280
- over_five = data.select{|record| calculate_age(record["birthdate"]) >=5 }.\
281
- collect{|record| record["patient_id"]}
285
+ over_five = data.select { |record| calculate_age(record['birthdate']) >=5 }\
286
+ .collect { |record| record['patient_id'] }
282
287
 
283
- options["<5yrs"] = under_five
284
- options[">=5yrs"] = over_five
288
+ options['<5yrs'] = under_five
289
+ options['>=5yrs'] = over_five
285
290
 
286
291
  collection[key] = options
287
292
  end
288
293
 
289
- if key.eql?("Diarrhoea In Under 5")
290
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
291
- AND encounter_type = ? AND value_coded IN (?)
292
- AND concept_id IN(6543, 6542)',
293
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
294
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
295
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
296
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
297
- select('encounter.encounter_type, obs.value_coded, p.*')
298
-
299
- #under_five
300
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
301
- collect{|record| record.person_id}
302
- options["<5yrs"] = under_five
294
+ if key.eql?('Diarrhoea In Under 5')
295
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
296
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
297
+ type.id,
298
+ concept_ids)
299
+
300
+ # under_five
301
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
302
+ .collect { |record| record.person_id }
303
+ options['<5yrs'] = under_five
303
304
  collection[key] = options
304
305
  end
305
306
 
306
307
 
307
- if key.eql?("Malnutrition In Under 5")
308
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
309
- AND encounter_type = ? AND value_coded IN (?)
310
- AND concept_id IN(6543, 6542)',
311
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
312
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
313
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
314
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
315
- select('encounter.encounter_type, obs.value_coded, p.*')
316
-
317
- #under_five
318
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
319
- collect{|record| record.person_id}
320
- options["<5yrs"] = under_five
308
+ if key.eql?('Malnutrition In Under 5')
309
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
310
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
311
+ type.id,
312
+ concept_ids)
313
+
314
+ # under_five
315
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
316
+ .collect { |record| record.person_id }
317
+ options['<5yrs'] = under_five
321
318
  collection[key] = options
322
319
  end
323
320
 
324
321
 
325
- if key.eql?("Underweight Newborns < 2500g in Under 5 Cases")
326
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
327
- AND encounter_type = ? AND value_coded IN (?)
328
- AND concept_id IN(6543, 6542)',
329
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
330
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
331
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
332
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
333
- select('encounter.encounter_type, obs.value_coded, p.*')
334
-
335
- #under_five
336
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
337
- collect{|record| record.person_id}
338
- options["<5yrs"] = under_five
322
+ if key.eql?('Underweight Newborns < 2500g in Under 5 Cases')
323
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
324
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
325
+ type.id,
326
+ concept_ids)
327
+
328
+ # under_five
329
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
330
+ .collect { |record| record.person_id }
331
+ options['<5yrs'] = under_five
339
332
  collection[key] = options
340
333
  end
341
334
 
342
- if key.eql?("Severe Pneumonia in under 5 cases")
343
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
344
- AND encounter_type = ? AND value_coded IN (?)
345
- AND concept_id IN(6543, 6542)',
346
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
347
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
348
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
349
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
350
- select('encounter.encounter_type, obs.value_coded, p.*')
351
-
352
- #under_five
353
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
354
- collect{|record| record.person_id}
355
- options["<5yrs"] = under_five
335
+ if key.eql?('Severe Pneumonia in under 5 cases')
336
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
337
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
338
+ type.id,
339
+ concept_ids)
340
+
341
+ # under_five
342
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
343
+ .collect { |record| record.person_id }
344
+ options['<5yrs'] = under_five
356
345
  collection[key] = options
357
346
  end
358
347
  end
359
348
  end
360
- if request == nil
361
- response = send_data(collection,"monthly")
362
- end
349
+ response = send_data(collection, 'monthly') if request == nil
363
350
  return collection
364
351
  end
365
352
 
366
- def generate_hmis_15_report(start_date=nil,end_date=nil)
353
+ def fetch_encounter_data(start_date, end_date, type_id, concept_ids)
354
+ Encounter.where('encounter_datetime BETWEEN ? AND ?
355
+ AND encounter_type = ?
356
+ AND value_coded IN (?)
357
+ AND concept_id IN(6543, 6542)
358
+ AND encounter.site_id = ?',
359
+ start_date, end_date, type_id, concept_ids, Location.current.location_id)
360
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
361
+ INNER JOIN person p ON p.person_id = encounter.patient_id')
362
+ .select('encounter.encounter_type, obs.value_coded, p.*')
363
+ end
364
+
365
+ def generate_hmis_15_report(start_date=nil, end_date=nil)
367
366
 
368
- diag_map = settings["hmis_15_map"]
367
+ diag_map = settings['hmis_15_map']
369
368
 
370
- #pull the data
369
+ # pull the data
371
370
  type = EncounterType.find_by_name 'Outpatient diagnosis'
372
371
  collection = {}
373
372
 
374
- special_indicators = ["Malaria - new cases (under 5)",
375
- "Malaria - new cases (5 & over)",
376
- "HIV confirmed positive (15-49 years) new cases",
377
- "Diarrhoea non - bloody -new cases (under5)",
378
- "Malnutrition - new case (under 5)",
379
- "Acute respiratory infections - new cases (U5)"
380
- ]
373
+ special_indicators = ['Malaria - new cases (under 5)',
374
+ 'Malaria - new cases (5 & over)',
375
+ 'HIV confirmed positive (15-49 years) new cases',
376
+ 'Diarrhoea non - bloody -new cases (under5)',
377
+ 'Malnutrition - new case (under 5)',
378
+ 'Acute respiratory infections - new cases (U5)']
381
379
 
382
- diag_map.each do |key,value|
383
- options = {"ids"=>nil}
384
- concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
380
+ diag_map.each do |key, value|
381
+ options = {'ids'=>nil}
382
+ concept_ids = ConceptName.where(name: value).collect { |cn| cn.concept_id }
385
383
 
386
384
  if !special_indicators.include?(key)
387
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
388
- AND encounter_type = ? AND value_coded IN (?)
389
- AND concept_id IN(6543, 6542)',
390
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
391
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
392
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
393
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
394
- select('encounter.encounter_type, obs.value_coded, p.*')
395
-
396
- # #under_five
397
- # under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
398
- # collect{|record| record.person_id}
399
- # options["<5yrs"] = under_five
400
- # #above 5 years
401
- # over_five = data.select{|record| calculate_age(record["birthdate"]) >=5 }.\
402
- # collect{|record| record.person_id}
385
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
386
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
387
+ type.id,
388
+ concept_ids)
389
+
390
+ all = data.collect { |record| record.person_id }
403
391
 
404
- # options[">=5yrs"] = over_five
405
392
 
406
- all = data.collect{|record| record.person_id}
407
-
408
-
409
- options["ids"] = all
393
+ options['ids'] = all
410
394
 
411
395
  collection[key] = options
412
396
  else
413
- if key.eql?("Malaria - new cases (under 5)")
414
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
415
- AND encounter_type = ? AND value_coded IN (?)
416
- AND concept_id IN(6543, 6542)',
417
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
418
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
419
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
420
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
421
- select('encounter.encounter_type, obs.value_coded, p.*')
397
+ if key.eql?('Malaria - new cases (under 5)')
398
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
399
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
400
+ type.id,
401
+ concept_ids)
422
402
 
423
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
424
- collect{|record| record["person_id"]}
403
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
404
+ .collect { |record| record['person_id'] }
425
405
 
426
- options["ids"] = under_five
406
+ options['ids'] = under_five
427
407
 
428
408
  collection[key] = options
429
409
  end
430
410
 
431
- if key.eql?("Malaria - new cases (5 & over)")
432
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
433
- AND encounter_type = ? AND value_coded IN (?)
434
- AND concept_id IN(6543, 6542)',
435
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
436
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
437
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
438
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
439
- select('encounter.encounter_type, obs.value_coded, p.*')
411
+ if key.eql?('Malaria - new cases (5 & over)')
412
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
413
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
414
+ type.id,
415
+ concept_ids)
440
416
 
441
- over_and_five = data.select{|record| calculate_age(record["birthdate"]) >= 5 }.\
442
- collect{|record| record["person_id"]}
417
+ over_and_five = data.select { |record| calculate_age(record['birthdate']) >= 5 }\
418
+ .collect { |record| record['person_id'] }
443
419
 
444
- options["ids"] = over_and_five
420
+ options['ids'] = over_and_five
445
421
 
446
422
  collection[key] = options
447
423
  end
448
424
 
449
- if key.eql?("HIV confirmed positive (15-49 years) new cases")
450
- data = ActiveRecord::Base.connection.select_all(
425
+ if key.eql?('HIV confirmed positive (15-49 years) new cases')
426
+ data = ActiveRecord::Base.connection.select_all(
451
427
  "SELECT * FROM temp_earliest_start_date
452
428
  WHERE date_enrolled BETWEEN '#{start_date}' AND '#{end_date}'
453
429
  AND date_enrolled = earliest_start_date
454
- GROUP BY patient_id" )
430
+ AND site_id = #{Location.current.location_id}
431
+ GROUP BY patient_id" ).to_a
455
432
 
456
- over_and_15_49 = data.select{|record| calculate_age(record["birthdate"]) >= 15 && calculate_age(record["birthdate"]) <=49 }.\
457
- collect{|record| record["patient_id"]}
433
+ over_and_15_49 = data.select { |record| calculate_age(record['birthdate']) >= 15 && calculate_age(record['birthdate']) <=49 }\
434
+ .collect { |record| record['patient_id'] }
458
435
 
459
- options["ids"] = over_and_15_49
436
+ options['ids'] = over_and_15_49
460
437
 
461
438
  collection[key] = options
462
439
  end
463
440
 
464
- if key.eql?("Diarrhoea non - bloody -new cases (under5)")
465
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
466
- AND encounter_type = ? AND value_coded IN (?)
467
- AND concept_id IN(6543, 6542)',
468
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
469
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
470
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
471
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
472
- select('encounter.encounter_type, obs.value_coded, p.*')
441
+ if key.eql?('Diarrhoea non - bloody -new cases (under5)')
442
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
443
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
444
+ type.id,
445
+ concept_ids)
473
446
 
474
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
475
- collect{|record| record["person_id"]}
447
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
448
+ .collect { |record| record['person_id'] }
476
449
 
477
- options["ids"] = under_five
450
+ options['ids'] = under_five
478
451
 
479
452
  collection[key] = options
480
453
  end
481
454
 
482
- if key.eql?("Malnutrition - new case (under 5)")
483
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
484
- AND encounter_type = ? AND value_coded IN (?)
485
- AND concept_id IN(6543, 6542)',
486
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
487
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
488
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
489
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
490
- select('encounter.encounter_type, obs.value_coded, p.*')
455
+ if key.eql?('Malnutrition - new case (under 5)')
456
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
457
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
458
+ type.id,
459
+ concept_ids)
491
460
 
492
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
493
- collect{|record| record["person_id"]}
461
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
462
+ .collect { |record| record['person_id'] }
494
463
 
495
- options["ids"] = under_five
464
+ options['ids'] = under_five
496
465
 
497
466
  collection[key] = options
498
467
  end
499
468
 
500
- if key.eql?("Acute respiratory infections - new cases (U5)")
501
- data = Encounter.where('encounter_datetime BETWEEN ? AND ?
502
- AND encounter_type = ? AND value_coded IN (?)
503
- AND concept_id IN(6543, 6542)',
504
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
505
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
506
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
507
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
508
- select('encounter.encounter_type, obs.value_coded, p.*')
509
-
510
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
511
- collect{|record| record["person_id"]}
469
+ if key.eql?('Acute respiratory infections - new cases (U5)')
470
+ data = fetch_encounter_data(start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
471
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'),
472
+ type.id,
473
+ concept_ids)
474
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
475
+ .collect { |record| record['person_id'] }
512
476
 
513
- options["ids"] = under_five
477
+ options['ids'] = under_five
514
478
 
515
479
  collection[key] = options
516
480
  end
@@ -521,96 +485,96 @@ module EmrOhspInterface
521
485
  end
522
486
 
523
487
  def disaggregate(disaggregate_key, concept_ids, start_date, end_date, type)
524
- options = {"ids"=>nil}
488
+ options = {'ids'=>nil}
525
489
  data = Encounter.where('encounter_datetime BETWEEN ? AND ?
526
490
  AND encounter_type = ? AND value_coded IN (?)
527
491
  AND concept_id IN(6543, 6542)',
528
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
529
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
530
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
531
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
532
- select('encounter.encounter_type, obs.value_coded, p.*')
533
-
534
- if disaggregate_key == "less"
535
- options["ids"] = data.select{|record| calculate_age(record["birthdate"]) < 5 }.\
536
- collect{|record| record["person_id"]}
492
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
493
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), type.id, concept_ids)\
494
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
495
+ INNER JOIN person p ON p.person_id = encounter.patient_id')\
496
+ .select('encounter.encounter_type, obs.value_coded, p.*')
497
+
498
+ if disaggregate_key == 'less'
499
+ options['ids'] = data.select { |record| calculate_age(record['birthdate']) < 5 }\
500
+ .collect { |record| record['person_id'] }
537
501
  else
538
- if disaggregate_key == "greater"
539
- options["ids"] = data.select{|record| calculate_age(record["birthdate"]) >= 5 }.\
540
- collect{|record| record["person_id"]}
502
+ if disaggregate_key == 'greater'
503
+ options['ids'] = data.select { |record| calculate_age(record['birthdate']) >= 5 }\
504
+ .collect { |record| record['person_id'] }
541
505
  end
542
506
  end
543
507
 
544
508
  options
545
509
  end
546
510
 
547
- def generate_hmis_17_report(start_date=nil,end_date=nil)
511
+ def generate_hmis_17_report(start_date=nil, end_date=nil)
548
512
 
549
- diag_map = settings["hmis_17_map"]
513
+ diag_map = settings['hmis_17_map']
550
514
 
551
- #pull the data
515
+ # pull the data
552
516
  type = EncounterType.find_by_name 'Outpatient diagnosis'
553
517
  collection = {}
554
518
 
555
519
  special_indicators = [
556
- "Referals from other institutions",
557
- "OPD total attendance",
558
- "Referal to other institutions",
559
- "Malaria 5 years and older - new",
560
- "HIV/AIDS - new"
520
+ 'Referals from other institutions',
521
+ 'OPD total attendance',
522
+ 'Referal to other institutions',
523
+ 'Malaria 5 years and older - new',
524
+ 'HIV/AIDS - new'
561
525
  ]
562
526
 
563
527
  special_under_five_indicators = [
564
- "Measles under five years - new",
565
- "Pneumonia under 5 years- new",
566
- "Dysentery under 5 years - new",
567
- "Diarrhoea non - bloody -new cases (under5)",
568
- "Malaria under 5 years - new"
528
+ 'Measles under five years - new',
529
+ 'Pneumonia under 5 years- new',
530
+ 'Dysentery under 5 years - new',
531
+ 'Diarrhoea non - bloody -new cases (under5)',
532
+ 'Malaria under 5 years - new'
569
533
  ]
570
534
 
571
- diag_map.each do |key,value|
572
- options = {"ids"=>nil}
573
- concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
535
+ diag_map.each do |key, value|
536
+ options = {'ids'=>nil}
537
+ concept_ids = ConceptName.where(name: value).collect { |cn| cn.concept_id }
574
538
 
575
539
  if !special_indicators.include?(key) && !special_under_five_indicators.include?(key)
576
540
  data = Encounter.where('encounter_datetime BETWEEN ? AND ?
577
541
  AND encounter_type = ? AND value_coded IN (?)
578
542
  AND concept_id IN(6543, 6542)',
579
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
580
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
581
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
582
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
583
- select('encounter.encounter_type, obs.value_coded, p.*')
543
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
544
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), type.id, concept_ids)\
545
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
546
+ INNER JOIN person p ON p.person_id = encounter.patient_id')\
547
+ .select('encounter.encounter_type, obs.value_coded, p.*')
584
548
 
585
- all = data.collect{|record| record.person_id}
549
+ all = data.collect { |record| record.person_id }
586
550
 
587
551
 
588
- options["ids"] = all
552
+ options['ids'] = all
589
553
 
590
554
  collection[key] = options
591
555
  else
592
- if key.eql?("Referals from other institutions")
556
+ if key.eql?('Referals from other institutions')
593
557
  _type = EncounterType.find_by_name 'PATIENT REGISTRATION'
594
558
  visit_type = ConceptName.find_by_name 'Type of visit'
595
559
 
596
560
  data = Encounter.where('encounter_datetime BETWEEN ? AND ?
597
561
  AND encounter_type = ? AND value_coded IS NOT NULL
598
562
  AND obs.concept_id = ?', start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
599
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),_type.id, visit_type.concept_id).\
600
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
563
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), _type.id, visit_type.concept_id)\
564
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
601
565
  INNER JOIN person p ON p.person_id = encounter.patient_id
602
- INNER JOIN concept_name c ON c.concept_id = 6541').\
603
- select('encounter.encounter_type, obs.value_coded, obs.obs_datetime, p.*, c.name visit_type').\
604
- group('p.person_id, encounter.encounter_id')
566
+ INNER JOIN concept_name c ON c.concept_id = 6541')\
567
+ .select('encounter.encounter_type, obs.value_coded, obs.obs_datetime, p.*, c.name visit_type')\
568
+ .group('p.person_id, encounter.encounter_id')
605
569
 
606
- all = data.collect{|record| record.person_id}
570
+ all = data.collect { |record| record.person_id }
607
571
 
608
- options["ids"] = all
572
+ options['ids'] = all
609
573
 
610
574
  collection[key] = options
611
575
  end
612
576
 
613
- if key.eql?("OPD total attendance")
577
+ if key.eql?('OPD total attendance')
614
578
  programID = Program.find_by_name 'OPD Program'
615
579
  data = Encounter.find_by_sql(
616
580
  "SELECT patient_id, DATE_FORMAT(encounter_datetime,'%Y-%m-%d') enc_date
@@ -620,55 +584,55 @@ module EmrOhspInterface
620
584
  AND '" + end_date.to_date.strftime('%Y-%m-%d 23:59:59') + "'
621
585
  AND program_id ='" + programID.program_id.to_s + "'
622
586
  GROUP BY enc_date"
623
- ).map{|e| e. patient_id}
587
+ ).map { |e| e. patient_id }
624
588
 
625
- options["ids"] = data
589
+ options['ids'] = data
626
590
  collection[key] = options
627
591
  end
628
592
 
629
- if key.eql?("Referal to other institutions")
593
+ if key.eql?('Referal to other institutions')
630
594
  data = Observation.where("obs_datetime BETWEEN ? AND ?
631
- AND concept_id = ?",start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
632
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),'7414').\
633
- joins('LEFT JOIN location l ON l.location_id = obs.value_text').\
634
- select('obs.person_id').order('obs_datetime DESC')
635
- all = data.collect{|record| record.person_id}
636
- options["ids"] = all
595
+ AND concept_id = ?", start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
596
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), '7414')\
597
+ .joins('LEFT JOIN location l ON l.location_id = obs.value_text')\
598
+ .select('obs.person_id').order('obs_datetime DESC')
599
+ all = data.collect { |record| record.person_id }
600
+ options['ids'] = all
637
601
  collection[key] = options
638
602
  end
639
603
 
640
- if key.eql?("HIV/AIDS - new")
641
- data = ActiveRecord::Base.connection.select_all(
604
+ if key.eql?('HIV/AIDS - new')
605
+ data = ActiveRecord::Base.connection.select_all(
642
606
  "SELECT * FROM temp_earliest_start_date
643
607
  WHERE date_enrolled BETWEEN '#{start_date}' AND '#{end_date}'
644
608
  AND date_enrolled = earliest_start_date
645
- GROUP BY patient_id" )
646
- all = data.collect{|record| record["patient_id"]}
647
- options["ids"] = all
609
+ GROUP BY patient_id" ).to_hash
610
+ all = data.collect { |record| record['patient_id'] }
611
+ options['ids'] = all
648
612
  collection[key] = options
649
613
  end
650
614
 
651
- if key.eql?("Measles under five years - new")
652
- collection[key] = disaggregate('less',concept_ids, start_date, end_date, type)
615
+ if key.eql?('Measles under five years - new')
616
+ collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
653
617
  end
654
618
 
655
- if key.eql?("Pneumonia under 5 years- new")
619
+ if key.eql?('Pneumonia under 5 years- new')
656
620
  collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
657
621
  end
658
622
 
659
- if key.eql?("Malaria under 5 years - new")
623
+ if key.eql?('Malaria under 5 years - new')
660
624
  collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
661
625
  end
662
626
 
663
- if key.eql?("Malaria 5 years and older - new")
664
- collection[key] = disaggregate('greater',concept_ids, start_date, end_date, type)
627
+ if key.eql?('Malaria 5 years and older - new')
628
+ collection[key] = disaggregate('greater', concept_ids, start_date, end_date, type)
665
629
  end
666
630
 
667
- if key.eql?("Dysentery under 5 years - new")
631
+ if key.eql?('Dysentery under 5 years - new')
668
632
  collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
669
633
  end
670
634
 
671
- if key.eql?("Diarrhoea non - bloody -new cases (under5)")
635
+ if key.eql?('Diarrhoea non - bloody -new cases (under5)')
672
636
  collection[key] = disaggregate('less', concept_ids, start_date, end_date, type)
673
637
  end
674
638
 
@@ -679,38 +643,38 @@ module EmrOhspInterface
679
643
 
680
644
  end
681
645
 
682
- def generate_notifiable_disease_conditions_report(start_date=nil,end_date=nil)
683
- diag_map = settings["notifiable_disease_conditions"]
646
+ def generate_notifiable_disease_conditions_report(start_date=nil, end_date=nil)
647
+ diag_map = settings['notifiable_disease_conditions']
684
648
 
685
- start_date = Date.today.strftime("%Y-%m-%d") if start_date.nil?
686
- end_date = Date.today.strftime("%Y-%m-%d") if end_date.nil?
649
+ start_date = Date.today.strftime('%Y-%m-%d') if start_date.nil?
650
+ end_date = Date.today.strftime('%Y-%m-%d') if end_date.nil?
687
651
 
688
652
  type = EncounterType.find_by_name 'Outpatient diagnosis'
689
653
  collection = {}
690
654
  concept_name_for_sms_portal = {}
691
655
 
692
- diag_map.each do |key,value|
693
- options = {"<5yrs"=>nil,">=5yrs"=>nil}
694
- concept_ids = ConceptName.where(name: value).collect{|cn| cn.concept_id}
656
+ diag_map.each do |key, value|
657
+ options = {'<5yrs'=>nil, '>=5yrs'=>nil}
658
+ concept_ids = ConceptName.where(name: value).collect { |cn| cn.concept_id }
695
659
 
696
660
  data = Encounter.where('encounter_datetime BETWEEN ? AND ?
697
661
  AND encounter_type = ? AND value_coded IN (?)
698
662
  AND concept_id IN(6543, 6542)',
699
- start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
700
- end_date.to_date.strftime('%Y-%m-%d 23:59:59'),type.id,concept_ids).\
701
- joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
702
- INNER JOIN person p ON p.person_id = encounter.patient_id').\
703
- select('encounter.encounter_type, obs.value_coded, p.*')
704
-
705
- #under_five
706
- under_five = data.select{|record| calculate_age(record["birthdate"]) < 5}.\
707
- collect{|record| record.person_id}
708
- options["<5yrs"] = under_five
709
- #above 5 years
710
- over_five = data.select{|record| calculate_age(record["birthdate"]) >=5 }.\
711
- collect{|record| record.person_id}
712
-
713
- options[">=5yrs"] = over_five
663
+ start_date.to_date.strftime('%Y-%m-%d 00:00:00'),
664
+ end_date.to_date.strftime('%Y-%m-%d 23:59:59'), type.id, concept_ids)\
665
+ .joins('INNER JOIN obs ON obs.encounter_id = encounter.encounter_id
666
+ INNER JOIN person p ON p.person_id = encounter.patient_id')\
667
+ .select('encounter.encounter_type, obs.value_coded, p.*')
668
+
669
+ # under_five
670
+ under_five = data.select { |record| calculate_age(record['birthdate']) < 5 }\
671
+ .collect { |record| record.person_id }
672
+ options['<5yrs'] = under_five
673
+ # above 5 years
674
+ over_five = data.select { |record| calculate_age(record['birthdate']) >=5 }\
675
+ .collect { |record| record.person_id }
676
+
677
+ options['>=5yrs'] = over_five
714
678
 
715
679
  collection[key] = options
716
680
 
@@ -727,9 +691,9 @@ module EmrOhspInterface
727
691
  curr_date = Date.today
728
692
  while count < 13 do
729
693
  curr_date = curr_date - 1.month
730
- months[curr_date.strftime("%Y%m")] = [curr_date.strftime("%B-%Y"),\
731
- (curr_date.beginning_of_month.to_s+" to " + curr_date.end_of_month.to_s)]
732
- count += 1
694
+ months[curr_date.strftime('%Y%m')] = [curr_date.strftime('%B-%Y'),\
695
+ (curr_date.beginning_of_month.to_s+' to ' + curr_date.end_of_month.to_s)]
696
+ count += 1
733
697
  end
734
698
  return months.to_a
735
699
  end
@@ -744,7 +708,7 @@ module EmrOhspInterface
744
708
  init_quarter = Date.today.beginning_of_year - 2.years
745
709
 
746
710
  while init_quarter <= Date.today do
747
- quarter = init_quarter.strftime("%Y")+" Q"+to_quarter.call(init_quarter).to_s
711
+ quarter = init_quarter.strftime('%Y')+' Q'+to_quarter.call(init_quarter).to_s
748
712
  dates = "#{(init_quarter.beginning_of_quarter).to_s} to #{(init_quarter.end_of_quarter).to_s}"
749
713
  quarters[quarter] = dates
750
714
  init_quarter = init_quarter + 3.months
@@ -761,90 +725,90 @@ module EmrOhspInterface
761
725
  wk_of_first_day = first_day.cweek
762
726
 
763
727
  if wk_of_first_day > 1
764
- wk = first_day.prev_year.year.to_s+"W"+wk_of_first_day.to_s
728
+ wk = first_day.prev_year.year.to_s+'W'+wk_of_first_day.to_s
765
729
  dates = "#{(first_day-first_day.wday+1).to_s} to #{((first_day-first_day.wday+1)+6).to_s}"
766
730
  weeks[wk] = dates
767
731
  end
768
732
 
769
- #get the firt monday of the year
733
+ # get the firt monday of the year
770
734
  while !first_day.monday? do
771
735
  first_day = first_day+1
772
736
  end
773
737
  first_monday = first_day
774
- #generate week numbers and date ranges
738
+ # generate week numbers and date ranges
775
739
 
776
740
  while first_monday <= Date.today do
777
- wk = (first_monday.year).to_s+"W"+(first_monday.cweek).to_s
778
- dates = "#{first_monday.to_s} to #{(first_monday+6).to_s}"
779
- #add to the hash
741
+ wk = (first_monday.year).to_s+'W'+(first_monday.cweek).to_s
742
+ dates = "#{first_monday.to_s} to #{(first_monday+6).to_s}"
743
+ # add to the hash
780
744
  weeks[wk] = dates
781
- #step by week
745
+ # step by week
782
746
  first_monday += 7
783
747
  end
784
- #remove the last week
785
- this_wk = (Date.today.year).to_s+"W"+(Date.today.cweek).to_s
786
- weeks = weeks.delete_if{|key,value| key==this_wk}
748
+ # remove the last week
749
+ this_wk = (Date.today.year).to_s+'W'+(Date.today.cweek).to_s
750
+ weeks = weeks.delete_if { |key, value| key==this_wk }
787
751
 
788
752
  return weeks.to_a
789
753
  end
790
754
 
791
- #Age calculator
755
+ # Age calculator
792
756
  def calculate_age(dob)
793
757
  age = ((Date.today-dob.to_date).to_i)/365 rescue 0
794
758
  end
795
759
 
796
- def send_data(data,type)
760
+ def send_data(data, type)
797
761
  # method used to post data to the server
798
- #prepare payload here
762
+ # prepare payload here
799
763
  conn = server_config['ohsp']
800
764
  payload = {
801
- "dataSet" =>get_data_set_id(type),
802
- "period"=>(type.eql?("weekly") ? weeks_generator.last[0] : months_generator.first[0]),
803
- "orgUnit"=> get_ohsp_facility_id,
804
- "dataValues"=> []
765
+ 'dataSet' =>get_data_set_id(type),
766
+ 'period'=>(type.eql?('weekly') ? weeks_generator.last[0] : months_generator.first[0]),
767
+ 'orgUnit'=> get_ohsp_facility_id,
768
+ 'dataValues'=> []
805
769
  }
806
- special = ["Severe Pneumonia in under 5 cases","Malaria in Pregnancy",
807
- "Underweight Newborns < 2500g in Under 5 Cases","Diarrhoea In Under 5"]
770
+ special = ['Severe Pneumonia in under 5 cases', 'Malaria in Pregnancy',
771
+ 'Underweight Newborns < 2500g in Under 5 Cases', 'Diarrhoea In Under 5']
808
772
 
809
- data.each do |key,value|
773
+ data.each do |key, value|
810
774
  if !special.include?(key)
811
- option1 = {"dataElement"=>get_ohsp_de_ids(key,type)[1],
812
- "categoryOptionCombo"=> get_ohsp_de_ids(key,type)[2],
813
- "value"=>value["<5yrs"].size } rescue {}
775
+ option1 = {'dataElement'=>get_ohsp_de_ids(key, type)[1],
776
+ 'categoryOptionCombo'=> get_ohsp_de_ids(key, type)[2],
777
+ 'value'=>value['<5yrs'].size } rescue {}
814
778
 
815
- option2 = {"dataElement"=>get_ohsp_de_ids(key,type)[1],
816
- "categoryOptionCombo"=> get_ohsp_de_ids(key,type)[3],
817
- "value"=>value[">=5yrs"].size} rescue {}
779
+ option2 = {'dataElement'=>get_ohsp_de_ids(key, type)[1],
780
+ 'categoryOptionCombo'=> get_ohsp_de_ids(key, type)[3],
781
+ 'value'=>value['>=5yrs'].size} rescue {}
818
782
 
819
- #fill data values array
820
- payload["dataValues"] << option1
821
- payload["dataValues"] << option2
783
+ # fill data values array
784
+ payload['dataValues'] << option1
785
+ payload['dataValues'] << option2
822
786
  else
823
787
  case key
824
788
  when special[0]
825
- option1 = {"dataElement"=>get_ohsp_de_ids(key,type)[1],
826
- "categoryOptionCombo"=> get_ohsp_de_ids(key,type)[2],
827
- "value"=>value["<5yrs"].size } rescue {}
789
+ option1 = {'dataElement'=>get_ohsp_de_ids(key, type)[1],
790
+ 'categoryOptionCombo'=> get_ohsp_de_ids(key, type)[2],
791
+ 'value'=>value['<5yrs'].size } rescue {}
828
792
 
829
- payload["dataValues"] << option1
793
+ payload['dataValues'] << option1
830
794
  when special[1]
831
- option2 = {"dataElement"=>get_ohsp_de_ids(key,type)[1],
832
- "categoryOptionCombo"=> get_ohsp_de_ids(key,type)[3],
833
- "value"=>value[">=5yrs"].size } rescue {}
795
+ option2 = {'dataElement'=>get_ohsp_de_ids(key, type)[1],
796
+ 'categoryOptionCombo'=> get_ohsp_de_ids(key, type)[3],
797
+ 'value'=>value['>=5yrs'].size } rescue {}
834
798
 
835
- payload["dataValues"] << option2
799
+ payload['dataValues'] << option2
836
800
  when special[2]
837
- option1 = {"dataElement"=>get_ohsp_de_ids(key,type)[1],
838
- "categoryOptionCombo"=> get_ohsp_de_ids(key,type)[2],
839
- "value"=>value["<5yrs"].size } rescue {}
801
+ option1 = {'dataElement'=>get_ohsp_de_ids(key, type)[1],
802
+ 'categoryOptionCombo'=> get_ohsp_de_ids(key, type)[2],
803
+ 'value'=>value['<5yrs'].size } rescue {}
840
804
 
841
- payload["dataValues"] << option1
805
+ payload['dataValues'] << option1
842
806
  when special[3]
843
- option1 = {"dataElement"=>get_ohsp_de_ids(key,type)[1],
844
- "categoryOptionCombo"=> get_ohsp_de_ids(key,type)[2],
845
- "value"=>value["<5yrs"].size} rescue {}
807
+ option1 = {'dataElement'=>get_ohsp_de_ids(key, type)[1],
808
+ 'categoryOptionCombo'=> get_ohsp_de_ids(key, type)[2],
809
+ 'value'=>value['<5yrs'].size} rescue {}
846
810
 
847
- payload["dataValues"] << option1
811
+ payload['dataValues'] << option1
848
812
  end
849
813
  end
850
814
  end
@@ -854,51 +818,47 @@ module EmrOhspInterface
854
818
  puts url
855
819
  puts "pushing #{type} IDSR Reports"
856
820
  send = RestClient::Request.execute(method: :post,
857
- url: url,
858
- headers:{'Content-Type'=> 'application/json'},
859
- payload: payload.to_json,
860
- #headers: {accept: :json},
861
- user: conn["username"],
862
- password: conn["password"])
821
+ url: url,
822
+ headers:{'Content-Type'=> 'application/json'},
823
+ payload: payload.to_json,
824
+ # headers: {accept: :json},
825
+ user: conn['username'],
826
+ password: conn['password'])
863
827
 
864
828
  puts send
865
829
  end
866
830
 
867
831
  def send_data_to_sms_portal(data, concept_name_collection)
868
832
  conn2 = server_config['idsr_sms']
869
- data = data.select {|k,v| v.select {|kk,vv| vv.length > 0}.length > 0}
833
+ data = data.select { |k, v| v.select { |kk, vv| vv.length > 0 }.length > 0 }
870
834
  payload = {
871
- "email"=> conn2["username"],
872
- "password" => conn2["password"],
873
- "emr_facility_id" => Location.current_health_center.id,
874
- "emr_facility_name" => Location.current_health_center.name,
875
- "payload" => data,
876
- "concept_name_collection" => concept_name_collection
835
+ 'email'=> conn2['username'],
836
+ 'password' => conn2['password'],
837
+ 'emr_facility_id' => Location.current_health_center.id,
838
+ 'emr_facility_name' => Location.current_health_center.name,
839
+ 'payload' => data,
840
+ 'concept_name_collection' => concept_name_collection
877
841
  }
878
842
 
879
843
 
880
844
 
881
845
  begin
882
846
  response = RestClient::Request.execute(method: :post,
883
- url: conn2["url"],
884
- headers:{'Content-Type'=> 'application/json'},
885
- payload: payload.to_json
847
+ url: conn2['url'],
848
+ headers:{'Content-Type'=> 'application/json'},
849
+ payload: payload.to_json
886
850
  )
887
851
  rescue RestClient::ExceptionWithResponse => res
888
- if res.class == RestClient::Forbidden
889
- puts "error: #{res.class}"
890
- end
852
+ puts "error: #{res.class}" if res.class == RestClient::Forbidden
891
853
  end
892
854
 
893
855
  if response.class != NilClass
894
- if response.code == 200
895
- puts "success: #{response}"
896
- end
856
+ puts "success: #{response}" if response.code == 200
897
857
  end
898
858
 
899
- end
859
+ end
900
860
 
901
861
  end
902
862
  end
903
863
 
904
- end
864
+ end