Class: Order::FollowUpScheduler
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
#activity ⇒ Object
Returns the value of attribute activity.
10
11
12
|
# File 'app/services/order/follow_up_scheduler.rb', line 10
def activity
@activity
end
|
#order ⇒ Object
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_result ⇒ Object
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_result ⇒ Object
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
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
91
92
93
|
# File 'app/services/order/follow_up_scheduler.rb', line 91
def already_has_an_activity?
last_ordfu.present?
end
|
#build_activity ⇒ Object
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_result ⇒ Object
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_result ⇒ Object
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_date ⇒ Object
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
Convenience method to determine if we should schedule a follow up on this order
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_result ⇒ Object
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_result ⇒ Object
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_ordfu ⇒ Object
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_type ⇒ Object
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 at
end
|
#ordfu_customer_filter ⇒ Object
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
28
29
30
|
# File 'app/services/order/follow_up_scheduler.rb', line 28
def skip_save?
options[:skip_save].present?
end
|