emr_ohsp_interface 0.3.0 → 0.4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6f6553499e58adb8f290bfa2ff597f0c57ca58412b1b7430d2ab8d33494c89b0
4
- data.tar.gz: c603ea2729e987c6a85a091f0bd9eaf63b2671e20b9218ebac5edfb706c42ad5
3
+ metadata.gz: 6d9929d6c572d68a83032faf3e7bcd30beb07c2ad9a6c5936f0da9b4e54e4377
4
+ data.tar.gz: a7df28d9f471cfaddecd76174698a83ee8b64172a8bc68ef91ec0751a2535ca4
5
5
  SHA512:
6
- metadata.gz: 837e42141f3d58d61da5780a4693f834edfbcb40715717ffa858ee20feac78a4e762f2d2265f1b0b7f0c588222d95e2ddaf392cb06c0cdd9555c69fc43227551
7
- data.tar.gz: 3e15c6d814d1277208b96ee5084562016cad88ce995f6434c0644a42925dc7620ffec7dfc0e8db285d479b0e97670a8fc0f6f1e54cf66f537eb659e308004b11
6
+ metadata.gz: e74d315683453b6853ecd523abed43953a29a8f7d34d948c11d3a382b0a3fb258c72945fecb685a34328d14ea5990127f61607723fcde62221621f0087f6f389
7
+ data.tar.gz: 702c61725fc4db911ab0d51c9cf55bd2bc3414daa5720bc2dd3c3cdfd0e5e57943d4e062bd01ee73aea148f485aaacdb9b262890e3f0b16394cb6783a29ad84e
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class EmrOhspInterface::EmrLimsInterfaceController < ::ApplicationController
4
+ def create
5
+ # lab_details = params.require %i[lab_details]
6
+ # render json: "#{lab_details[0]['firstname']}"
7
+ # render json:
8
+ order_params_list, clinician_id = params.require %i[lab_details clinician_id]
9
+
10
+ render json: service.create_lab_order(order_params_list, clinician_id)
11
+ end
12
+
13
+ def index
14
+ render json: service.get_lims_test_results(params[:id],params[:patient_id])
15
+ end
16
+
17
+ def get_user_info()
18
+ render json: service.get_user_details(params[:id])
19
+ end
20
+
21
+ def service
22
+ EmrOhspInterface::EmrLimsInterfaceService
23
+ end
24
+ end
@@ -0,0 +1,405 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'emr_ohsp_interface/version'
4
+ module EmrOhspInterface
5
+ module EmrLimsInterfaceService
6
+ class << self
7
+ require 'csv'
8
+ require 'rest-client'
9
+
10
+ def initialize
11
+ @mysql_connection_pool = {}
12
+ end
13
+ ######################################### start creation of lab test in lims #####################################################
14
+ def settings
15
+ file = File.read(Rails.root.join('db', 'lims_metadata', 'lims_map.json'))
16
+ JSON.parse(file)
17
+ end
18
+
19
+ def get_patient_number
20
+ query "SELECT COUNT(*) as 'patient_identify' FROM patients; "
21
+ end
22
+
23
+ def check_patient_number(patient_id)
24
+ patient_number = ''
25
+ get_patient_id = query "SELECT patient_number FROM patients WHERE `external_patient_number` ='#{patient_id}'; "
26
+
27
+ get_patient_id.each do |x|
28
+ patient_number = x['patient_number']
29
+ end
30
+
31
+ patient_number
32
+ end
33
+
34
+ def filterpatient_number(data)
35
+ patient_number = 0
36
+ data.each do |x|
37
+ patient_number = x['patient_identify']
38
+ end
39
+ patient_number
40
+ end
41
+
42
+ def get_patient_dentifier(patient_id)
43
+ patient_dentifier =PatientIdentifier.where('patient_id= ? AND identifier_type = ?', patient_id,3)[0]
44
+ patient_dentifier[:identifier]
45
+ end
46
+ def create_lab_order(lab_details, clinician_id)
47
+ external_patient_number = get_patient_dentifier(lab_details[0][:patient_id])
48
+ patient_number = check_patient_number(external_patient_number)
49
+ time = Time.new
50
+ date = time.strftime('%Y-%m-%d %H:%M:%S')
51
+ lab_details.map do |order_params|
52
+ if patient_number.blank?
53
+ patient_number = filterpatient_number(get_patient_number) + 1
54
+
55
+ person_data = Person.where('person_id= ?', order_params[:patient_id])[0]
56
+ address_data = PersonAddress.where('person_id= ?', order_params[:patient_id])[0]
57
+ name_data = PersonName.where('person_id= ?', order_params[:patient_id])[0]
58
+
59
+ gender = person_data[:gender].match(/f/i) ? 1 : (person_data[:gender].match(/m/i) ? 0 : 2)
60
+ create_patient(
61
+ name_data[:given_name],
62
+ name_data[:family_name],
63
+ clinician_id[0][:requesting_clinician_id],
64
+ address_data[:address1],
65
+ gender,
66
+ person_data[:birthdate],
67
+ person_data[:birthdate_estimated],
68
+ external_patient_number,
69
+ patient_number,
70
+ date
71
+ )
72
+ end
73
+ create_visit(patient_number, date)
74
+ create_specimens(
75
+ clinician_id[0][:requesting_clinician_id],
76
+ order_params[:specimen][:name],
77
+ order_params[:accession_number]
78
+ )
79
+ specimen_id = get_specimen_id
80
+ create_unsync_orders(date, specimen_id)
81
+
82
+ create_test(specimen_id, order_params[:requesting_clinician], order_params[:tests][0][:name])
83
+ end
84
+ end
85
+
86
+ def create_patient(
87
+ firstname, surname,
88
+ user_id, address,
89
+ gender, dob,
90
+ dob_estimated, external_patient_number,
91
+ patient_number, date
92
+ )
93
+ query(
94
+ "INSERT INTO `patients` (`name`, `first_name_code`, `last_name_code`, `created_by`, `address`, `gender`, `patient_number`, `dob`, `dob_estimated`, `external_patient_number`, `created_at`, `updated_at`)
95
+ VALUES ('#{firstname} #{surname}', SOUNDEX('#{firstname}'), SOUNDEX('#{surname}'), #{user_id}, '#{address}',#{gender},'#{patient_number}', '#{dob}', '#{dob_estimated}', '#{external_patient_number}', '#{date}', '#{date}')"
96
+ )
97
+ end
98
+
99
+ def create_visit(patient_number, date)
100
+ query "INSERT INTO `visits` (`patient_id`, `visit_type`, `ward_or_location`, `created_at`, `updated_at`)
101
+ VALUES ('#{patient_number}', 'Out Patient', 'EM OPD', '#{date}', '#{date}')"
102
+ end
103
+
104
+ def create_specimens(user_id, specimen_type, tracking_number)
105
+ specimen_type_id = settings['lims_specimen_map'][specimen_type.to_s]
106
+ accession_number = new_accession_number
107
+ # prepare_next_tracking_number()
108
+ # tracking_number = create_local_tracking_number()
109
+ query(" INSERT INTO `specimens` (`specimen_type_id`, `accepted_by`, `priority`, `accession_number`, `tracking_number`)
110
+ VALUES ('#{specimen_type_id}', '#{user_id}', 'Stat', '#{accession_number}', '#{tracking_number}')")
111
+ end
112
+
113
+ def create_unsync_orders(date, specimen_id)
114
+ query(" INSERT INTO `unsync_orders` (`specimen_id`, `data_not_synced`, `data_level`, `sync_status`, `updated_by_name`, `updated_by_id`, `created_at`, `updated_at`)
115
+ VALUES ('#{specimen_id}', 'new order', 'specimen', 'not-synced', 'kBLIS Administrator', '1', '#{date}', '#{date}')")
116
+ end
117
+
118
+ def create_test(specimen_id, requested_by, test_type)
119
+ visit_id = get_visit_id
120
+ test_type_id = settings['lims_test_type_map'][test_type.to_s]
121
+ query("INSERT INTO `tests` (`visit_id`, `test_type_id`, `specimen_id`, `test_status_id`, `not_done_reasons`, `person_talked_to_for_not_done`, `created_by`, `requested_by`)
122
+ VALUES ('#{visit_id}', '#{test_type_id}', '#{specimen_id}', '2', '0', '0', 1, '#{requested_by}')")
123
+ end
124
+
125
+ def new_accession_number
126
+ # Generate the next accession number for specimen registration
127
+ @mutex = Mutex.new if @mutex.blank?
128
+ @mutex.lock
129
+ max_acc_num = 0
130
+ return_value = nil
131
+ sentinel = 99_999_999
132
+
133
+ settings = YAML.load_file("#{Rails.root}/config/application.yml")[Rails.env]
134
+ code = settings['facility_code']
135
+ year = Date.today.year.to_s[2..3]
136
+
137
+ record = get_last_accession_number
138
+
139
+ unless record.blank?
140
+ max_acc_num = record[5..20].match(/\d+/)[0].to_i # first 5 chars are for facility code and 2 digit year
141
+ end
142
+
143
+ if max_acc_num < sentinel
144
+ max_acc_num += 1
145
+ else
146
+ max_acc_num = 1
147
+ end
148
+
149
+ max_acc_num = max_acc_num.to_s.rjust(8, '0')
150
+ return_value = "#{code}#{year}#{max_acc_num}"
151
+ @mutex.unlock
152
+
153
+ return_value
154
+ end
155
+
156
+ def get_last_accession_number
157
+ data = query('SELECT * FROM specimens WHERE accession_number IS NOT NULL ORDER BY id DESC LIMIT 1')
158
+ data.each do |x|
159
+ return last_accession_number = x['accession_number']
160
+ end
161
+ end
162
+
163
+ def get_specimen_id
164
+ data = query('SELECT * FROM specimens WHERE accession_number IS NOT NULL ORDER BY id DESC LIMIT 1')
165
+ data.each do |x|
166
+ return specimen_id = x['id']
167
+ end
168
+ end
169
+
170
+ def get_visit_id
171
+ data = query('SELECT * FROM visits WHERE id IS NOT NULL ORDER BY id DESC LIMIT 1')
172
+ data.each do |x|
173
+ return specimen_id = x['id']
174
+ end
175
+ end
176
+
177
+ def prepare_next_tracking_number
178
+ file = JSON.parse(File.read("#{Rails.root}/public/tracker.json"))
179
+ todate = Time.now.strftime('%Y%m%d')
180
+
181
+ counter = file[todate]
182
+ counter = counter.to_i + 1
183
+ fi = {}
184
+ fi[todate] = counter
185
+ File.open("#{Rails.root}/public/tracker.json", 'w') do |f|
186
+ f.write(fi.to_json)
187
+ end
188
+ end
189
+
190
+ ###### lims tracking number ###############
191
+ def create_local_tracking_number
192
+ configs = YAML.load_file "#{Rails.root}/config/application.yml"
193
+ site_code = configs['facility_code']
194
+ file = JSON.parse(File.read("#{Rails.root}/public/tracker.json"))
195
+ todate = Time.now.strftime('%Y%m%d')
196
+ year = Time.now.strftime('%Y%m%d').to_s.slice(2..3)
197
+ month = Time.now.strftime('%m')
198
+ day = Time.now.strftime('%d')
199
+
200
+ key = file.keys
201
+
202
+ if todate > key[0]
203
+
204
+ fi = {}
205
+ fi[todate] = 1
206
+ File.open("#{Rails.root}/public/tracker.json", 'w') do |f|
207
+ f.write(fi.to_json)
208
+ end
209
+
210
+ value = '001'
211
+ tracking_number = "X#{site_code}#{year}#{get_month(month)}#{get_day(day)}#{value}"
212
+
213
+ else
214
+ counter = file[todate]
215
+
216
+ value = if counter.to_s.length == 1
217
+ '00' + counter.to_s
218
+ elsif counter.to_s.length == 2
219
+ '0' + counter.to_s
220
+ else
221
+ begin
222
+ counter.to_s
223
+ rescue StandardError
224
+ '001'
225
+ end
226
+ end
227
+
228
+ tracking_number = "X#{site_code}#{year}#{get_month(month)}#{get_day(day)}#{value}"
229
+
230
+ end
231
+ tracking_number
232
+ end
233
+
234
+ def get_month(month)
235
+ case month
236
+
237
+ when '01'
238
+ '1'
239
+ when '02'
240
+ '2'
241
+ when '03'
242
+ '3'
243
+ when '04'
244
+ '4'
245
+ when '05'
246
+ '5'
247
+ when '06'
248
+ '6'
249
+ when '07'
250
+ '7'
251
+ when '08'
252
+ '8'
253
+ when '09'
254
+ '9'
255
+ when '10'
256
+ 'A'
257
+ when '11'
258
+ 'B'
259
+ when '12'
260
+ 'C'
261
+ end
262
+ end
263
+
264
+ def get_day(day)
265
+ case day
266
+
267
+ when '01'
268
+ '1'
269
+ when '02'
270
+ '2'
271
+ when '03'
272
+ '3'
273
+ when '04'
274
+ '4'
275
+ when '05'
276
+ '5'
277
+ when '06'
278
+ '6'
279
+ when '07'
280
+ '7'
281
+ when '08'
282
+ '8'
283
+ when '09'
284
+ '9'
285
+ when '10'
286
+ 'A'
287
+ when '11'
288
+ 'B'
289
+ when '12'
290
+ 'C'
291
+ when '13'
292
+ 'E'
293
+ when '14'
294
+ 'F'
295
+ when '15'
296
+ 'G'
297
+ when '16'
298
+ 'H'
299
+ when '17'
300
+ 'Y'
301
+ when '18'
302
+ 'J'
303
+ when '19'
304
+ 'K'
305
+ when '20'
306
+ 'Z'
307
+ when '21'
308
+ 'M'
309
+ when '22'
310
+ 'N'
311
+ when '23'
312
+ 'O'
313
+ when '24'
314
+ 'P'
315
+ when '25'
316
+ 'Q'
317
+ when '26'
318
+ 'R'
319
+ when '27'
320
+ 'S'
321
+ when '28'
322
+ 'T'
323
+ when '29'
324
+ 'V'
325
+ when '30'
326
+ 'W'
327
+ when '31'
328
+ 'X'
329
+ end
330
+ end
331
+ ############################################# end creation of lab test in lims #####################################################
332
+
333
+ ############## get results from lims ###############
334
+
335
+ def get_lims_test_results(tracking_number,patient_id)
336
+ external_patient_number = get_patient_dentifier(patient_id)
337
+ data = query("
338
+ SELECT
339
+ visits.ward_or_location, specimens.accession_number,
340
+ tests.created_by, tests.verified_by,
341
+ tests.time_completed,tests.requested_by,tests.interpretation,
342
+ tests.time_created as tests_time_created,
343
+ test_types.name as test_types_name,
344
+ test_categories.name as test_categories_name,
345
+ tests.time_verified as tests_time_verified,
346
+ users.name as users_name,
347
+ specimen_types.name as specimen_types_name,
348
+ specimen_statuses.name as specimen_statuses_name,
349
+ test_results.result as test_results_result,
350
+ test_results.device_name as test_results_device_name,
351
+ measures.name as measures_name,
352
+ measures.unit as measures_unit,
353
+ measure_ranges.range_lower as measure_ranges_range_lower,
354
+ measure_ranges.range_upper as measure_ranges_range_upper
355
+ FROM iblis.patients
356
+ inner join iblis.visits on `visits`.`patient_id` = `patients`.`patient_number`
357
+ inner join iblis.tests on `tests`.`visit_id` = `visits`.`id`
358
+ inner join iblis.test_types on `test_types`.`id` = `tests`.`test_type_id`
359
+ inner join iblis.test_categories on `test_categories`.`id` = `test_types`.`test_category_id`
360
+ inner join iblis.users on `users`.`id` = `tests`.`tested_by`
361
+ inner join iblis.specimens on `specimens`.`id` = `tests`.`specimen_id`
362
+ inner join iblis.specimen_types on `specimen_types`.`id` = `specimens`.`specimen_type_id`
363
+ inner join iblis.specimen_statuses on `specimen_statuses`.`id` = `specimens`.`specimen_status_id`
364
+ right join iblis.test_results on `test_results`.`test_id` = `tests`.`id`
365
+ right join iblis.measures on `measures`.`id` = `test_results`.`measure_id`
366
+ right join iblis.measure_ranges on `measure_ranges`.`measure_id` = `measures`.`id`
367
+ where `patients`.`deleted_at` is null and `specimens`.`tracking_number` = '#{tracking_number}' and `patients`.`external_patient_number` = '#{external_patient_number}' and `measure_ranges`.`deleted_at`
368
+ is null group by(`measure_ranges`.`measure_id`) order by time_completed asc ;
369
+ ")
370
+ data
371
+ end
372
+ def get_user_details(user_id)
373
+ data = query("SELECT * FROM iblis.users where id = #{user_id};")
374
+ data
375
+ end
376
+ ############################################# start connection to lims database ######################################################
377
+ def query(sql)
378
+ Rails.logger.debug(sql.to_s)
379
+ result = mysql.query(sql)
380
+ end
381
+
382
+ def mysql
383
+ # self.initialize
384
+ return mysql_connection if mysql_connection
385
+
386
+ connection = Mysql2::Client.new(host: settings['headers']['host'],
387
+ username: settings['headers']['username'],
388
+ password: settings['headers']['password'],
389
+ port: settings['headers']['port'],
390
+ database: settings['headers']['database'],
391
+ reconnect: true)
392
+ self.mysql_connection = connection
393
+ end
394
+
395
+ def mysql_connection=(connection)
396
+ @mysql_connection_pool = connection
397
+ end
398
+
399
+ def mysql_connection
400
+ @mysql_connection_pool
401
+ end
402
+ ############################################# end connection to lims database ######################################################
403
+ end
404
+ end
405
+ end
data/config/routes.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  EmrOhspInterface::Engine.routes.draw do
2
- resources :radiology, path: 'api/v1/emr_ohsp_interface'
2
+ resources :emr_lims_interface, path: 'api/v1/emr_lims_interface'
3
+ get '/get_lims_user', to: 'emr_lims_interface#get_user_info'
3
4
  get '/get_weeks', to: 'emr_ohsp_interface#weeks_generator'
4
5
  get '/get_months', to: 'emr_ohsp_interface#months_generator'
5
6
  get '/generate_weekly_idsr_report', to: 'emr_ohsp_interface#generate_weekly_idsr_report'
@@ -1,3 +1,3 @@
1
1
  module EmrOhspInterface
2
- VERSION = '0.3.0'
2
+ VERSION = '0.4.0'
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.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
- - Justin Manda
7
+ - Justin Manda and Petros Kayange
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-19 00:00:00.000000000 Z
11
+ date: 2021-11-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -74,7 +74,7 @@ dependencies:
74
74
  version: '0'
75
75
  description:
76
76
  email:
77
- - justinmandah@gmail.com
77
+ - justinmandah@gmail.com, kayangepetros@gmail.com
78
78
  executables: []
79
79
  extensions: []
80
80
  extra_rdoc_files: []
@@ -86,11 +86,13 @@ files:
86
86
  - app/assets/javascripts/emr_ohsp_interface/application.js
87
87
  - app/assets/stylesheets/emr_ohsp_interface/application.css
88
88
  - app/controllers/emr_ohsp_interface/application_controller.rb
89
+ - app/controllers/emr_ohsp_interface/emr_lims_interface_controller.rb
89
90
  - app/controllers/emr_ohsp_interface/emr_ohsp_interface_controller.rb
90
91
  - app/helpers/emr_ohsp_interface/application_helper.rb
91
92
  - app/jobs/emr_ohsp_interface/application_job.rb
92
93
  - app/mailers/emr_ohsp_interface/application_mailer.rb
93
94
  - app/models/emr_ohsp_interface/application_record.rb
95
+ - app/services/emr_ohsp_interface/emr_lims_interface_service.rb
94
96
  - app/services/emr_ohsp_interface/emr_ohsp_interface_service.rb
95
97
  - app/views/layouts/emr_ohsp_interface/application.html.erb
96
98
  - config/routes.rb
@@ -121,6 +123,6 @@ requirements: []
121
123
  rubygems_version: 3.0.8
122
124
  signing_key:
123
125
  specification_version: 4
124
- summary: This in a gem that facilitates interfacing of EMR and One Health Surveillance
125
- Platform
126
+ summary: This in a gem that facilitates interfacing of EMR, One Health Surveillance
127
+ Platform and Lims
126
128
  test_files: []