his_emr_api_lab 2.1.4.pre.alpha → 2.1.4.pre.beta
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/jobs/lab/process_lab_result_job.rb +0 -1
- data/app/serializers/lab/result_serializer.rb +6 -12
- data/app/services/lab/concepts_service.rb +1 -1
- data/app/services/lab/lims/api/rest_api.rb +1 -1
- data/app/services/lab/lims/pull_worker.rb +1 -1
- data/app/services/lab/lims/utils.rb +2 -6
- data/app/services/lab/results_service.rb +13 -27
- data/lib/lab/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 2cb84913a3c09866a51aa40a98812803bfee6f66a36c3e5c7ea4bdcb9a530724
|
|
4
|
+
data.tar.gz: 833074b20f473b97b515a11392fc768dabc0b3289b1717474e08b903120c6216
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: fa6487f57604f5ee24b2fc15e730dfc765cea9eff12051d1875560aa49832e36dc7ffab4320517eeb1f6ffe0ccb706b0e40e4bffc0bcb56d3055b77c9f72c650
|
|
7
|
+
data.tar.gz: 02a6a0b02074c8fcec8c3d9dbeaeee0a29ea6f96a62f30459f96ee904720c72a854d8251bfb111c5e6e80ae6552a658dabb409547b92119062ada27723d2d0bf
|
|
@@ -6,7 +6,6 @@ module Lab
|
|
|
6
6
|
class ProcessLabResultJob < ApplicationJob
|
|
7
7
|
queue_as :default
|
|
8
8
|
def perform(results_obs_id, serializer, result_enter_by)
|
|
9
|
-
Rails.logger.info("Lab::ProcessLabResultJob: Processing result completion for #{serializer}")
|
|
10
9
|
results_obs = Lab::LabResult.find(results_obs_id)
|
|
11
10
|
Lab::ResultsService.process_result_completion(results_obs, serializer, result_enter_by)
|
|
12
11
|
end
|
|
@@ -7,11 +7,11 @@ module Lab
|
|
|
7
7
|
def self.serialize(result)
|
|
8
8
|
result.children.map do |measure|
|
|
9
9
|
value, value_type = read_value(measure)
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
program_id =
|
|
10
|
+
concept_name = ConceptName.find_by_concept_id(measure.concept_id)
|
|
11
|
+
|
|
12
|
+
program_id = ""
|
|
13
13
|
if measure.obs_id.present?
|
|
14
|
-
obs = Observation.
|
|
14
|
+
obs = Observation.find(measure.obs_id)
|
|
15
15
|
encounter = Encounter.find(obs.encounter_id)
|
|
16
16
|
program_id = encounter.program_id
|
|
17
17
|
end
|
|
@@ -19,8 +19,8 @@ module Lab
|
|
|
19
19
|
{
|
|
20
20
|
id: measure.obs_id,
|
|
21
21
|
indicator: {
|
|
22
|
-
concept_id:
|
|
23
|
-
name: concept_name
|
|
22
|
+
concept_id: concept_name&.concept_id,
|
|
23
|
+
name: concept_name&.name
|
|
24
24
|
},
|
|
25
25
|
date: measure.obs_datetime,
|
|
26
26
|
value:,
|
|
@@ -31,12 +31,6 @@ module Lab
|
|
|
31
31
|
end
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
def self.get_test_catalog_concept_name(concept_id)
|
|
35
|
-
return nil unless concept_id
|
|
36
|
-
|
|
37
|
-
::ConceptAttribute.find_by(concept_id:, attribute_type: ConceptAttributeType.test_catalogue_name)&.value_reference
|
|
38
|
-
end
|
|
39
|
-
|
|
40
34
|
def self.read_value(measure)
|
|
41
35
|
%w[value_numeric value_coded value_boolean value_text].each do |field|
|
|
42
36
|
value = measure.send(field) if measure.respond_to?(field)
|
|
@@ -61,7 +61,7 @@ module Lab
|
|
|
61
61
|
INNER JOIN concept_attribute ca2 ON ca.concept_id = ca2.concept_id
|
|
62
62
|
AND ca2.attribute_type_id = #{ConceptAttributeType.nlims_code.concept_attribute_type_id}
|
|
63
63
|
WHERE ca.attribute_type_id = #{ConceptAttributeType.test_catalogue_name.concept_attribute_type_id}
|
|
64
|
-
AND ca.concept_id IN (#{concept_set.select(:
|
|
64
|
+
AND ca.concept_id IN (#{concept_set.select(:concept_id).to_sql})
|
|
65
65
|
GROUP BY ca.concept_id
|
|
66
66
|
SQL
|
|
67
67
|
end
|
|
@@ -341,7 +341,7 @@ module Lab
|
|
|
341
341
|
def nlims_order_exists?(tracking_number)
|
|
342
342
|
response = in_authenticated_session do |headers|
|
|
343
343
|
Rails.logger.info("Verifying order ##{tracking_number}")
|
|
344
|
-
RestClient.get(expand_uri("orders/#{tracking_number}
|
|
344
|
+
RestClient.get(expand_uri("orders/#{tracking_number}", api_version: 'v2'), headers)
|
|
345
345
|
end
|
|
346
346
|
|
|
347
347
|
Rails.logger.info("Order ##{tracking_number} verified... Parsing...")
|
|
@@ -78,12 +78,8 @@ module Lab
|
|
|
78
78
|
end
|
|
79
79
|
|
|
80
80
|
def self.find_concept_by_name(name)
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
ConceptName.joins('INNER JOIN concept_attribute ON concept_attribute.concept_id = concept_name.concept_id')
|
|
85
|
-
.where('concept_attribute.attribute_type_id = ? AND concept_attribute.value_reference = ? AND concept_name.name = ?',
|
|
86
|
-
attribute_type_id, unescaped_name, unescaped_name)
|
|
81
|
+
ConceptName.joins("INNER JOIN concept_attribute ON concept_attribute.concept_id = concept_name.concept_id")
|
|
82
|
+
.where("concept_attribute.value_reference = ?", CGI.unescapeHTML(name))
|
|
87
83
|
.first
|
|
88
84
|
end
|
|
89
85
|
end
|
|
@@ -20,11 +20,7 @@ module Lab
|
|
|
20
20
|
serializer = {}
|
|
21
21
|
results_obs = {}
|
|
22
22
|
ActiveRecord::Base.transaction do
|
|
23
|
-
test =
|
|
24
|
-
Lab::LabTest.find(test_id)
|
|
25
|
-
rescue StandardError
|
|
26
|
-
nil
|
|
27
|
-
end
|
|
23
|
+
test = Lab::LabTest.find(test_id) rescue nil
|
|
28
24
|
test = Lab::LabTest.find_by_uuid(test_id) if test.blank?
|
|
29
25
|
encounter = find_encounter(test, encounter_id: params[:encounter_id],
|
|
30
26
|
encounter_uuid: params[:encounter],
|
|
@@ -41,9 +37,9 @@ module Lab
|
|
|
41
37
|
|
|
42
38
|
# force commit all transactions
|
|
43
39
|
ActiveRecord::Base.connection.commit_db_transaction
|
|
44
|
-
|
|
45
|
-
#
|
|
46
|
-
ProcessLabResultJob.
|
|
40
|
+
|
|
41
|
+
# delay job by a second
|
|
42
|
+
ProcessLabResultJob.set(wait: 1.second).perform_later(results_obs.id, serializer, result_enter_by)
|
|
47
43
|
|
|
48
44
|
Rails.logger.info("Lab::ResultsService: Result created for test #{test_id} #{serializer}")
|
|
49
45
|
serializer
|
|
@@ -59,10 +55,10 @@ module Lab
|
|
|
59
55
|
def precess_notification_message(result, values, result_enter_by)
|
|
60
56
|
order = Order.find(result.order_id)
|
|
61
57
|
data = { Type: result_enter_by,
|
|
62
|
-
Specimen:
|
|
63
|
-
'Test type':
|
|
58
|
+
Specimen: ConceptName.find_by(concept_id: order.concept_id)&.name,
|
|
59
|
+
'Test type': ConceptName.find_by(concept_id: result.test.value_coded)&.name,
|
|
64
60
|
'Accession number': order&.accession_number,
|
|
65
|
-
|
|
61
|
+
'Orde date': Order.columns.include?('start_date') ? order.start_date : order.date_created,
|
|
66
62
|
'ARV-Number': find_arv_number(result.person_id),
|
|
67
63
|
PatientID: result.person_id,
|
|
68
64
|
'Ordered By': Order.columns.include?('provider_id') ? order&.provider&.person&.name : Person.find(order.creator)&.name,
|
|
@@ -86,21 +82,19 @@ module Lab
|
|
|
86
82
|
def find_encounter(test, encounter_id: nil, encounter_uuid: nil, date: nil, provider_id: nil)
|
|
87
83
|
return Encounter.find(encounter_id) if encounter_id
|
|
88
84
|
return Encounter.find_by_uuid(encounter_uuid) if encounter_uuid
|
|
89
|
-
|
|
90
|
-
lab_encounter_type = EncounterType.find_by_name!(Lab::Metadata::ENCOUNTER_TYPE_NAME)
|
|
85
|
+
encounter_type = EncounterType.find_by_name!(Lab::Metadata::ENCOUNTER_TYPE_NAME)
|
|
91
86
|
|
|
92
87
|
encounter = Encounter.new
|
|
93
88
|
encounter.patient_id = test.person_id
|
|
94
89
|
encounter.program_id = test.encounter.program_id if Encounter.column_names.include?('program_id')
|
|
95
90
|
encounter.visit_id = test.encounter.visit_id if Encounter.column_names.include?('visit_id')
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
encounter_type_value = lab_encounter_type.is_a?(Integer) ? lab_encounter_type : lab_encounter_type.encounter_type_id
|
|
99
|
-
encounter[:encounter_type] = encounter_type_value
|
|
91
|
+
encounter.type = encounter_type
|
|
92
|
+
encounter.encounter_type = encounter_type if (encounter&.encounter_type.nil? || encounter&.type.nil?)
|
|
100
93
|
encounter.encounter_datetime = date || Date.today
|
|
101
94
|
encounter.provider_id = provider_id || User.current.user_id if Encounter.column_names.include?('provider_id')
|
|
95
|
+
|
|
102
96
|
encounter.save!
|
|
103
|
-
|
|
97
|
+
|
|
104
98
|
encounter
|
|
105
99
|
end
|
|
106
100
|
|
|
@@ -136,8 +130,7 @@ module Lab
|
|
|
136
130
|
def add_measure_to_results(results_obs, params, date)
|
|
137
131
|
validate_measure_params(params)
|
|
138
132
|
|
|
139
|
-
concept_id = params[:indicator][:concept_id] || Concept.find_concept_by_uuid(params.dig(:indicator,
|
|
140
|
-
:concept))&.id
|
|
133
|
+
concept_id = params[:indicator][:concept_id] || Concept.find_concept_by_uuid(params.dig(:indicator, :concept))&.id
|
|
141
134
|
|
|
142
135
|
Observation.create!(
|
|
143
136
|
person_id: results_obs.person_id,
|
|
@@ -181,13 +174,6 @@ module Lab
|
|
|
181
174
|
else raise InvalidParameterError, "Invalid boolean value: #{string}"
|
|
182
175
|
end
|
|
183
176
|
end
|
|
184
|
-
|
|
185
|
-
def get_test_catalog_name(concept_id)
|
|
186
|
-
return nil unless concept_id
|
|
187
|
-
|
|
188
|
-
::ConceptAttribute.find_by(concept_id:,
|
|
189
|
-
attribute_type: ConceptAttributeType.test_catalogue_name)&.value_reference
|
|
190
|
-
end
|
|
191
177
|
end
|
|
192
178
|
end
|
|
193
179
|
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: 2.1.4.pre.
|
|
4
|
+
version: 2.1.4.pre.beta
|
|
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: 2026-01-
|
|
11
|
+
date: 2026-01-29 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: couchrest
|