spree_core 4.1.9 → 4.2.0.beta

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/spree/base_controller.rb +1 -0
  3. data/app/helpers/spree/base_helper.rb +23 -2
  4. data/app/helpers/spree/mail_helper.rb +24 -0
  5. data/app/mailers/spree/base_mailer.rb +17 -3
  6. data/app/mailers/spree/order_mailer.rb +11 -2
  7. data/app/mailers/spree/reimbursement_mailer.rb +4 -2
  8. data/app/mailers/spree/shipment_mailer.rb +4 -2
  9. data/app/models/concerns/spree/default_price.rb +2 -1
  10. data/app/models/concerns/spree/user_methods.rb +11 -5
  11. data/app/models/spree/app_configuration.rb +5 -0
  12. data/app/models/spree/line_item.rb +10 -1
  13. data/app/models/spree/option_type.rb +5 -1
  14. data/app/models/spree/order.rb +26 -5
  15. data/app/models/spree/price.rb +26 -2
  16. data/app/models/spree/product.rb +17 -7
  17. data/app/models/spree/promotion_handler/coupon.rb +1 -1
  18. data/app/models/spree/reimbursement.rb +2 -0
  19. data/app/models/spree/shipment.rb +2 -5
  20. data/app/models/spree/stock_location.rb +13 -2
  21. data/app/models/spree/store.rb +19 -2
  22. data/app/models/spree/variant.rb +15 -2
  23. data/app/presenters/spree/variant_presenter.rb +7 -0
  24. data/app/presenters/spree/variants/option_types_presenter.rb +1 -0
  25. data/app/views/layouts/spree/base_mailer.html.erb +45 -40
  26. data/app/views/spree/order_mailer/cancel_email.html.erb +19 -25
  27. data/app/views/spree/order_mailer/cancel_email.text.erb +24 -2
  28. data/app/views/spree/order_mailer/confirm_email.html.erb +18 -65
  29. data/app/views/spree/order_mailer/confirm_email.text.erb +2 -1
  30. data/app/views/spree/order_mailer/store_owner_notification_email.html.erb +23 -0
  31. data/app/views/spree/order_mailer/store_owner_notification_email.text.erb +38 -0
  32. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +53 -58
  33. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +3 -1
  34. data/app/views/spree/shared/_base_mailer_footer.html.erb +6 -14
  35. data/app/views/spree/shared/_base_mailer_header.html.erb +12 -32
  36. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +293 -625
  37. data/app/views/spree/shared/_purchased_items_table.html.erb +60 -0
  38. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +13 -0
  39. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +27 -0
  40. data/app/views/spree/shared/purchased_items_table/_subtotal.html.erb +13 -0
  41. data/app/views/spree/shared/purchased_items_table/_total.html.erb +13 -0
  42. data/app/views/spree/shipment_mailer/shipped_email.html.erb +31 -36
  43. data/app/views/spree/shipment_mailer/shipped_email.text.erb +2 -1
  44. data/config/initializers/assets.rb +1 -0
  45. data/config/locales/en.yml +113 -13
  46. data/db/default/spree/stores.rb +11 -10
  47. data/db/migrate/20140309033438_create_store_from_preferences.rb +1 -1
  48. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +10 -0
  49. data/db/migrate/20200102141311_add_social_to_spree_stores.rb +3 -0
  50. data/db/migrate/20200308210757_add_default_locale_to_spree_store.rb +7 -0
  51. data/db/migrate/20200310145140_add_customer_support_email_to_spree_store.rb +7 -0
  52. data/db/migrate/20200421095017_add_compare_at_amount_to_spree_prices.rb +7 -0
  53. data/db/migrate/20200423123001_add_default_country_id_to_spree_store.rb +9 -0
  54. data/db/migrate/20200430072209_add_footer_fields_to_spree_stores.rb +8 -0
  55. data/db/migrate/20200513154939_add_show_property_to_spree_product_properties.rb +5 -0
  56. data/db/migrate/20200607161221_add_store_owner_order_notification_delivered_to_spree_orders.rb +7 -0
  57. data/db/migrate/20200607161222_add_new_order_notifications_email_to_spree_stores.rb +7 -0
  58. data/db/migrate/20200826075557_add_unique_index_on_taxon_id_and_product_id_to_spree_products_taxons.rb +5 -0
  59. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -2
  60. data/lib/generators/spree/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -2
  61. data/lib/generators/spree/mailers_preview/mailers_preview_generator.rb +23 -0
  62. data/lib/generators/spree/mailers_preview/templates/mailers/previews/order_preview.rb +13 -0
  63. data/lib/generators/spree/mailers_preview/templates/mailers/previews/reimbursement_preview.rb +5 -0
  64. data/lib/generators/spree/mailers_preview/templates/mailers/previews/shipment_preview.rb +5 -0
  65. data/lib/generators/spree/mailers_preview/templates/mailers/previews/user_preview.rb +11 -0
  66. data/lib/spree/core.rb +1 -0
  67. data/lib/spree/core/controller_helpers/common.rb +1 -0
  68. data/lib/spree/core/controller_helpers/currency_helpers.rb +15 -0
  69. data/lib/spree/core/controller_helpers/store.rb +12 -1
  70. data/lib/spree/core/version.rb +1 -1
  71. data/lib/spree/permitted_attributes.rb +7 -4
  72. data/lib/spree/testing_support/authorization_helpers.rb +7 -4
  73. data/lib/spree/testing_support/factories/store_factory.rb +11 -8
  74. data/spree_core.gemspec +4 -4
  75. data/vendor/assets/javascripts/cleave.js +1669 -0
  76. metadata +37 -14
  77. data/app/views/spree/order_mailer/_adjustment.html.erb +0 -8
  78. data/app/views/spree/order_mailer/_subtotal.html.erb +0 -8
  79. data/app/views/spree/order_mailer/_total.html.erb +0 -8
@@ -28,7 +28,7 @@ module Spree
28
28
 
29
29
  if promotion.present?
30
30
  # Order promotion has to be destroyed before line item removing
31
- order.order_promotions.find_by!(promotion_id: promotion.id).destroy
31
+ order.order_promotions.where(promotion_id: promotion.id).destroy_all
32
32
 
33
33
  remove_promotion_adjustments(promotion)
34
34
  remove_promotion_line_items(promotion)
@@ -60,6 +60,8 @@ module Spree
60
60
  class_attribute :reimbursement_failure_hooks
61
61
  self.reimbursement_failure_hooks = []
62
62
 
63
+ delegate :store, :currency, to: :order
64
+
63
65
  state_machine :reimbursement_status, initial: :pending do
64
66
  event :errored do
65
67
  transition to: :errored, from: :pending
@@ -42,6 +42,8 @@ module Spree
42
42
  scope :reverse_chronological, -> { order(Arel.sql('coalesce(spree_shipments.shipped_at, spree_shipments.created_at) desc'), id: :desc) }
43
43
  scope :valid, -> { where.not(state: :canceled) }
44
44
 
45
+ delegate :store, :currency, to: :order
46
+
45
47
  # shipment state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
46
48
  state_machine initial: :pending, use_transactions: false do
47
49
  event :ready do
@@ -104,11 +106,6 @@ module Spree
104
106
  inventory_units.any?(&:backordered?)
105
107
  end
106
108
 
107
- # TODO: delegate currency to Order, order.currency is mandatory
108
- def currency
109
- order ? order.currency : Spree::Config[:currency]
110
- end
111
-
112
109
  # Determines the appropriate +state+ according to the following logic:
113
110
  #
114
111
  # pending unless order is complete and +order.payment_state+ is +paid+
@@ -106,8 +106,19 @@ module Spree
106
106
  private
107
107
 
108
108
  def create_stock_items
109
- Variant.includes(:product).find_each do |variant|
110
- propagate_variant(variant)
109
+ variants_scope = Spree::Variant
110
+ prepared_stock_items = variants_scope.ids.map do |variant_id|
111
+ Hash[
112
+ 'stock_location_id', id,
113
+ 'variant_id', variant_id,
114
+ 'backorderable', backorderable_default,
115
+ 'created_at', Time.current,
116
+ 'updated_at', Time.current
117
+ ]
118
+ end
119
+ if prepared_stock_items.any?
120
+ stock_items.insert_all(prepared_stock_items)
121
+ variants_scope.touch_all
111
122
  end
112
123
  end
113
124
 
@@ -2,12 +2,23 @@ module Spree
2
2
  class Store < Spree::Base
3
3
  has_many :orders, class_name: 'Spree::Order'
4
4
  has_many :payment_methods, class_name: 'Spree::PaymentMethod'
5
+ belongs_to :default_country, class_name: 'Spree::Country'
5
6
 
6
7
  with_options presence: true do
7
- validates :name, :url, :mail_from_address
8
- validates :default_currency
8
+ validates :name, :url, :mail_from_address, :default_currency, :code
9
9
  end
10
10
 
11
+ validates :code, uniqueness: true
12
+
13
+ if !ENV['SPREE_DISABLE_DB_CONNECTION'] &&
14
+ connected? &&
15
+ table_exists? &&
16
+ connection.column_exists?(:spree_stores, :new_order_notifications_email)
17
+ validates :new_order_notifications_email, email: { allow_blank: true }
18
+ end
19
+
20
+ has_one_attached :logo
21
+
11
22
  before_save :ensure_default_exists_and_is_unique
12
23
  before_destroy :validate_not_default
13
24
 
@@ -26,6 +37,12 @@ module Spree
26
37
  end
27
38
  end
28
39
 
40
+ def supported_currencies_list
41
+ (read_attribute(:supported_currencies).to_s.split(',') << default_currency).map(&:to_s).map do |code|
42
+ ::Money::Currency.find(code.strip)
43
+ end.uniq.compact
44
+ end
45
+
29
46
  private
30
47
 
31
48
  def ensure_default_exists_and_is_unique
@@ -103,10 +103,19 @@ module Spree
103
103
 
104
104
  self.whitelisted_ransackable_associations = %w[option_values product prices default_price]
105
105
  self.whitelisted_ransackable_attributes = %w[weight sku]
106
- self.whitelisted_ransackable_scopes = %i(product_name_or_sku_cont)
106
+ self.whitelisted_ransackable_scopes = %i(product_name_or_sku_cont search_by_product_name_or_sku)
107
107
 
108
108
  def self.product_name_or_sku_cont(query)
109
- joins(:product).where("#{Product.table_name}.name LIKE :query OR sku LIKE :query", query: "%#{query}%")
109
+ joins(:product).where("LOWER(#{Product.table_name}.name) LIKE LOWER(:query) OR LOWER(sku) LIKE LOWER(:query)", query: "%#{query}%")
110
+ end
111
+
112
+ def self.search_by_product_name_or_sku(query)
113
+ if defined?(SpreeGlobalize)
114
+ joins(product: :translations).where("LOWER(#{Product::Translation.table_name}.name) LIKE LOWER(:query) OR LOWER(sku) LIKE LOWER(:query)",
115
+ query: "%#{query}%")
116
+ else
117
+ product_name_or_sku_cont(query)
118
+ end
110
119
  end
111
120
 
112
121
  def available?
@@ -223,6 +232,10 @@ module Spree
223
232
  end.sum
224
233
  end
225
234
 
235
+ def compare_at_price
236
+ price_in(cost_currency).try(:compare_at_amount)
237
+ end
238
+
226
239
  def name_and_sku
227
240
  "#{name} - #{sku}"
228
241
  end
@@ -16,6 +16,9 @@ module Spree
16
16
  @variants.map do |variant|
17
17
  {
18
18
  display_price: display_price(variant),
19
+ price: variant.price_in(current_currency),
20
+ display_compare_at_price: display_compare_at_price(variant),
21
+ should_display_compare_at_price: should_display_compare_at_price(variant),
19
22
  is_product_available_in_currency: @is_product_available_in_currency,
20
23
  backorderable: backorderable?(variant),
21
24
  in_stock: in_stock?(variant),
@@ -71,5 +74,9 @@ module Spree
71
74
  purchasable: variant.purchasable?
72
75
  }
73
76
  end
77
+
78
+ def should_display_compare_at_price(variant)
79
+ variant.compare_at_price.present? && variant.compare_at_price > variant.price
80
+ end
74
81
  end
75
82
  end
@@ -76,6 +76,7 @@ module Spree
76
76
  id: option_value.id,
77
77
  position: option_value.position,
78
78
  presentation: option_value.presentation,
79
+ name: option_value.name,
79
80
  variant_id: option_value.variants.where(id: @variant_ids).order(:position).first.id,
80
81
  is_default: option_value == default_variant_data[:option_value]
81
82
  }
@@ -1,41 +1,46 @@
1
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2
- <html xmlns="http://www.w3.org/1999/xhtml">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
5
- <meta name="viewport" content="width=device-width"/>
6
- <%= render partial: 'spree/shared/base_mailer_stylesheets' %>
7
- </head>
8
- <body>
9
- <table class="body">
10
- <tr>
11
- <td class="center" align="center" valign="top">
12
- <center>
13
- <%= render partial: 'spree/shared/base_mailer_header' %>
14
- <table class="container">
15
- <tr>
16
- <td>
17
- <table class="row">
18
- <tr>
19
- <td class="wrapper last">
20
- <table class="twelve columns">
21
- <tr>
22
- <td>
23
- <%= yield %>
24
- </td>
25
- <td class="expander"></td>
26
- </tr>
27
- </table>
28
- </td>
29
- </tr>
30
- </table>
31
- <%= render partial: 'spree/shared/base_mailer_footer' %>
32
- <!-- container end below -->
33
- </td>
34
- </tr>
35
- </table>
36
- </center>
37
- </td>
38
- </tr>
39
- </table>
40
- </body>
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0"/>
5
+ <meta name="x-apple-disable-message-reformatting"/>
6
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
7
+
8
+ <%= render partial: 'spree/shared/base_mailer_stylesheets' %>
9
+ </head>
10
+ <body>
11
+ <table class="email-wrapper" width="100%" cellpadding="0" cellspacing="0" role="presentation">
12
+ <tr>
13
+ <td align="center">
14
+ <table class="email-content" width="100%" cellpadding="0" cellspacing="0" role="presentation">
15
+ <%= render partial: 'spree/shared/base_mailer_header' %>
16
+ <!-- Email Body -->
17
+ <tr>
18
+ <td class="email-body" width="570" cellpadding="0" cellspacing="0">
19
+ <table class="email-body_inner" align="center" width="570" cellpadding="0" cellspacing="0" role="presentation">
20
+ <!-- Body content -->
21
+ <tbody>
22
+ <tr>
23
+ <td class="content-cell">
24
+ <div class="f-fallback">
25
+ <%= yield %>
26
+ </div>
27
+ </td>
28
+ </tr>
29
+ </tbody>
30
+ </table>
31
+ </td>
32
+ </tr>
33
+ <tr>
34
+ <td>
35
+ <%= render partial: 'spree/shared/base_mailer_footer' %>
36
+ </td>
37
+ </tr>
38
+ </table>
39
+ </td>
40
+ </tr>
41
+ <tr>
42
+ <td height="60px">&nbsp;</td>
43
+ </tr>
44
+ </table>
45
+ </body>
41
46
  </html>
@@ -1,30 +1,24 @@
1
- <table class="row header">
1
+ <h1>
2
+ <%= Spree.t('order_mailer.cancel_email.dear_customer', name: name_for(@order)) %>
3
+ </h1>
4
+ <p>
5
+ <%= Spree.t('order_mailer.cancel_email.instructions') %>
6
+ </p>
7
+
8
+ <table class="purchase" role="presentation">
2
9
  <tr>
3
10
  <td>
4
- <p class="lede">
5
- <%= Spree.t('order_mailer.cancel_email.dear_customer') %>
6
- </p>
7
- <p>
8
- <%= Spree.t('order_mailer.cancel_email.instructions') %>
9
- </p>
10
- <p>
11
- <%= Spree.t('order_mailer.cancel_email.order_summary_canceled', number: @order.number) %>
12
- </p>
13
- <table class="container">
14
- <tr>
15
- <td class="wrapper last">
16
- <table class="twelve columns">
17
- <%= render collection: @order.line_items, partial: 'spree/shared/mailer_line_item', as: :line_item %>
18
- <%= render 'spree/order_mailer/subtotal', order: @order %>
19
- <% @order.adjustments.eligible.each do |adjustment| %>
20
- <%= render 'spree/order_mailer/adjustment', adjustment: adjustment %>
21
- <% end %>
22
- <%= render 'spree/order_mailer/total', order: @order %>
23
- </table>
24
- </td>
25
- </tr>
26
- </table>
11
+ <h3> <%= Spree.t('order_mailer.cancel_email.order_summary_canceled', number: @order.number) %></h3>
12
+ </td>
13
+ </tr>
14
+ <tr>
15
+ <td colspan="2">
16
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
27
17
  </td>
28
- <td class="expander"></td>
29
18
  </tr>
30
19
  </table>
20
+ <p>
21
+ <%= Spree.t('order_mailer.cancel_email.thanks') %>
22
+ <br />
23
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
24
+ </p>
@@ -1,4 +1,4 @@
1
- <%= Spree.t('order_mailer.cancel_email.dear_customer') %>
1
+ <%= Spree.t('order_mailer.cancel_email.dear_customer', name: name_for(@order)) %>
2
2
 
3
3
  <%= Spree.t('order_mailer.cancel_email.instructions') %>
4
4
 
@@ -10,7 +10,29 @@
10
10
  <% end %>
11
11
  ============================================================
12
12
  <%= Spree.t('order_mailer.subtotal') %> <%= @order.display_item_total %>
13
+ <% if @order.line_item_adjustments.exists? %>
14
+ <% if @order.all_adjustments.promotion.eligible.exists? %>
15
+ <% @order.all_adjustments.promotion.eligible.group_by(&:label).each do |label, adjustments| %>
16
+ <%= Spree.t(:promotion) %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
17
+ <% end %>
18
+ <% end %>
19
+ <% end %>
20
+
21
+ <% @order.shipments.group_by { |s| s.selected_shipping_rate.try(:name) }.each do |name, shipments| %>
22
+ <%= Spree.t(:shipping) %>: <%= name %> <%= Spree::Money.new(shipments.sum(&:discounted_cost), currency: @order.currency) %>
23
+ <% end %>
24
+
25
+ <% if @order.all_adjustments.eligible.tax.exists? %>
26
+ <% @order.all_adjustments.eligible.tax.group_by(&:label).each do |label, adjustments| %>
27
+ <%= Spree.t(:tax) %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
28
+ <% end %>
29
+ <% end %>
30
+
13
31
  <% @order.adjustments.eligible.each do |adjustment| %>
14
- <%= raw(adjustment.label) %> <%= adjustment.display_amount %>
32
+ <% next if (adjustment.source_type == 'Spree::TaxRate') and (adjustment.amount == 0) %>
33
+ <%= adjustment.label %> <%= adjustment.display_amount %>
15
34
  <% end %>
35
+ ============================================================
16
36
  <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
37
+ <%= Spree.t('order_mailer.cancel_email.thanks') %>
38
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
@@ -1,70 +1,23 @@
1
- <table class="row header">
1
+ <h1>
2
+ <%= Spree.t('order_mailer.confirm_email.dear_customer', name: name_for(@order)) %>
3
+ </h1>
4
+ <p>
5
+ <%= Spree.t('order_mailer.confirm_email.instructions') %>
6
+ </p>
7
+ <table class="purchase" role="presentation">
2
8
  <tr>
3
9
  <td>
4
- <p class="lede">
5
- <%= Spree.t('order_mailer.confirm_email.dear_customer') %>
6
- </p>
7
- <p>
8
- <%= Spree.t('order_mailer.confirm_email.instructions') %>
9
- </p>
10
- <p>
11
- <%= Spree.t('order_mailer.confirm_email.order_summary', number: @order.number) %>
12
- </p>
13
- <table class="container">
14
- <tr>
15
- <td class="wrapper last">
16
- <table class="twelve columns">
17
- <%= render collection: @order.line_items, partial: 'spree/shared/mailer_line_item', as: :line_item %>
18
- <%= render 'spree/order_mailer/subtotal', order: @order %>
19
- <% if @order.line_item_adjustments.exists? %>
20
- <% if @order.all_adjustments.promotion.eligible.exists? %>
21
- <% @order.all_adjustments.promotion.eligible.group_by(&:label).each do |label, adjustments| %>
22
- <tr>
23
- <td class="six sub-columns">
24
- <%= Spree.t(:promotion) %> <%= label %>:
25
- </td>
26
- <td class="six sub-columns last right">
27
- <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
28
- </td>
29
- </tr>
30
- <% end %>
31
- <% end %>
32
- <% end %>
33
- <% @order.shipments.group_by { |s| s.selected_shipping_rate.try(:name) }.each do |name, shipments| %>
34
- <tr>
35
- <td class="six sub-columns">
36
- <%= Spree.t(:shipping) %> <%= name %>:
37
- </td>
38
- <td class="six sub-columns last right">
39
- <%= Spree::Money.new(shipments.sum(&:discounted_cost), currency: @order.currency) %>
40
- </td>
41
- </tr>
42
- <% end %>
43
- <% if @order.all_adjustments.eligible.tax.exists? %>
44
- <% @order.all_adjustments.eligible.tax.group_by(&:label).each do |label, adjustments| %>
45
- <tr>
46
- <td class="six sub-columns">
47
- <%= Spree.t(:tax) %> <%= label %>:
48
- </td>
49
- <td class="six sub-columns last right">
50
- <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
51
- </td>
52
- </tr>
53
- <% end %>
54
- <% end %>
55
- <% @order.adjustments.eligible.each do |adjustment| %>
56
- <% next if (adjustment.source_type == 'Spree::TaxRate') || (adjustment.amount == 0) %>
57
- <%= render 'spree/order_mailer/adjustment', adjustment: adjustment %>
58
- <% end %>
59
- <%= render 'spree/order_mailer/total', order: @order %>
60
- </table>
61
- </td>
62
- </tr>
63
- </table>
64
- <p>
65
- <%= Spree.t('order_mailer.confirm_email.thanks') %>
66
- </p>
10
+ <h3><%= Spree.t('order_mailer.confirm_email.order_summary', number: @order.number) %></h3>
11
+ </td>
12
+ </tr>
13
+ <tr>
14
+ <td colspan="2">
15
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
67
16
  </td>
68
- <td class="expander"></td>
69
17
  </tr>
70
18
  </table>
19
+ <p>
20
+ <%= Spree.t('order_mailer.confirm_email.thanks') %>
21
+ <br />
22
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
23
+ </p>
@@ -1,4 +1,4 @@
1
- <%= Spree.t('order_mailer.confirm_email.dear_customer') %>
1
+ <%= Spree.t('order_mailer.confirm_email.dear_customer', name: name_for(@order)) %>
2
2
 
3
3
  <%= Spree.t('order_mailer.confirm_email.instructions') %>
4
4
 
@@ -36,3 +36,4 @@
36
36
  <%= Spree.t('order_mailer.total') %> <%= @order.display_total %>
37
37
 
38
38
  <%= Spree.t('order_mailer.confirm_email.thanks') %>
39
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
@@ -0,0 +1,23 @@
1
+ <h1>
2
+ <%= Spree.t('order_mailer.store_owner_notification_email.heading') %>
3
+ </h1>
4
+ <p>
5
+ <%= Spree.t('order_mailer.store_owner_notification_email.instructions') %>
6
+ </p>
7
+ <table class="purchase" role="presentation">
8
+ <tr>
9
+ <td>
10
+ <h3><%= Spree.t('order_mailer.store_owner_notification_email.order_summary', number: @order.number) %></h3>
11
+ </td>
12
+ </tr>
13
+ <tr>
14
+ <td colspan="2">
15
+ <%= render 'spree/shared/purchased_items_table', line_items: @order.line_items, order: @order %>
16
+ </td>
17
+ </tr>
18
+ </table>
19
+ <p>
20
+ <%= Spree.t('order_mailer.store_owner_notification_email.thanks') %>
21
+ <br />
22
+ <%= Spree.t('order_mailer.store_team', store_name: current_store.name) %>
23
+ </p>