Class: Receptacle
  
  
  
Overview
  
    
A receptacle is a container for aliquots, they are associated with Labware, which represents the physical object which moves round the lab. A Labware may have a single Receptacle, such as in the case of a Tube or multiple, in the case of a Plate. Work can be requested on a particular receptacle.
   
 
  
Defined Under Namespace
  
    
      Modules: DownstreamAliquotsRemoval
    
  
    
      Classes: Qc
    
  
  
    
      Constant Summary
      collapse
    
    
      
        - QC_STATE_ALIASES =
          
        
- { 'passed' => 'pass', 'failed' => 'fail' }.freeze
Transfer::State::ALL_STATES
  
    
      Instance Method Summary
      collapse
    
    
  
  
  
  
  
  
  
  
  
  
  #allow_to_remove_downstream_aliquots?
  
  
  
  
  
  
  
  
  
  #qc_report
  
  
  
  
  
  
  
  
  
  #on_downstream_aliquots, #process_aliquots, #remove_downstream_aliquots, #remove_matching_aliquots
  
  
  
  
  
  
  
  
  
  #default_state, #state, #state_from, state_helper
  
  
  
  
  
  
  
  
  
  #after_comment_addition
  
  
  
  
  
  
  
  
  
  
  included, #unsaved_uuid!, #uuid
  
  
  
  
  
  
  
  
  Methods inherited from Asset
  #ancestor_of_purpose, #asset_type_for_request_types, #barcode_number, #compatible_purposes, #generate_barcode, #get_qc_result_value_for, #has_stock_asset?, #label, #label=, #original_stock_plates, #prefix, #printable?, #printable_target, #register_stock!, #request_types, #type
  
  
  
  
  
  
  
  
  
  #has_many_events, #has_many_lab_events, #has_one_event_with_family
  
  
  
  
  
  
  
  
  
  #event_date, #fluidigm_stamp_date, #gel_qc_date, #pico_date, #qc_started_date, #sequenom_stamp_date
  
  
  
  
  
  
  
  
  
  
  alias_association, convert_labware_to_receptacle_for, find_by_id_or_name, find_by_id_or_name!
  
  
  
  
  
  
  
  
  Methods included from Squishify
  extended
  
  
  
    Instance Method Details
    
      
  
  
    #absolute_position_name  ⇒ Object 
  
  
  
  
    
Returns the name of the position (eg. A1) of the receptacle within the context of any tube-rack it may be contained within
   
 
  
  
    | 
328
329
330 | # File 'app/models/receptacle.rb', line 328
def absolute_position_name
  racked_tube&.coordinate
end | 
 
    
      
  
  
    #any_barcode_matching?(other_barcode)  ⇒ Boolean 
  
  
  
  
    | 
66
67
68 | # File 'app/models/receptacle.rb', line 66
def any_barcode_matching?(other_barcode)
  barcodes.any? { |barcode| barcode =~ other_barcode }
end | 
 
    
      
  
  
    #api_asset_type  ⇒ Object 
  
  
  
  
    
Compatibility for v1 API maintains legacy 'type' for assets
   
 
  
  
    | 
313
314
315 | # File 'app/models/receptacle.rb', line 313
def api_asset_type
  legacy_asset_type.tableize
end | 
 
    
      
  
  
    #assign_tag2(tag)  ⇒ Object 
  
  
  
  
    | 
239
240
241
242
243
244 | # File 'app/models/receptacle.rb', line 239
def assign_tag2(tag)
  aliquots.each do |aliquot|
    aliquot.tag2 = tag
    aliquot.save!
  end
end | 
 
    
      
  
  
    #attach_tag(tag, tag2 = nil)  ⇒ Object 
  
  
    Also known as:
    attach_tags
    
  
  
  
    | 
271
272
273
274
275
276
277 | # File 'app/models/receptacle.rb', line 271
def attach_tag(tag, tag2 = nil)
  tags = { tag:, tag2: }.compact
  return if tags.empty?
  raise StandardError, 'Cannot tag an empty asset' if aliquots.empty?
  aliquots.each { |a| a.update!(tags) }
end | 
 
    
      
  
  
    #been_through_qc?  ⇒ Boolean 
  
  
  
  
    | 
228
229
230 | # File 'app/models/receptacle.rb', line 228
def been_through_qc?
  qc_state.present?
end | 
 
    
      
  
  
    #compatible_qc_state  ⇒ Object 
  
  
  
  
    | 
218
219
220 | # File 'app/models/receptacle.rb', line 218
def compatible_qc_state
  QC_STATE_ALIASES.fetch(qc_state, qc_state) || ''
end | 
 
    
      
  
  
    #created_with_request_options  ⇒ Object 
  
  
  
  
    | 
246
247
248 | # File 'app/models/receptacle.rb', line 246
def created_with_request_options
  aliquots.first&.created_with_request_options || {}
end | 
 
    
      
  
  
    #details  ⇒ Object 
  
  
  
  
    | 
308
309
310 | # File 'app/models/receptacle.rb', line 308
def details
  labware.try(:details).presence || 'Not on labware'
end | 
 
    
      
  
  
    #friendly_name  ⇒ Object 
  
  
  
  
    | 
322
323
324 | # File 'app/models/receptacle.rb', line 322
def friendly_name
  labware&.friendly_name || id
end | 
 
    
      
  
  
    | 
193
194
195 | # File 'app/models/receptacle.rb', line 193
def 
  labware&.&.size || 0
end | 
 
    
      
  
  
    #latest_stock_metrics(_product, *_args)  ⇒ Object 
  
  
  
  
    
We only support wells for the time being
   
 
  
  
    | 
285
286
287 | # File 'app/models/receptacle.rb', line 285
def latest_stock_metrics(_product, *_args)
  []
end | 
 
    
      
  
  
    #legacy_asset_type  ⇒ Object 
  
  
  
  
    
Compatibility for v1 API maintains legacy 'type' for assets
   
 
  
  
    | 
318
319
320 | # File 'app/models/receptacle.rb', line 318
def legacy_asset_type
  labware.sti_type
end | 
 
    
      
  
  
    | 
236
237 | # File 'app/models/receptacle.rb', line 236
def library_information
end | 
 
    
      
  
  
    #library_name  ⇒ Object 
  
  
  
  
    | 
304
305
306 | # File 'app/models/receptacle.rb', line 304
def library_name
  labware.name
end | 
 
    
      
  
  
    #library_types  ⇒ Object 
  
  
  
  
    
Library types are still just a string on aliquot.
   
 
  
  
    | 
251
252
253 | # File 'app/models/receptacle.rb', line 251
def library_types
  aliquots.pluck(:library_type).uniq
end | 
 
    
      
  
  
    #most_recent_requests_as_target_group_by_same_source  ⇒ Array<Request> 
  
  
  
  
    
Groups the requests as target by the same source and returns the most recent request for each source
   
 
  
    | 
340
341
342
343
344
345
346 | # File 'app/models/receptacle.rb', line 340
def most_recent_requests_as_target_group_by_same_source
          requests_as_target.order(id: :asc).index_by(&:asset_id).values
end | 
 
    
      
  
  
    #name  ⇒ Object 
  
  
  
  
    | 
292
293
294
295
296 | # File 'app/models/receptacle.rb', line 292
def name
  labware_name = labware.present? ? labware.try(:name) : '(not on a labware)'
  labware_name ||= labware.display_name   labware_name
end | 
 
    
      
  
  
    #outer_request(submission_id)  ⇒ Object 
  
  
  
  
    | 
262
263
264 | # File 'app/models/receptacle.rb', line 262
def outer_request(submission_id)
  transfer_requests_as_target.find_by(submission_id:).try(:outer_request)
end | 
 
    
      
  
  
    #primary_aliquot_if_unique  ⇒ Object 
  
  
  
  
    | 
232
233
234 | # File 'app/models/receptacle.rb', line 232
def primary_aliquot_if_unique
  primary_aliquot if aliquots.count == 1
end | 
 
    
      
  
  
    
All studies related to this asset
   
 
  
  
    | 
267
268
269 | # File 'app/models/receptacle.rb', line 267
def related_studies
  (ordered_studies + studies).compact.uniq
end | 
 
    
      
  
  
    #role  ⇒ Object 
  
  
  
  
    | 
332
333
334 | # File 'app/models/receptacle.rb', line 332
def role
  (requests_as_source.first || aliquot_requests.first).role
end | 
 
    
      
  
  
    #set_as_library(force: false)  ⇒ Object 
  
  
  
  
    | 
255
256
257
258
259
260 | # File 'app/models/receptacle.rb', line 255
def set_as_library(force: false)
  aliquots.each do |aliquot|
    aliquot.set_library(force:)
    aliquot.save!
  end
end | 
 
    
      
  
  
    #set_qc_state(state)  ⇒ Object 
  
  
  
  
    | 
222
223
224
225
226 | # File 'app/models/receptacle.rb', line 222
def set_qc_state(state)
  self.qc_state = QC_STATE_ALIASES.key(state) || state
  save
  set_external_release(qc_state)
end | 
 
    
      
  
  
    #tag_range  ⇒ String? 
  
  
  
  
    
Returns the map_id of the first and last tag in an asset eg 1-96. Caution: Used on barcode labels. Avoid using elsewhere as makes assumptions  about tag behaviour which may change shortly.
   
 
  
    | 
206
207
208
209
210
211
212
213
214
215
216 | # File 'app/models/receptacle.rb', line 206
def tag_range
  map_ids = tags.order(:map_id).pluck(:map_id)
  case map_ids.length
  when 0
    nil
  when 1
    map_ids.first
  else
    "#{map_ids.first}-#{map_ids.last}"
  end
end | 
 
    
      
  
  
    | 
189
190
191 | # File 'app/models/receptacle.rb', line 189
def 
  .size + 
end | 
 
    
      
  
  
    #update_aliquot_quality(suboptimal_quality)  ⇒ Object 
  
  
  
  
    | 
179
180
181
182 | # File 'app/models/receptacle.rb', line 179
def update_aliquot_quality(suboptimal_quality)
  aliquots.each { |a| a.update_quality(suboptimal_quality) }
  true
end | 
 
    
      
  
  
    #update_from_qc(qc_result)  ⇒ Object 
  
  
  
  
    | 
298
299
300 | # File 'app/models/receptacle.rb', line 298
def update_from_qc(qc_result)
  Tube::AttributeUpdater.update(self, qc_result)
end |