his_emr_api_lab 1.1.9 → 1.1.12
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/api/rest_api.rb +3 -23
- data/app/services/lab/lims/push_worker.rb +40 -12
- data/app/services/lab/lims/worker.rb +9 -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: a64e5dbfcbbeff8e1574ebab38f4af1d637849468056f0d764a0f9d2833747b3
|
4
|
+
data.tar.gz: c8714fea2237f63b31bb2b33fa2b2e6a52e4d228c2ea63a0ceeb4be350c251d4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fea82ce152d7f5b2e5a6a2e4d0565c42d409bd6301fb449c645f24db7f4f3b6a014e7db9ee9478c0a63d4fa3807ba3cf8f2785a1093fe77dcf02e765f0a6c14f
|
7
|
+
data.tar.gz: ab53beacd38b5c8ae75f5e93e63db7d57d56533565acfce963aa3df8464fbebdfb9170cb5740f97a4fd902a57861c0b65100c0dda81cb3572389a0222550148a
|
@@ -44,9 +44,6 @@ class Lab::Lims::Api::RestApi
|
|
44
44
|
|
45
45
|
def consume_orders(*_args, patient_id: nil, **_kwargs)
|
46
46
|
orders_pending_updates(patient_id).each do |order|
|
47
|
-
mapping = Lab::LimsOrderMapping.find_by(order_id: order.order_id)
|
48
|
-
next if mapping.nil? || check_and_fix_duplicate!(mapping, order)
|
49
|
-
|
50
47
|
order_dto = Lab::Lims::OrderSerializer.serialize_order(order)
|
51
48
|
|
52
49
|
if order_dto['priority'].nil? || order_dto['sample_type'].casecmp?('not_specified')
|
@@ -389,6 +386,7 @@ class Lab::Lims::Api::RestApi
|
|
389
386
|
unknown_specimen = ConceptName.where(name: Lab::Metadata::UNKNOWN_SPECIMEN)
|
390
387
|
.select(:concept_id)
|
391
388
|
orders = Lab::LabOrder.where(concept_id: unknown_specimen)
|
389
|
+
.where.not(accession_number: Lab::LimsOrderMapping.select(:lims_id))
|
392
390
|
orders = orders.where(patient_id: patient_id) if patient_id
|
393
391
|
|
394
392
|
orders
|
@@ -397,6 +395,7 @@ class Lab::Lims::Api::RestApi
|
|
397
395
|
def orders_without_results(patient_id = nil)
|
398
396
|
Rails.logger.debug('Looking for orders without a result')
|
399
397
|
Lab::OrdersSearchService.find_orders_without_results(patient_id: patient_id)
|
398
|
+
.where.not(accession_number: Lab::LimsOrderMapping.select(:lims_id))
|
400
399
|
end
|
401
400
|
|
402
401
|
def orders_without_reason(patient_id = nil)
|
@@ -404,28 +403,9 @@ class Lab::Lims::Api::RestApi
|
|
404
403
|
orders = Lab::LabOrder.joins(:reason_for_test)
|
405
404
|
.merge(Observation.where(value_coded: nil, value_text: nil))
|
406
405
|
.limit(1000)
|
406
|
+
.where.not(accession_number: Lab::LimsOrderMapping.select(:lims_id))
|
407
407
|
orders = orders.where(patient_id: patient_id) if patient_id
|
408
408
|
|
409
409
|
orders
|
410
410
|
end
|
411
|
-
|
412
|
-
# Checks for duplicates previously created due to this proving orders that have
|
413
|
-
# not been pushed to LIMS as orders awaiting updates.
|
414
|
-
def check_and_fix_duplicate!(mapping, order)
|
415
|
-
duplicate_orders = Lab::LabOrder.where(accession_number: mapping.lims_id)
|
416
|
-
.where.not(order_id: mapping.order_id)
|
417
|
-
return false if duplicate_orders.size.zero?
|
418
|
-
|
419
|
-
unless order.discontinued
|
420
|
-
order.void('Duplicate created due to bug in HIS-EMR-API-Lab v1.1.7')
|
421
|
-
mapping.destroy
|
422
|
-
return true
|
423
|
-
end
|
424
|
-
|
425
|
-
duplicate_orders.each do |duplicate_order|
|
426
|
-
duplicate_order.void("Has duplicate that contains updates ##{order.order_id}: Duplicate was created by bug in HIS-EMR-API-Lab v1.1.7")
|
427
|
-
end
|
428
|
-
|
429
|
-
true
|
430
|
-
end
|
431
411
|
end
|
@@ -17,21 +17,17 @@ module Lab
|
|
17
17
|
loop do
|
18
18
|
logger.info('Looking for new orders to push to LIMS...')
|
19
19
|
orders = orders_pending_sync(batch_size).all
|
20
|
+
|
21
|
+
logger.debug("Found #{orders.size} orders...")
|
20
22
|
orders.each do |order|
|
21
23
|
push_order(order)
|
22
24
|
rescue GatewayError => e
|
23
25
|
logger.error("Failed to push order ##{order.accession_number}: #{e.class} - #{e.message}")
|
24
|
-
sleep(Lab::Lims::Config.updates_poll_frequency)
|
25
26
|
end
|
26
27
|
|
27
|
-
|
28
|
-
# an extra request to the database (ActiveRecord's lazy evaluation
|
29
|
-
# sometimes leads to unnecessary database hits for checking counts).
|
30
|
-
if orders.empty? && !wait
|
31
|
-
logger.info('Finished processing orders; exiting...')
|
32
|
-
break
|
33
|
-
end
|
28
|
+
break unless wait
|
34
29
|
|
30
|
+
logger.info('Waiting for orders...')
|
35
31
|
sleep(Lab::Lims::Config.updates_poll_frequency)
|
36
32
|
end
|
37
33
|
end
|
@@ -51,18 +47,20 @@ module Lab
|
|
51
47
|
|
52
48
|
ActiveRecord::Base.transaction do
|
53
49
|
if mapping && !order.voided.zero?
|
54
|
-
Rails.logger.info("Deleting order ##{order_dto[
|
50
|
+
Rails.logger.info("Deleting order ##{order_dto[:accession_number]} from LIMS")
|
55
51
|
lims_api.delete_order(mapping.lims_id, order_dto)
|
56
52
|
mapping.destroy
|
57
53
|
elsif mapping
|
58
|
-
Rails.logger.info("Updating order ##{order_dto[
|
54
|
+
Rails.logger.info("Updating order ##{order_dto[:accession_number]} in LIMS")
|
59
55
|
lims_api.update_order(mapping.lims_id, order_dto)
|
60
56
|
mapping.update(pushed_at: Time.now)
|
61
57
|
elsif order_dto[:_id] && Lab::LimsOrderMapping.where(lims_id: order_dto[:_id]).exists?
|
58
|
+
# HACK: v1.1.7 had a bug where duplicates of recently created orders where being created by
|
59
|
+
# the pull worker. This here detects those duplicates and voids them.
|
62
60
|
Rails.logger.warn("Duplicate accession number found: #{order_dto[:_id]}, skipping order...")
|
63
|
-
|
61
|
+
fix_duplicates!(order)
|
64
62
|
else
|
65
|
-
Rails.logger.info("Creating order ##{order_dto[
|
63
|
+
Rails.logger.info("Creating order ##{order_dto[:accession_number]} in LIMS")
|
66
64
|
update = lims_api.create_order(order_dto)
|
67
65
|
Lab::LimsOrderMapping.create!(order: order, lims_id: update['id'], revision: update['rev'],
|
68
66
|
pushed_at: Time.now)
|
@@ -85,6 +83,7 @@ module Lab
|
|
85
83
|
def new_orders
|
86
84
|
Rails.logger.debug('Looking for new orders that need to be created in LIMS...')
|
87
85
|
Lab::LabOrder.where.not(order_id: Lab::LimsOrderMapping.all.select(:order_id))
|
86
|
+
.order(date_created: :desc)
|
88
87
|
end
|
89
88
|
|
90
89
|
def updated_orders
|
@@ -98,6 +97,7 @@ module Lab
|
|
98
97
|
OR obs.date_created > :last_updated',
|
99
98
|
last_updated: last_updated)
|
100
99
|
.group('orders.order_id')
|
100
|
+
.order(discontinued_date: :desc, date_created: :desc)
|
101
101
|
end
|
102
102
|
|
103
103
|
def voided_orders
|
@@ -106,6 +106,34 @@ module Lab
|
|
106
106
|
.where(order_type: OrderType.where(name: Lab::Metadata::ORDER_TYPE_NAME),
|
107
107
|
order_id: Lab::LimsOrderMapping.all.select(:order_id),
|
108
108
|
voided: 1)
|
109
|
+
.order(date_voided: :desc)
|
110
|
+
end
|
111
|
+
|
112
|
+
##
|
113
|
+
# HACK: Checks for duplicates previously created by version 1.1.7 pull worker bug due to this proving orders
|
114
|
+
# that have not been pushed to LIMS as orders awaiting updates.
|
115
|
+
def fix_duplicates!(order)
|
116
|
+
return order.void('Duplicate created by bug in HIS-EMR-API-Lab v1.1.7') unless order_has_specimen?(order)
|
117
|
+
|
118
|
+
duplicate_order = Lab::LabOrder.where(accession_number: order.accession_number)
|
119
|
+
.where.not(order_id: order.order_id)
|
120
|
+
.first
|
121
|
+
return unless duplicate_order
|
122
|
+
|
123
|
+
if !order_has_results?(order) && (order_has_results?(duplicate_order) || order_has_specimen?(duplicate_order))
|
124
|
+
order.void('DUplicate created by bug in HIS-EMR-API-Lab v1.1.7')
|
125
|
+
else
|
126
|
+
duplicate_order.void('Duplicate created by bug in HIS-EMR-API-Lab v1.1.7')
|
127
|
+
Lab::LimsOrderMapping.find_by_lims_id(order.accession_number)&.destroy
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
def order_has_results?(order)
|
132
|
+
order.results.exists?
|
133
|
+
end
|
134
|
+
|
135
|
+
def order_has_specimen?(order)
|
136
|
+
order.concept_id == ConceptName.find_by_name!('Unknown').concept_id
|
109
137
|
end
|
110
138
|
end
|
111
139
|
end
|
@@ -43,9 +43,12 @@ module Lab
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
LOG_FILES_TO_KEEP = 5
|
47
|
+
LOG_FILE_SIZE = 500.megabytes
|
48
|
+
|
46
49
|
def self.start_worker(worker_name)
|
47
|
-
Rails.logger = LoggerMultiplexor.new(
|
48
|
-
|
50
|
+
Rails.logger = LoggerMultiplexor.new(file_logger(worker_name), $stdout)
|
51
|
+
ActiveRecord::Base.logger = Rails.logger
|
49
52
|
Rails.logger.level = :debug
|
50
53
|
|
51
54
|
File.open(log_path("#{worker_name}.lock"), File::RDWR | File::CREAT, 0o644) do |fout|
|
@@ -60,6 +63,10 @@ module Lab
|
|
60
63
|
end
|
61
64
|
end
|
62
65
|
|
66
|
+
def self.file_logger(worker_name)
|
67
|
+
Logger.new(log_path("#{worker_name}.log"), LOG_FILES_TO_KEEP, LOG_FILE_SIZE)
|
68
|
+
end
|
69
|
+
|
63
70
|
def self.log_path(filename)
|
64
71
|
Lab::Lims::Utils::LIMS_LOG_PATH.join(filename)
|
65
72
|
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: 1.1.
|
4
|
+
version: 1.1.12
|
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-08-
|
11
|
+
date: 2021-08-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: couchrest
|