spree_core 4.2.0.rc2 → 4.2.1

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 (120) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js +20 -0
  3. data/app/controllers/spree/base_controller.rb +2 -3
  4. data/app/controllers/spree/errors_controller.rb +11 -0
  5. data/app/finders/spree/addresses/find.rb +1 -12
  6. data/app/finders/spree/base_finder.rb +14 -0
  7. data/app/finders/spree/countries/find.rb +11 -3
  8. data/app/finders/spree/credit_cards/find.rb +2 -2
  9. data/app/finders/spree/orders/find_current.rb +2 -2
  10. data/app/finders/spree/products/find.rb +14 -3
  11. data/app/helpers/spree/base_helper.rb +3 -8
  12. data/app/helpers/spree/currency_helper.rb +34 -0
  13. data/app/helpers/spree/locale_helper.rb +31 -0
  14. data/app/helpers/spree/products_helper.rb +37 -12
  15. data/app/mailers/spree/base_mailer.rb +4 -4
  16. data/app/mailers/spree/order_mailer.rb +3 -3
  17. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  18. data/app/mailers/spree/shipment_mailer.rb +1 -1
  19. data/app/models/concerns/spree/default_price.rb +1 -5
  20. data/app/models/concerns/spree/product_scopes.rb +1 -1
  21. data/app/models/concerns/spree/user_methods.rb +2 -2
  22. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  23. data/app/models/spree/ability.rb +45 -34
  24. data/app/models/spree/address.rb +4 -0
  25. data/app/models/spree/app_configuration.rb +2 -2
  26. data/app/models/spree/app_dependencies.rb +6 -2
  27. data/app/models/spree/base.rb +5 -0
  28. data/app/models/spree/credit_card.rb +4 -0
  29. data/app/models/spree/fulfilment_changer.rb +58 -16
  30. data/app/models/spree/image.rb +14 -14
  31. data/app/models/spree/inventory_unit.rb +2 -7
  32. data/app/models/spree/line_item.rb +7 -15
  33. data/app/models/spree/order.rb +1 -0
  34. data/app/models/spree/payment.rb +18 -4
  35. data/app/models/spree/payment/processing.rb +2 -2
  36. data/app/models/spree/payment_method.rb +3 -3
  37. data/app/models/spree/price.rb +2 -7
  38. data/app/models/spree/product.rb +41 -17
  39. data/app/models/spree/promotion/rules/option_value.rb +1 -1
  40. data/app/models/spree/promotion/rules/product.rb +2 -1
  41. data/app/models/spree/promotion/rules/user.rb +2 -1
  42. data/app/models/spree/refund.rb +2 -2
  43. data/app/models/spree/return_item/eligibility_validator/default.rb +0 -2
  44. data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb} +0 -0
  45. data/app/models/spree/shipment.rb +1 -1
  46. data/app/models/spree/shipping_method.rb +1 -5
  47. data/app/models/spree/shipping_rate.rb +2 -11
  48. data/app/models/spree/stock/availability_validator.rb +3 -4
  49. data/app/models/spree/stock_item.rb +1 -5
  50. data/app/models/spree/store.rb +55 -2
  51. data/app/models/spree/store_credit.rb +1 -1
  52. data/app/models/spree/variant.rb +9 -16
  53. data/app/models/spree/zone.rb +13 -4
  54. data/app/paginators/spree/shared/paginate.rb +8 -1
  55. data/app/presenters/spree/variant_presenter.rb +2 -5
  56. data/app/services/spree/account/addresses/create.rb +6 -1
  57. data/app/services/spree/account/addresses/{base.rb → helper.rb} +1 -3
  58. data/app/services/spree/account/addresses/update.rb +6 -1
  59. data/app/services/spree/build_localized_redirect_url.rb +101 -0
  60. data/app/services/spree/cart/estimate_shipping_rates.rb +1 -1
  61. data/app/services/spree/compare_line_items.rb +4 -2
  62. data/app/sorters/spree/base_sorter.rb +35 -0
  63. data/app/sorters/spree/orders/sort.rb +1 -37
  64. data/app/sorters/spree/products/sort.rb +9 -32
  65. data/app/validators/email_validator.rb +1 -1
  66. data/app/views/spree/errors/forbidden.html.erb +0 -0
  67. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  68. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +13 -2
  69. data/app/views/spree/shared/_purchased_items_table.html.erb +15 -6
  70. data/app/views/spree/shared/purchased_items_table/_adjustment.html.erb +2 -2
  71. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +2 -2
  72. data/config/initializers/inflections.rb +3 -0
  73. data/config/initializers/rails61_fixes.rb +3 -0
  74. data/config/locales/en.yml +31 -60
  75. data/config/routes.rb +2 -1
  76. data/db/default/spree/stores.rb +1 -0
  77. data/db/default/spree/zones.rb +4 -1
  78. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  79. data/db/migrate/20191017121054_add_supported_currencies_to_store.rb +1 -0
  80. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -2
  81. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +5 -0
  82. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +5 -0
  83. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +10 -0
  84. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
  85. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +5 -0
  86. data/db/migrate/20210120142527_ensure_default_locale_in_spree_stores.rb +5 -0
  87. data/db/migrate/20210205211040_add_supported_locales_to_spree_stores.rb +11 -0
  88. data/db/migrate/20210215202602_migrate_spree_i18n_globalize_config.rb +22 -0
  89. data/lib/generators/spree/install/install_generator.rb +9 -6
  90. data/lib/spree/core.rb +2 -1
  91. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  92. data/lib/spree/core/controller_helpers/common.rb +6 -8
  93. data/lib/spree/core/controller_helpers/currency.rb +54 -0
  94. data/lib/spree/core/controller_helpers/locale.rb +58 -0
  95. data/lib/spree/core/controller_helpers/search.rb +1 -1
  96. data/lib/spree/core/controller_helpers/store.rb +4 -16
  97. data/lib/spree/core/product_filters.rb +3 -3
  98. data/lib/spree/core/version.rb +3 -1
  99. data/lib/spree/i18n.rb +17 -19
  100. data/lib/spree/permitted_attributes.rb +2 -2
  101. data/lib/spree/service_module.rb +8 -4
  102. data/lib/spree/testing_support/capybara_config.rb +1 -1
  103. data/lib/spree/testing_support/common_rake.rb +1 -1
  104. data/lib/spree/testing_support/controller_requests.rb +10 -10
  105. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -9
  106. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
  107. data/lib/spree/testing_support/factories/store_factory.rb +1 -0
  108. data/lib/spree/testing_support/factories/zone_factory.rb +16 -13
  109. data/lib/spree/testing_support/flatpickr_capybara.rb +101 -0
  110. data/lib/spree/testing_support/locale_helpers.rb +78 -0
  111. data/lib/spree/testing_support/next_instance_of.rb +38 -0
  112. data/lib/spree/testing_support/order_walkthrough.rb +8 -3
  113. data/lib/spree/testing_support/rspec_retry_config.rb +10 -0
  114. data/spree_core.gemspec +5 -4
  115. metadata +71 -26
  116. data/lib/generators/spree/install/templates/config/initializers/spree_storefront.rb +0 -1
  117. data/lib/generators/spree/install/templates/config/spree_storefront.yml +0 -67
  118. data/lib/spree/core/controller_helpers/currency_helpers.rb +0 -15
  119. data/lib/spree/i18n/base.rb +0 -17
  120. data/lib/spree/i18n/initializer.rb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3c4aedf602c42650159969df6a8bc7f450fd1c68f6d93d2a40ff8635f691b5be
4
- data.tar.gz: 41c8433179fb96ecb5ea01dd0b7f35cf600652531f8bdebdb837e24977cf795f
3
+ metadata.gz: 5f9630450c68b8797b744c4f046769f568ebf50366a956fcbad41ede886c8419
4
+ data.tar.gz: 76d0ef19926855683298402e5ff729982be202b4c03fd021e4440ec7dc6d5185
5
5
  SHA512:
6
- metadata.gz: 5f3c60e7a972db6b1a2747b06485210904a431959eda4bdf5e9b0948207b5352bbff1b9fca5c414ac68b03d872301fb8aaffdbb1aef8b61777c51c5fa927b0c1
7
- data.tar.gz: 15fa837cab8e2f12a409ff45432206e01f3d54211545b52c3ae26c0291baa2ee40cd8f49edaccdb9d6914411b8bacff269abc91993968741b959d555b8bdab30
6
+ metadata.gz: 604ae3a3334b1a70869577cbafa21eafb5c4953f280e6c9ef6b76b51e5b50b7dbe010b66681076019f55745e40448906e0668c9ee0dc4d8912759ae4fd7289b7
7
+ data.tar.gz: 6fb2f4a1d3b55e5974326ff473fa554757a8d5464c41cb2963af4ffef11e8f26250000c020075fa6dc70127a8267d908687490c9f62919d11ec6b18f56a512ed
@@ -17,9 +17,29 @@ Spree.adminPath = function () {
17
17
 
18
18
  Spree.pathFor = function (path) {
19
19
  var locationOrigin = (window.location.protocol + '//' + window.location.hostname) + (window.location.port ? ':' + window.location.port : '')
20
+
20
21
  return this.url('' + locationOrigin + (this.mountedAt()) + path, this.url_params).toString()
21
22
  }
22
23
 
24
+ Spree.localizedPathFor = function(path) {
25
+ if (typeof (SPREE_LOCALE) !== 'undefined' && typeof (SPREE_CURRENCY) !== 'undefined') {
26
+ var fullUrl = new URL(Spree.pathFor(path))
27
+ var params = fullUrl.searchParams
28
+ var pathName = fullUrl.pathname
29
+
30
+ params.set('currency', SPREE_CURRENCY)
31
+
32
+ if (pathName.match(/api\/v/)) {
33
+ params.set('locale', SPREE_LOCALE)
34
+ } else {
35
+ pathName = SPREE_LOCALE + '/' + pathName
36
+ }
37
+
38
+ path = pathName + '?' + params.toString()
39
+ }
40
+ return Spree.pathFor(path)
41
+ }
42
+
23
43
  Spree.adminPathFor = function (path) {
24
44
  return this.pathFor('' + (this.adminPath()) + path)
25
45
  }
@@ -7,9 +7,8 @@ class Spree::BaseController < ApplicationController
7
7
  include Spree::Core::ControllerHelpers::Search
8
8
  include Spree::Core::ControllerHelpers::Store
9
9
  include Spree::Core::ControllerHelpers::StrongParameters
10
- include Spree::Core::ControllerHelpers::CurrencyHelpers
10
+ include Spree::Core::ControllerHelpers::Locale
11
+ include Spree::Core::ControllerHelpers::Currency
11
12
 
12
13
  respond_to :html
13
14
  end
14
-
15
- require 'spree/i18n/initializer'
@@ -0,0 +1,11 @@
1
+ module Spree
2
+ class ErrorsController < BaseController
3
+ def forbidden
4
+ render status: 403
5
+ end
6
+
7
+ def unauthorized
8
+ render status: 401
9
+ end
10
+ end
11
+ end
@@ -1,17 +1,6 @@
1
1
  module Spree
2
2
  module Addresses
3
- class Find
4
- def initialize(scope:, params:)
5
- @scope = scope
6
- end
7
-
8
- def execute
9
- scope
10
- end
11
-
12
- private
13
-
14
- attr_reader :scope
3
+ class Find < ::Spree::BaseFinder
15
4
  end
16
5
  end
17
6
  end
@@ -0,0 +1,14 @@
1
+ module Spree
2
+ class BaseFinder
3
+ def initialize(scope:, params:)
4
+ @scope = scope
5
+ @params = params
6
+ end
7
+
8
+ attr_reader :scope, :params
9
+
10
+ def execute
11
+ scope
12
+ end
13
+ end
14
+ end
@@ -1,13 +1,21 @@
1
1
  module Spree
2
2
  module Countries
3
- class Find
4
- def initialize(scope, params)
3
+ class Find < ::Spree::BaseFinder
4
+ def initialize(scope:, params:)
5
5
  @scope = scope
6
6
 
7
7
  @shippable = String(params[:filter][:shippable]) unless params[:filter].nil?
8
8
  end
9
9
 
10
10
  def call
11
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
12
+ Spree::Countries::Find.new.call is deprecated and will be removed in Spree 5.0.
13
+ Please use Spree::Countries::Find.new.execute instead
14
+ DEPRECATION
15
+ execute
16
+ end
17
+
18
+ def execute
11
19
  countries = by_shippability(scope)
12
20
 
13
21
  countries
@@ -15,7 +23,7 @@ module Spree
15
23
 
16
24
  private
17
25
 
18
- attr_reader :shippable, :scope
26
+ attr_reader :shippable
19
27
 
20
28
  def shippable?
21
29
  shippable.present?
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  module CreditCards
3
- class Find
4
- def execute(scope:, params:)
3
+ class Find < ::Spree::BaseFinder
4
+ def execute
5
5
  return scope.default.take if params[:id].eql?('default')
6
6
  return scope.where(payment_method_id: params[:filter]['payment_method_id']) if params[:filter].present?
7
7
 
@@ -9,13 +9,13 @@ module Spree
9
9
  return order unless order.nil?
10
10
  return if user.nil?
11
11
 
12
- incomplete_orders.order(created_at: :desc).find_by(store: store, user: user)
12
+ incomplete_orders.order(created_at: :desc).find_by(store: store, user: user, currency: params[:currency])
13
13
  end
14
14
 
15
15
  private
16
16
 
17
17
  def incomplete_orders
18
- Spree::Order.incomplete.includes(scope_includes)
18
+ Spree::Order.incomplete.not_canceled.includes(scope_includes)
19
19
  end
20
20
 
21
21
  def scope_includes
@@ -7,7 +7,7 @@ module Spree
7
7
  @ids = String(params.dig(:filter, :ids)).split(',')
8
8
  @skus = String(params.dig(:filter, :skus)).split(',')
9
9
  @price = String(params.dig(:filter, :price)).split(',').map(&:to_f)
10
- @currency = params[:currency] || current_currency
10
+ @currency = current_currency
11
11
  @taxons = taxon_ids(params.dig(:filter, :taxons))
12
12
  @concat_taxons = taxon_ids(params.dig(:filter, :concat_taxons))
13
13
  @name = params.dig(:filter, :name)
@@ -22,6 +22,7 @@ module Spree
22
22
  products = by_ids(scope)
23
23
  products = by_skus(products)
24
24
  products = by_price(products)
25
+ products = by_currency(products)
25
26
  products = by_taxons(products)
26
27
  products = by_concat_taxons(products)
27
28
  products = by_name(products)
@@ -51,6 +52,10 @@ module Spree
51
52
  price.present?
52
53
  end
53
54
 
55
+ def currency?
56
+ currency.present?
57
+ end
58
+
54
59
  def taxons?
55
60
  taxons.present?
56
61
  end
@@ -94,15 +99,21 @@ module Spree
94
99
  def by_price(products)
95
100
  return products unless price?
96
101
 
97
- products.joins(master: :default_price).
102
+ products.joins(master: :prices).
98
103
  where(
99
104
  spree_prices: {
100
105
  amount: price.min..price.max,
101
- currency: currency
106
+ currency: currency&.upcase
102
107
  }
103
108
  )
104
109
  end
105
110
 
111
+ def by_currency(products)
112
+ return products unless currency?
113
+
114
+ products.joins(master: :prices).where(spree_prices: { currency: currency.upcase })
115
+ end
116
+
106
117
  def by_taxons(products)
107
118
  return products unless taxons?
108
119
 
@@ -1,13 +1,7 @@
1
1
  module Spree
2
2
  module BaseHelper
3
3
  def available_countries
4
- checkout_zone = current_store.checkout_zone || Spree::Zone.default_checkout_zone
5
-
6
- countries = if checkout_zone && checkout_zone.kind == 'country'
7
- checkout_zone.country_list
8
- else
9
- Spree::Country.all
10
- end
4
+ countries = current_store.countries_available_for_checkout
11
5
 
12
6
  countries.collect do |country|
13
7
  country.name = Spree.t(country.iso, scope: 'country_names', default: country.name)
@@ -140,7 +134,8 @@ module Spree
140
134
  [I18n.l(date.to_date, format: :long)].join(' ')
141
135
  end
142
136
 
143
- def seo_url(taxon, options = nil)
137
+ def seo_url(taxon, options = {})
138
+ options.merge(locale: locale_param)
144
139
  spree.nested_taxons_path(taxon.permalink, options)
145
140
  end
146
141
 
@@ -0,0 +1,34 @@
1
+ module Spree
2
+ module CurrencyHelper
3
+ def currency_options(selected_value = nil)
4
+ selected_value ||= Spree::Config[:currency]
5
+ currencies = ::Money::Currency.table.map do |_code, details|
6
+ iso = details[:iso_code]
7
+ [iso, "#{details[:name]} (#{iso})"]
8
+ end
9
+ options_from_collection_for_select(currencies, :first, :last, selected_value)
10
+ end
11
+
12
+ def supported_currency_options
13
+ return if current_store.nil?
14
+
15
+ current_store.supported_currencies_list.map(&:iso_code).map { |currency| currency_presentation(currency) }
16
+ end
17
+
18
+ def should_render_currency_dropdown?
19
+ return false if current_store.nil?
20
+
21
+ current_store.supported_currencies_list.size > 1
22
+ end
23
+
24
+ def currency_symbol(currency)
25
+ ::Money::Currency.find(currency).symbol
26
+ end
27
+
28
+ def currency_presentation(currency)
29
+ label = [currency_symbol(currency), currency].compact.join(' ')
30
+
31
+ [label, currency]
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module LocaleHelper
3
+ def all_locales_options
4
+ supported_locales_for_all_stores.map { |locale| locale_presentation(locale) }
5
+ end
6
+
7
+ def available_locales_options
8
+ available_locales.map { |locale| locale_presentation(locale) }
9
+ end
10
+
11
+ def supported_locales_options
12
+ return if current_store.nil?
13
+
14
+ current_store.supported_locales_list.map { |locale| locale_presentation(locale) }
15
+ end
16
+
17
+ def locale_presentation(locale)
18
+ if I18n.exists?('spree.i18n.this_file_language', locale: locale)
19
+ [Spree.t('i18n.this_file_language', locale: locale), locale.to_s]
20
+ else
21
+ locale.to_s == 'en' ? ['English (US)', 'en'] : [locale, locale.to_s]
22
+ end
23
+ end
24
+
25
+ def should_render_locale_dropdown?
26
+ return false if current_store.nil?
27
+
28
+ current_store.supported_locales_list.size > 1
29
+ end
30
+ end
31
+ end
@@ -35,6 +35,11 @@ module Spree
35
35
  variants_option_types_presenter(variants, product).default_variant || product.default_variant
36
36
  end
37
37
 
38
+ def should_display_compare_at_price?(default_variant)
39
+ default_variant_price = default_variant.price_in(current_currency)
40
+ default_variant_price.compare_at_amount.present? && (default_variant_price.compare_at_amount > default_variant_price.amount)
41
+ end
42
+
38
43
  def used_variants_options(variants, product)
39
44
  variants_option_types_presenter(variants, product).options
40
45
  end
@@ -115,19 +120,39 @@ module Spree
115
120
  ).call.to_json
116
121
  end
117
122
 
123
+ def product_relation_types
124
+ @product_relation_types ||= @product.respond_to?(:relation_types) ? @product.relation_types : []
125
+ end
126
+
127
+ def product_relations_by_type(relation_type)
128
+ return [] if product_relation_types.none? || !@product.respond_to?(:relations)
129
+
130
+ product_ids = @product.relations.where(relation_type: relation_type).pluck(:related_to_id).uniq
131
+
132
+ return [] if product_ids.empty?
133
+
134
+ Spree::Product.
135
+ available.not_discontinued.distinct.
136
+ where(id: product_ids).
137
+ includes(
138
+ :tax_category,
139
+ master: [
140
+ :prices,
141
+ { images: { attachment_attachment: :blob } },
142
+ ]
143
+ ).
144
+ limit(Spree::Config[:products_per_page])
145
+ end
146
+
118
147
  def related_products
119
- return [] unless @product.respond_to?(:has_related_products?) && @product.has_related_products?(:related_products)
120
-
121
- @related_products ||= @product.
122
- related_products.
123
- includes(
124
- :tax_category,
125
- master: [
126
- :prices,
127
- images: { attachment_attachment: :blob },
128
- ]
129
- ).
130
- limit(Spree::Config[:products_per_page])
148
+ ActiveSupport::Deprecation.warn(<<-DEPRECATION, caller)
149
+ ProductsHelper#related_products is deprecated and will be removed in Spree 5.0.
150
+ Please use ProductsHelper#relations from now on.
151
+ DEPRECATION
152
+
153
+ return [] unless @product.respond_to?(:has_related_products?)
154
+
155
+ @related_products ||= relations_by_type('related_products')
131
156
  end
132
157
 
133
158
  def product_available_in_currency?
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class BaseMailer < ActionMailer::Base
3
- add_template_helper(MailHelper)
3
+ helper Spree::MailHelper
4
4
 
5
5
  def current_store
6
6
  @current_store ||= Spree::Store.current
@@ -23,7 +23,7 @@ module Spree
23
23
  helper_method :frontend_available?
24
24
 
25
25
  def mail(headers = {}, &block)
26
- ensure_default_action_mailer_url_host
26
+ ensure_default_action_mailer_url_host(headers[:store_url])
27
27
  set_email_locale
28
28
  super if Spree::Config[:send_core_emails]
29
29
  end
@@ -33,9 +33,9 @@ module Spree
33
33
  # this ensures that ActionMailer::Base.default_url_options[:host] is always set
34
34
  # this is only a fail-safe solution if developer didn't set this in environment files
35
35
  # http://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views
36
- def ensure_default_action_mailer_url_host
36
+ def ensure_default_action_mailer_url_host(store_url = nil)
37
37
  ActionMailer::Base.default_url_options ||= {}
38
- ActionMailer::Base.default_url_options[:host] ||= current_store.url
38
+ ActionMailer::Base.default_url_options[:host] ||= store_url || current_store.url
39
39
  end
40
40
 
41
41
  def set_email_locale
@@ -5,14 +5,14 @@ module Spree
5
5
  current_store = @order.store
6
6
  subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
7
7
  subject += "#{current_store.name} #{Spree.t('order_mailer.confirm_email.subject')} ##{@order.number}"
8
- mail(to: @order.email, from: from_address, subject: subject)
8
+ mail(to: @order.email, from: from_address, subject: subject, store_url: current_store.url)
9
9
  end
10
10
 
11
11
  def store_owner_notification_email(order)
12
12
  @order = order.respond_to?(:id) ? order : Spree::Order.find(order)
13
13
  current_store = @order.store
14
14
  subject = Spree.t('order_mailer.store_owner_notification_email.subject', store_name: current_store.name)
15
- mail(to: current_store.new_order_notifications_email, from: from_address, subject: subject)
15
+ mail(to: current_store.new_order_notifications_email, from: from_address, subject: subject, store_url: current_store.url)
16
16
  end
17
17
 
18
18
  def cancel_email(order, resend = false)
@@ -20,7 +20,7 @@ module Spree
20
20
  current_store = @order.store
21
21
  subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
22
22
  subject += "#{current_store.name} #{Spree.t('order_mailer.cancel_email.subject')} ##{@order.number}"
23
- mail(to: @order.email, from: from_address, subject: subject)
23
+ mail(to: @order.email, from: from_address, subject: subject, store_url: current_store.url)
24
24
  end
25
25
  end
26
26
  end
@@ -6,7 +6,7 @@ module Spree
6
6
  current_store = @reimbursement.store || Spree::Store.current
7
7
  subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
8
8
  subject += "#{current_store.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@order.number}"
9
- mail(to: @order.email, from: current_store.mail_from_address, subject: subject)
9
+ mail(to: @order.email, from: current_store.mail_from_address, subject: subject, store_url: current_store.url)
10
10
  end
11
11
  end
12
12
  end
@@ -6,7 +6,7 @@ module Spree
6
6
  current_store = @shipment.store
7
7
  subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
8
8
  subject += "#{current_store.name} #{Spree.t('shipment_mailer.shipped_email.subject')} ##{@order.number}"
9
- mail(to: @order.email, from: from_address, subject: subject)
9
+ mail(to: @order.email, from: from_address, subject: subject, store_url: current_store.url)
10
10
  end
11
11
  end
12
12
  end