Module: Lab::OrdersSearchService

Defined in:
app/services/lab/orders_search_service.rb

Overview

Search Lab orders.

Class Method Summary collapse

Class Method Details

.fetch_results(order) ⇒ Object



69
# File 'app/services/lab/orders_search_service.rb', line 69

def fetch_results(order); end

.filter_orders_by_date(orders:, date: nil, end_date: nil) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
# File 'app/services/lab/orders_search_service.rb', line 36

def filter_orders_by_date(orders:, date: nil, end_date: nil)
  date = date&.to_date
  end_date = end_date&.to_date

  return orders.where('start_date BETWEEN ? AND ?', date, end_date + 1.day) if date && end_date

  return orders.where('start_date BETWEEN ? AND ?', date, date + 1.day) if date

  return orders.where('start_date < ?', end_date + 1.day) if end_date

  orders
end

.filter_orders_by_status(orders:, status: nil) ⇒ Object



49
50
51
52
53
54
55
# File 'app/services/lab/orders_search_service.rb', line 49

def filter_orders_by_status(orders:, status: nil)
  case status&.downcase
  when 'ordered' then orders.where(concept_id: unknown_concept_id)
  when 'drawn' then orders.where.not(concept_id: unknown_concept_id)
  else orders
  end
end

.find_orders(filters) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/services/lab/orders_search_service.rb', line 7

def find_orders(filters)
  extra_filters = pop_filters(filters, :date, :end_date, :status)

  uuid = filters.delete(:patient)
  patient = Patient.find(uuid) if uuid

  filters.merge!(patient_id: patient.id) if patient

  orders = Lab::LabOrder.prefetch_relationships
                        .where(filters)
  orders = orders.order(start_date: :desc) if Order.column_names.include?('start_date')
  orders = orders.order(date_created: :desc) unless Order.column_names.include?('start_date')

  orders = filter_orders_by_status(orders: orders, status: extra_filters[:status])
  orders = filter_orders_by_date(orders: orders, date: extra_filters[:date], end_date: extra_filters[:end_date])

  orders.map { |order| Lab::LabOrderSerializer.serialize_order(order) }
end

.find_orders_without_results(patient_id: nil) ⇒ Object



26
27
28
29
30
31
32
33
34
# File 'app/services/lab/orders_search_service.rb', line 26

def find_orders_without_results(patient_id: nil)
  results_query = Lab::LabResult.all
  results_query = results_query.where(person_id: patient_id) if patient_id

  query = Lab::LabOrder.where.not(order_id: results_query.select(:order_id))
  query = query.where(patient_id: patient_id) if patient_id

  query
end

.pop_filters(params, *filters) ⇒ Object



61
62
63
64
65
66
67
# File 'app/services/lab/orders_search_service.rb', line 61

def pop_filters(params, *filters)
  filters.each_with_object({}) do |filter, popped_params|
    next unless params.key?(filter)

    popped_params[filter.to_sym] = params.delete(filter)
  end
end

.unknown_concept_idObject



57
58
59
# File 'app/services/lab/orders_search_service.rb', line 57

def unknown_concept_id
  ConceptName.find_by_name!('Unknown').concept_id
end