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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ec3adbde37c8f4213c049a83371cd30deb35a4833e3f95d5ace57bf9e2344e02
4
- data.tar.gz: 2b676b2060b642493906794747160939e9d5cec15e94f87cb35e486434e4a7cd
3
+ metadata.gz: a64e5dbfcbbeff8e1574ebab38f4af1d637849468056f0d764a0f9d2833747b3
4
+ data.tar.gz: c8714fea2237f63b31bb2b33fa2b2e6a52e4d228c2ea63a0ceeb4be350c251d4
5
5
  SHA512:
6
- metadata.gz: 232dbd10ff1f15f18432d3421e99ecce64ab5855c30fc0d6f028bfe3cce291f29d5954453c0f7bc6f9d9c27a5990ac16299677721188d4d0b981734ba23d283f
7
- data.tar.gz: 2f823d4b6edc2494f405002dc6681eb895ec7e961c817dd7c02b6688e286edf9a72b9467651d39d743d74a4bee094a4590150020002c3028a69d8534696af8de
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
@@ -12,7 +12,7 @@ module Lab
12
12
 
13
13
  class << self
14
14
  def preferred_api
15
- emr_api_application('lims_api', 'couchdb')
15
+ emr_api_application('lims_api')
16
16
  end
17
17
 
18
18
  ##
@@ -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
- # 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,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['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)
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['accession_number']} in LIMS")
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(log_path("#{worker_name}.log"), $stdout)
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
- ActiveRecord::Base.connection.execute('ALTER TABLE lab_lims_order_mappings MODIFY revision VARCHAR(256) DEFAULT NULL')
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lab
4
- VERSION = '1.1.6'
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.6
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-07 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
@@ -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.0.8
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