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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a13cacbcc7be1a44baac082c8ade406f20538dabe21c26b3b2ef249cd9ee22cd
4
- data.tar.gz: 9b0a9cfb4676982b299600078fa0421133af14a0b8d15dd49ac9ca1933fad7e0
3
+ metadata.gz: a64e5dbfcbbeff8e1574ebab38f4af1d637849468056f0d764a0f9d2833747b3
4
+ data.tar.gz: c8714fea2237f63b31bb2b33fa2b2e6a52e4d228c2ea63a0ceeb4be350c251d4
5
5
  SHA512:
6
- metadata.gz: 93092265b1d1cde16121ff005c901387e357040e32b05b3dff508564cde3832f8451e6805c7ca47c772abf90a47757a6cfd9a95084962b148cbdf7819f3a3493
7
- data.tar.gz: d2d1dded33ca89b66ad8d99c477fa373f6cc8c33958cc17192fb1a7691abaf4802ebc800c63006ff46d64e527a630ce263c0edddc1db368d67b2848406fd997c
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
- # Doing this after .each above to stop ActiveRecord from executing
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['accession_number']} from LIMS")
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['accession_number']} in LIMS")
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
- nil
61
+ fix_duplicates!(order)
64
62
  else
65
- Rails.logger.info("Creating order ##{order_dto['accession_number']} in LIMS")
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(log_path("#{worker_name}.log"), $stdout)
48
- # ActiveRecord::Base.logger = Rails.logger
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lab
4
- VERSION = '1.1.9'
4
+ VERSION = '1.1.12'
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: 1.1.9
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-23 00:00:00.000000000 Z
11
+ date: 2021-08-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: couchrest