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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 306b46064eb5c58668eb1f4598d99258f1e76b69db42b90abe33d35ddd2434b0
4
- data.tar.gz: f367e1fdf5101dd25a2e64f83f61ac6eeffe4fee2007846da5037c18083d1b96
3
+ metadata.gz: 2cb84913a3c09866a51aa40a98812803bfee6f66a36c3e5c7ea4bdcb9a530724
4
+ data.tar.gz: 833074b20f473b97b515a11392fc768dabc0b3289b1717474e08b903120c6216
5
5
  SHA512:
6
- metadata.gz: a8e09ab538d005a20b43f41b0c47357c0440a8cb8508f223b4d3f9639c1b3df2dc87a3c6f33d3c6cecd5604c77a1b4cb36f14e335e0df52732280ca1256c41b6
7
- data.tar.gz: 47fdae979daa748c4dbc6fd1c291594b857a40b45e4f3adea3ecaae8fcb54275c2c77485e8bf2f2c222eddea66a1518f3c396236dbd56f4b4afcd9b16bfd4e76
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
- # Get the test catalog name instead of any random concept name
11
- concept_name = get_test_catalog_concept_name(measure.concept_id)
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.unscope(where: :obs_group_id).find(measure.obs_id)
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: measure.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(:concept_set).to_sql})
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}/exists", api_version: 'v2'), headers)
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...")
@@ -216,7 +216,7 @@ module Lab
216
216
  end
217
217
 
218
218
  next if test.result || test_results['results'].blank?
219
-
219
+
220
220
  result_date = Time.now
221
221
  measures = test_results['results'].map do |indicator, value|
222
222
  measure = find_measure(order, indicator, value)
@@ -78,12 +78,8 @@ module Lab
78
78
  end
79
79
 
80
80
  def self.find_concept_by_name(name)
81
- unescaped_name = CGI.unescapeHTML(name)
82
- attribute_type_id = ConceptAttributeType.test_catalogue_name.concept_attribute_type_id
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 = begin
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
- # Execute job synchronously
46
- ProcessLabResultJob.perform_now(results_obs.id, serializer, result_enter_by)
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: get_test_catalog_name(order.concept_id) || ConceptName.find_by(concept_id: order.concept_id)&.name,
63
- 'Test type': get_test_catalog_name(result.test.value_coded) || ConceptName.find_by(concept_id: result.test.value_coded)&.name,
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
- order_date: Order.columns.include?('start_date') ? order.start_date : order.date_created,
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
- # Use bracket notation to set the encounter_type column directly (bypasses association)
97
- # This handles both Integer and EncounterType object
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
- encounter.reload
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lab
4
- VERSION = '2.1.4-alpha'
4
+ VERSION = '2.1.4-beta'
5
5
  end
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.alpha
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-30 00:00:00.000000000 Z
11
+ date: 2026-01-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: couchrest