mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-02-20 00:37:26 +00:00
Fixes #6435 i.e. If the customer paid for their order by Stripe/Paypal then the Enterprise needs to know that the order was cancelled in order to arrange a refund. Refunds are not automatically processed when an order is cancelled. This will send a very basic email to the shop, it only includes a link to view the cancelled order in the admin area initially. I created a CustomerOrderCancellation object here because orders can be cancelled in two ways (1) by the customer, so an email should be sent to the shop. (2) by the shop, so an email doesn't need to be sent. However the code for cancelling order happens in Order#cancel via the state machine. Rather than passing some sort of parameter into #cancel to indicate whether it is a customer or shop cancelled order it might be clearer to have a CustomerOrderCancellation object, there could be other differences between customer or shop cancelled orders in future maybe.
79 lines
2.6 KiB
Ruby
79 lines
2.6 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Spree
|
|
class OrderMailer < BaseMailer
|
|
helper ::CheckoutHelper
|
|
helper SpreeCurrencyHelper
|
|
helper Spree::Admin::PaymentsHelper
|
|
helper OrderHelper
|
|
include I18nHelper
|
|
|
|
def cancel_email(order_or_order_id, resend = false)
|
|
@order = find_order(order_or_order_id)
|
|
I18n.with_locale valid_locale(@order.user) do
|
|
mail(to: @order.email,
|
|
from: from_address,
|
|
subject: mail_subject(t('spree.order_mailer.cancel_email.subject'), resend))
|
|
end
|
|
end
|
|
|
|
def cancel_email_for_shop(order)
|
|
@order = order
|
|
I18n.with_locale valid_locale(@order.distributor.owner) do
|
|
subject = I18n.t('spree.order_mailer.cancel_email_for_shop.subject')
|
|
mail(to: @order.distributor.contact.email,
|
|
from: from_address,
|
|
subject: subject)
|
|
end
|
|
end
|
|
|
|
def confirm_email_for_customer(order_or_order_id, resend = false)
|
|
@order = find_order(order_or_order_id)
|
|
I18n.with_locale valid_locale(@order.user) do
|
|
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
|
|
mail(to: @order.email,
|
|
from: from_address,
|
|
subject: subject,
|
|
reply_to: @order.distributor.contact.email)
|
|
end
|
|
end
|
|
|
|
def confirm_email_for_shop(order_or_order_id, resend = false)
|
|
@order = find_order(order_or_order_id)
|
|
I18n.with_locale valid_locale(@order.user) do
|
|
subject = mail_subject(t('spree.order_mailer.confirm_email.subject'), resend)
|
|
mail(to: @order.distributor.contact.email,
|
|
from: from_address,
|
|
subject: subject)
|
|
end
|
|
end
|
|
|
|
def invoice_email(order_or_order_id, pdf)
|
|
@order = find_order(order_or_order_id)
|
|
attach_file("invoice-#{@order.number}.pdf", pdf)
|
|
I18n.with_locale valid_locale(@order.user) do
|
|
mail(to: @order.email,
|
|
from: from_address,
|
|
subject: mail_subject(t(:invoice), false),
|
|
reply_to: @order.distributor.contact.email)
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
# Finds an order instance from an order or from an order id
|
|
def find_order(order_or_order_id)
|
|
order_or_order_id.respond_to?(:id) ? order_or_order_id : Spree::Order.find(order_or_order_id)
|
|
end
|
|
|
|
def mail_subject(base_subject, resend)
|
|
resend_prefix = (resend ? "[#{t(:resend).upcase}] " : '')
|
|
"#{resend_prefix}#{Spree::Config[:site_name]} #{base_subject} ##{@order.number}"
|
|
end
|
|
|
|
def attach_file(filename, file)
|
|
attachments[filename] = file if file.present?
|
|
end
|
|
end
|
|
end
|