Class: Order::SendAbandonedCartEmails
- Inherits:
-
BaseService
- Object
- BaseService
- Order::SendAbandonedCartEmails
- Defined in:
- app/services/order/send_abandoned_cart_emails.rb
Overview
Service object: send abandoned cart emails.
Instance Attribute Summary
Attributes inherited from BaseService
Instance Method Summary collapse
-
#initialize ⇒ SendAbandonedCartEmails
constructor
A new instance of SendAbandonedCartEmails.
- #process ⇒ Object
Methods inherited from BaseService
#log_debug, #log_error, #log_info, #log_warning, #logger, #tagged_logger
Constructor Details
#initialize ⇒ SendAbandonedCartEmails
Returns a new instance of SendAbandonedCartEmails.
4 5 6 7 8 |
# File 'app/services/order/send_abandoned_cart_emails.rb', line 4 def initialize @first_reminder_template = EmailTemplate.find_by(system_code: "ABANDONED_CART") @second_reminder_template = EmailTemplate.find_by(system_code: "ABANDONED_CART_REM") @third_reminder_template = EmailTemplate.find_by(system_code: "ABANDONED_CART_REM_2") end |
Instance Method Details
#process ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'app/services/order/send_abandoned_cart_emails.rb', line 10 def process problems = [] all_abandoned_orders = Query::OrderQuery.new.abandoned_carts + Query::OrderQuery.new.abandoned_carts(true) all_abandoned_orders.each do |order| need_to_remind = false # Flag to know when to send the reminder # Check which reminder needs to be sent case order.abandoned_cart_reminder when 'reminder_not_sent' # This order hasn't been reminded yet, so we send the first reminder if order.communications.where(email_template_id: @first_reminder_template.id).any? problems << { order: order, error: 'Reminder already sent' } next end need_to_remind = true template_code = "ABANDONED_CART" column_to_update = "first_reminder" when 'first_reminder' # This order had the first reminder sent at some point. Now we check if the conditions are met to send the second reminder if order.communications.where(email_template_id: @second_reminder_template.id).any? problems << { order: order, error: 'Second reminder already sent' } next end cc = order.communications.where(email_template_id: @first_reminder_template.id)&.first # Grab the first reminder sent # We send a reminder after 24 hours of the first one, and we disregard old orders that never got the second reminder sent need_to_remind = true if cc.present? && cc.created_at > 24.hours.ago && cc.created_at < 7.days.ago template_code = "ABANDONED_CART_REM" column_to_update = "second_reminder" when 'second_reminder' # This order had the second reminder sent at some point. Now we check if the conditions are met to send the third reminder if order.communications.where(email_template_id: @third_reminder_template.id).any? problems << { order: order, error: 'Third reminder already sent' } next end cc = order.communications.where(email_template_id: @second_reminder_template.id)&.first # Grab the first reminder sent # We send a reminder after 24 hours of the first one, and we disregard old orders that never got the second reminder sent need_to_remind = true if cc.present? && cc.created_at > 48.hours.ago && cc.created_at < 7.days.ago template_code = "ABANDONED_CART_REM_2" column_to_update = "third_reminder" end next unless need_to_remind acc = order.customer.account if acc.nil? res = order.customer.generate_guest_account acc = res[:account] if res[:success] == true end next if acc.nil? CommunicationBuilder.new( resource: order, sender: INFO_EMAIL, recipient_party: order.customer, emails: acc.login, recipient_name: order.customer.guest? ? nil : order.customer.name, template_system_code: template_code, merge_options: { order: order.to_liquid } ).create order.update_column('abandoned_cart_reminder', column_to_update) end SystemMailer.abandoned_cart_problems_alert(problems).deliver_later if problems.any? true end |