his_emr_api_lab 1.1.9 → 1.1.12

Sign up to get free protection for your applications and to get access to all the features.
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