his_emr_api_lab 1.1.6 → 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: 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