his_emr_api_lab 1.0.5 → 1.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -10,6 +10,7 @@ module Lab
10
10
  TEST_RESULT_CONCEPT_NAME = 'Lab test result'
11
11
  TEST_RESULT_INDICATOR_CONCEPT_NAME = 'Lab test result indicator'
12
12
  TEST_TYPE_CONCEPT_NAME = 'Test type'
13
+ UNKNOWN_SPECIMEN = 'Unknown'
13
14
 
14
15
  # Encounter
15
16
  ENCOUNTER_TYPE_NAME = 'Lab'
@@ -5,6 +5,14 @@ module Lab
5
5
  module OrdersSearchService
6
6
  class << self
7
7
  def find_orders(filters)
8
+ # A bit of hack-ish solution to have a patient's orders updated upon
9
+ # scanning of a patient. Done in this way to deal with LIMS' lack of
10
+ # a notification system for lab order updates. We are limited to polling
11
+ # for updates on a per order basis.
12
+ if filters[:patient_id]
13
+ Lab::UpdatePatientOrdersJob.perform_later(filters[:patient_id])
14
+ end
15
+
8
16
  extra_filters = pop_filters(filters, :date, :end_date, :status)
9
17
 
10
18
  orders = Lab::LabOrder.prefetch_relationships
@@ -17,6 +25,16 @@ module Lab
17
25
  orders.map { |order| Lab::LabOrderSerializer.serialize_order(order) }
18
26
  end
19
27
 
28
+ def find_orders_without_results(patient_id: nil)
29
+ results_query = Lab::LabResult.all
30
+ results_query = results_query.where(person_id: patient_id) if patient_id
31
+
32
+ query = Lab::LabOrder.where.not(order_id: results_query.select(:order_id))
33
+ query = query.where(patient_id: patient_id) if patient_id
34
+
35
+ query
36
+ end
37
+
20
38
  def filter_orders_by_date(orders, date: nil, end_date: nil)
21
39
  date = date&.to_date
22
40
  end_date = end_date&.to_date
@@ -53,6 +71,8 @@ module Lab
53
71
  popped_params[filter.to_sym] = params.delete(filter)
54
72
  end
55
73
  end
74
+
75
+ def fetch_results(order); end
56
76
  end
57
77
  end
58
78
  end
@@ -66,20 +66,27 @@ module Lab
66
66
 
67
67
  def update_order(order_id, params)
68
68
  specimen_id = params.dig(:specimen, :concept_id)
69
- unless specimen_id
70
- raise ::InvalidParameterError, 'Specimen concept_id is required'
71
- end
69
+ raise ::InvalidParameterError, 'Specimen concept_id is required' unless specimen_id
72
70
 
73
71
  order = Lab::LabOrder.find(order_id)
74
- unless order.concept_id == unknown_concept_id || params[:force_update]&.to_s&.casecmp?('true')
75
- raise ::UnprocessableEntityError
72
+ if order.concept_id != unknown_concept_id && !params[:force_update]&.casecmp?('true')
73
+ raise ::UnprocessableEntityError, "Can't change order specimen once set"
74
+ end
75
+
76
+ if specimen_id.to_i != order.concept_id
77
+ Rails.logger.debug("Updating order ##{order.order_id}")
78
+ order.update!(concept_id: specimen_id,
79
+ discontinued: true,
80
+ discontinued_by: User.current.user_id,
81
+ discontinued_date: params[:date]&.to_date || Time.now,
82
+ discontinued_reason_non_coded: 'Sample drawn/updated')
83
+ end
84
+
85
+ if params[:reason_for_test_id]
86
+ Rails.logger.debug("Updating reason for test on order ##{order.order_id}")
87
+ update_reason_for_test(order, params[:reason_for_test_id])
76
88
  end
77
89
 
78
- order.update!(concept_id: specimen_id,
79
- discontinued: true,
80
- discontinued_by: User.current.user_id,
81
- discontinued_date: params[:date]&.to_date || Date.today,
82
- discontinued_reason_non_coded: 'Sample drawn/updated')
83
90
  Lab::LabOrderSerializer.serialize_order(order)
84
91
  end
85
92
 
@@ -92,8 +99,10 @@ module Lab
92
99
  order.target_lab&.void(reason)
93
100
 
94
101
  order.tests.each { |test| test.void(reason) }
102
+ voided = order.void(reason)
103
+ Lab::VoidOrderJob.perform_later(order_id)
95
104
 
96
- order.void(reason)
105
+ voided
97
106
  end
98
107
 
99
108
  private
@@ -105,13 +114,9 @@ module Lab
105
114
  # a 'Lab' encounter is created using the provided program_id and
106
115
  # patient_id.
107
116
  def find_encounter(order_params)
108
- if order_params[:encounter_id]
109
- return Encounter.find(order_params[:encounter_id])
110
- end
117
+ return Encounter.find(order_params[:encounter_id]) if order_params[:encounter_id]
111
118
 
112
- unless order_params[:patient_id]
113
- raise InvalidParameterError, 'encounter_id or patient_id required'
114
- end
119
+ raise InvalidParameterError, 'encounter_id or patient_id required' unless order_params[:patient_id]
115
120
 
116
121
  program_id = order_params[:program_id] || Program.find_by_name!(Lab::Metadata::LAB_PROGRAM_NAME).program_id
117
122
 
@@ -157,7 +162,7 @@ module Lab
157
162
  order,
158
163
  Lab::Metadata::REASON_FOR_TEST_CONCEPT_NAME,
159
164
  params[:date],
160
- value_coded: params['reason_for_test_id']
165
+ value_coded: params[:reason_for_test_id]
161
166
  )
162
167
  end
163
168
 
@@ -190,6 +195,17 @@ module Lab
190
195
  def unknown_concept_id
191
196
  ConceptName.find_by_name!('Unknown').concept_id
192
197
  end
198
+
199
+ def update_reason_for_test(order, concept_id)
200
+ raise InvalidParameterError, "Reason for test can't be blank" if concept_id.blank?
201
+
202
+ return if order.reason_for_test&.value_coded == concept_id
203
+
204
+ raise InvalidParameterError, "Can't change reason for test once set" if order.reason_for_test&.value_coded
205
+
206
+ order.reason_for_test&.delete
207
+ add_reason_for_test(order, date: order.start_date, reason_for_test_id: concept_id)
208
+ end
193
209
  end
194
210
  end
195
211
  end
data/lib/lab/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lab
4
- VERSION = '1.0.5'
4
+ VERSION = '1.1.3'
5
5
  end
@@ -3,4 +3,5 @@
3
3
  "Repeat / Missing"
4
4
  "Targeted"
5
5
  "Confirmatory"
6
+ "Stat"
6
7
  "Other"
@@ -86,8 +86,6 @@ Blood,HbA1c,"2019-11-19 14:05:31"
86
86
  Blood,Microalbumin,"2019-11-19 14:05:31"
87
87
  Blood,Microprotein,"2019-11-19 14:05:31"
88
88
  Blood,"Von Willebrand Factor","2019-11-19 14:05:31"
89
- Blood,"HIV_viral_load","2021-04-13 00:00:00"
90
- Blood,"Viral laod","2021-04-11 00:00:00"
91
89
  Blood,"Viral Load","2019-11-19 14:05:31"
92
90
  Blood,"Urine Lam","2019-11-19 14:05:31"
93
91
  Blood,"Protein and Sugar","2021-04-16"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: his_emr_api_lab
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elizabeth Glaser Pediatric Foundation Malawi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-23 00:00:00.000000000 Z
11
+ date: 2021-07-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: couchrest
@@ -58,6 +58,20 @@ dependencies:
58
58
  - - ">="
59
59
  - !ruby/object:Gem::Version
60
60
  version: 5.2.4.3
61
+ - !ruby/object:Gem::Dependency
62
+ name: socket.io-client-simple
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: 1.2.1
68
+ type: :runtime
69
+ prerelease: false
70
+ version_requirements: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: 1.2.1
61
75
  - !ruby/object:Gem::Dependency
62
76
  name: bcrypt
63
77
  requirement: !ruby/object:Gem::Requirement
@@ -234,6 +248,8 @@ files:
234
248
  - app/controllers/lab/test_types_controller.rb
235
249
  - app/controllers/lab/tests_controller.rb
236
250
  - app/jobs/lab/application_job.rb
251
+ - app/jobs/lab/update_patient_orders_job.rb
252
+ - app/jobs/lab/void_order_job.rb
237
253
  - app/mailers/lab/application_mailer.rb
238
254
  - app/models/lab/application_record.rb
239
255
  - app/models/lab/lab_accession_number_counter.rb
@@ -251,12 +267,15 @@ files:
251
267
  - app/services/lab/labelling_service/order_label.rb
252
268
  - app/services/lab/lims/api/couchdb_api.rb
253
269
  - app/services/lab/lims/api/mysql_api.rb
270
+ - app/services/lab/lims/api/rest_api.rb
271
+ - app/services/lab/lims/api/ws_api.rb
254
272
  - app/services/lab/lims/config.rb
255
273
  - app/services/lab/lims/exceptions.rb
256
- - app/services/lab/lims/failed_imports.rb
257
274
  - app/services/lab/lims/migrator.rb
258
275
  - app/services/lab/lims/order_dto.rb
259
276
  - app/services/lab/lims/order_serializer.rb
277
+ - app/services/lab/lims/pull_worker.rb
278
+ - app/services/lab/lims/push_worker.rb
260
279
  - app/services/lab/lims/utils.rb
261
280
  - app/services/lab/lims/worker.rb
262
281
  - app/services/lab/metadata.rb
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative './order_dto'
4
-
5
- module Lab
6
- module Lims
7
- ##
8
- # Manage LIMS orders that failed to import
9
- module FailedImports
10
- class << self
11
- ##
12
- # Retrieve all imports that failed
13
- def failed_imports(start_id = 0, limit = 20)
14
- Lab::LimsFailedImport.where('id >= ?', start_id).limit(limit)
15
- end
16
-
17
- ##
18
- # Forcefully imports a failed import into a patient
19
- def force_import(failed_import_id, _patient_id)
20
- failed_import = Lab::LimsFailedImport.find(failed_import_id)
21
- order_dto = Lab::Lims::OrderDTO.new(lims_api.find_order(failed_import.lims_id))
22
- byebug
23
- end
24
-
25
- private
26
-
27
- def lims_api
28
- @lims_api ||= Lab::Lims::Api.new
29
- end
30
- end
31
- end
32
- end
33
- end