his_emr_api_lab 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -18,6 +18,6 @@ module Lab
18
18
  ORDER_TYPE_NAME = 'Lab'
19
19
 
20
20
  # Programs
21
- LAB_PROGRAM_NAME = 'Lab Program'
21
+ LAB_PROGRAM_NAME = 'Laboratory Program'
22
22
  end
23
23
  end
@@ -27,7 +27,7 @@ module Lab
27
27
  # },
28
28
  # program_id: { type: :integer, required: false },
29
29
  # patient_id: { type: :integer, required: false }
30
- # specimen_type_id: { type: :object, properties: { concept_id: :integer }, required: %i[concept_id] },
30
+ # specimen: { type: :object, properties: { concept_id: :integer }, required: %i[concept_id] },
31
31
  # test_type_ids: {
32
32
  # type: :array,
33
33
  # items: {
@@ -71,11 +71,15 @@ module Lab
71
71
  end
72
72
 
73
73
  order = Lab::LabOrder.find(order_id)
74
- unless order.concept_id == unknown_concept_id
74
+ unless order.concept_id == unknown_concept_id || params[:force_update]&.to_s&.casecmp?('true')
75
75
  raise ::UnprocessableEntityError
76
76
  end
77
77
 
78
- order.update!(concept_id: specimen_id)
78
+ order.update!(concept_id: specimen_id,
79
+ discontinued: true,
80
+ discontinued_by: User.current.user_id,
81
+ discontinued_date: params[:date]&.to_date || Date.today,
82
+ discontinued_reason_non_coded: 'Sample drawn/updated')
79
83
  Lab::LabOrderSerializer.serialize_order(order)
80
84
  end
81
85
 
@@ -87,10 +91,7 @@ module Lab
87
91
  order.reason_for_test&.void(reason)
88
92
  order.target_lab&.void(reason)
89
93
 
90
- order.tests.each do |test|
91
- test.result&.void(reason)
92
- test.void(reason)
93
- end
94
+ order.tests.each { |test| test.void(reason) }
94
95
 
95
96
  order.void(reason)
96
97
  end
@@ -119,7 +120,7 @@ module Lab
119
120
  program_id: program_id,
120
121
  type: EncounterType.find_by_name!(Lab::Metadata::ENCOUNTER_TYPE_NAME),
121
122
  encounter_datetime: order_params[:date] || Date.today,
122
- provider_id: order_params[:provider_id] || User.current&.user_id
123
+ provider_id: order_params[:provider_id] || User.current.person.person_id
123
124
  )
124
125
  end
125
126
 
@@ -3,14 +3,26 @@
3
3
  module Lab
4
4
  module ResultsService
5
5
  class << self
6
+ ##
7
+ # Attach results to a test
8
+ #
9
+ # Params:
10
+ # test_id: The tests id (maps to obs_id of the test's observation in OpenMRS)
11
+ # params: A hash comprising the following fields
12
+ # - encounter_id: Encounter to create result under (can be ommitted but provider_id has to specified)
13
+ # - provider_id: Specify a provider for an encounter the result is going to be created under
14
+ # - date: Retrospective date when the result was received (can be ommitted, defaults to today)
15
+ # - measures: An array of measures. A measure is an object of the following structure
16
+ # - indicator: An object that has a concept_id field (concept_id of the indicator)
17
+ # - value_type: An enum that's limited to 'numeric', 'boolean', 'text', and 'coded'
6
18
  def create_results(test_id, params)
7
19
  ActiveRecord::Base.transaction do
8
20
  test = Lab::LabTest.find(test_id)
9
21
  encounter = find_encounter(test, encounter_id: params[:encounter_id],
10
- date: params[:date],
22
+ date: params[:date]&.to_date,
11
23
  provider_id: params[:provider_id])
12
24
 
13
- results_obs = create_results_obs(encounter, test, params[:date])
25
+ results_obs = create_results_obs(encounter, test, params[:date], params[:comments])
14
26
  params[:measures].map { |measure| add_measure_to_results(results_obs, measure, params[:date]) }
15
27
 
16
28
  Lab::ResultSerializer.serialize(results_obs)
@@ -32,23 +44,41 @@ module Lab
32
44
  end
33
45
 
34
46
  # Creates the parent observation for results to which the different measures are attached
35
- def create_results_obs(encounter, test, date)
47
+ def create_results_obs(encounter, test, date, comments = nil)
48
+ void_existing_results_obs(encounter, test)
49
+
36
50
  Lab::LabResult.create!(
37
51
  person_id: encounter.patient_id,
38
52
  encounter_id: encounter.encounter_id,
39
- concept_id: ConceptName.find_by_name!(Lab::Metadata::TEST_RESULT_CONCEPT_NAME).concept_id,
53
+ concept_id: test_result_concept.concept_id,
40
54
  order_id: test.order_id,
41
55
  obs_group_id: test.obs_id,
42
- obs_datetime: date&.to_datetime || DateTime.now
56
+ obs_datetime: date&.to_datetime || DateTime.now,
57
+ comments: comments
43
58
  )
44
59
  end
45
60
 
61
+ def void_existing_results_obs(encounter, test)
62
+ result = Lab::LabResult.find_by(person_id: encounter.patient_id,
63
+ concept_id: test_result_concept.concept_id,
64
+ obs_group_id: test.obs_id)
65
+ return unless result
66
+
67
+ result.measures.map { |child_obs| child_obs.void("Updated/overwritten by #{User.current.username}") }
68
+ result.void("Updated/overwritten by #{User.current.username}")
69
+ end
70
+
71
+ def test_result_concept
72
+ ConceptName.find_by_name!(Lab::Metadata::TEST_RESULT_CONCEPT_NAME)
73
+ end
74
+
46
75
  def add_measure_to_results(results_obs, params, date)
47
76
  validate_measure_params(params)
48
77
 
49
78
  Observation.create!(
50
79
  person_id: results_obs.person_id,
51
80
  encounter_id: results_obs.encounter_id,
81
+ order_id: results_obs.order_id,
52
82
  concept_id: params[:indicator][:concept_id],
53
83
  obs_group_id: results_obs.obs_id,
54
84
  obs_datetime: date&.to_datetime || DateTime.now,
@@ -57,7 +87,9 @@ module Lab
57
87
  end
58
88
 
59
89
  def validate_measure_params(params)
60
- raise InvalidParameterError, 'measures.value is required' if params[:value].blank?
90
+ if params[:value].blank?
91
+ raise InvalidParameterError, 'measures.value is required'
92
+ end
61
93
 
62
94
  if params[:indicator]&.[](:concept_id).blank?
63
95
  raise InvalidParameterError, 'measures.indicator.concept_id is required'
data/config/routes.rb CHANGED
@@ -6,6 +6,8 @@ Lab::Engine.routes.draw do
6
6
  resources :results, only: %i[index create destroy]
7
7
  end
8
8
 
9
+ get 'api/v1/lab/labels/order', to: 'labels#print_order_label'
10
+
9
11
  # Metadata
10
12
  # TODO: Move the following to namespace /concepts
11
13
  resources :specimen_types, only: %i[index], path: 'api/v1/lab/specimen_types'
data/lib/auto12epl.rb ADDED
@@ -0,0 +1,201 @@
1
+ #!/usr/bin/ruby
2
+ # Jeremy Espino MD MS
3
+ # 28-JAN-2016
4
+
5
+
6
+ class Float
7
+ # function to round down a float to an integer value
8
+ def round_down n=0
9
+ n < 1 ? self.to_i.to_f : (self - 0.5 / 10**n).round(n)
10
+ end
11
+ end
12
+
13
+ # Generates EPL code that conforms to the Auto12-A standard for specimen labeling
14
+ class Auto12Epl
15
+
16
+ attr_accessor :element_font
17
+ attr_accessor :barcode_human_font
18
+
19
+ DPI = 203
20
+ LABEL_WIDTH_IN = 2.0
21
+ LABEL_HEIGHT_IN = 0.5
22
+
23
+ # font constants
24
+ FONT_X_DOTS = [8, 10, 12, 14, 32]
25
+ FONT_Y_DOTS = [12, 16, 20, 24, 24]
26
+ FONT_PAD_DOTS = 2
27
+
28
+ # element heights
29
+ HEIGHT_MARGIN = 0.031
30
+ HEIGHT_ELEMENT = 0.1
31
+ HEIGHT_ELEMENT_SPACE = 0.01
32
+ HEIGHT_PID = 0.1
33
+ HEIGHT_BARCODE = 0.200
34
+ HEIGHT_BARCODE_HUMAN = 0.050
35
+
36
+ # element widths
37
+ WIDTH_ELEMENT = 1.94
38
+ WIDTH_BARCODE = 1.395
39
+ WIDTH_BARCODE_HUMAN = 1.688
40
+
41
+ # margins
42
+ L_MARGIN = 0.031
43
+ L_MARGIN_BARCODE = 0.25
44
+
45
+ # stat locations
46
+ L_MARGIN_BARCODE_W_STAT = 0.200
47
+ L_MARGIN_W_STAT = 0.150
48
+ STAT_WIDTH_ELEMENT = 1.78
49
+ STAT_WIDTH_BARCODE = 1.150
50
+ STAT_WIDTH_BARCODE_HUMAN = 1.400
51
+
52
+ # constants for generated EPL code
53
+ BARCODE_TYPE = '1A'
54
+ BARCODE_NARROW_WIDTH = '2'
55
+ BARCODE_WIDE_WIDTH = '2'
56
+ BARCODE_ROTATION = '0'
57
+ BARCODE_IS_HUMAN_READABLE = 'N'
58
+ ASCII_HORZ_MULT = 1
59
+ ASCII_VERT_MULT = 1
60
+
61
+
62
+ def initialize(element_font = 1, barcode_human_font = 1)
63
+ @element_font = element_font
64
+ @barcode_human_font = barcode_human_font
65
+ end
66
+
67
+ # Calculate the number of characters that will fit in a given length
68
+ def max_characters(font, length)
69
+
70
+ dots_per_char = FONT_X_DOTS.at(font-1) + FONT_PAD_DOTS
71
+
72
+ num_char = ( (length * DPI) / dots_per_char).round_down
73
+
74
+ num_char.to_int
75
+ end
76
+
77
+ # Use basic truncation rule to truncate the name element i.e., if > maxCharacters cutoff and trail with +
78
+ def truncate_name(last_name, first_name, middle_initial, is_stat)
79
+ if is_stat
80
+ name_max_characters = max_characters(@element_font, STAT_WIDTH_ELEMENT)
81
+ else
82
+ name_max_characters = max_characters(@element_font, WIDTH_ELEMENT)
83
+ end
84
+
85
+ if concatName(last_name, first_name, middle_initial).length > name_max_characters
86
+ # truncate last?
87
+ if last_name.length > 12
88
+ last_name = last_name[0..11] + '+'
89
+ end
90
+
91
+ # truncate first?
92
+ if concatName(last_name, first_name, middle_initial).length > name_max_characters && first_name.length > 7
93
+ first_name = first_name[0..7] + '+'
94
+ end
95
+ end
96
+
97
+ concatName(last_name, first_name, middle_initial)
98
+
99
+ end
100
+
101
+ def concatName(last_name, first_name, middle_initial)
102
+ last_name + ', ' + first_name + (middle_initial == nil ? '' : ' ' + middle_initial)
103
+ end
104
+
105
+ # The main function to generate the EPL
106
+ def generate_epl(last_name, first_name, middle_initial, pid, dob, age, gender, col_date_time, col_name, tests, stat, acc_num, schema_track)
107
+
108
+ # format text and set margin
109
+ if stat == nil
110
+ name_text = truncate_name(last_name, first_name, middle_initial, false)
111
+ pid_dob_age_gender_text = full_justify(pid, dob + ' ' + age + ' ' + gender, @element_font, WIDTH_ELEMENT)
112
+ l_margin = L_MARGIN
113
+ l_margin_barcode = L_MARGIN_BARCODE
114
+ else
115
+ name_text = truncate_name(last_name, first_name, middle_initial, true)
116
+ pid_dob_age_gender_text = full_justify(pid, dob + ' ' + age + ' ' + gender, @element_font, STAT_WIDTH_ELEMENT)
117
+ stat_element_text = pad_stat_w_space(stat)
118
+ l_margin = L_MARGIN_W_STAT
119
+ l_margin_barcode = L_MARGIN_BARCODE_W_STAT
120
+ end
121
+ barcode_human_text = "#{acc_num} * #{schema_track.gsub(/\-/i, '')}"
122
+ collector_element_text = "Col: #{col_date_time} #{col_name}"
123
+ tests_element_text = tests
124
+
125
+ # generate EPL statements
126
+ name_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN), 0, @element_font, false, name_text)
127
+ pid_dob_age_gender_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, pid_dob_age_gender_text)
128
+ barcode_human_element = generate_ascii_element(to_dots(l_margin_barcode), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE), 0, @barcode_human_font, false, barcode_human_text)
129
+ collector_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE + HEIGHT_BARCODE_HUMAN + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, collector_element_text)
130
+ tests_element = generate_ascii_element(to_dots(l_margin), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_BARCODE + HEIGHT_BARCODE_HUMAN + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), 0, @element_font, false, tests_element_text)
131
+ barcode_element = generate_barcode_element(to_dots(l_margin_barcode), to_dots(HEIGHT_MARGIN + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE + HEIGHT_ELEMENT + HEIGHT_ELEMENT_SPACE), to_dots(HEIGHT_BARCODE)-4, schema_track)
132
+ stat_element = generate_ascii_element(to_dots(L_MARGIN)+FONT_Y_DOTS.at(@element_font - 1)+FONT_PAD_DOTS, to_dots(HEIGHT_MARGIN), 1, @element_font, true, stat_element_text)
133
+
134
+ # combine EPL statements
135
+ if stat == nil
136
+ "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{barcode_element}\n#{barcode_human_element}\n#{collector_element}\n#{tests_element}\nP3\n"
137
+ else
138
+ "\nN\nR216,0\nZT\nS1\n#{name_element}\n#{pid_dob_age_gender_element}\n#{barcode_element}\n#{barcode_human_element}\n#{collector_element}\n#{tests_element}\n#{stat_element}\nP3\n"
139
+ end
140
+
141
+ end
142
+
143
+ # Add spaces before and after the stat text so that black bars appear across the left edge of label
144
+ def pad_stat_w_space(stat)
145
+ num_char = max_characters(@element_font, LABEL_HEIGHT_IN)
146
+ spaces_needed = (num_char - stat.length) / 1
147
+ space = ''
148
+ spaces_needed.times do
149
+ space = space + ' '
150
+ end
151
+ space + stat + space
152
+ end
153
+
154
+ # Add spaces between the NPID and the dob/age/gender so that line is fully justified
155
+ def full_justify(pid, dag, font, length)
156
+ max_char = max_characters(font, length)
157
+ spaces_needed = max_char - pid.length - dag.length
158
+ space = ''
159
+ spaces_needed.times do
160
+ space = space + ' '
161
+ end
162
+ pid + space + dag
163
+ end
164
+
165
+ # convert inches to number of dots using DPI
166
+ def to_dots(inches)
167
+ (inches * DPI).round
168
+ end
169
+
170
+ # generate ascii EPL
171
+ def generate_ascii_element(x, y, rotation, font, is_reverse, text)
172
+ "A#{x.to_s},#{y.to_s},#{rotation.to_s},#{font.to_s},#{ASCII_HORZ_MULT},#{ASCII_VERT_MULT},#{is_reverse ? 'R' : 'N'},\"#{text}\""
173
+ end
174
+
175
+ # generate barcode EPL
176
+ def generate_barcode_element(x, y, height, schema_track)
177
+ schema_track = schema_track.gsub("-", "").strip
178
+ "B#{x.to_s},#{y.to_s},#{BARCODE_ROTATION},#{BARCODE_TYPE},#{BARCODE_NARROW_WIDTH},#{BARCODE_WIDE_WIDTH},#{height.to_s},#{BARCODE_IS_HUMAN_READABLE},\"#{schema_track}\""
179
+ end
180
+
181
+ end
182
+
183
+ if __FILE__ == $0
184
+
185
+ auto = Auto12Epl.new
186
+
187
+ puts auto.generate_epl("Banda", "Mary", "U", "Q23-HGF", "12-SEP-1997", "19y", "F", "01-JAN-2016 14:21", "byGD", "CHEM7,Ca,Mg", nil, "KCH-16-00001234", "1600001234")
188
+ puts "\n"
189
+ puts auto.generate_epl("Banda", "Mary", "U", "Q23-HGF", "12-SEP-1997", "19y", "F", "01-JAN-2016 14:21", "byGD", "CHEM7,Ca,Mg", "STAT CHEM", "KCH-16-00001234", "1600001234")
190
+ puts "\n"
191
+ puts auto.generate_epl("Bandajustrightlas", "Mary", "U", "Q23-HGF", "12-SEP-1997", "19y", "F", "01-JAN-2016 14:21", "byGD", "CHEM7,Ca,Mg", "STAT CHEM", "KCH-16-00001234", "1600001234")
192
+ puts "\n"
193
+ puts auto.generate_epl("Bandasuperlonglastnamethatwonfit", "Marysuperlonglastnamethatwonfit", "U", "Q23-HGF", "12-SEP-1997", "19y", "F", "01-JAN-2016 14:21", "byGD", "CHEM7,Ca,Mg", "STAT CHEM", "KCH-16-00001234", "1600001234")
194
+ puts "\n"
195
+ puts auto.generate_epl("Bandasuperlonglastnamethatwonfit", "Mary", "U", "Q23-HGF", "12-SEP-1997", "19y", "F", "01-JAN-2016 14:21", "byGD", "CHEM7,Ca,Mg", "STAT CHEM", "KCH-16-00001234", "1600001234")
196
+ puts "\n"
197
+ puts auto.generate_epl("Banda", "Marysuperlonglastnamethatwonfit", "U", "Q23-HGF", "12-SEP-1997", "19y", "F", "01-JAN-2016 14:21", "byGD", "CHEM7,Ca,Mg", "STAT CHEM", "KCH-16-00001234", "1600001234")
198
+
199
+
200
+
201
+ end
@@ -8,8 +8,12 @@ require 'couchrest'
8
8
  #
9
9
  # See: https://github.com/couchrest/couchrest
10
10
  class CouchBum
11
+ cattr_accessor :logger
12
+
11
13
  def initialize(database:, protocol: 'http', host: 'localhost', port: 5984, username: nil, password: nil)
12
14
  @connection_string = make_connection_string(protocol, username, password, host, port, database)
15
+
16
+ CouchBum.logger ||= Logger.new(STDOUT)
13
17
  end
14
18
 
15
19
  ##
@@ -29,7 +33,13 @@ class CouchBum
29
33
  end
30
34
 
31
35
  def couch_rest(method, route, *args, **kwargs)
32
- CouchRest.send(method, expand_route(route), *args, **kwargs)
36
+ url = expand_route(route)
37
+
38
+ logger.debug("CouchBum: Executing #{method} #{url}")
39
+ CouchRest.send(method, url, *args, **kwargs)
40
+ rescue CouchRest::Exception => e
41
+ logger.error("Failed to communicate with CouchDB: Status: #{e.http_code} - #{e.http_body}")
42
+ raise e
33
43
  end
34
44
 
35
45
  private
data/lib/lab/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Lab
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.3'
5
5
  end
@@ -35,6 +35,7 @@ Blood,"Liver Function Tests","2019-11-19 14:05:31"
35
35
  Blood,"Renal Function Test","2019-11-19 14:05:31"
36
36
  Blood,Lipogram,"2019-11-19 14:05:31"
37
37
  Blood,FBC,"2019-11-19 14:05:31"
38
+ Blood,"FBS","2021-04-11 00:00:00"
38
39
  Blood,Electrolytes,"2019-11-19 14:05:31"
39
40
  Blood,Enzymes,"2019-11-19 14:05:31"
40
41
  Blood,Glucose,"2019-11-19 14:05:31"
@@ -42,6 +43,22 @@ Blood,"Prothrombin Time","2019-11-19 14:05:31"
42
43
  Blood,APTT,"2019-11-19 14:05:31"
43
44
  Blood,INR,"2019-11-19 14:05:31"
44
45
  Blood,ESR,"2019-11-19 14:05:31"
46
+ Blood,"D/Coombs","2021-04-11 00:00:00"
47
+ Blood,"creat","2021-04-11 00:00:00"
48
+ Blood,"Widal","2021-04-11 00:00:00"
49
+ Blood,"AAFB (3rd)","2021-04-11 00:00:00"
50
+ Blood,"Urine micro","2021-04-11 00:00:00"
51
+ Blood,"AAFB (1st)","2021-04-11 00:00:00"
52
+ Blood,ASOT,"2021-04-11 00:00:00"
53
+ Blood,"Blood C/S","2021-04-11 00:00:00"
54
+ Blood,"Cryptococcal Ag","2021-04-11 00:00:00"
55
+ Blood,"I/Ink","2021-04-11 00:00:00"
56
+ Blood,"Prot& Sugar","2021-04-11 00:00:00"
57
+ Blood,C_S,"2021-04-11 00:00:00"
58
+ Blood,hep,"2021-04-11 00:00:00"
59
+ Blood,"Cryptococcal Antigen","2021-04-11 00:00:00"
60
+ Blood,Resistance,"2021-04-11 00:00:00"
61
+ Blood,Sickle,"2021-04-11 00:00:00"
45
62
  Blood,"Sickling Test","2019-11-19 14:05:31"
46
63
  Blood,"Manual Differential & Cell Morphology","2019-11-19 14:05:31"
47
64
  Blood,"Pancreatic Function Test","2019-11-19 14:05:31"
@@ -69,8 +86,12 @@ Blood,HbA1c,"2019-11-19 14:05:31"
69
86
  Blood,Microalbumin,"2019-11-19 14:05:31"
70
87
  Blood,Microprotein,"2019-11-19 14:05:31"
71
88
  Blood,"Von Willebrand Factor","2019-11-19 14:05:31"
89
+ Blood,"HIV_viral_load","2021-04-13 00:00:00"
90
+ Blood,"Viral laod","2021-04-11 00:00:00"
72
91
  Blood,"Viral Load","2019-11-19 14:05:31"
73
92
  Blood,"Urine Lam","2019-11-19 14:05:31"
93
+ Blood,"Protein and Sugar","2021-04-16"
94
+ Blood,"White cell count","2021-04-16"
74
95
  Blood,Urea,"2019-11-19 14:05:31"
75
96
  Blood,Creatinine,"2019-11-19 14:05:31"
76
97
  Blood,ALT,"2019-11-19 14:05:31"
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: 0.0.2
4
+ version: 0.0.3
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-04-07 00:00:00.000000000 Z
11
+ date: 2021-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: couchrest
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 2.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: parallel
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 1.20.1
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 1.20.1
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rails
29
43
  requirement: !ruby/object:Gem::Requirement
@@ -211,6 +225,7 @@ files:
211
225
  - README.md
212
226
  - Rakefile
213
227
  - app/controllers/lab/application_controller.rb
228
+ - app/controllers/lab/labels_controller.rb
214
229
  - app/controllers/lab/orders_controller.rb
215
230
  - app/controllers/lab/reasons_for_test_controller.rb
216
231
  - app/controllers/lab/results_controller.rb
@@ -233,8 +248,11 @@ files:
233
248
  - app/serializers/lab/test_serializer.rb
234
249
  - app/services/lab/accession_number_service.rb
235
250
  - app/services/lab/concepts_service.rb
251
+ - app/services/lab/labelling_service/order_label.rb
236
252
  - app/services/lab/lims/api.rb
237
253
  - app/services/lab/lims/config.rb
254
+ - app/services/lab/lims/exceptions.rb
255
+ - app/services/lab/lims/migrator.rb
238
256
  - app/services/lab/lims/order_dto.rb
239
257
  - app/services/lab/lims/order_serializer.rb
240
258
  - app/services/lab/lims/utils.rb
@@ -250,6 +268,7 @@ files:
250
268
  - db/migrate/20210323080140_change_lims_id_to_string_in_lims_order_mapping.rb
251
269
  - db/migrate/20210326195504_add_order_revision_to_lims_order_mapping.rb
252
270
  - db/migrate/20210407071728_create_lab_lims_failed_imports.rb
271
+ - lib/auto12epl.rb
253
272
  - lib/couch_bum/couch_bum.rb
254
273
  - lib/generators/lab/install/USAGE
255
274
  - lib/generators/lab/install/install_generator.rb