Class: Order::FollowUpScheduler

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

Defined Under Namespace

Classes: Result

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from BaseService

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

Constructor Details

This class inherits a constructor from BaseService

Instance Attribute Details

#activityObject (readonly)

Returns the value of attribute activity.



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

def activity
  @activity
end

#orderObject (readonly)

Returns the value of attribute order.



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

def order
  @order
end

Instance Method Details

#activity_error_resultObject (protected)



62
63
64
65
# File 'app/services/order/follow_up_scheduler.rb', line 62

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)



67
68
69
70
# File 'app/services/order/follow_up_scheduler.rb', line 67

def activity_success_result
  message = "Order #{order.id} ORDFU scheduled on #{activity.target_datetime} assigned to #{activity.assigned_resource&.full_name}"
  Result.new(order: order, activity: activity, activity_scheduled: true)
end

#activity_valid_based_on_customer_filter?Boolean (protected)

Returns:

  • (Boolean)


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

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

#already_has_an_activity?Boolean (protected)

Returns:

  • (Boolean)


85
86
87
# File 'app/services/order/follow_up_scheduler.rb', line 85

def already_has_an_activity?
  last_ordfu.present?
end

#build_activityObject (protected)



35
36
37
38
39
40
41
42
43
# File 'app/services/order/follow_up_scheduler.rb', line 35

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)



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

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)



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

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)



29
30
31
32
33
# File 'app/services/order/follow_up_scheduler.rb', line 29

def expected_arrival_date
  days_offset = (order.deliveries.map{|d| d.shipping_option.days_commitment rescue 4}.max || 4).ceil
  date_origin = order.shipped_date || order.updated_at || order.created_at || Date.current
  ideal_target_date = 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)


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

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)



77
78
79
# File 'app/services/order/follow_up_scheduler.rb', line 77

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)



81
82
83
# File 'app/services/order/follow_up_scheduler.rb', line 81

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)



89
90
91
# File 'app/services/order/follow_up_scheduler.rb', line 89

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

#ordfu_activity_typeObject (protected)



45
46
47
48
49
50
51
52
53
54
55
56
# File 'app/services/order/follow_up_scheduler.rb', line 45

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

#ordfu_customer_filterObject (protected)



58
59
60
# File 'app/services/order/follow_up_scheduler.rb', line 58

def ordfu_customer_filter
  ordfu_activity_type&.customer_filter
end

#process(order) ⇒ Object



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

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
  return activity_success_result
end

#skip_save?Boolean (protected)

Returns:

  • (Boolean)


25
26
27
# File 'app/services/order/follow_up_scheduler.rb', line 25

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