spree_custom_email 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +673 -0
  3. data/README.md +27 -0
  4. data/app/controllers/spree/admin/custom_emails_controller.rb +22 -0
  5. data/app/helpers/spree/mail_helper_decorator.rb +7 -0
  6. data/app/helpers/spree/shipment_helper_decorator.rb +15 -0
  7. data/app/helpers/spree_custom_email/admin/base_helper_decorator.rb +15 -0
  8. data/app/mailer/spree/order_mailer_decorator.rb +38 -0
  9. data/app/mailer/spree/reimbursement_mailer_decorator.rb +24 -0
  10. data/app/mailer/spree/shipment_mailer_decorator.rb +24 -0
  11. data/app/models/spree/custom_email.rb +48 -0
  12. data/app/models/spree_custom_email/store_decorator.rb +9 -0
  13. data/app/overrides/add_custom_emails.rb +10 -0
  14. data/app/views/spree/admin/custom_emails/_form.html.erb +29 -0
  15. data/app/views/spree/admin/custom_emails/setting.html.erb +15 -0
  16. data/app/views/spree/admin/shared/sidebar/_custom_emails_menu.html.erb +8 -0
  17. data/app/views/spree/order_mailer/cancel_email.html.erb +33 -0
  18. data/app/views/spree/order_mailer/cancel_email.text.erb +23 -0
  19. data/app/views/spree/order_mailer/confirm_email.html.erb +80 -0
  20. data/app/views/spree/order_mailer/confirm_email.text.erb +48 -0
  21. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +58 -0
  22. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +36 -0
  23. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +497 -0
  24. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +28 -0
  25. data/app/views/spree/shipment_mailer/shipped_email.html.erb +73 -0
  26. data/app/views/spree/shipment_mailer/shipped_email.text.erb +33 -0
  27. data/config/initializers/admin_navigation.rb +17 -0
  28. data/config/locales/en.yml +16 -0
  29. data/config/locales/ja.yml +16 -0
  30. data/config/routes.rb +9 -0
  31. data/db/migrate/20250306091041_add_table_spree_custom_emails.rb +32 -0
  32. data/lib/generators/spree_custom_email/install/install_generator.rb +20 -0
  33. data/lib/spree_custom_email/engine.rb +20 -0
  34. data/lib/spree_custom_email/version.rb +7 -0
  35. data/lib/spree_custom_email.rb +4 -0
  36. metadata +119 -0
data/README.md ADDED
@@ -0,0 +1,27 @@
1
+ # spree_custom_email
2
+
3
+ Customize Spree’s transactional emails—subjects, headers and footers—for order confirmations, shipping notices, and more.
4
+
5
+ ## Installation
6
+
7
+ 1. In your Gemfile:
8
+ ```ruby
9
+ gem 'spree_custom_email', path: 'engines/spree_custom_email'
10
+ ```
11
+
12
+ Run the following commands:
13
+
14
+ ```sh
15
+ bundle install
16
+ rails g spree_custom_email:install
17
+ ```
18
+
19
+ ## Features
20
+
21
+ - Custom Subjects
22
+ - Custom Header/Footer
23
+ - Per‑Store: Different templates and subjects per store.
24
+
25
+ ## Licence
26
+
27
+ AGPL-3.0-or-later. See [LICENSE](LICENSE).
@@ -0,0 +1,22 @@
1
+ module Spree
2
+ module Admin
3
+ class CustomEmailsController < ResourceController
4
+ # Spree 5.2 の設定エリア扱いにする(設定サイドバー+設定レイアウトを使う)。
5
+ include Spree::Admin::SettingsConcern
6
+
7
+ def setting
8
+ @custom_emails = current_store.custom_emails
9
+ end
10
+
11
+ private
12
+
13
+ def location_after_save
14
+ setting_admin_custom_emails_url
15
+ end
16
+
17
+ def permitted_resource_params
18
+ params.require(:custom_email).permit(:subject, :header, :footer)
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,7 @@
1
+ module Spree
2
+ module MailHelperDecorator
3
+ include ImagesHelper
4
+ end
5
+ end
6
+
7
+ Spree::MailHelper.prepend Spree::MailHelperDecorator
@@ -0,0 +1,15 @@
1
+ module Spree
2
+ module ShipmentHelperDecorator
3
+ def tracking_url_for_shipment(shipment)
4
+ if shipment.tracking&.match?(/\Ahttps?:\/\//)
5
+ shipment.tracking
6
+ elsif shipment.shipping_method&.tracking_url.present?
7
+ shipment.tracking_url
8
+ else
9
+ nil
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Spree::BaseHelper.prepend(Spree::ShipmentHelperDecorator)
@@ -0,0 +1,15 @@
1
+ module SpreeCustomEmail
2
+ module Admin
3
+ module BaseHelperDecorator
4
+ # @gem-override spree_admin-5.3.6/app/helpers/spree/admin/base_helper.rb#settings_active?
5
+ # @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4
6
+ # カスタムメール(custom_emails)管理画面でも設定メニューをアクティブ表示にする。
7
+ # Spree 5.3 追従: 本家変更(deprecation 文言)は super 経由で取り込まれるため本体は無変更。
8
+ def settings_active?
9
+ super || %w[custom_emails].include?(controller_name)
10
+ end
11
+ end
12
+ end
13
+ end
14
+
15
+ Spree::Admin::BaseHelper.prepend SpreeCustomEmail::Admin::BaseHelperDecorator
@@ -0,0 +1,38 @@
1
+ module Spree
2
+ module OrderMailerDecorator
3
+ # @gem-override spree_emails-5.3.6/app/mailers/spree/order_mailer.rb#confirm_email
4
+ # @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4
5
+ # 管理画面で設定したカスタム件名・本文を使えるよう send_custom_email に委譲する。
6
+ def confirm_email(order, resend = false)
7
+ send_custom_email(order, 'confirm_email', resend)
8
+ end
9
+
10
+ # @gem-override spree_emails-5.3.6/app/mailers/spree/order_mailer.rb#cancel_email
11
+ # @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4
12
+ def cancel_email(order, resend = false)
13
+ send_custom_email(order, 'cancel_email', resend)
14
+ end
15
+
16
+ private
17
+
18
+ def send_custom_email(order, mail_type, resend)
19
+ @order = order.respond_to?(:id) ? order : Spree::Order.find(order)
20
+ current_store = @order.store
21
+ @spree_custom_email = current_store.custom_emails.find_by(mail_type: mail_type)
22
+ subject = build_subject(mail_type, resend, current_store)
23
+ mail(to: @order.email, from: from_address, subject: subject, store_url: current_store.url_or_custom_domain, reply_to: reply_to_address)
24
+ end
25
+
26
+ def build_subject(mail_type, resend, current_store)
27
+ subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
28
+ if @spree_custom_email&.subject.present?
29
+ subject += @spree_custom_email.subject
30
+ else
31
+ subject += "#{current_store.name} #{Spree.t("order_mailer.#{mail_type}.subject")} ##{@order.number}"
32
+ end
33
+ subject
34
+ end
35
+ end
36
+ end
37
+
38
+ Spree::OrderMailer.prepend Spree::OrderMailerDecorator
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module ReimbursementMailerDecorator
3
+ # @gem-override spree_emails-5.3.6/app/mailers/spree/reimbursement_mailer.rb#reimbursement_email
4
+ # @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4
5
+ # 管理画面で設定したカスタム件名を使えるよう再実装する。
6
+ def reimbursement_email(reimbursement, resend = false)
7
+ @reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
8
+ @order = @reimbursement.order
9
+ current_store = @reimbursement.store || Spree::Store.default
10
+ @spree_custom_email = current_store.custom_emails.find_by(mail_type: 'reimbursement_email')
11
+ subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
12
+
13
+ if @spree_custom_email&.subject.present?
14
+ subject += @spree_custom_email.subject
15
+ else
16
+ subject += "#{current_store.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@order.number}"
17
+ end
18
+
19
+ mail(to: @order.email, from: from_address, subject: subject, store_url: current_store.url_or_custom_domain, reply_to: reply_to_address)
20
+ end
21
+ end
22
+ end
23
+
24
+ Spree::ReimbursementMailer.prepend Spree::ReimbursementMailerDecorator
@@ -0,0 +1,24 @@
1
+ module Spree
2
+ module ShipmentMailerDecorator
3
+ # @gem-override spree_emails-5.3.6/app/mailers/spree/shipment_mailer.rb#shipped_email
4
+ # @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4
5
+ # 管理画面で設定したカスタム件名を使えるよう再実装する。
6
+ def shipped_email(shipment, resend = false)
7
+ @shipment = shipment.respond_to?(:id) ? shipment : Spree::Shipment.find(shipment)
8
+ @order = @shipment.order
9
+ current_store = @shipment.store
10
+ @spree_custom_email = current_store.custom_emails.find_by(mail_type: 'shipped_email')
11
+ subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
12
+
13
+ if @spree_custom_email&.subject.present?
14
+ subject += @spree_custom_email.subject
15
+ else
16
+ subject += "#{current_store.name} #{Spree.t('shipment_mailer.shipped_email.subject')} ##{@order.number}"
17
+ end
18
+
19
+ mail(to: @order.email, from: from_address, subject: subject, store_url: current_store.url_or_custom_domain, reply_to: reply_to_address)
20
+ end
21
+ end
22
+ end
23
+
24
+ Spree::ShipmentMailer.prepend Spree::ShipmentMailerDecorator
@@ -0,0 +1,48 @@
1
+ module Spree
2
+ class CustomEmail < ActiveRecord::Base
3
+ belongs_to :store, class_name: 'Spree::Store'
4
+
5
+ enum :mail_type, {
6
+ confirm_email: 0,
7
+ cancel_email: 1,
8
+ reimbursement_email: 2,
9
+ shipped_email: 3
10
+ }
11
+
12
+ validates :mail_type, uniqueness: { scope: :store_id }
13
+
14
+ # Spree 5.2(Ransack 4.x)は検索・ソート対象を明示的に allowlist することを要求する。
15
+ # ActiveRecord::Base 継承で Spree::Core::Ransackable を含まないため、Ransack 標準の
16
+ # ransackable_attributes / ransackable_associations をオーバーライドして許可する。
17
+ def self.ransackable_attributes(_auth_object = nil)
18
+ %w[id store_id mail_type subject header footer created_at updated_at]
19
+ end
20
+
21
+ def self.ransackable_associations(_auth_object = nil)
22
+ %w[store]
23
+ end
24
+
25
+ def header_for(format)
26
+ format_content(header, format)
27
+ end
28
+
29
+ def footer_for(format)
30
+ format_content(footer, format)
31
+ end
32
+
33
+ private
34
+
35
+ def format_content(content, format)
36
+ return "" if content.blank?
37
+
38
+ case format.to_sym
39
+ when :html
40
+ content.gsub("\n", "<br>").html_safe # rubocop:disable Rails/OutputSafety
41
+ when :text
42
+ ActionController::Base.helpers.strip_tags(content)
43
+ else
44
+ content # デフォルトは未処理で返す
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,9 @@
1
+ module SpreeCustomEmail
2
+ module StoreDecorator
3
+ def self.prepended(base)
4
+ base.has_many :custom_emails, class_name: 'Spree::CustomEmail', dependent: :destroy
5
+ end
6
+ end
7
+ end
8
+
9
+ Spree::Store.prepend(SpreeCustomEmail::StoreDecorator)
@@ -0,0 +1,10 @@
1
+ Deface::Override.new(
2
+ virtual_path: 'spree/admin/shared/sidebar/_store_nav',
3
+ name: 'add_custom_emails_to_store_nav',
4
+ insert_before: "erb:contains('can?(:manage, Spree::StockLocation)')",
5
+ text: <<-HTML
6
+ <li class="nav-item">
7
+ <%= nav_item(Spree.t(:custom_emails), spree.setting_admin_custom_emails_path, icon: 'mail', active: %w[custom_emails].include?(controller_name)) %>
8
+ </li>
9
+ HTML
10
+ )
@@ -0,0 +1,29 @@
1
+ <div data-hook="admin_custom_email_form_fields">
2
+ <%= form_for custom_email, url: admin_custom_email_path(custom_email), method: :patch do |f| %>
3
+ <fieldset>
4
+ <%= f.hidden_field :mail_type, value: mail_type %>
5
+
6
+ <div class="form-group">
7
+ <%= f.label :subject, Spree.t(:subject) %>
8
+ <%= f.error_message_on :subject, class: 'fullwidth title' %>
9
+ <%= f.text_field :subject, class: 'form-control' %>
10
+ </div>
11
+
12
+ <div class="form-group">
13
+ <%= f.label :header, Spree.t(:header) %>
14
+ <%= f.error_message_on :header, class: 'fullwidth title' %>
15
+ <%= f.text_area :header, rows: 3, class: 'form-control' %>
16
+ </div>
17
+
18
+ <div class="form-group">
19
+ <%= f.label :footer, Spree.t(:footer) %>
20
+ <%= f.error_message_on :footer, class: 'fullwidth title' %>
21
+ <%= f.text_area :footer, rows: 3, class: 'form-control' %>
22
+ </div>
23
+
24
+ <div data-hook="buttons" class="actions mb-6">
25
+ <%= button Spree.t('actions.update'), 'save' %>
26
+ </div>
27
+ </fieldset>
28
+ <% end %>
29
+ </div>
@@ -0,0 +1,15 @@
1
+ <% content_for :page_title do %>
2
+ <%= Spree.t(:editing_resource, resource: Spree::CustomEmail.model_name.human) %>
3
+ <% end %>
4
+
5
+ <div class='page-alerts'>
6
+ <div class='alert alert-info'>
7
+ <%= Spree.t(:custom_email_alert_info)%>
8
+ </div>
9
+ </div>
10
+
11
+ <% @custom_emails.each do |custom_email| %>
12
+ <h3>■<%= Spree.t(custom_email.mail_type, default: custom_email.mail_type) %></h3>
13
+ <%= render partial: 'form', locals: { custom_email: custom_email, mail_type: custom_email.mail_type } %>
14
+ <hr class="my-6" />
15
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <% if can?(:manage, Spree::CustomEmail) %>
2
+ <li class="nav-item">
3
+ <%= active_link_to spree.setting_admin_custom_emails_path, class: 'nav-link' do %>
4
+ <%= icon 'mail' %>
5
+ <%= Spree.t(:custom_emails) %>
6
+ <% end %>
7
+ </li>
8
+ <% end %>
@@ -0,0 +1,33 @@
1
+ <%# @gem-override spree_emails-5.3.6/app/views/spree/order_mailer/cancel_email.html.erb %>
2
+ <%# reason: カスタムメール (spree_custom_email) のヘッダー/フッター差し込みに対応している %>
3
+ <%# @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4 %>
4
+ <h1>
5
+ <%= Spree.t('order_mailer.cancel_email.dear_customer', name: name_for(@order)) %>
6
+ </h1>
7
+ <% if @spree_custom_email&.header.present? %>
8
+ <p><%= @spree_custom_email.header_for(:html) %></p>
9
+ <% else %>
10
+ <p><%= Spree.t('order_mailer.cancel_email.instructions') %></p>
11
+ <% end %>
12
+
13
+ <table class="purchase" role="presentation">
14
+ <tr>
15
+ <td>
16
+ <h3> <%= Spree.t('order_mailer.cancel_email.order_summary_canceled', number: @order.number) %></h3>
17
+ </td>
18
+ </tr>
19
+ <tr>
20
+ <td colspan="2">
21
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
22
+ </td>
23
+ </tr>
24
+ </table>
25
+
26
+ <% if @spree_custom_email&.footer.present? %>
27
+ <p><%= @spree_custom_email.footer_for(:html) %></p>
28
+ <% else %>
29
+ <p>
30
+ <%= Spree.t('order_mailer.cancel_email.thanks') %><br />
31
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
32
+ </p>
33
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <%# @gem-override spree_emails-5.3.6/app/views/spree/order_mailer/cancel_email.text.erb %>
2
+ <%# reason: カスタムメールのヘッダー/フッター差し込みに対応している (テキスト版) %>
3
+ <%# @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4 %>
4
+ <%= Spree.t('order_mailer.cancel_email.dear_customer', name: name_for(@order)) %>
5
+
6
+ <% if @spree_custom_email&.header.present? %>
7
+ <%= @spree_custom_email.header_for(:text) %>
8
+ <% else %>
9
+ <%= Spree.t('order_mailer.cancel_email.instructions') %>
10
+ <% end %>
11
+
12
+ ============================================================
13
+ <%= Spree.t('order_mailer.cancel_email.order_summary_canceled', number: @order.number) %>
14
+ ============================================================
15
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
16
+ ============================================================
17
+ <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
18
+ <% if @spree_custom_email&.footer.present? %>
19
+ <%= @spree_custom_email.footer_for(:text) %>
20
+ <% else %>
21
+ <%= Spree.t('order_mailer.cancel_email.thanks') %>
22
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
23
+ <% end %>
@@ -0,0 +1,80 @@
1
+ <%# @gem-override spree_emails-5.3.6/app/views/spree/order_mailer/confirm_email.html.erb %>
2
+ <%# reason: カスタムメールのヘッダー/フッター差し込みに加え、支払い方法・配送先/請求先住所・デジタル商品ダウンロードリンクを追加している %>
3
+ <%# @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4 %>
4
+ <h1>
5
+ <%= Spree.t('order_mailer.confirm_email.dear_customer', name: name_for(@order)) %>
6
+ </h1>
7
+ <% if @spree_custom_email&.header.present? %>
8
+ <p><%= @spree_custom_email.header_for(:html) %></p>
9
+ <% else %>
10
+ <p><%= Spree.t('order_mailer.confirm_email.instructions') %></p>
11
+ <% end %>
12
+
13
+ <table class="purchase" role="presentation">
14
+ <tr>
15
+ <td>
16
+ <h3><%= Spree.t('order_mailer.confirm_email.order_summary', number: @order.number) %></h3>
17
+ </td>
18
+ </tr>
19
+ <tr>
20
+ <td colspan="2">
21
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
22
+ </td>
23
+ </tr>
24
+ <tr>
25
+ <td>
26
+ <p><%= Spree.t('order_mailer.confirm_email.payment_method', name: @order.payments.valid.map{|p| p.payment_method.name}.join(", ")) %></p>
27
+ </td>
28
+ </tr>
29
+
30
+ <% if @order.shipping_address.present? %>
31
+ <tr>
32
+ <td>
33
+ <p><%= Spree::Order.human_attribute_name(:ship_address) %>: <%= @order.shipping_address.to_s %></p>
34
+ </td>
35
+ </tr>
36
+ <% end %>
37
+
38
+ <% if @order.billing_address.present? %>
39
+ <tr>
40
+ <td>
41
+ <p><%= Spree::Order.human_attribute_name(:bill_address) %>: <%= @order.billing_address.to_s %></p>
42
+ </td>
43
+ </tr>
44
+ <% end %>
45
+
46
+ </table>
47
+
48
+ <% if @order.some_digital? %>
49
+ <p>
50
+ <%= Spree.t('order_mailer.confirm_email.download_digitals') %>
51
+ </p>
52
+ <ul>
53
+ <% @order.line_items.each do |item| %>
54
+ <% if item.digital? && item.digital_links.any? { |link| link.authorize! } %>
55
+ <li>
56
+ <p><%= raw item.variant.name %>:</p>
57
+ <ul>
58
+ <% item.digital_links.each do |link| %>
59
+ <% next unless link.authorize! %>
60
+ <li>
61
+ <%= link_to link.digital.attachment.filename.to_s,
62
+ spree.digital_link_url(id: link.token, host: @order.store.url_or_custom_domain),
63
+ target: "_blank"
64
+ %>
65
+ </li>
66
+ <% end %>
67
+ </ul>
68
+ </li>
69
+ <% end %>
70
+ <% end %>
71
+ </ul>
72
+ <% end %>
73
+ <% if @spree_custom_email&.footer.present? %>
74
+ <p><%= @spree_custom_email.footer_for(:html) %></p>
75
+ <% else %>
76
+ <p>
77
+ <%= Spree.t('order_mailer.confirm_email.thanks') %><br />
78
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
79
+ </p>
80
+ <% end %>
@@ -0,0 +1,48 @@
1
+ <%# @gem-override spree_emails-5.3.6/app/views/spree/order_mailer/confirm_email.text.erb %>
2
+ <%# reason: カスタムメールのヘッダー/フッター差し込みに加え、支払い方法・住所・デジタル商品ダウンロードリンクを追加している (テキスト版) %>
3
+ <%# @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4 %>
4
+ <%= Spree.t('order_mailer.confirm_email.dear_customer', name: name_for(@order)) %>
5
+
6
+ <% if @spree_custom_email&.header.present? %>
7
+ <%= @spree_custom_email.header_for(:text) %>
8
+ <% else %>
9
+ <%= Spree.t('order_mailer.confirm_email.instructions') %>
10
+ <% end %>
11
+
12
+ ============================================================
13
+ <%= Spree.t('order_mailer.confirm_email.order_summary', number: @order.number) %>
14
+ ============================================================
15
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
16
+ ============================================================
17
+ <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
18
+ <%= Spree.t('order_mailer.confirm_email.payment_method', name: @order.payments.valid.map{|p| p.payment_method.name}.join(", ")) %>
19
+ ============================================================
20
+ <% if @order.shipping_address.present? %>
21
+ <%= Spree::Order.human_attribute_name(:ship_address) %>: <%= @order.shipping_address.to_text %>
22
+ <% end %>
23
+ <% if @order.billing_address.present? %>
24
+ <%= Spree::Order.human_attribute_name(:bill_address) %>: <%= @order.billing_address.to_text %>
25
+ <% end %>
26
+ <% if @order.some_digital? %>
27
+ ============================================================
28
+ <%= Spree.t('order_mailer.confirm_email.download_digitals') %>
29
+ ============================================================
30
+ <% @order.line_items.each do |item| %>
31
+ <% if item.digital? && item.digital_links.any? { |link| link.authorize! } %>
32
+ <%= item.variant.name %>:
33
+ <% item.digital_links.each do |link| %>
34
+ <% next unless link.authorize! %>
35
+ <%= link.digital.attachment.filename.to_s %>:
36
+ <%= spree.digital_link_url(id: link.token, host: @order.store.url_or_custom_domain) %>
37
+ <% end %>
38
+ <% end %>
39
+ <% end %>
40
+ ============================================================
41
+ <% end %>
42
+
43
+ <% if @spree_custom_email&.footer.present? %>
44
+ <%= @spree_custom_email.footer_for(:text) %>
45
+ <% else %>
46
+ <%= Spree.t('order_mailer.confirm_email.thanks') %>
47
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
48
+ <% end %>
@@ -0,0 +1,58 @@
1
+ <%# @gem-override spree_emails-5.3.6/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb %>
2
+ <%# reason: カスタムメールのヘッダー/フッター差し込みと、明細画像のレスポンシブスタイルを追加している %>
3
+ <%# @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4 %>
4
+ <h1>
5
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.dear_customer', name: name_for(@order)) %>
6
+ </h1>
7
+ <% if @spree_custom_email&.header.present? %>
8
+ <p><%= @spree_custom_email.header_for(:html) %></p>
9
+ <% else %>
10
+ <p><%= Spree.t('reimbursement_mailer.reimbursement_email.instructions') %></p>
11
+ <% end %>
12
+ <p>
13
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.refund_summary') %>
14
+ </p>
15
+ <p>
16
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.total_refunded', total: @reimbursement.display_total) %>
17
+ </p>
18
+ <% if @reimbursement.return_items.exchange_requested.present? %>
19
+ <p>
20
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.exchange_summary') %>
21
+ </p>
22
+
23
+ <table class="purchase_content">
24
+ <% @reimbursement.return_items.exchange_requested.each do |return_item| %>
25
+ <tr>
26
+ <td class="purchase_image">
27
+ <%= link_to(image_tag(variant_image_url(return_item.variant), style: "max-width: 100%; height: auto; display: block;"), spree_storefront_resource_url(return_item.variant.product)) %>
28
+ </td>
29
+ <td class="purchase_item" style="word-break: break-word;">
30
+ <strong>
31
+ <span class="f-fallback">
32
+ <%= link_to raw(return_item.variant.name), spree_storefront_resource_url(return_item.variant.product) %>
33
+ </span>
34
+ </strong>
35
+ <p class="purchase_item--additional">
36
+ <%= "(#{raw(return_item.exchange_variant.options_text)})" if return_item.exchange_variant.options_text.present? -%>
37
+ </p>
38
+ </td>
39
+ </tr>
40
+ <% end %>
41
+ </table>
42
+
43
+ <% if @reimbursement.return_items.awaiting_return.present? && Spree::Config[:expedited_exchanges] %>
44
+ <p>
45
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.days_to_send', days: Spree::Config[:expedited_exchanges_days_window]) %>
46
+ </p>
47
+ <% end %>
48
+ <% end %>
49
+
50
+ <% if @spree_custom_email&.footer.present? %>
51
+ <p><%= @spree_custom_email.footer_for(:html) %></p>
52
+ <% else %>
53
+ <p>
54
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.thanks') %>
55
+ <br />
56
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.store_team', store_name: current_store.name) %>
57
+ </p>
58
+ <% end %>
@@ -0,0 +1,36 @@
1
+ <%# @gem-override spree_emails-5.3.6/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb %>
2
+ <%# reason: カスタムメールのヘッダー/フッター差し込みに対応している (テキスト版) %>
3
+ <%# @see https://github.com/be-agile/giga-repeat/commit/27ad550f76d381992f038b6d1c52270e2d9e78e4 %>
4
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.dear_customer', name: name_for(@reimbursement.order)) %>
5
+
6
+ <% if @spree_custom_email&.header.present? %>
7
+ <%= @spree_custom_email.header_for(:text) %>
8
+ <% else %>
9
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.instructions') %>
10
+ <% end %>
11
+
12
+ ============================================================
13
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.refund_summary') %>
14
+ ============================================================
15
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.total_refunded', total: @reimbursement.display_total) %>
16
+
17
+ <% if @reimbursement.return_items.exchange_requested.present? %>
18
+ ============================================================
19
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.exchange_summary') %>
20
+ ============================================================
21
+ <% @reimbursement.return_items.exchange_requested.each do |return_item| %>
22
+ <%= return_item.variant.sku %> <%= raw(return_item.variant.product.name) %> <%= "(#{raw(return_item.variant.options_text)})" if return_item.variant.options_text.present? -%> -> <%= return_item.exchange_variant.sku %> <%= raw(return_item.exchange_variant.product.name) if return_item.exchange_variant.options_text.present? %> <%= "(#{raw(return_item.exchange_variant.options_text)})" -%>
23
+ <% end %>
24
+
25
+
26
+ <% if @reimbursement.return_items.awaiting_return.present? && Spree::Config[:expedited_exchanges] %>
27
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.days_to_send', days: Spree::Config[:expedited_exchanges_days_window]) %>
28
+ <% end %>
29
+ <% end %>
30
+ <% if @spree_custom_email&.footer.present? %>
31
+ <%= @spree_custom_email.footer_for(:text) %>
32
+ <% else %>
33
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.thanks') %>
34
+ <%= Spree.t('reimbursement_mailer.reimbursement_email.store_team', store_name: current_store.name) %>
35
+ <% end %>
36
+