his_emr_api_lab 1.1.6 → 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 -0
- data/app/services/lab/lims/config.rb +1 -1
- data/app/services/lab/lims/order_dto.rb +1 -1
- data/app/services/lab/lims/push_worker.rb +42 -11
- data/app/services/lab/lims/worker.rb +8 -1
- data/db/migrate/20210807111531_add_default_to_lims_order_mapping.rb +1 -1
- data/lib/lab/version.rb +1 -1
- metadata +3 -3
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
|
@@ -386,6 +386,7 @@ class Lab::Lims::Api::RestApi
|
|
386
386
|
unknown_specimen = ConceptName.where(name: Lab::Metadata::UNKNOWN_SPECIMEN)
|
387
387
|
.select(:concept_id)
|
388
388
|
orders = Lab::LabOrder.where(concept_id: unknown_specimen)
|
389
|
+
.where.not(accession_number: Lab::LimsOrderMapping.select(:lims_id))
|
389
390
|
orders = orders.where(patient_id: patient_id) if patient_id
|
390
391
|
|
391
392
|
orders
|
@@ -394,6 +395,7 @@ class Lab::Lims::Api::RestApi
|
|
394
395
|
def orders_without_results(patient_id = nil)
|
395
396
|
Rails.logger.debug('Looking for orders without a result')
|
396
397
|
Lab::OrdersSearchService.find_orders_without_results(patient_id: patient_id)
|
398
|
+
.where.not(accession_number: Lab::LimsOrderMapping.select(:lims_id))
|
397
399
|
end
|
398
400
|
|
399
401
|
def orders_without_reason(patient_id = nil)
|
@@ -401,6 +403,7 @@ class Lab::Lims::Api::RestApi
|
|
401
403
|
orders = Lab::LabOrder.joins(:reason_for_test)
|
402
404
|
.merge(Observation.where(value_coded: nil, value_text: nil))
|
403
405
|
.limit(1000)
|
406
|
+
.where.not(accession_number: Lab::LimsOrderMapping.select(:lims_id))
|
404
407
|
orders = orders.where(patient_id: patient_id) if patient_id
|
405
408
|
|
406
409
|
orders
|
@@ -32,7 +32,7 @@ module Lab
|
|
32
32
|
def specimen_type_id
|
33
33
|
lims_specimen_name = self['sample_type']&.strip&.downcase
|
34
34
|
|
35
|
-
if %w[specimen_not_collected not_assigned not_specified].include?(lims_specimen_name)
|
35
|
+
if lims_specimen_name.nil? || %w[specimen_not_collected not_assigned not_specified].include?(lims_specimen_name)
|
36
36
|
return ConceptName.select(:concept_id).find_by_name!('Unknown').concept_id
|
37
37
|
end
|
38
38
|
|
@@ -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,15 +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)
|
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.
|
60
|
+
Rails.logger.warn("Duplicate accession number found: #{order_dto[:_id]}, skipping order...")
|
61
|
+
fix_duplicates!(order)
|
61
62
|
else
|
62
|
-
Rails.logger.info("Creating order ##{order_dto[
|
63
|
+
Rails.logger.info("Creating order ##{order_dto[:accession_number]} in LIMS")
|
63
64
|
update = lims_api.create_order(order_dto)
|
64
65
|
Lab::LimsOrderMapping.create!(order: order, lims_id: update['id'], revision: update['rev'],
|
65
66
|
pushed_at: Time.now)
|
@@ -82,6 +83,7 @@ module Lab
|
|
82
83
|
def new_orders
|
83
84
|
Rails.logger.debug('Looking for new orders that need to be created in LIMS...')
|
84
85
|
Lab::LabOrder.where.not(order_id: Lab::LimsOrderMapping.all.select(:order_id))
|
86
|
+
.order(date_created: :desc)
|
85
87
|
end
|
86
88
|
|
87
89
|
def updated_orders
|
@@ -95,6 +97,7 @@ module Lab
|
|
95
97
|
OR obs.date_created > :last_updated',
|
96
98
|
last_updated: last_updated)
|
97
99
|
.group('orders.order_id')
|
100
|
+
.order(discontinued_date: :desc, date_created: :desc)
|
98
101
|
end
|
99
102
|
|
100
103
|
def voided_orders
|
@@ -103,6 +106,34 @@ module Lab
|
|
103
106
|
.where(order_type: OrderType.where(name: Lab::Metadata::ORDER_TYPE_NAME),
|
104
107
|
order_id: Lab::LimsOrderMapping.all.select(:order_id),
|
105
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
|
106
137
|
end
|
107
138
|
end
|
108
139
|
end
|
@@ -43,8 +43,11 @@ 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(
|
50
|
+
Rails.logger = LoggerMultiplexor.new(file_logger(worker_name), $stdout)
|
48
51
|
ActiveRecord::Base.logger = Rails.logger
|
49
52
|
Rails.logger.level = :debug
|
50
53
|
|
@@ -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
|
@@ -1,6 +1,6 @@
|
|
1
1
|
class AddDefaultToLimsOrderMapping < ActiveRecord::Migration[5.2]
|
2
2
|
def up
|
3
|
-
|
3
|
+
change_column :lab_lims_order_mappings, :revision, :string, limit: 256, default: nil, null: true
|
4
4
|
end
|
5
5
|
|
6
6
|
def down; 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
|
@@ -331,7 +331,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
331
331
|
- !ruby/object:Gem::Version
|
332
332
|
version: '0'
|
333
333
|
requirements: []
|
334
|
-
rubygems_version: 3.
|
334
|
+
rubygems_version: 3.1.4
|
335
335
|
signing_key:
|
336
336
|
specification_version: 4
|
337
337
|
summary: Lab extension for the HIS-EMR-API
|