his_emr_api_lab 2.3.5 → 2.3.7
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/controllers/lab/orders_controller.rb +5 -1
- data/app/services/lab/acknowledgement_service.rb +3 -4
- data/app/services/lab/lims/acknowledgement_worker.rb +16 -2
- data/app/services/lab/lims/exceptions.rb +7 -6
- data/app/services/lab/orders_service.rb +17 -2
- 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: aa10ff237ade4cbd630628c0511ca04f8ab31e076a8b9b6f8413a4e0dde444f9
|
|
4
|
+
data.tar.gz: 4ca6cf07011ac9117fa00b0fee436e353dd5faad5cb71ed50656b89b4826c98e
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1a6aba5b3b1339126fd2f7f16959b1d1f1a11381d1d790eeeaca9909383fcd8324c3896b1a94d75aa9c19edc7ae7b7aafdbfb95b59073ff68b66be35732fc97e
|
|
7
|
+
data.tar.gz: 4964fbb342fc54ff534c0d90d6c43191492deb9401b7e4278ed5921be74bc32ea84cd6adbc6f6dca5c82a1fd8f6120a8412ce08b58fa55634825ae1bccb45193
|
|
@@ -58,6 +58,10 @@ module Lab
|
|
|
58
58
|
def verify_tracking_number
|
|
59
59
|
tracking_number = params.require(:accession_number)
|
|
60
60
|
render json: { exists: OrdersService.check_tracking_number(tracking_number) }, status: :ok
|
|
61
|
+
rescue Lab::Lims::ValidationUnavailable => e
|
|
62
|
+
# Return 502 Bad Gateway to indicate the external service is unavailable
|
|
63
|
+
# This allows the frontend to prompt user for confirmation
|
|
64
|
+
render json: { errors: [e.message] }, status: :bad_gateway
|
|
61
65
|
end
|
|
62
66
|
|
|
63
67
|
def destroy
|
|
@@ -74,7 +78,7 @@ module Lab
|
|
|
74
78
|
|
|
75
79
|
def order_status
|
|
76
80
|
order_params = params.permit(:tracking_number, :status, :status_time, :comments, :status_id,
|
|
77
|
-
|
|
81
|
+
updated_by: %i[first_name last_name id phone_number])
|
|
78
82
|
OrdersService.update_order_status(order_params)
|
|
79
83
|
render json: { message: "Status for order #{order_params['tracking_number']} successfully updated" }, status: :ok
|
|
80
84
|
end
|
|
@@ -14,12 +14,11 @@ module Lab
|
|
|
14
14
|
date_received: params[:date_received])
|
|
15
15
|
end
|
|
16
16
|
|
|
17
|
-
def acknowledgements_pending_sync(batch_size, start_date: nil)
|
|
17
|
+
def acknowledgements_pending_sync(batch_size, start_date: nil, last_order_id: 0)
|
|
18
18
|
query = Lab::LabAcknowledgement.joins(:order).where(pushed: false)
|
|
19
|
-
|
|
19
|
+
.where('lims_acknowledgement_statuses.order_id > ?', last_order_id)
|
|
20
20
|
query = query.where('orders.date_created >= ?', start_date) if start_date
|
|
21
|
-
|
|
22
|
-
query.limit(batch_size)
|
|
21
|
+
query.order('lims_acknowledgement_statuses.order_id ASC').limit(batch_size)
|
|
23
22
|
end
|
|
24
23
|
|
|
25
24
|
def push_acknowledgement(acknowledgement, lims_api)
|
|
@@ -16,19 +16,33 @@ module Lab
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def push_acknowledgement(batch_size: 1000, wait: false)
|
|
19
|
+
last_order_id = 0
|
|
19
20
|
loop do
|
|
20
21
|
logger.info('Looking for new acknowledgements to push to LIMS...')
|
|
21
22
|
acknowledgements = Lab::AcknowledgementService.acknowledgements_pending_sync(batch_size,
|
|
22
|
-
start_date: start_date
|
|
23
|
+
start_date: start_date,
|
|
24
|
+
last_order_id: last_order_id).all
|
|
23
25
|
|
|
24
26
|
logger.debug("Found #{acknowledgements.size} acknowledgements...")
|
|
25
27
|
acknowledgements.each do |acknowledgement|
|
|
26
28
|
Lab::AcknowledgementService.push_acknowledgement(acknowledgement, @lims_api)
|
|
29
|
+
last_order_id = acknowledgement.order_id
|
|
27
30
|
rescue StandardError => e
|
|
28
31
|
logger.error("Failed to push acknowledgement ##{acknowledgement.order_id}: #{e.class} - #{e.message}")
|
|
29
32
|
end
|
|
30
33
|
|
|
31
|
-
|
|
34
|
+
# If no records found or not waiting, check if we should continue
|
|
35
|
+
if acknowledgements.empty?
|
|
36
|
+
break unless wait
|
|
37
|
+
elsif !wait && acknowledgements.size < batch_size
|
|
38
|
+
# Processed final partial batch in one-shot mode
|
|
39
|
+
logger.info("Processed final batch of #{acknowledgements.size} acknowledgements")
|
|
40
|
+
break
|
|
41
|
+
elsif !wait
|
|
42
|
+
# More records likely exist, continue processing
|
|
43
|
+
logger.info('Batch complete, checking for more acknowledgements...')
|
|
44
|
+
next
|
|
45
|
+
end
|
|
32
46
|
|
|
33
47
|
logger.info('Waiting for acknowledgements...')
|
|
34
48
|
sleep(Lab::Lims::Config.updates_poll_frequency)
|
|
@@ -8,17 +8,18 @@ module Lab
|
|
|
8
8
|
class MissingAccessionNumber < LimsException; end
|
|
9
9
|
class UnknownSpecimenType < LimsException; end
|
|
10
10
|
class UnknownTestType < LimsException; end
|
|
11
|
+
class ValidationUnavailable < LimsException; end
|
|
11
12
|
end
|
|
12
13
|
end
|
|
13
14
|
end
|
|
14
15
|
|
|
15
|
-
|
|
16
16
|
module Lab
|
|
17
17
|
module Lims
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
18
|
+
class LimsException < StandardError; end
|
|
19
|
+
class DuplicateNHID < LimsException; end
|
|
20
|
+
class MissingAccessionNumber < LimsException; end
|
|
21
|
+
class UnknownSpecimenType < LimsException; end
|
|
22
|
+
class UnknownTestType < LimsException; end
|
|
23
|
+
class ValidationUnavailable < LimsException; end
|
|
23
24
|
end
|
|
24
25
|
end
|
|
@@ -56,8 +56,14 @@ module Lab
|
|
|
56
56
|
|
|
57
57
|
Order.transaction do
|
|
58
58
|
encounter = find_encounter(order_params)
|
|
59
|
-
if order_params[:accession_number].present?
|
|
60
|
-
|
|
59
|
+
if order_params[:accession_number].present?
|
|
60
|
+
begin
|
|
61
|
+
raise 'Accession number already exists' if check_tracking_number(order_params[:accession_number])
|
|
62
|
+
rescue Lab::Lims::ValidationUnavailable => e
|
|
63
|
+
# Log warning but allow order creation to proceed
|
|
64
|
+
# User should have been prompted to confirm on the frontend
|
|
65
|
+
Rails.logger.warn("Creating order with unvalidated accession number: #{e.message}")
|
|
66
|
+
end
|
|
61
67
|
end
|
|
62
68
|
|
|
63
69
|
order = create_order(encounter, order_params)
|
|
@@ -364,6 +370,15 @@ module Lab
|
|
|
364
370
|
# fetch from the rest api and check if it exists
|
|
365
371
|
lims_api = Lab::Lims::ApiFactory.create_api
|
|
366
372
|
lims_api.verify_tracking_number(accession_number).present?
|
|
373
|
+
rescue StandardError => e
|
|
374
|
+
# Log the error for debugging
|
|
375
|
+
Rails.logger.error("Failed to verify accession number with NLIMS: #{e.message}")
|
|
376
|
+
Rails.logger.error(e.backtrace.join("\n"))
|
|
377
|
+
|
|
378
|
+
# Raise a specific exception indicating validation is unavailable
|
|
379
|
+
# This allows the controller to handle it differently than "accession exists"
|
|
380
|
+
raise Lab::Lims::ValidationUnavailable,
|
|
381
|
+
"Failed to communicate with external service: #{e.message}"
|
|
367
382
|
end
|
|
368
383
|
|
|
369
384
|
##
|
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.3.
|
|
4
|
+
version: 2.3.7
|
|
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-06-
|
|
11
|
+
date: 2026-06-19 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: couchrest
|