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