his_emr_api_lab 0.0.15 → 1.0.4
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 +4 -4
- data/app/services/lab/lims/config.rb +3 -2
- data/app/services/lab/lims/order_dto.rb +2 -2
- data/app/services/lab/lims/order_serializer.rb +62 -8
- data/app/services/lab/lims/worker.rb +14 -5
- data/db/migrate/20210610095024_fix_numeric_results_value_type.rb +20 -0
- data/lib/lab/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6142a8351eea3dc6cc2dde34b014948bd95c5d4398355ddc29d2aa0ddff8c095
|
4
|
+
data.tar.gz: ca4493c370000ab13cae02629c8cc3ea840f9bf03a70dee35a3f8bc3574e12e3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b18abf5a9f7e00c213ff41bea37c924f7c5abafbfefd5f63727c76093d26e057391ddb047e4a2583fbfdb9d98bd05895387cc6b26aacfe54df4a290cb804f9b9
|
7
|
+
data.tar.gz: e7e23b2a1eb5d387855e7acc7e1bd60dcdfca08938245693a07833a6fc43314e1127a9108eaaf8e1536fa3e16acaaa74ecf104d107b3fb71a98ad9b0c4b8a875
|
@@ -45,10 +45,11 @@ module Lab
|
|
45
45
|
paths = [
|
46
46
|
"#{ENV['HOME']}/apps/nlims_controller/config/#{filename}",
|
47
47
|
"/var/www/nlims_controller/config/#{filename}",
|
48
|
-
Rails.root.parent.join("nlims_controller/config/#{filename}")
|
49
|
-
Rails.root.join('config/lims-couch.yml')
|
48
|
+
Rails.root.parent.join("nlims_controller/config/#{filename}")
|
50
49
|
]
|
51
50
|
|
51
|
+
paths = [Rails.root.join('config/lims-couchdb.yml'), *paths] if filename == 'couchdb.yml'
|
52
|
+
|
52
53
|
paths.each do |path|
|
53
54
|
Rails.logger.debug("Looking for LIMS couchdb config at: #{path}")
|
54
55
|
return path if File.exist?(path)
|
@@ -83,9 +83,9 @@ module Lab
|
|
83
83
|
|
84
84
|
# Translates a LIMS sample priority to a concept_id
|
85
85
|
def reason_for_test
|
86
|
-
return unknown_concept.concept_id unless self['
|
86
|
+
return unknown_concept.concept_id unless self['priority']
|
87
87
|
|
88
|
-
ConceptName.find_by_name!(self['
|
88
|
+
ConceptName.find_by_name!(self['priority']).concept_id
|
89
89
|
end
|
90
90
|
|
91
91
|
def lab_program
|
@@ -18,14 +18,16 @@ module Lab
|
|
18
18
|
tracking_number: serialized_order.accession_number,
|
19
19
|
sending_facility: current_facility_name,
|
20
20
|
receiving_facility: serialized_order.target_lab,
|
21
|
-
tests: serialized_order.tests.
|
21
|
+
tests: serialized_order.tests.map { |test| format_test_name(test.name) },
|
22
22
|
patient: format_patient(serialized_order.patient_id),
|
23
23
|
order_location: format_order_location(serialized_order.encounter_id),
|
24
24
|
sample_type: format_sample_type(serialized_order.specimen.name),
|
25
25
|
sample_status: format_sample_status(serialized_order.specimen.name),
|
26
26
|
sample_statuses: format_sample_status_trail(order),
|
27
|
+
test_statuses: format_test_status_trail(order),
|
28
|
+
who_order_test: format_orderer(order),
|
27
29
|
districy: current_district, # yes districy [sic]...
|
28
|
-
priority: serialized_order.reason_for_test.name,
|
30
|
+
priority: format_sample_priority(serialized_order.reason_for_test.name),
|
29
31
|
date_created: serialized_order.order_date,
|
30
32
|
test_results: format_test_results(serialized_order),
|
31
33
|
type: 'Order'
|
@@ -67,7 +69,7 @@ module Lab
|
|
67
69
|
end
|
68
70
|
|
69
71
|
def format_sample_type(name)
|
70
|
-
name.casecmp?('Unknown') ? 'not_specified' : name
|
72
|
+
name.casecmp?('Unknown') ? 'not_specified' : name.titleize
|
71
73
|
end
|
72
74
|
|
73
75
|
def format_sample_status(name)
|
@@ -75,9 +77,7 @@ module Lab
|
|
75
77
|
end
|
76
78
|
|
77
79
|
def format_sample_status_trail(order)
|
78
|
-
if order.concept_id == ConceptName.find_by_name!('Unknown').concept_id
|
79
|
-
return []
|
80
|
-
end
|
80
|
+
return [] if order.concept_id == ConceptName.find_by_name!('Unknown').concept_id
|
81
81
|
|
82
82
|
user = User.find(order.discontinued_by || order.creator)
|
83
83
|
drawn_by = PersonName.find_by_person_id(user.user_id)
|
@@ -96,13 +96,39 @@ module Lab
|
|
96
96
|
]
|
97
97
|
end
|
98
98
|
|
99
|
+
def format_test_status_trail(order)
|
100
|
+
order.tests.each_with_object({}) do |test, trail|
|
101
|
+
test_name = format_test_name(ConceptName.find_by_concept_id!(test.value_coded).name)
|
102
|
+
|
103
|
+
current_test_trail = trail[test_name] = {}
|
104
|
+
|
105
|
+
current_test_trail[test.obs_datetime.strftime('%Y%m%d%H%M%S')] = {
|
106
|
+
status: 'Drawn',
|
107
|
+
updated_by: find_user(test.creator)
|
108
|
+
}
|
109
|
+
|
110
|
+
next unless test.result
|
111
|
+
|
112
|
+
current_test_trail[test.obs_datetime.strftime('%Y%m%d%H%M%S')] = {
|
113
|
+
status: 'Verified',
|
114
|
+
updated_by: find_user(test.result.creator)
|
115
|
+
}
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
def format_orderer(order)
|
120
|
+
find_user(order.creator)
|
121
|
+
end
|
122
|
+
|
99
123
|
def format_test_results(order)
|
100
124
|
order.tests&.each_with_object({}) do |test, results|
|
101
125
|
next unless test.result
|
102
126
|
|
103
|
-
results[test.name] = {
|
127
|
+
results[format_test_name(test.name)] = {
|
104
128
|
results: test.result.each_with_object({}) do |measure, measures|
|
105
|
-
measures[measure.indicator.name] = {
|
129
|
+
measures[format_test_name(measure.indicator.name)] = {
|
130
|
+
result_value: "#{measure.value_modifier}#{measure.value}"
|
131
|
+
}
|
106
132
|
end,
|
107
133
|
result_date: test.result.first&.date,
|
108
134
|
result_entered_by: {}
|
@@ -110,6 +136,20 @@ module Lab
|
|
110
136
|
end
|
111
137
|
end
|
112
138
|
|
139
|
+
def format_test_name(test_name)
|
140
|
+
return 'Viral Load' if test_name.casecmp?('HIV Viral load')
|
141
|
+
|
142
|
+
return 'TB' if test_name.casecmp?('TB Program')
|
143
|
+
|
144
|
+
test_name.titleize
|
145
|
+
end
|
146
|
+
|
147
|
+
def format_sample_priority(priority)
|
148
|
+
return 'Routine' if priority&.casecmp?('Medical examination, routine')
|
149
|
+
|
150
|
+
priority&.titleize
|
151
|
+
end
|
152
|
+
|
113
153
|
def current_health_center
|
114
154
|
health_center = Location.current_health_center
|
115
155
|
raise 'Current health center not set' unless health_center
|
@@ -134,6 +174,20 @@ module Lab
|
|
134
174
|
def current_facility_name
|
135
175
|
current_health_center.name
|
136
176
|
end
|
177
|
+
|
178
|
+
def find_user(user_id)
|
179
|
+
user = User.find(user_id)
|
180
|
+
person_name = PersonName.find_by(person_id: user.person_id)
|
181
|
+
phone_number = PersonAttribute.find_by(type: PersonAttributeType.where(name: 'Cell phone number'),
|
182
|
+
person_id: user.person_id)
|
183
|
+
|
184
|
+
{
|
185
|
+
first_name: person_name&.given_name,
|
186
|
+
last_name: person_name&.family_name,
|
187
|
+
phone_number: phone_number&.value,
|
188
|
+
id: user.username
|
189
|
+
}
|
190
|
+
end
|
137
191
|
end
|
138
192
|
end
|
139
193
|
end
|
@@ -26,11 +26,11 @@ module Lab
|
|
26
26
|
User.current = Utils.lab_user
|
27
27
|
|
28
28
|
fout.write("Worker ##{Process.pid} started at #{Time.now}")
|
29
|
-
worker = new(CouchDbApi.new)
|
29
|
+
worker = new(Api::CouchDbApi.new)
|
30
30
|
worker.pull_orders
|
31
31
|
# TODO: Verify that names being pushed to LIMS are of the correct format (ie matching
|
32
32
|
# LIMS naming conventions). Enable pushing when that is done
|
33
|
-
|
33
|
+
worker.push_orders
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
@@ -209,7 +209,7 @@ module Lab
|
|
209
209
|
raise MissingAccessionNumber if order_dto[:tracking_number].blank?
|
210
210
|
|
211
211
|
logger.info("Importing LIMS order ##{order_dto[:tracking_number]}")
|
212
|
-
mapping =
|
212
|
+
mapping = find_order_mapping_by_lims_id(order_dto[:_id])
|
213
213
|
|
214
214
|
ActiveRecord::Base.transaction do
|
215
215
|
if mapping
|
@@ -221,7 +221,6 @@ module Lab
|
|
221
221
|
order_id: order['id'],
|
222
222
|
pulled_at: Time.now,
|
223
223
|
revision: order_dto['_rev'])
|
224
|
-
byebug unless mapping.errors.empty?
|
225
224
|
end
|
226
225
|
|
227
226
|
order
|
@@ -313,7 +312,7 @@ module Lab
|
|
313
312
|
end
|
314
313
|
|
315
314
|
def guess_result_datatype(result)
|
316
|
-
return 'numeric' if result.strip.match?(/^[+-]?(\d+(\.\d+)|\.\d+)
|
315
|
+
return 'numeric' if result.strip.match?(/^[+-]?((\d+(\.\d+)?)|\.\d+)$/)
|
317
316
|
|
318
317
|
'text'
|
319
318
|
end
|
@@ -339,6 +338,16 @@ module Lab
|
|
339
338
|
def last_seq_path
|
340
339
|
LIMS_LOG_PATH.join('last_seq.dat')
|
341
340
|
end
|
341
|
+
|
342
|
+
def find_order_mapping_by_lims_id(lims_id)
|
343
|
+
mapping = Lab::LimsOrderMapping.find_by(lims_id: lims_id)
|
344
|
+
return nil unless mapping
|
345
|
+
|
346
|
+
return mapping if Lab::LabOrder.where(order_id: mapping.order_id).exists?
|
347
|
+
|
348
|
+
mapping.destroy
|
349
|
+
nil
|
350
|
+
end
|
342
351
|
end
|
343
352
|
end
|
344
353
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class FixNumericResultsValueType < ActiveRecord::Migration[5.2]
|
2
|
+
def up
|
3
|
+
results = Lab::LabResult.all.includes(:children)
|
4
|
+
|
5
|
+
ActiveRecord::Base.connection.transaction do
|
6
|
+
results.each do |result|
|
7
|
+
result.children.each do |measure|
|
8
|
+
next unless measure.value_text&.match?(/^[+-]?((\d+(\.\d+)?)|\.\d+)$/)
|
9
|
+
|
10
|
+
puts "Updating result value type for result measure ##{measure.obs_id}"
|
11
|
+
measure.value_numeric = measure.value_text
|
12
|
+
measure.value_text = nil
|
13
|
+
measure.save!
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def down; end
|
20
|
+
end
|
data/lib/lab/version.rb
CHANGED
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:
|
4
|
+
version: 1.0.4
|
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-
|
11
|
+
date: 2021-06-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: couchrest
|
@@ -270,6 +270,7 @@ files:
|
|
270
270
|
- db/migrate/20210323080140_change_lims_id_to_string_in_lims_order_mapping.rb
|
271
271
|
- db/migrate/20210326195504_add_order_revision_to_lims_order_mapping.rb
|
272
272
|
- db/migrate/20210407071728_create_lab_lims_failed_imports.rb
|
273
|
+
- db/migrate/20210610095024_fix_numeric_results_value_type.rb
|
273
274
|
- lib/auto12epl.rb
|
274
275
|
- lib/couch_bum/couch_bum.rb
|
275
276
|
- lib/generators/lab/install/USAGE
|