his_emr_api_lab 1.2.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -1
  3. data/app/controllers/lab/application_controller.rb +5 -0
  4. data/app/controllers/lab/orders_controller.rb +3 -3
  5. data/app/controllers/lab/specimen_types_controller.rb +1 -1
  6. data/app/controllers/lab/test_result_indicators_controller.rb +6 -4
  7. data/app/controllers/lab/test_types_controller.rb +1 -1
  8. data/app/controllers/lab/tests_controller.rb +20 -17
  9. data/app/jobs/lab/application_job.rb +2 -0
  10. data/app/jobs/lab/update_patient_orders_job.rb +1 -1
  11. data/app/mailers/lab/application_mailer.rb +2 -0
  12. data/app/models/lab/application_record.rb +2 -0
  13. data/app/models/lab/lab_order.rb +1 -1
  14. data/app/models/lab/lims_failed_import.rb +2 -0
  15. data/app/serializers/lab/lab_order_serializer.rb +2 -2
  16. data/app/serializers/lab/result_serializer.rb +2 -2
  17. data/app/services/lab/accession_number_service.rb +2 -2
  18. data/app/services/lab/concepts_service.rb +2 -2
  19. data/app/services/lab/labelling_service/order_label.rb +2 -2
  20. data/app/services/lab/lims/api/blackhole_api.rb +1 -1
  21. data/app/services/lab/lims/api/couchdb_api.rb +3 -3
  22. data/app/services/lab/lims/api/mysql_api.rb +6 -6
  23. data/app/services/lab/lims/api/rest_api.rb +378 -372
  24. data/app/services/lab/lims/api/ws_api.rb +1 -1
  25. data/app/services/lab/lims/api_factory.rb +1 -1
  26. data/app/services/lab/lims/config.rb +1 -1
  27. data/app/services/lab/lims/exceptions.rb +1 -0
  28. data/app/services/lab/lims/migrator.rb +11 -12
  29. data/app/services/lab/lims/order_dto.rb +4 -4
  30. data/app/services/lab/lims/order_serializer.rb +12 -12
  31. data/app/services/lab/lims/pull_worker.rb +14 -13
  32. data/app/services/lab/lims/push_worker.rb +5 -5
  33. data/app/services/lab/lims/utils.rb +4 -6
  34. data/app/services/lab/lims/worker.rb +1 -1
  35. data/app/services/lab/orders_search_service.rb +3 -3
  36. data/app/services/lab/orders_service.rb +5 -5
  37. data/app/services/lab/results_service.rb +3 -3
  38. data/app/services/lab/tests_service.rb +5 -5
  39. data/db/migrate/20210126092910_create_lab_lab_accession_number_counters.rb +2 -0
  40. data/db/migrate/20210310115457_create_lab_lims_order_mappings.rb +2 -0
  41. data/db/migrate/20210326195504_add_order_revision_to_lims_order_mapping.rb +2 -0
  42. data/db/migrate/20210610095024_fix_numeric_results_value_type.rb +2 -0
  43. data/db/migrate/20210807111531_add_default_to_lims_order_mapping.rb +2 -0
  44. data/lib/auto12epl.rb +55 -53
  45. data/lib/couch_bum/couch_bum.rb +4 -4
  46. data/lib/generators/lab/install/templates/rswag-ui-lab.rb +2 -0
  47. data/lib/his_emr_api_lab.rb +2 -0
  48. data/lib/lab/engine.rb +2 -0
  49. data/lib/lab/version.rb +1 -1
  50. data/lib/logger_multiplexor.rb +2 -2
  51. data/lib/tasks/lab_tasks.rake +2 -0
  52. data/lib/tasks/loaders/loader_mixin.rb +4 -4
  53. data/lib/tasks/loaders/reasons_for_test_loader.rb +1 -1
  54. data/lib/tasks/loaders/specimens_loader.rb +6 -7
  55. data/lib/tasks/loaders/test_result_indicators_loader.rb +5 -5
  56. metadata +12 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b30e492def430c355c0ac0a80c1c0af05d5fede383fa50f5664e3b9340b2180
4
- data.tar.gz: 948693f89c85c6a2111c8b10c1accd91fdbb2d9bea3ad8ef41157d7421af7fd1
3
+ metadata.gz: 314873736cb992217b9c0bab3446d7aa62f94f4b08e7f10b749894573d74811f
4
+ data.tar.gz: 163f43124d1952514ab77b7ef70b5d86b54c36d5daa8d41f4da0cdb7cf07ff38
5
5
  SHA512:
6
- metadata.gz: 69ec800aefa4f198dc16f392500723c47a6b1e24dd1b600b6646bf552c7c9a63533a7257810d7605128eab5f54c0c8ab76fe06ff60621f010209109675b7ba3e
7
- data.tar.gz: ae17044c979b38e3f6182d23b29d36aeb90845e9238d9c85f63c7d7971cc2ae99bb87a64d4684b33b2dbc16a871ebf0615e3ec92b589ea9040dcd3d6eefedd91
6
+ metadata.gz: dc26c5a5edecdadd4a108adc213c65d184d25bf114c6096f353accfcd00fcce16289695a7320f5119172c31857cbbc173140915be0a10619582a1db819015616
7
+ data.tar.gz: 131d6ee486442f33d5b0c87de7ecd2c190897aa9f423f5ad0bb98e73711d77b93a9464d0309313fb2945f452d6ce006c0f6b8d62124931a2a200f4b966ba3bf6
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  begin
2
4
  require 'bundler/setup'
3
5
  rescue LoadError
@@ -14,7 +16,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
16
  rdoc.rdoc_files.include('lib/**/*.rb')
15
17
  end
16
18
 
17
- APP_RAKEFILE = File.expand_path("spec/dummy/Rakefile", __dir__)
19
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
18
20
  load 'rails/tasks/engine.rake'
19
21
 
20
22
  load 'rails/tasks/statistics.rake'
@@ -2,5 +2,10 @@
2
2
 
3
3
  module Lab
4
4
  class ApplicationController < ::ApplicationController
5
+ before_action :permit_parameters
6
+
7
+ def permit_parameters
8
+ params.permit!
9
+ end
5
10
  end
6
11
  end
@@ -17,15 +17,15 @@ module Lab
17
17
  end
18
18
 
19
19
  def update
20
- specimen = params.require(:specimen).permit(:concept_id)
21
- order = OrdersService.update_order(params[:id], specimen: specimen, force_update: params[:force_update])
20
+ specimen = params.require(:specimen).slice(:concept_id)
21
+ order = OrdersService.update_order(params[:id], specimen:, force_update: params[:force_update])
22
22
  Lab::PushOrderJob.perform_later(order.fetch(:order_id))
23
23
 
24
24
  render json: order
25
25
  end
26
26
 
27
27
  def index
28
- filters = params.permit(%i[patient_id accession_number date status])
28
+ filters = params.slice(:patient_id, :accession_number, :date, :status)
29
29
 
30
30
  Lab::UpdatePatientOrdersJob.perform_later(filters[:patient_id]) if filters[:patient_id]
31
31
  render json: OrdersSearchService.find_orders(filters)
@@ -3,7 +3,7 @@
3
3
  module Lab
4
4
  class SpecimenTypesController < ApplicationController
5
5
  def index
6
- filters = params.permit(%w[name test_type])
6
+ filters = params.slice(:name, :test_type)
7
7
 
8
8
  specimen_types = ConceptsService.specimen_types(name: filters['name'],
9
9
  test_type: filters['test_type'])
@@ -1,9 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Lab::TestResultIndicatorsController < ApplicationController
4
- def index
5
- test_type_id = params.require(:test_type_id)
3
+ module Lab
4
+ class TestResultIndicatorsController < ApplicationController
5
+ def index
6
+ test_type_id = params.require(:test_type_id)
6
7
 
7
- render json: Lab::ConceptsService.test_result_indicators(test_type_id)
8
+ render json: Lab::ConceptsService.test_result_indicators(test_type_id)
9
+ end
8
10
  end
9
11
  end
@@ -3,7 +3,7 @@
3
3
  module Lab
4
4
  class TestTypesController < ApplicationController
5
5
  def index
6
- filters = params.permit(%w[name specimen_type])
6
+ filters = params.slice(:name, :specimen_type)
7
7
 
8
8
  test_types = ConceptsService.test_types(name: filters['name'],
9
9
  specimen_type: filters['specimen_type'])
@@ -1,26 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class Lab::TestsController < ::ApplicationController
4
- def index
5
- filters = params.permit(%i[order_date accession_number patient_id test_type_id specimen_type_id pending_results])
3
+ module Lab
4
+ class TestsController < ApplicationController
5
+ def index
6
+ filters = params.slice(:order_date, :accession_number, :patient_id, :test_type_id, :specimen_type_id,
7
+ :pending_results)
6
8
 
7
- tests = service.find_tests(filters)
8
- render json: tests
9
- end
9
+ tests = service.find_tests(filters)
10
+ render json: tests
11
+ end
10
12
 
11
- # Add a specimen to an existing order
12
- def create
13
- test_params = params.permit(:order_id, :date, tests: [:concept_id])
14
- order_id, test_concepts = test_params.require(%i[order_id tests])
15
- date = test_params[:date] || Date.today
13
+ # Add a specimen to an existing order
14
+ def create
15
+ test_params = params.slice(:order_id, :date, tests: [:concept_id])
16
+ order_id, test_concepts = test_params.require(%i[order_id tests])
17
+ date = test_params[:date] || Date.today
16
18
 
17
- tests = service.create_tests(Lab::LabOrder.find(order_id), date, test_concepts)
18
- Lab::PushOrderJob.perform_later(order_id)
19
+ tests = service.create_tests(Lab::LabOrder.find(order_id), date, test_concepts)
20
+ Lab::PushOrderJob.perform_later(order_id)
19
21
 
20
- render json: tests, status: :created
21
- end
22
+ render json: tests, status: :created
23
+ end
22
24
 
23
- def service
24
- Lab::TestsService
25
+ def service
26
+ Lab::TestsService
27
+ end
25
28
  end
26
29
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lab
2
4
  class ApplicationJob < ActiveJob::Base
3
5
  end
@@ -21,7 +21,7 @@ module Lab
21
21
  end
22
22
 
23
23
  worker = Lab::Lims::PullWorker.new(Lab::Lims::ApiFactory.create_api)
24
- worker.pull_orders(patient_id: patient_id)
24
+ worker.pull_orders(patient_id:)
25
25
 
26
26
  true
27
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lab
2
4
  class ApplicationMailer < ActionMailer::Base
3
5
  default from: 'from@example.com'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lab
2
4
  class ApplicationRecord < ActiveRecord::Base
3
5
  self.abstract_class = true
@@ -6,7 +6,7 @@ module Lab
6
6
  def make_obs_concept_filter(concept_name)
7
7
  concept = ConceptName.where(name: concept_name).select(:concept_id)
8
8
 
9
- -> { where(concept: concept) }
9
+ -> { where(concept:) }
10
10
  end
11
11
  end
12
12
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Lab
2
4
  class LimsFailedImport < ApplicationRecord
3
5
  end
@@ -21,7 +21,7 @@ module Lab
21
21
  name: concept_name(order.concept_id)
22
22
  },
23
23
  requesting_clinician: requesting_clinician&.value_text,
24
- target_lab: target_lab,
24
+ target_lab:,
25
25
  reason_for_test: {
26
26
  concept_id: reason_for_test&.value_coded,
27
27
  name: concept_name(reason_for_test&.value_coded)
@@ -50,7 +50,7 @@ module Lab
50
50
  def self.voided_tests(order)
51
51
  concept = ConceptName.where(name: Lab::Metadata::TEST_TYPE_CONCEPT_NAME)
52
52
  .select(:concept_id)
53
- LabTest.unscoped.where(concept: concept, order: order, voided: true)
53
+ LabTest.unscoped.where(concept:, order:, voided: true)
54
54
  end
55
55
  end
56
56
  end
@@ -16,8 +16,8 @@ module Lab
16
16
  name: concept_name&.name
17
17
  },
18
18
  date: measure.obs_datetime,
19
- value: value,
20
- value_type: value_type,
19
+ value:,
20
+ value_type:,
21
21
  value_modifier: measure.value_modifier
22
22
  }
23
23
  end
@@ -24,10 +24,10 @@ module Lab
24
24
  private
25
25
 
26
26
  def find_counter(date)
27
- counter = Lab::LabAccessionNumberCounter.find_by(date: date)
27
+ counter = Lab::LabAccessionNumberCounter.find_by(date:)
28
28
  return counter if counter
29
29
 
30
- Lab::LabAccessionNumberCounter.create(date: date, value: 1)
30
+ Lab::LabAccessionNumberCounter.create(date:, value: 1)
31
31
  end
32
32
 
33
33
  # Checks if date does not exceed system date
@@ -5,7 +5,7 @@ module Lab
5
5
  module ConceptsService
6
6
  def self.test_types(name: nil, specimen_type: nil)
7
7
  test_types = ConceptSet.find_members_by_name(Lab::Metadata::TEST_TYPE_CONCEPT_NAME)
8
- test_types = test_types.filter_members(name: name) if name
8
+ test_types = test_types.filter_members(name:) if name
9
9
 
10
10
  unless specimen_type
11
11
  return test_types.joins('INNER JOIN concept_name ON concept_set.concept_id = concept_name.concept_id AND concept_name.voided = 0 AND concept_name.locale_preferred = 1')
@@ -31,7 +31,7 @@ module Lab
31
31
 
32
32
  def self.specimen_types(name: nil, test_type: nil)
33
33
  specimen_types = ConceptSet.find_members_by_name(Lab::Metadata::SPECIMEN_TYPE_CONCEPT_NAME)
34
- specimen_types = specimen_types.filter_members(name: name) if name
34
+ specimen_types = specimen_types.filter_members(name:) if name
35
35
 
36
36
  unless test_type
37
37
  return specimen_types.select('concept_name.concept_id, concept_name.name')
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'auto12epl'
3
+ require_relative '../../../../lib/auto12epl'
4
4
 
5
5
  module Lab
6
6
  module LabellingService
@@ -89,7 +89,7 @@ module Lab
89
89
  end
90
90
 
91
91
  def short_concept_name(concept_id)
92
- ConceptName.where(concept_id: concept_id)
92
+ ConceptName.where(concept_id:)
93
93
  .min_by { |concept| concept.name.size }
94
94
  &.name
95
95
  end
@@ -14,7 +14,7 @@ module Lab
14
14
 
15
15
  def void_order(order_dto); end
16
16
 
17
- def consume_orders(&_block); end
17
+ def consume_orders(&); end
18
18
  end
19
19
  end
20
20
  end
@@ -9,7 +9,7 @@ module Lab
9
9
  module Api
10
10
  ##
11
11
  # Talk to LIMS like a boss
12
- class CouchDbApi
12
+ class CouchdbApi
13
13
  attr_reader :bum
14
14
 
15
15
  def initialize(config: nil)
@@ -30,10 +30,10 @@ module Lab
30
30
  # given block until the queue is empty or connection is terminated
31
31
  # by calling method +choke+.
32
32
  def consume_orders(from: 0, limit: 30)
33
- bum.binge_changes(since: from, limit: limit, include_docs: true) do |change|
33
+ bum.binge_changes(since: from, limit:, include_docs: true) do |change|
34
34
  next unless change['doc']['type']&.casecmp?('Order')
35
35
 
36
- yield OrderDTO.new(change['doc']), self
36
+ yield OrderDto.new(change['doc']), self
37
37
  end
38
38
  end
39
39
 
@@ -28,7 +28,7 @@ module Lab
28
28
  def consume_orders(from: nil, limit: 1000)
29
29
  loop do
30
30
  specimens_to_process = specimens(from, limit)
31
- break if specimens_to_process.size.zero?
31
+ break if specimens_to_process.empty?
32
32
 
33
33
  processes = multiprocessed? ? @processes : 0
34
34
  on_merge_processes = ->(_item, index, _result) { @on_merge_processes&.call(from + index) }
@@ -42,7 +42,7 @@ module Lab
42
42
  end
43
43
 
44
44
  dto = make_order_dto(
45
- specimen: specimen,
45
+ specimen:,
46
46
  patient: specimen_patient(specimen['specimen_id']),
47
47
  test_results: results,
48
48
  specimen_status_trail: specimen_status_trail(specimen['specimen_id']),
@@ -162,7 +162,7 @@ module Lab
162
162
  drawn_by_first_name, drawn_by_last_name = specimen['drawn_by_name']&.split
163
163
  patient_first_name, patient_last_name = patient['name'].split
164
164
 
165
- OrderDTO.new(
165
+ OrderDto.new(
166
166
  _id: specimen['doc_id'].blank? ? SecureRandom.uuid : specimen['doc_id'],
167
167
  _rev: '0',
168
168
  tracking_number: specimen['tracking_number'],
@@ -197,8 +197,8 @@ module Lab
197
197
  object[format_date(trail_entry['date'])] = {
198
198
  status: trail_entry['status_name'],
199
199
  updated_by: {
200
- first_name: first_name,
201
- last_name: last_name,
200
+ first_name:,
201
+ last_name:,
202
202
  phone_number: trail_entry['updated_by_phone_number'],
203
203
  id: trail_entry['updated_by_id']
204
204
  }
@@ -230,7 +230,7 @@ module Lab
230
230
  end
231
231
 
232
232
  def format_test_result_for_dto(test_name, specimen, results, test_status_trail)
233
- return {} if results.size.zero?
233
+ return {} if results.empty?
234
234
 
235
235
  result_create_event = test_status_trail[test_name]&.find do |trail_entry|
236
236
  trail_entry['status_name'].casecmp?('drawn')