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



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

def fetch_results(order); end

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



30
31
32
33
34
35
36
37
38
39
40
41
# File 'app/services/lab/orders_search_service.rb', line 30

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



43
44
45
46
47
48
49
# File 'app/services/lab/orders_search_service.rb', line 43

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
# File 'app/services/lab/orders_search_service.rb', line 7

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

  orders = Lab::LabOrder.prefetch_relationships
                        .where(filters)
                        .order(start_date: :desc)

  orders = filter_orders_by_status(orders, **pop_filters(extra_filters, :status))
  orders = filter_orders_by_date(orders, **extra_filters)

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

.find_orders_without_results(patient_id: nil) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'app/services/lab/orders_search_service.rb', line 20

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:) if patient_id

  query
end

.pop_filters(params, *filters) ⇒ Object



55
56
57
58
59
60
61
# File 'app/services/lab/orders_search_service.rb', line 55

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



51
52
53
# File 'app/services/lab/orders_search_service.rb', line 51

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