Class: Order::FollowUpScheduler

Inherits:
BaseService show all
Defined in:
app/services/order/follow_up_scheduler.rb

Overview

Service object: follow up scheduler.

Defined Under Namespace

Classes: Result

Instance Attribute Summary collapse

Attributes inherited from BaseService

#options

Instance Method Summary collapse

Methods inherited from BaseService

#initialize, #log_debug, #log_error, #log_info, #log_warning, #logger, #tagged_logger

Constructor Details

This class inherits a constructor from BaseService

Instance Attribute Details

#activityObject (readonly)

Returns the value of attribute activity.



10
11
12
# File 'app/services/order/follow_up_scheduler.rb', line 10

def activity
  @activity
end

#orderObject (readonly)

Returns the value of attribute order.



10
11
12
# File 'app/services/order/follow_up_scheduler.rb', line 10

def order
  @order
end

Instance Method Details

#activity_error_resultObject (protected)



69
70
71
72
# File 'app/services/order/follow_up_scheduler.rb', line 69

def activity_error_result
  message = "Order #{order.id} ORDFU could not be created due to errors: #{activity.errors_to_s}"
  Result.new(order: order, activity: activity, activity_scheduled: false, messages: [message])
end

#activity_success_resultObject (protected)



74
75
76
# File 'app/services/order/follow_up_scheduler.rb', line 74

def activity_success_result
  Result.new(order: order, activity: activity, activity_scheduled: true)
end

#activity_valid_based_on_customer_filter?Boolean (protected)

Returns:

  • (Boolean)


106
107
108
# File 'app/services/order/follow_up_scheduler.rb', line 106

def activity_valid_based_on_customer_filter?
  ordfu_activity_type&.valid_for_party?(order.customer)
end

#already_has_an_activity?Boolean (protected)

Returns:

  • (Boolean)


91
92
93
# File 'app/services/order/follow_up_scheduler.rb', line 91

def already_has_an_activity?
  last_ordfu.present?
end

#build_activityObject (protected)



42
43
44
45
46
47
48
49
50
# File 'app/services/order/follow_up_scheduler.rb', line 42

def build_activity
  @activity = order.activities.build
  @activity.activity_type = ordfu_activity_type
  @activity.description = "#{activity.activity_type.description} - Order #{order.reference_number} Shipped"
  @activity.target_datetime = [expected_arrival_date, Date.current].compact.max
  @activity.party = order.primary_party
  @activity.assigned_resource_id = activity.best_resource
  @activity
end

#customer_filter_invalid_resultObject (protected)



110
111
112
113
# File 'app/services/order/follow_up_scheduler.rb', line 110

def customer_filter_invalid_result
  message = "Order #{order.id} ORDFU activity type valid_for_party? rejected the customer #{order.customer}. Check customer filter #{ordfu_customer_filter}"
  Result.new(order: order, activity_scheduled: false, messages: [message])
end

#existing_activity_resultObject (protected)



99
100
101
102
103
104
# File 'app/services/order/follow_up_scheduler.rb', line 99

def existing_activity_result
  Result.new(order: order,
              activity_scheduled: false,
              activity: last_ordfu,
              messages: ["Order #{order.id} already has an ORDFU activity"])
end

#expected_arrival_dateObject (protected)



32
33
34
35
36
37
38
39
40
# File 'app/services/order/follow_up_scheduler.rb', line 32

def expected_arrival_date
  days_offset = (order.deliveries.map do |d|
    d.shipping_option.days_commitment
  rescue StandardError
    4
  end.max || 4).ceil
  date_origin = order.shipped_date || order.updated_at || order.created_at || Date.current
  date_origin + days_offset.days
end

#follow_up_based_on_item?Boolean (protected)

Convenience method to determine if we should schedule a follow up on this order

Returns:

  • (Boolean)


79
80
81
# File 'app/services/order/follow_up_scheduler.rb', line 79

def follow_up_based_on_item?
  order.line_items.joins(:item).where.not(items: { product_category_id: ProductCategory.no_follow_ups_ids }).exists?
end

#invalid_item_follow_up_resultObject (protected)



83
84
85
# File 'app/services/order/follow_up_scheduler.rb', line 83

def invalid_item_follow_up_result
  Result.new(order: order, activity_scheduled: false, messages: ["Order #{order.id} does not require ORDFU activity based on item purchased."])
end

#invalid_order_type_resultObject (protected)



87
88
89
# File 'app/services/order/follow_up_scheduler.rb', line 87

def invalid_order_type_result
  Result.new(order: order, activity_scheduled: false, messages: ["Order #{order.id} is not a sales order and does not require ORDFU activity."])
end

#last_ordfuObject (protected)



95
96
97
# File 'app/services/order/follow_up_scheduler.rb', line 95

def last_ordfu
  order.activities.joins(:activity_type).where(activity_types: { task_type: 'ORDFU' }).order(:created_at).last
end

#ordfu_activity_typeObject (protected)



52
53
54
55
56
57
58
59
60
61
62
63
# File 'app/services/order/follow_up_scheduler.rb', line 52

def ordfu_activity_type
  nil
  at = if order.customer.is_homeowner?
         ActivityType.active.where(task_type: 'ORDFUHOM').first
       elsif order.customer.orders.sales_orders.size == 1
         ActivityType.active.where(task_type: 'ORDFUPRO1').first
       else
         ActivityType.active.where(task_type: 'ORDFUPRO').first
       end
  at ||= ActivityType.active.where(task_type: 'ORDFU').first # fallback
  at
end

#ordfu_customer_filterObject (protected)



65
66
67
# File 'app/services/order/follow_up_scheduler.rb', line 65

def ordfu_customer_filter
  ordfu_activity_type&.customer_filter
end

#process(order) ⇒ Object



12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'app/services/order/follow_up_scheduler.rb', line 12

def process(order)
  @order = order
  @activity = nil
  return invalid_order_type_result unless order.is_sales_order?
  return invalid_item_follow_up_result unless follow_up_based_on_item?
  return existing_activity_result if already_has_an_activity?
  return customer_filter_invalid_result unless activity_valid_based_on_customer_filter?

  build_activity
  return activity_error_result unless skip_save? || activity.save

  activity_success_result
end

#skip_save?Boolean (protected)

Returns:

  • (Boolean)


28
29
30
# File 'app/services/order/follow_up_scheduler.rb', line 28

def skip_save?
  options[:skip_save].present?
end