spree_emails 5.6.1 → 6.0.0.beta1

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 (70) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +30 -0
  3. data/README.md +2 -2
  4. data/app/helpers/spree/base_helper.rb +45 -0
  5. data/app/helpers/spree/digital_asset_helper.rb +16 -0
  6. data/app/helpers/spree/fulfillment_helper.rb +12 -0
  7. data/app/helpers/spree/mail_helper.rb +0 -13
  8. data/app/mailers/spree/company_mailer.rb +40 -0
  9. data/app/mailers/spree/customer_mailer.rb +21 -0
  10. data/app/mailers/spree/digital_asset_mailer.rb +30 -0
  11. data/app/mailers/spree/fulfillment_mailer.rb +17 -0
  12. data/app/mailers/spree/order_mailer.rb +1 -1
  13. data/app/mailers/spree/return_mailer.rb +17 -0
  14. data/app/mailers/spree/seller_mailer.rb +68 -0
  15. data/app/mailers/spree/shipment_mailer.rb +4 -11
  16. data/app/subscribers/spree/company_email_subscriber.rb +19 -0
  17. data/app/subscribers/spree/customer_email_subscriber.rb +1 -1
  18. data/app/subscribers/spree/data_request_email_subscriber.rb +21 -0
  19. data/app/subscribers/spree/digital_asset_email_subscriber.rb +35 -0
  20. data/app/subscribers/spree/fulfillment_email_subscriber.rb +34 -0
  21. data/app/subscribers/spree/order_email_subscriber.rb +5 -2
  22. data/app/subscribers/spree/return_email_subscriber.rb +23 -0
  23. data/app/subscribers/spree/seller_email_subscriber.rb +46 -0
  24. data/app/views/spree/company_mailer/invitation_email.html.erb +8 -0
  25. data/app/views/spree/company_mailer/invitation_email.text.erb +11 -0
  26. data/app/views/spree/customer_mailer/data_export_email.html.erb +12 -0
  27. data/app/views/spree/customer_mailer/data_export_email.text.erb +9 -0
  28. data/app/views/spree/digital_asset_mailer/files_ready_email.html.erb +20 -0
  29. data/app/views/spree/digital_asset_mailer/files_ready_email.text.erb +10 -0
  30. data/app/views/spree/fulfillment_mailer/fulfilled_email.html.erb +22 -0
  31. data/app/views/spree/fulfillment_mailer/fulfilled_email.text.erb +18 -0
  32. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -0
  33. data/app/views/spree/order_mailer/confirm_email.text.erb +1 -0
  34. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +1 -0
  35. data/app/views/spree/return_mailer/refunded_email.html.erb +22 -0
  36. data/app/views/spree/return_mailer/refunded_email.text.erb +20 -0
  37. data/app/views/spree/seller_mailer/approved_email.html.erb +8 -0
  38. data/app/views/spree/seller_mailer/approved_email.text.erb +8 -0
  39. data/app/views/spree/seller_mailer/rejected_email.html.erb +6 -0
  40. data/app/views/spree/seller_mailer/rejected_email.text.erb +7 -0
  41. data/app/views/spree/seller_mailer/suspended_email.html.erb +6 -0
  42. data/app/views/spree/seller_mailer/suspended_email.text.erb +7 -0
  43. data/app/views/spree/shared/_item_thumbnail_link.html.erb +12 -1
  44. data/app/views/spree/shared/_order_summary_section.html.erb +5 -0
  45. data/app/views/spree/shared/_po_number.text.erb +6 -0
  46. data/app/views/spree/shared/_purchased_items_table.html.erb +16 -11
  47. data/app/views/spree/shared/_purchased_items_table.text.erb +9 -10
  48. data/lib/spree/emails/engine.rb +4 -3
  49. data/lib/spree/emails/previews/fulfillment_preview.rb +12 -0
  50. data/lib/spree/emails/previews/return_preview.rb +12 -0
  51. metadata +43 -28
  52. data/app/assets/config/spree_emails_manifest.js +0 -1
  53. data/app/assets/images/logo/spree_50.png +0 -0
  54. data/app/assets/images/noimage/mini.png +0 -0
  55. data/app/assets/images/noimage/noimage/large.png +0 -0
  56. data/app/assets/images/noimage/noimage/mini.png +0 -0
  57. data/app/assets/images/noimage/noimage/product.png +0 -0
  58. data/app/assets/images/noimage/noimage/small.png +0 -0
  59. data/app/assets/images/noimage/small.png +0 -0
  60. data/app/mailers/spree/reimbursement_mailer.rb +0 -15
  61. data/app/subscribers/spree/reimbursement_email_subscriber.rb +0 -24
  62. data/app/subscribers/spree/shipment_email_subscriber.rb +0 -24
  63. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -47
  64. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -24
  65. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +0 -3
  66. data/app/views/spree/shipment_mailer/shipped_email.html.erb +0 -20
  67. data/app/views/spree/shipment_mailer/shipped_email.text.erb +0 -17
  68. data/config/initializers/assets.rb +0 -3
  69. data/lib/spree/emails/previews/reimbursement_preview.rb +0 -12
  70. data/lib/spree/emails/previews/shipment_preview.rb +0 -12
@@ -0,0 +1,9 @@
1
+ <%= Spree.t('customer_mailer.data_export_email.greeting') %>
2
+
3
+ <%= Spree.t('customer_mailer.data_export_email.instructions') %>
4
+
5
+ <% if @download_url %><%= @download_url %><% end %>
6
+
7
+ <% if @expires_at %><%= Spree.t('customer_mailer.data_export_email.expiry_notice', date: I18n.l(@expires_at.to_date, format: :long)) %><% end %>
8
+
9
+ <%= Spree.t('customer_mailer.data_export_email.ignore_notice') %>
@@ -0,0 +1,20 @@
1
+ <%= render layout: 'spree/shared/mailer_hero' do %>
2
+ <h1><%= Spree.t('digital_asset_mailer.files_ready_email.subject') %></h1>
3
+ <p class="greeting"><%= Spree.t('digital_asset_mailer.files_ready_email.dear_customer', name: name_for(@order)) %></p>
4
+ <p><%= Spree.t('digital_asset_mailer.files_ready_email.instructions', number: @order.number) %></p>
5
+ <% end %>
6
+
7
+ <table width="100%" cellpadding="0" cellspacing="0" border="0">
8
+ <% @digital_links.each do |digital_link| %>
9
+ <tr>
10
+ <td style="padding: 8px 0;">
11
+ <a href="<%= digital_link_download_url(digital_link, @download_host) %>"><%= digital_link.filename %></a>
12
+ <% if digital_link.expires_at %>
13
+ <div style="font-size: 12px; color: #666;">
14
+ <%= Spree.t('digital_asset_mailer.files_ready_email.available_until', date: l(digital_link.expires_at.to_date, format: :long)) %>
15
+ </div>
16
+ <% end %>
17
+ </td>
18
+ </tr>
19
+ <% end %>
20
+ </table>
@@ -0,0 +1,10 @@
1
+ <%= Spree.t('digital_asset_mailer.files_ready_email.dear_customer', name: name_for(@order)) %>
2
+
3
+ <%= Spree.t('digital_asset_mailer.files_ready_email.instructions', number: @order.number) %>
4
+
5
+ <% @digital_links.each do |digital_link| %>
6
+ <%= digital_link.filename %>
7
+ <%= digital_link_download_url(digital_link, @download_host) %>
8
+ <% if digital_link.expires_at %><%= Spree.t('digital_asset_mailer.files_ready_email.available_until', date: l(digital_link.expires_at.to_date, format: :long)) %>
9
+ <% end %>
10
+ <% end %>
@@ -0,0 +1,22 @@
1
+ <%= render 'spree/shared/purchased_items_styles' %>
2
+
3
+ <%= render layout: 'spree/shared/mailer_hero' do %>
4
+ <h1><%= Spree.t('fulfillment_mailer.fulfilled_email.subject') %></h1>
5
+ <p class="greeting"><%= Spree.t('fulfillment_mailer.fulfilled_email.dear_customer', name: name_for(@fulfillment.order)) %></p>
6
+ <p><%= Spree.t('fulfillment_mailer.fulfilled_email.instructions', number: @fulfillment.order.number) %></p>
7
+ <% if @fulfillment.delivery_method %>
8
+ <p><%= Spree.t('fulfillment_mailer.fulfilled_email.delivery_method', delivery_method: @fulfillment.delivery_method.name) %></p>
9
+ <% end %>
10
+ <% if @fulfillment.tracking %>
11
+ <p><%= Spree.t('fulfillment_mailer.fulfilled_email.track_information', tracking: @fulfillment.tracking) %></p>
12
+ <% end %>
13
+ <% if @fulfillment.tracking_url %>
14
+ <p><%= Spree.t('fulfillment_mailer.fulfilled_email.track_link', url: fulfillment_tracking_link_to(fulfillment: @fulfillment)).html_safe %></p>
15
+ <% end %>
16
+ <% end %>
17
+
18
+ <%= render 'spree/shared/order_summary_section',
19
+ heading: Spree.t('fulfillment_mailer.fulfilled_email.fulfillment_summary'),
20
+ line_items: @fulfillment.manifest.map(&:line_item),
21
+ order: @fulfillment.order,
22
+ totals: false %>
@@ -0,0 +1,18 @@
1
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.dear_customer', name: name_for(@fulfillment.order)) %>
2
+
3
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.instructions', number: @fulfillment.order.number) %>
4
+
5
+ ============================================================
6
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.fulfillment_summary') %>
7
+ ============================================================
8
+ <%= render 'spree/shared/po_number', order: @fulfillment.order %>
9
+ <% @fulfillment.manifest.each do |item| %>
10
+ <%= item.variant.sku %> <%= item.variant.product.name %> <%= item.variant.options_text %>
11
+ <% end %>
12
+ ============================================================
13
+
14
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.track_information', tracking: @fulfillment.tracking) if @fulfillment.tracking %>
15
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.track_link', url: @fulfillment.tracking_url) if @fulfillment.tracking_url %>
16
+
17
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.thanks') %>
18
+ <%= Spree.t('fulfillment_mailer.fulfilled_email.store_team', store_name: current_store.name) %>
@@ -5,6 +5,7 @@
5
5
  ============================================================
6
6
  <%= Spree.t('order_mailer.cancel_email.order_summary_canceled', number: @order.number) %>
7
7
  ============================================================
8
+ <%= render 'spree/shared/po_number', order: @order %>
8
9
  <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
9
10
  ============================================================
10
11
  <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
@@ -5,6 +5,7 @@
5
5
  ============================================================
6
6
  <%= Spree.t('order_mailer.confirm_email.order_summary', number: @order.number) %>
7
7
  ============================================================
8
+ <%= render 'spree/shared/po_number', order: @order %>
8
9
  <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
9
10
  ============================================================
10
11
  <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
@@ -5,6 +5,7 @@
5
5
  ============================================================
6
6
  <%= Spree.t('order_mailer.store_owner_notification_email.order_summary', number: @order.number) %>
7
7
  ============================================================
8
+ <%= render 'spree/shared/po_number', order: @order %>
8
9
  <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
9
10
  ============================================================
10
11
  <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
@@ -0,0 +1,22 @@
1
+ <%= render 'spree/shared/purchased_items_styles' %>
2
+
3
+ <%= render layout: 'spree/shared/mailer_hero' do %>
4
+ <h1><%= Spree.t('return_mailer.refunded_email.subject') %></h1>
5
+ <p class="greeting"><%= Spree.t('return_mailer.refunded_email.dear_customer', name: name_for(@order)) %></p>
6
+ <p><%= Spree.t('return_mailer.refunded_email.instructions', number: @order.number) %></p>
7
+ <% end %>
8
+
9
+ <table class="section" width="100%" cellpadding="0" cellspacing="0" role="presentation">
10
+ <tr>
11
+ <td>
12
+ <h3 class="f-fallback"><%= Spree.t('return_mailer.refunded_email.refund_summary') %></h3>
13
+ <p class="strong f-fallback"><%= Spree.t('return_mailer.refunded_email.total_refunded', total: @return.display_refunded_total) %></p>
14
+ </td>
15
+ </tr>
16
+ </table>
17
+
18
+ <%= render 'spree/shared/order_summary_section',
19
+ heading: Spree.t('return_mailer.refunded_email.returned_items'),
20
+ line_items: @return.return_line_items.map(&:line_item),
21
+ order: @order,
22
+ totals: false %>
@@ -0,0 +1,20 @@
1
+ <%= Spree.t('return_mailer.refunded_email.dear_customer', name: name_for(@order)) %>
2
+
3
+ <%= Spree.t('return_mailer.refunded_email.instructions', number: @order.number) %>
4
+
5
+ ============================================================
6
+ <%= Spree.t('return_mailer.refunded_email.refund_summary') %>
7
+ ============================================================
8
+ <%= render 'spree/shared/po_number', order: @order %>
9
+ <%= Spree.t('return_mailer.refunded_email.total_refunded', total: @return.display_refunded_total) %>
10
+
11
+ ============================================================
12
+ <%= Spree.t('return_mailer.refunded_email.returned_items') %>
13
+ ============================================================
14
+ <% @return.return_line_items.each do |line| %>
15
+ <%= line.variant.sku %> <%= line.variant.product.name %> <%= line.variant.options_text %>
16
+ <% end %>
17
+ ============================================================
18
+
19
+ <%= Spree.t('return_mailer.refunded_email.thanks') %>
20
+ <%= Spree.t('return_mailer.refunded_email.store_team', store_name: current_store.name) %>
@@ -0,0 +1,8 @@
1
+ <%= render layout: 'spree/shared/mailer_hero' do %>
2
+ <h1><%= Spree.t('seller_mailer.approved_email.heading') %></h1>
3
+ <p class="greeting"><%= Spree.t('seller_mailer.greeting', seller_name: @seller.name) %></p>
4
+ <p><%= Spree.t('seller_mailer.approved_email.message', store_name: current_store.name) %></p>
5
+ <% if @dashboard_url %>
6
+ <%= render 'spree/shared/mailer_button', url: @dashboard_url, label: Spree.t('seller_mailer.approved_email.action') %>
7
+ <% end %>
8
+ <% end %>
@@ -0,0 +1,8 @@
1
+ <%= Spree.t('seller_mailer.greeting', seller_name: @seller.name) %>
2
+
3
+ <%= Spree.t('seller_mailer.approved_email.message', store_name: current_store.name) %>
4
+ <% if @dashboard_url %>
5
+ <%= Spree.t('seller_mailer.approved_email.action') %>: <%= @dashboard_url %>
6
+ <% end %>
7
+
8
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
@@ -0,0 +1,6 @@
1
+ <%= render layout: 'spree/shared/mailer_hero' do %>
2
+ <h1><%= Spree.t('seller_mailer.rejected_email.heading') %></h1>
3
+ <p class="greeting"><%= Spree.t('seller_mailer.greeting', seller_name: @seller.name) %></p>
4
+ <p><%= Spree.t('seller_mailer.rejected_email.message', store_name: current_store.name) %></p>
5
+ <p class="sub"><%= Spree.t('seller_mailer.get_in_touch', store_email: current_store.mail_from_address) %></p>
6
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <%= Spree.t('seller_mailer.greeting', seller_name: @seller.name) %>
2
+
3
+ <%= Spree.t('seller_mailer.rejected_email.message', store_name: current_store.name) %>
4
+
5
+ <%= Spree.t('seller_mailer.get_in_touch', store_email: current_store.mail_from_address) %>
6
+
7
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
@@ -0,0 +1,6 @@
1
+ <%= render layout: 'spree/shared/mailer_hero' do %>
2
+ <h1><%= Spree.t('seller_mailer.suspended_email.heading') %></h1>
3
+ <p class="greeting"><%= Spree.t('seller_mailer.greeting', seller_name: @seller.name) %></p>
4
+ <p><%= Spree.t('seller_mailer.suspended_email.message', store_name: current_store.name) %></p>
5
+ <p class="sub"><%= Spree.t('seller_mailer.get_in_touch', store_email: current_store.mail_from_address) %></p>
6
+ <% end %>
@@ -0,0 +1,7 @@
1
+ <%= Spree.t('seller_mailer.greeting', seller_name: @seller.name) %>
2
+
3
+ <%= Spree.t('seller_mailer.suspended_email.message', store_name: current_store.name) %>
4
+
5
+ <%= Spree.t('seller_mailer.get_in_touch', store_email: current_store.mail_from_address) %>
6
+
7
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
@@ -3,5 +3,16 @@
3
3
  <% if image.present? && image.attached? %>
4
4
  <%= link_to spree_image_tag(image, variant: :small, alt: alt, width: 80, class: 'item_thumb'), product_url %>
5
5
  <% else %>
6
- <%= link_to image_tag('noimage/small.png', alt: alt, width: 80, class: 'item_thumb'), product_url %>
6
+ <%# Table + inline styles, not a styled div: Outlook collapses empty block
7
+ elements and ignores class-based height, and a div inside <a> is invalid
8
+ under the XHTML doctype the mailer layout declares. %>
9
+ <table class="item_thumb_placeholder" width="80" height="80" cellpadding="0" cellspacing="0" role="presentation"
10
+ style="width: 80px; height: 80px; background-color: #E4E4E4; border-radius: 12px;">
11
+ <tr>
12
+ <td width="80" height="80" style="width: 80px; height: 80px; line-height: 80px; font-size: 0;">
13
+ <%= link_to '&#160;'.html_safe, product_url, 'aria-label': alt,
14
+ style: 'display: block; width: 80px; height: 80px; line-height: 80px; text-decoration: none;' %>
15
+ </td>
16
+ </tr>
17
+ </table>
7
18
  <% end %>
@@ -6,6 +6,11 @@
6
6
  <tr>
7
7
  <td>
8
8
  <h3 class="f-fallback"><%= heading %></h3>
9
+ <%# The buyer's own purchase-order reference, when they gave one — it is
10
+ how their accounting reconciles this order. %>
11
+ <% if order.po_number.present? %>
12
+ <p class="f-fallback"><%= Spree.t('order_mailer.po_number', number: order.po_number) %></p>
13
+ <% end %>
9
14
  <%= render 'spree/shared/purchased_items_table',
10
15
  line_items: line_items,
11
16
  order: order,
@@ -0,0 +1,6 @@
1
+ <%# The buyer's own purchase-order reference, when they gave one. Rendered by
2
+ every order-facing document so their accounting can reconcile against it.
3
+ Locals: order. %>
4
+ <% if order.po_number.present? %>
5
+ <%= Spree.t('order_mailer.po_number', number: order.po_number) %>
6
+ <% end %>
@@ -3,15 +3,13 @@
3
3
  <% if local_assigns.fetch(:totals, true) %>
4
4
  <table class="summary purchase_content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
5
5
  <%= render 'spree/shared/purchased_items_table/subtotal', order: order %>
6
- <% if order.line_item_adjustments.exists? %>
7
- <% order.all_adjustments.promotion.eligible.to_a.group_by(&:label).each do |label, adjustments| %>
8
- <%= render 'spree/shared/purchased_items_table/summary_row',
9
- label: Spree.t(:promotion),
10
- sub: label,
11
- value: Spree::Money.new(adjustments.sum(&:amount), currency: order.currency) %>
12
- <% end %>
6
+ <% order.discounts.promotion.to_a.group_by(&:label).each do |label, discounts| %>
7
+ <%= render 'spree/shared/purchased_items_table/summary_row',
8
+ label: Spree.t(:promotion),
9
+ sub: label,
10
+ value: Spree::Money.new(discounts.sum(&:amount), currency: order.currency) %>
13
11
  <% end %>
14
- <% order.shipments.group_by { |s| s.selected_shipping_rate&.name }.each do |name, shipments| %>
12
+ <% order.fulfillments.group_by { |f| f.selected_delivery_rate&.name }.each do |name, shipments| %>
15
13
  <%= render 'spree/shared/purchased_items_table/summary_row',
16
14
  label: Spree.t(:shipping),
17
15
  sub: name,
@@ -27,9 +25,16 @@
27
25
  label: Spree.t(:gift_card),
28
26
  value: safe_join(['-', order.display_gift_card_total.to_html]) %>
29
27
  <% end %>
30
- <% order.adjustments.eligible.each do |adjustment| %>
31
- <% next if (adjustment.source_type == 'Spree::TaxRate') || (adjustment.amount == 0) %>
32
- <%= render 'spree/shared/purchased_items_table/adjustment', adjustment: adjustment, order: order %>
28
+ <% order.discounts.manual.to_a.group_by(&:label).each do |label, discounts| %>
29
+ <%= render 'spree/shared/purchased_items_table/summary_row',
30
+ label: label,
31
+ value: Spree::Money.new(discounts.sum(&:amount), currency: order.currency) %>
32
+ <% end %>
33
+ <% order.fees.each do |fee| %>
34
+ <% next if fee.amount == 0 %>
35
+ <%= render 'spree/shared/purchased_items_table/summary_row',
36
+ label: fee.label,
37
+ value: Spree::Money.new(fee.amount, currency: order.currency) %>
33
38
  <% end %>
34
39
  <%= render 'spree/shared/purchased_items_table/total', order: order %>
35
40
  </table>
@@ -3,15 +3,11 @@
3
3
  <% end %>
4
4
  ============================================================
5
5
  <%= Spree.t('order_mailer.subtotal') %> <%= order.display_item_total %>
6
- <% if order.line_item_adjustments.exists? %>
7
- <% if order.all_adjustments.promotion.eligible.exists? %>
8
- <% order.all_adjustments.promotion.eligible.group_by(&:label).each do |label, adjustments| %>
9
- <%= Spree.t(:promotion) %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: order.currency) %>
10
- <% end %>
11
- <% end %>
6
+ <% order.discounts.promotion.to_a.group_by(&:label).each do |label, discounts| %>
7
+ <%= Spree.t(:promotion) %>: <%= label %> <%= Spree::Money.new(discounts.sum(&:amount), currency: order.currency) %>
12
8
  <% end %>
13
9
 
14
- <% order.shipments.group_by { |s| s.selected_shipping_rate.try(:name) }.each do |name, shipments| %>
10
+ <% order.fulfillments.group_by { |f| f.selected_delivery_rate.try(:name) }.each do |name, shipments| %>
15
11
  <%= Spree.t(:shipping) %>: <%= name %> <%= Spree::Money.new(shipments.sum(&:discounted_cost), currency: order.currency) %>
16
12
  <% end %>
17
13
 
@@ -23,7 +19,10 @@
23
19
  <%= Spree.t(:gift_card) %>: -<%= order.display_gift_card_total.to_html %>
24
20
  <% end %>
25
21
 
26
- <% order.adjustments.eligible.each do |adjustment| %>
27
- <% next if (adjustment.source_type == 'Spree::TaxRate') and (adjustment.amount == 0) %>
28
- <%= adjustment.label %> <%= adjustment.display_amount %>
22
+ <% order.discounts.manual.to_a.group_by(&:label).each do |label, discounts| %>
23
+ <%= label %> <%= Spree::Money.new(discounts.sum(&:amount), currency: order.currency) %>
24
+ <% end %>
25
+ <% order.fees.each do |fee| %>
26
+ <% next if fee.amount == 0 %>
27
+ <%= fee.label %> <%= fee.display_amount %>
29
28
  <% end %>
@@ -21,10 +21,11 @@ module Spree
21
21
  config.after_initialize do
22
22
  Spree.subscribers.concat [
23
23
  Spree::OrderEmailSubscriber,
24
- Spree::ShipmentEmailSubscriber,
25
- Spree::ReimbursementEmailSubscriber,
24
+ Spree::FulfillmentEmailSubscriber,
25
+ Spree::ReturnEmailSubscriber,
26
26
  Spree::NewsletterSubscriberEmailSubscriber,
27
- Spree::CustomerEmailSubscriber
27
+ Spree::CustomerEmailSubscriber,
28
+ Spree::SellerEmailSubscriber
28
29
  ]
29
30
  end
30
31
  end
@@ -0,0 +1,12 @@
1
+ require 'spree/core/previews/preview_data'
2
+
3
+ # Preview Spree fulfillment emails at /rails/mailers/spree/fulfillment
4
+ class Spree::FulfillmentPreview < ActionMailer::Preview
5
+ include Spree::PreviewData::LocaleParam
6
+
7
+ def fulfilled_email
8
+ fulfillment = Spree::Fulfillment.fulfilled.last
9
+ fulfillment.order.locale = locale if fulfillment && locale.present?
10
+ Spree::FulfillmentMailer.fulfilled_email(fulfillment)
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ require 'spree/core/previews/preview_data'
2
+
3
+ # Preview Spree return emails at /rails/mailers/spree/return
4
+ class Spree::ReturnPreview < ActionMailer::Preview
5
+ include Spree::PreviewData::LocaleParam
6
+
7
+ def refunded_email
8
+ return_record = Spree::Return.refunded.last
9
+ return_record.order.locale = locale if return_record && locale.present?
10
+ Spree::ReturnMailer.refunded_email(return_record)
11
+ end
12
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_emails
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.6.1
4
+ version: 6.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
@@ -10,22 +10,22 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2026-07-28 00:00:00.000000000 Z
13
+ date: 2026-09-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: spree
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - ">="
19
+ - - '='
20
20
  - !ruby/object:Gem::Version
21
- version: 5.6.1
21
+ version: 6.0.0.beta1
22
22
  type: :runtime
23
23
  prerelease: false
24
24
  version_requirements: !ruby/object:Gem::Requirement
25
25
  requirements:
26
- - - ">="
26
+ - - '='
27
27
  - !ruby/object:Gem::Version
28
- version: 5.6.1
28
+ version: 6.0.0.beta1
29
29
  - !ruby/object:Gem::Dependency
30
30
  name: email_spec
31
31
  requirement: !ruby/object:Gem::Requirement
@@ -41,35 +41,47 @@ dependencies:
41
41
  - !ruby/object:Gem::Version
42
42
  version: '2.2'
43
43
  description: Optional transactional emails for Spree such as Order placed or Shipment
44
- notification emails
44
+ notification emails. Fully responsive and mobile ready
45
45
  email: hello@spreecommerce.org
46
46
  executables: []
47
47
  extensions: []
48
48
  extra_rdoc_files: []
49
49
  files:
50
+ - LICENSE
50
51
  - README.md
51
52
  - Rakefile
52
- - app/assets/config/spree_emails_manifest.js
53
- - app/assets/images/logo/spree_50.png
54
- - app/assets/images/noimage/mini.png
55
- - app/assets/images/noimage/noimage/large.png
56
- - app/assets/images/noimage/noimage/mini.png
57
- - app/assets/images/noimage/noimage/product.png
58
- - app/assets/images/noimage/noimage/small.png
59
- - app/assets/images/noimage/small.png
53
+ - app/helpers/spree/base_helper.rb
54
+ - app/helpers/spree/digital_asset_helper.rb
55
+ - app/helpers/spree/fulfillment_helper.rb
60
56
  - app/helpers/spree/mail_helper.rb
57
+ - app/mailers/spree/company_mailer.rb
61
58
  - app/mailers/spree/customer_mailer.rb
59
+ - app/mailers/spree/digital_asset_mailer.rb
60
+ - app/mailers/spree/fulfillment_mailer.rb
62
61
  - app/mailers/spree/newsletter_mailer.rb
63
62
  - app/mailers/spree/order_mailer.rb
64
- - app/mailers/spree/reimbursement_mailer.rb
63
+ - app/mailers/spree/return_mailer.rb
64
+ - app/mailers/spree/seller_mailer.rb
65
65
  - app/mailers/spree/shipment_mailer.rb
66
+ - app/subscribers/spree/company_email_subscriber.rb
66
67
  - app/subscribers/spree/customer_email_subscriber.rb
68
+ - app/subscribers/spree/data_request_email_subscriber.rb
69
+ - app/subscribers/spree/digital_asset_email_subscriber.rb
70
+ - app/subscribers/spree/fulfillment_email_subscriber.rb
67
71
  - app/subscribers/spree/newsletter_subscriber_email_subscriber.rb
68
72
  - app/subscribers/spree/order_email_subscriber.rb
69
- - app/subscribers/spree/reimbursement_email_subscriber.rb
70
- - app/subscribers/spree/shipment_email_subscriber.rb
73
+ - app/subscribers/spree/return_email_subscriber.rb
74
+ - app/subscribers/spree/seller_email_subscriber.rb
75
+ - app/views/spree/company_mailer/invitation_email.html.erb
76
+ - app/views/spree/company_mailer/invitation_email.text.erb
77
+ - app/views/spree/customer_mailer/data_export_email.html.erb
78
+ - app/views/spree/customer_mailer/data_export_email.text.erb
71
79
  - app/views/spree/customer_mailer/password_reset_email.html.erb
72
80
  - app/views/spree/customer_mailer/password_reset_email.text.erb
81
+ - app/views/spree/digital_asset_mailer/files_ready_email.html.erb
82
+ - app/views/spree/digital_asset_mailer/files_ready_email.text.erb
83
+ - app/views/spree/fulfillment_mailer/fulfilled_email.html.erb
84
+ - app/views/spree/fulfillment_mailer/fulfilled_email.text.erb
73
85
  - app/views/spree/newsletter_mailer/email_confirmation.html.erb
74
86
  - app/views/spree/newsletter_mailer/email_confirmation.text.erb
75
87
  - app/views/spree/order_mailer/cancel_email.html.erb
@@ -79,37 +91,40 @@ files:
79
91
  - app/views/spree/order_mailer/payment_link_email.html.erb
80
92
  - app/views/spree/order_mailer/store_owner_notification_email.html.erb
81
93
  - app/views/spree/order_mailer/store_owner_notification_email.text.erb
82
- - app/views/spree/reimbursement_mailer/reimbursement_email.html.erb
83
- - app/views/spree/reimbursement_mailer/reimbursement_email.text.erb
94
+ - app/views/spree/return_mailer/refunded_email.html.erb
95
+ - app/views/spree/return_mailer/refunded_email.text.erb
96
+ - app/views/spree/seller_mailer/approved_email.html.erb
97
+ - app/views/spree/seller_mailer/approved_email.text.erb
98
+ - app/views/spree/seller_mailer/rejected_email.html.erb
99
+ - app/views/spree/seller_mailer/rejected_email.text.erb
100
+ - app/views/spree/seller_mailer/suspended_email.html.erb
101
+ - app/views/spree/seller_mailer/suspended_email.text.erb
84
102
  - app/views/spree/shared/_item_thumbnail_link.html.erb
85
103
  - app/views/spree/shared/_order_summary_section.html.erb
104
+ - app/views/spree/shared/_po_number.text.erb
86
105
  - app/views/spree/shared/_purchased_items_table.html.erb
87
106
  - app/views/spree/shared/_purchased_items_table.text.erb
88
- - app/views/spree/shared/purchased_items_table/_adjustment.html.erb
89
107
  - app/views/spree/shared/purchased_items_table/_line_item.html.erb
90
108
  - app/views/spree/shared/purchased_items_table/_subtotal.html.erb
91
109
  - app/views/spree/shared/purchased_items_table/_summary_row.html.erb
92
110
  - app/views/spree/shared/purchased_items_table/_total.html.erb
93
- - app/views/spree/shipment_mailer/shipped_email.html.erb
94
- - app/views/spree/shipment_mailer/shipped_email.text.erb
95
- - config/initializers/assets.rb
96
111
  - lib/generators/spree/emails/install/install_generator.rb
97
112
  - lib/spree/emails.rb
98
113
  - lib/spree/emails/engine.rb
99
114
  - lib/spree/emails/previews/customer_preview.rb
115
+ - lib/spree/emails/previews/fulfillment_preview.rb
100
116
  - lib/spree/emails/previews/newsletter_preview.rb
101
117
  - lib/spree/emails/previews/order_preview.rb
102
- - lib/spree/emails/previews/reimbursement_preview.rb
103
- - lib/spree/emails/previews/shipment_preview.rb
118
+ - lib/spree/emails/previews/return_preview.rb
104
119
  - lib/spree_emails.rb
105
120
  homepage: https://spreecommerce.org
106
121
  licenses:
107
122
  - BSD-3-Clause
108
123
  metadata:
109
124
  bug_tracker_uri: https://github.com/spree/spree/issues
110
- changelog_uri: https://github.com/spree/spree/releases/tag/v5.6.1
125
+ changelog_uri: https://github.com/spree/spree/releases/tag/v6.0.0.beta1
111
126
  documentation_uri: https://docs.spreecommerce.org/
112
- source_code_uri: https://github.com/spree/spree/tree/v5.6.1
127
+ source_code_uri: https://github.com/spree/spree/tree/v6.0.0.beta1
113
128
  post_install_message:
114
129
  rdoc_options: []
115
130
  require_paths:
@@ -1 +0,0 @@
1
- //= link_tree ../images
Binary file
Binary file
Binary file
@@ -1,15 +0,0 @@
1
- module Spree
2
- class ReimbursementMailer < BaseMailer
3
- helper Spree::MailHelper
4
-
5
- def reimbursement_email(reimbursement, resend = false)
6
- @reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
7
- @order = @reimbursement.order
8
- current_store = @reimbursement.store || Spree::Store.default
9
- with_store_locale(current_store, @order.locale) do
10
- subject = order_email_subject(current_store, Spree.t('reimbursement_mailer.reimbursement_email.subject'), @order.number, resend: resend)
11
- mail(to: @order.email, subject: subject, store_url: current_store.storefront_url)
12
- end
13
- end
14
- end
15
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spree
4
- class ReimbursementEmailSubscriber < Spree::Subscriber
5
- subscribes_to 'reimbursement.reimbursed'
6
-
7
- def handle(event)
8
- reimbursement = find_reimbursement(event)
9
- return unless reimbursement
10
-
11
- store = reimbursement.store
12
- return unless store.prefers_send_consumer_transactional_emails?
13
-
14
- ReimbursementMailer.reimbursement_email(reimbursement.id).deliver_later
15
- end
16
-
17
- private
18
-
19
- def find_reimbursement(event)
20
- reimbursement_id = event.payload['id']
21
- Spree::Reimbursement.find_by_prefix_id(reimbursement_id)
22
- end
23
- end
24
- end
@@ -1,24 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Spree
4
- class ShipmentEmailSubscriber < Spree::Subscriber
5
- subscribes_to 'shipment.shipped'
6
-
7
- def handle(event)
8
- shipment = find_shipment(event)
9
- return unless shipment
10
-
11
- store = shipment.store
12
- return unless store.prefers_send_consumer_transactional_emails?
13
-
14
- ShipmentMailer.shipped_email(shipment.id).deliver_later
15
- end
16
-
17
- private
18
-
19
- def find_shipment(event)
20
- shipment_id = event.payload['id']
21
- Spree::Shipment.find_by_prefix_id(shipment_id)
22
- end
23
- end
24
- end