85bdf28f91
see https://github.com/foodcoops/foodsoft/pull/907 for reference and original work by viehlieb Co-authored-by: viehlieb <pf@pragma-shift.net> fix PDF Pdf
204 lines
6.6 KiB
Ruby
204 lines
6.6 KiB
Ruby
# ActionMailer class that handles all emails for Foodsoft.
|
|
class Mailer < ActionMailer::Base
|
|
# XXX Quick fix to allow the use of show_user. Proper take would be one of
|
|
# (1) Use draper, decorate user
|
|
# (2) Create a helper with this method, include here and in ApplicationHelper
|
|
helper :application
|
|
include ApplicationHelper
|
|
|
|
layout 'email' # Use views/layouts/email.txt.erb
|
|
|
|
default from: "#{I18n.t('layouts.foodsoft')} <#{FoodsoftConfig[:email_sender]}>",
|
|
'X-Auto-Response-Suppress' => 'All'
|
|
|
|
# Sends an email with instructions on how to reset the password.
|
|
# Assumes user.setResetPasswordToken has been successfully called already.
|
|
def reset_password(user)
|
|
@user = user
|
|
@link = new_password_url(id: @user.id, token: @user.reset_password_token)
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.reset_password.subject', username: show_user(user))
|
|
end
|
|
|
|
# Sends an invite email.
|
|
def invite(invite)
|
|
@invite = invite
|
|
@link = accept_invitation_url(token: @invite.token)
|
|
|
|
mail to: invite.email,
|
|
subject: I18n.t('mailer.invite.subject')
|
|
end
|
|
|
|
# Notify user of upcoming task.
|
|
def upcoming_tasks(user, task)
|
|
@user = user
|
|
@task = task
|
|
@next_tasks = Task.order(:due_date).next_assigned_tasks_for(user)
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.upcoming_tasks.subject')
|
|
end
|
|
|
|
# Sends a welcome email with instructions on how to reset the password.
|
|
# Assumes user.setResetPasswordToken has been successfully called already.
|
|
def welcome(user)
|
|
@user = user
|
|
@additional_text = additonal_welcome_text(user)
|
|
@link = new_password_url(id: @user.id, token: @user.reset_password_token)
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.welcome.subject')
|
|
end
|
|
|
|
# Sends automatically generated invoicesfor group orders to ordergroup members
|
|
def group_order_invoice(group_order_invoice, user)
|
|
@user = user
|
|
@group_order_invoice = group_order_invoice
|
|
@group_order = group_order_invoice.group_order
|
|
@supplier = @group_order.order.supplier.name
|
|
@group = @group_order.ordergroup
|
|
add_group_order_invoice_attachments(group_order_invoice)
|
|
mail to: user,
|
|
subject: I18n.t('mailer.group_order_invoice.subject', group: @group.name, supplier: @supplier)
|
|
end
|
|
|
|
# Sends order result for specific Ordergroup
|
|
def order_result(user, group_order)
|
|
@order = group_order.order
|
|
@group_order = group_order
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.order_result.subject', name: group_order.order.name)
|
|
end
|
|
|
|
# Sends order received info for specific Ordergroup
|
|
def order_received(user, group_order)
|
|
@order = group_order.order
|
|
@group_order = group_order
|
|
|
|
order_articles = @order.order_articles.reject { |oa| oa.units_received.nil? }
|
|
@abundant_articles = order_articles.select { |oa| oa.difference_received_ordered.positive? }
|
|
@scarce_articles = order_articles.select { |oa| oa.difference_received_ordered.negative? }
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.order_received.subject', name: group_order.order.name)
|
|
end
|
|
|
|
# Sends order result to the supplier
|
|
def order_result_supplier(user, order, options = {})
|
|
@user = user
|
|
@order = order
|
|
@supplier = order.supplier
|
|
|
|
add_order_result_attachments order, options
|
|
|
|
subject = I18n.t('mailer.order_result_supplier.subject', name: order.supplier.name)
|
|
subject += " (#{I18n.t('activerecord.attributes.order.pickup')}: #{format_date(order.pickup)})" if order.pickup
|
|
|
|
mail to: order.supplier.email,
|
|
cc: user,
|
|
reply_to: user,
|
|
subject: subject
|
|
end
|
|
|
|
# Notify user if account balance is less than zero
|
|
def negative_balance(user, transaction)
|
|
@group = user.ordergroup
|
|
@transaction = transaction
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.negative_balance.subject')
|
|
end
|
|
|
|
def feedback(user, feedback)
|
|
@user = user
|
|
@feedback = feedback
|
|
|
|
mail to: feedback_recipients,
|
|
from: user,
|
|
subject: I18n.t('mailer.feedback.subject')
|
|
end
|
|
|
|
def not_enough_users_assigned(task, user)
|
|
@task = task
|
|
@user = user
|
|
|
|
mail to: user,
|
|
subject: I18n.t('mailer.not_enough_users_assigned.subject', task: task.name)
|
|
end
|
|
|
|
def mail(args)
|
|
args[:message_id] ||= "<#{Mail.random_tag}@#{default_url_options[:host]}>"
|
|
args[:subject] = "[#{FoodsoftConfig[:name]}] #{args[:subject]}"
|
|
|
|
if args[:from].is_a? User
|
|
args[:reply_to] ||= args[:from]
|
|
args[:from] =
|
|
format_address(FoodsoftConfig[:email_sender], I18n.t('mailer.from_via_foodsoft', name: show_user(args[:from])))
|
|
end
|
|
|
|
%i[bcc cc reply_to sender to].each do |k|
|
|
user = args[k]
|
|
args[k] = format_address(user.email, show_user(user)) if user.is_a? User
|
|
end
|
|
|
|
if contact_email = FoodsoftConfig[:contact][:email]
|
|
args[:reply_to] ||= format_address(contact_email, FoodsoftConfig[:name])
|
|
end
|
|
|
|
reply_email_domain = FoodsoftConfig[:reply_email_domain]
|
|
if reply_email_domain && !args[:return_path] && args[:to].is_a?(String)
|
|
address = Mail::Parsers::AddressListsParser.parse(args[:to]).addresses.first
|
|
args[:return_path] = "<#{FoodsoftConfig.scope}.bounce+#{address.local}=#{address.domain}@#{reply_email_domain}>"
|
|
end
|
|
|
|
super
|
|
end
|
|
|
|
def self.deliver_now_with_user_locale(user, &block)
|
|
I18n.with_locale(user.settings['profile']['language']) do
|
|
deliver_now(&block)
|
|
end
|
|
end
|
|
|
|
def self.deliver_now_with_default_locale(&block)
|
|
I18n.with_locale(FoodsoftConfig[:default_locale]) do
|
|
deliver_now(&block)
|
|
end
|
|
end
|
|
|
|
def self.deliver_now
|
|
message = yield
|
|
message.deliver_now
|
|
rescue StandardError => e
|
|
MailDeliveryStatus.create email: message.to[0], message: e.message
|
|
end
|
|
|
|
# separate method to allow plugins to mess with the attachments
|
|
def add_order_result_attachments(order, options = {})
|
|
attachments['order.pdf'] = OrderFax.new(order, options).to_pdf
|
|
attachments['order.csv'] = OrderCsv.new(order, options).to_csv
|
|
end
|
|
|
|
def add_group_order_invoice_attachments(group_order_invoice)
|
|
attachment_name = group_order_invoice.name + '.pdf'
|
|
attachments[attachment_name] = GroupOrderInvoicePdf.new(group_order_invoice.load_data_for_invoice).to_pdf
|
|
end
|
|
|
|
# separate method to allow plugins to mess with the text
|
|
def additonal_welcome_text(user); end
|
|
|
|
private
|
|
|
|
def format_address(email, name)
|
|
address = Mail::Address.new email
|
|
address.display_name = name
|
|
address.format
|
|
end
|
|
|
|
# use the (new) feedback_recipients option, but fallback to error_recipients for backwards compatibility
|
|
def feedback_recipients
|
|
FoodsoftConfig[:notification][:feedback_recipients] || FoodsoftConfig[:notification][:error_recipients]
|
|
end
|
|
end
|