his_emr_api_lab 1.1.24 → 1.1.26
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/models/lab/lab_acknowledgement.rb +6 -0
- data/app/services/lab/acknowledgement_service.rb +44 -0
- data/app/services/lab/lims/acknowledgement_serializer.rb +29 -0
- data/app/services/lab/lims/acknowledgement_worker.rb +37 -0
- data/app/services/lab/lims/api/rest_api.rb +11 -1
- data/app/services/lab/lims/order_serializer.rb +1 -0
- data/app/services/lab/lims/worker.rb +8 -0
- data/app/services/lab/results_service.rb +17 -9
- data/lib/lab/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 775a892a4617d90d67a28f1bf22a88b24a2c41a9fc288b8ec06e485bf6437269
|
4
|
+
data.tar.gz: e626bd34e7b4baa2eb9979caef87a819e7f87466ec28c70113fa9aba12efead7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5c248c75193b97da5c79f71f47aafb8ab7abdd8d069a4b4b9e61842e3f1529e20c56edb3adcef6411e4a9a8839bb185e01ddb2f0e0f02eac85bc14a1e99fa025
|
7
|
+
data.tar.gz: 2f5b12505060dfcc8d1b6f1e0e1256d78d9853e6e8a1cee56859bac2868431c56755d29ac41cf5d14055c5848b2df184a9add39254e67998f438b9670d6fc364
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lab
|
4
|
+
# acknoledgement service for creating lab acknowledgements
|
5
|
+
module AcknowledgementService
|
6
|
+
class << self
|
7
|
+
def create_acknowledgement(params)
|
8
|
+
order = Order.find(params[:order_id])
|
9
|
+
Lab::LabAcknowledgement.create!(order_id: order.id, test: params[:test], pushed: false,
|
10
|
+
acknowledgement_type: params[:entered_by] == 'LIMS' ? 'test_results_delivered_to_site_electronically' : 'test_results_delivered_to_site_manually',
|
11
|
+
date_received: params[:date_received])
|
12
|
+
end
|
13
|
+
|
14
|
+
def acknowledgements_pending_sync(batch_size)
|
15
|
+
Lab::LabAcknowledgement.where(pushed: false)
|
16
|
+
.limit(batch_size)
|
17
|
+
end
|
18
|
+
|
19
|
+
def push_acknowledgement(acknowledgement, lims_api)
|
20
|
+
Rails.logger.info("Pushing acknowledgement ##{acknowledgement.order_id}")
|
21
|
+
|
22
|
+
acknowledgement_dto = Lab::Lims::AcknowledgementSerializer.serialize_acknowledgement(acknowledgement)
|
23
|
+
mapping = Lab::LimsOrderMapping.find_by(order_id: acknowledgement.order_id)
|
24
|
+
|
25
|
+
ActiveRecord::Base.transaction do
|
26
|
+
if mapping
|
27
|
+
Rails.logger.info("Updating acknowledgement ##{acknowledgement_dto[:tracking_number]} in LIMS")
|
28
|
+
response = lims_api.acknowledge(acknowledgement_dto)
|
29
|
+
Rails.logger.info("Info #{response}")
|
30
|
+
if response['status'] == 200 || response['message'] == 'results already delivered for test name given'
|
31
|
+
acknowledgement.pushed = true
|
32
|
+
acknowledgement.date_pushed = Time.now
|
33
|
+
acknowledgement.save!
|
34
|
+
else
|
35
|
+
Rails.logger.error("Failed to process acknowledgement for tracking number ##{acknowledgement_dto[:tracking_number]} in LIMS")
|
36
|
+
end
|
37
|
+
else
|
38
|
+
Rails.logger.info("No mapping found for acknowledgement ##{acknowledgement_dto[:tracking_number]}")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lab
|
4
|
+
module Lims
|
5
|
+
##
|
6
|
+
# Serialize a Lab::LabResult to LIMS' acknowledgement format
|
7
|
+
module AcknowledgementSerializer
|
8
|
+
class << self
|
9
|
+
include Utils
|
10
|
+
|
11
|
+
def serialize_acknowledgement(acknowledgement)
|
12
|
+
serialized_acknowledgement = Lims::Utils.structify(acknowledgement)
|
13
|
+
{
|
14
|
+
tracking_number: Lab::LabOrder.find(serialized_acknowledgement.order_id).accession_number,
|
15
|
+
test: ::ConceptName.where(concept_id: serialized_acknowledgement.test, concept_name_type: nil).first.name,
|
16
|
+
date_acknowledged: format_date(serialized_acknowledgement.date_received),
|
17
|
+
recipient_type: serialized_acknowledgement.acknowledgement_type
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def format_date(date)
|
24
|
+
date.strftime('%Y-%m-%d %H:%M:%S')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Lab
|
4
|
+
module Lims
|
5
|
+
# This class is responsible for handling the acknowledgement of lab orders
|
6
|
+
class AcknowledgementWorker
|
7
|
+
attr_reader :lims_api
|
8
|
+
|
9
|
+
include Utils # for logger
|
10
|
+
|
11
|
+
SECONDS_TO_WAIT_FOR_ORDERS = 30
|
12
|
+
|
13
|
+
def initialize(lims_api)
|
14
|
+
@lims_api = lims_api
|
15
|
+
end
|
16
|
+
|
17
|
+
def push_acknowledgement(batch_size: 1000, wait: false)
|
18
|
+
loop do
|
19
|
+
logger.info('Looking for new acknowledgements to push to LIMS...')
|
20
|
+
acknowledgements = Lab::AcknowledgementService.acknowledgements_pending_sync(batch_size).all
|
21
|
+
|
22
|
+
logger.debug("Found #{acknowledgements.size} acknowledgements...")
|
23
|
+
acknowledgements.each do |acknowledgement|
|
24
|
+
Lab::AcknowledgementService.push_acknowledgement(acknowledgement, @lims_api)
|
25
|
+
rescue GatewayError => e
|
26
|
+
logger.error("Failed to push acknowledgement ##{acknowledgement.order_id}: #{e.class} - #{e.message}")
|
27
|
+
end
|
28
|
+
|
29
|
+
break unless wait
|
30
|
+
|
31
|
+
logger.info('Waiting for acknowledgements...')
|
32
|
+
sleep(Lab::Lims::Config.updates_poll_frequency)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -32,6 +32,15 @@ class Lab::Lims::Api::RestApi
|
|
32
32
|
)
|
33
33
|
end
|
34
34
|
|
35
|
+
def acknowledge(acknowledgement_dto)
|
36
|
+
Rails.logger.info("Acknowledging order ##{acknowledgement_dto} in LIMS")
|
37
|
+
response = in_authenticated_session do |headers|
|
38
|
+
RestClient.post(expand_uri('/acknowledge/test/results/recipient'), acknowledgement_dto, headers)
|
39
|
+
end
|
40
|
+
Rails.logger.info("Acknowledged order ##{acknowledgement_dto} in LIMS. Response: #{response}")
|
41
|
+
JSON.parse(response)
|
42
|
+
end
|
43
|
+
|
35
44
|
def update_order(_id, order_dto)
|
36
45
|
in_authenticated_session do |headers|
|
37
46
|
RestClient.post(expand_uri('update_order'), make_update_params(order_dto), headers)
|
@@ -191,6 +200,7 @@ class Lab::Lims::Api::RestApi
|
|
191
200
|
arv_number: order_dto.fetch(:patient).fetch(:arv_number),
|
192
201
|
art_regimen: order_dto.fetch(:patient).fetch(:art_regimen),
|
193
202
|
art_start_date: order_dto.fetch(:patient).fetch(:art_start_date),
|
203
|
+
date_of_birth: order_dto.fetch(:patient).fetch(:dob),
|
194
204
|
national_patient_id: order_dto.fetch(:patient).fetch(:id),
|
195
205
|
requesting_clinician: requesting_clinician(order_dto),
|
196
206
|
sample_type: order_dto.fetch(:sample_type),
|
@@ -380,7 +390,7 @@ class Lab::Lims::Api::RestApi
|
|
380
390
|
orders_without_specimen(patient_id).each { |order| orders[order.order_id] = order }
|
381
391
|
orders_without_results(patient_id).each { |order| orders[order.order_id] = order }
|
382
392
|
orders_without_reason(patient_id).each { |order| orders[order.order_id] = order }
|
383
|
-
|
393
|
+
|
384
394
|
orders.values
|
385
395
|
end
|
386
396
|
|
@@ -67,6 +67,7 @@ module Lab
|
|
67
67
|
arv_number: find_arv_number(patient_id),
|
68
68
|
art_regimen: find_current_regimen(patient_id),
|
69
69
|
art_start_date: find_art_start_date(patient_id),
|
70
|
+
dob: person.birthdate,
|
70
71
|
phone_number: phone_number&.value || 'Unknown',
|
71
72
|
gender: person.gender,
|
72
73
|
email: nil
|
@@ -14,6 +14,7 @@ module Lab
|
|
14
14
|
|
15
15
|
fork(&method(:start_push_worker))
|
16
16
|
fork(&method(:start_pull_worker))
|
17
|
+
fork(&method(:start_acknowledgement_worker))
|
17
18
|
fork(&method(:start_realtime_pull_worker)) if realtime_updates_enabled?
|
18
19
|
|
19
20
|
Process.waitall
|
@@ -27,6 +28,13 @@ module Lab
|
|
27
28
|
end
|
28
29
|
end
|
29
30
|
|
31
|
+
def self.start_acknowledgement_worker
|
32
|
+
start_worker('acknowledgement_worker') do
|
33
|
+
worker = AcknowledgementWorker.new(lims_api)
|
34
|
+
worker.push_acknowledgement
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
30
38
|
def self.start_pull_worker
|
31
39
|
start_worker('pull_worker') do
|
32
40
|
worker = PullWorker.new(lims_api)
|
@@ -32,22 +32,30 @@ module Lab
|
|
32
32
|
|
33
33
|
serializer = Lab::ResultSerializer.serialize(results_obs)
|
34
34
|
end
|
35
|
-
|
35
|
+
process_acknowledgement(results_obs, result_enter_by)
|
36
|
+
precess_notification_message(results_obs, serializer, result_enter_by)
|
36
37
|
Rails.logger.info("Lab::ResultsService: Result created for test #{test_id} #{serializer}")
|
37
38
|
serializer
|
38
39
|
end
|
39
40
|
|
40
41
|
private
|
41
42
|
|
42
|
-
def
|
43
|
+
def precess_notification_message(result, values, result_enter_by)
|
43
44
|
order = Order.find(result.order_id)
|
44
|
-
{ Type: result_enter_by,
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
45
|
+
data = { Type: result_enter_by,
|
46
|
+
'Test type': ConceptName.find_by(concept_id: result.test.value_coded)&.name,
|
47
|
+
'Accession number': order&.accession_number,
|
48
|
+
'ARV-Number': find_arv_number(result.person_id),
|
49
|
+
PatientID: result.person_id,
|
50
|
+
'Ordered By': order&.provider&.person&.name,
|
51
|
+
Result: values }.as_json
|
52
|
+
NotificationService.new.create_notification(result_enter_by, data)
|
53
|
+
end
|
54
|
+
|
55
|
+
def process_acknowledgement(results, results_enter_by)
|
56
|
+
Lab::AcknowledgementService.create_acknowledgement({ order_id: results.order_id, test: results.test.value_coded,
|
57
|
+
date_received: Time.now,
|
58
|
+
entered_by: results_enter_by })
|
51
59
|
end
|
52
60
|
|
53
61
|
def find_arv_number(patient_id)
|
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: 1.1.
|
4
|
+
version: 1.1.26
|
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:
|
11
|
+
date: 2023-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: couchrest
|
@@ -254,6 +254,7 @@ files:
|
|
254
254
|
- app/mailers/lab/application_mailer.rb
|
255
255
|
- app/models/lab/application_record.rb
|
256
256
|
- app/models/lab/lab_accession_number_counter.rb
|
257
|
+
- app/models/lab/lab_acknowledgement.rb
|
257
258
|
- app/models/lab/lab_encounter.rb
|
258
259
|
- app/models/lab/lab_order.rb
|
259
260
|
- app/models/lab/lab_result.rb
|
@@ -264,8 +265,11 @@ files:
|
|
264
265
|
- app/serializers/lab/result_serializer.rb
|
265
266
|
- app/serializers/lab/test_serializer.rb
|
266
267
|
- app/services/lab/accession_number_service.rb
|
268
|
+
- app/services/lab/acknowledgement_service.rb
|
267
269
|
- app/services/lab/concepts_service.rb
|
268
270
|
- app/services/lab/labelling_service/order_label.rb
|
271
|
+
- app/services/lab/lims/acknowledgement_serializer.rb
|
272
|
+
- app/services/lab/lims/acknowledgement_worker.rb
|
269
273
|
- app/services/lab/lims/api/blackhole_api.rb
|
270
274
|
- app/services/lab/lims/api/couchdb_api.rb
|
271
275
|
- app/services/lab/lims/api/mysql_api.rb
|