spree_core 4.2.0.beta → 4.2.0.rc5

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 (121) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/spree/base_controller.rb +2 -3
  3. data/app/controllers/spree/errors_controller.rb +11 -0
  4. data/app/finders/spree/addresses/find.rb +6 -0
  5. data/app/finders/spree/base_finder.rb +14 -0
  6. data/app/finders/spree/countries/find.rb +11 -3
  7. data/app/finders/spree/credit_cards/find.rb +2 -2
  8. data/app/finders/spree/orders/find_current.rb +2 -2
  9. data/app/finders/spree/products/find.rb +12 -1
  10. data/app/helpers/spree/base_helper.rb +38 -18
  11. data/app/helpers/spree/locale_helper.rb +19 -0
  12. data/app/helpers/spree/mail_helper.rb +12 -7
  13. data/app/helpers/spree/products_helper.rb +39 -13
  14. data/app/mailers/spree/base_mailer.rb +5 -5
  15. data/app/mailers/spree/order_mailer.rb +3 -3
  16. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  17. data/app/mailers/spree/shipment_mailer.rb +1 -1
  18. data/app/models/concerns/spree/default_price.rb +1 -5
  19. data/app/models/concerns/spree/user_methods.rb +2 -2
  20. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  21. data/app/models/spree/ability.rb +45 -34
  22. data/app/models/spree/address.rb +17 -1
  23. data/app/models/spree/adjustment.rb +1 -0
  24. data/app/models/spree/app_configuration.rb +2 -3
  25. data/app/models/spree/app_dependencies.rb +10 -2
  26. data/app/models/spree/base.rb +5 -0
  27. data/app/models/spree/credit_card.rb +5 -0
  28. data/app/models/spree/fulfilment_changer.rb +58 -16
  29. data/app/models/spree/image.rb +14 -14
  30. data/app/models/spree/inventory_unit.rb +2 -7
  31. data/app/models/spree/line_item.rb +9 -16
  32. data/app/models/spree/log_entry.rb +1 -1
  33. data/app/models/spree/option_type.rb +2 -0
  34. data/app/models/spree/order.rb +12 -6
  35. data/app/models/spree/order/address_book.rb +7 -20
  36. data/app/models/spree/order/payments.rb +10 -2
  37. data/app/models/spree/payment.rb +18 -4
  38. data/app/models/spree/payment/processing.rb +2 -2
  39. data/app/models/spree/payment_method.rb +3 -3
  40. data/app/models/spree/preferences/store.rb +1 -1
  41. data/app/models/spree/price.rb +1 -6
  42. data/app/models/spree/product.rb +24 -17
  43. data/app/models/spree/promotion.rb +10 -15
  44. data/app/models/spree/promotion/rules/option_value.rb +1 -1
  45. data/app/models/spree/promotion/rules/product.rb +2 -1
  46. data/app/models/spree/promotion/rules/user.rb +2 -1
  47. data/app/models/spree/promotion_handler/coupon.rb +1 -2
  48. data/app/models/spree/promotion_handler/promotion_duplicator.rb +9 -3
  49. data/app/models/spree/refund.rb +2 -2
  50. data/app/models/spree/return_item/eligibility_validator/default.rb +0 -2
  51. data/app/models/spree/return_item/eligibility_validator/{r_m_a_required.rb → rma_required.rb} +0 -0
  52. data/app/models/spree/shipment.rb +1 -1
  53. data/app/models/spree/shipping_method.rb +1 -5
  54. data/app/models/spree/shipping_rate.rb +2 -11
  55. data/app/models/spree/stock/availability_validator.rb +3 -4
  56. data/app/models/spree/stock_item.rb +1 -5
  57. data/app/models/spree/store.rb +45 -1
  58. data/app/models/spree/store_credit.rb +1 -1
  59. data/app/models/spree/variant.rb +8 -15
  60. data/app/models/spree/zone.rb +17 -4
  61. data/app/presenters/spree/variant_presenter.rb +4 -6
  62. data/app/services/spree/account/addresses/create.rb +23 -0
  63. data/app/services/spree/account/addresses/helper.rb +37 -0
  64. data/app/services/spree/account/addresses/update.rb +23 -0
  65. data/app/services/spree/cart/estimate_shipping_rates.rb +1 -1
  66. data/app/services/spree/checkout/update.rb +13 -2
  67. data/app/services/spree/compare_line_items.rb +4 -2
  68. data/app/sorters/spree/base_sorter.rb +35 -0
  69. data/app/sorters/spree/orders/sort.rb +1 -37
  70. data/app/sorters/spree/products/sort.rb +9 -32
  71. data/app/validators/email_validator.rb +1 -1
  72. data/app/views/spree/errors/forbidden.html.erb +0 -0
  73. data/app/views/spree/errors/unauthorized.html.erb +0 -0
  74. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -2
  75. data/app/views/spree/shared/purchased_items_table/_line_item.html.erb +1 -1
  76. data/config/initializers/inflections.rb +3 -0
  77. data/config/initializers/rails61_fixes.rb +3 -0
  78. data/config/locales/en.yml +42 -63
  79. data/config/routes.rb +2 -1
  80. data/db/default/spree/countries.rb +10 -4
  81. data/db/default/spree/states.rb +42 -5
  82. data/db/default/spree/stores.rb +18 -13
  83. data/db/default/spree/zones.rb +5 -2
  84. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  85. data/db/migrate/20200610113542_add_label_to_spree_addresses.rb +5 -0
  86. data/db/migrate/20201006110150_add_checkout_zone_field_to_store.rb +12 -0
  87. data/db/migrate/20201012091259_add_filterable_column_to_spree_option_types.rb +6 -0
  88. data/db/migrate/20201013084504_add_seo_robots_to_spree_stores.rb +5 -0
  89. data/db/migrate/20201127084048_add_default_country_kind_to_spree_zones.rb +5 -0
  90. data/db/migrate/20210112193440_remove_contact_email_from_spree_stores.rb +5 -0
  91. data/db/migrate/20210114182625_create_spree_payment_methods_stores.rb +10 -0
  92. data/db/migrate/20210114220232_migrate_data_payment_methods_stores.rb +15 -0
  93. data/db/migrate/20210117112551_remove_store_id_from_spree_payment_methods.rb +5 -0
  94. data/db/migrate/20210120142527_ensure_default_locale_in_spree_stores.rb +5 -0
  95. data/lib/generators/spree/install/templates/config/spree_storefront.yml +9 -9
  96. data/lib/spree/core.rb +3 -1
  97. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  98. data/lib/spree/core/controller_helpers/common.rb +6 -8
  99. data/lib/spree/core/controller_helpers/currency.rb +45 -0
  100. data/lib/spree/core/controller_helpers/locale.rb +57 -0
  101. data/lib/spree/core/controller_helpers/order.rb +9 -4
  102. data/lib/spree/core/controller_helpers/store.rb +4 -16
  103. data/lib/spree/core/importer/order.rb +9 -9
  104. data/lib/spree/core/product_filters.rb +3 -3
  105. data/lib/spree/core/version.rb +1 -1
  106. data/lib/spree/i18n.rb +7 -21
  107. data/lib/spree/permitted_attributes.rb +3 -3
  108. data/lib/spree/service_module.rb +6 -2
  109. data/lib/spree/testing_support/capybara_config.rb +1 -1
  110. data/lib/spree/testing_support/factories/promotion_factory.rb +29 -17
  111. data/lib/spree/testing_support/factories/shipment_factory.rb +7 -9
  112. data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
  113. data/lib/spree/testing_support/factories/zone_factory.rb +16 -13
  114. data/lib/spree/testing_support/i18n.rb +1 -1
  115. data/lib/spree/testing_support/order_walkthrough.rb +8 -3
  116. data/lib/spree/testing_support/rspec_retry_config.rb +10 -0
  117. data/spree_core.gemspec +7 -5
  118. metadata +90 -28
  119. data/lib/spree/core/controller_helpers/currency_helpers.rb +0 -15
  120. data/lib/spree/i18n/base.rb +0 -17
  121. data/lib/spree/i18n/initializer.rb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd3e3f16eb808f16f592360085f02f1382ee4ddd6ee0903c3eb8a8079e5d8bad
4
- data.tar.gz: 8567b7555de6f0f578d6277e6943af11b68329e5e17a77d13c7e66085e7fe09f
3
+ metadata.gz: 3d0f9d56b3e68e0ff69cfa46d00d61872b775e2e92ddf76a3eccd85899ca863b
4
+ data.tar.gz: 80879be83858cb06f69c5e78f975b9cbf1846941d62282290c8403bd8b509363
5
5
  SHA512:
6
- metadata.gz: 113900d45a999bb7aa47209797e8ab47a5ed6f40caa445242952eac3a604cc43bc658fec8fb86dc148743032f71341d97331cd7d6d7b77d84df36ffc979f122b
7
- data.tar.gz: a175395cbe157f6ca1704ab5bdacbbf5c9abbee4bdae89f19363c06fc7a1fe06610fab87347342ecddd297d3bf22bf9354116340e8e408270a4f968a78883a0e
6
+ metadata.gz: 82e15e51f5847c472eac8cd4e24e549dc28705b328f082860009c638277f203adbfe42ff898105862e3385b4ed5935e102200cd247ee998b09b4b2f3912b77d3
7
+ data.tar.gz: c843177415698e0d50d2d9d81b2803f84713db0dfe7d9098c41a7de69cb9c1c15158d97b93a2ecc97dc62752078797adbd03436bad2a8674c87eef07ecb97e35
@@ -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
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ module Addresses
3
+ class Find < ::Spree::BaseFinder
4
+ end
5
+ end
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
@@ -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,7 +99,7 @@ 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,
@@ -103,6 +108,12 @@ module Spree
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 })
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 = Spree::Zone.find_by(name: Spree::Config[: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)
@@ -57,8 +51,33 @@ module Spree
57
51
  end
58
52
  end
59
53
 
54
+ def object
55
+ instance_variable_get('@' + controller_name.singularize)
56
+ end
57
+
58
+ def og_meta_data
59
+ og_meta = {}
60
+
61
+ if object.is_a? Spree::Product
62
+ image = default_image_for_product_or_variant(object)
63
+ og_meta['og:image'] = main_app.url_for(image.attachment) if image&.attachment
64
+
65
+ og_meta['og:url'] = spree.url_for(object) if frontend_available? # url_for product needed
66
+ og_meta['og:type'] = object.class.name.demodulize.downcase
67
+ og_meta['og:title'] = object.name
68
+ og_meta['og:description'] = object.description
69
+
70
+ price = object.price_in(current_currency)
71
+ if price
72
+ og_meta['product:price:amount'] = price.amount
73
+ og_meta['product:price:currency'] = current_currency
74
+ end
75
+ end
76
+
77
+ og_meta
78
+ end
79
+
60
80
  def meta_data
61
- object = instance_variable_get('@' + controller_name.singularize)
62
81
  meta = {}
63
82
 
64
83
  if object.is_a? ApplicationRecord
@@ -82,16 +101,10 @@ module Spree
82
101
  meta
83
102
  end
84
103
 
85
- def meta_image_url_path
86
- object = instance_variable_get('@' + controller_name.singularize)
87
- return unless object.is_a?(Spree::Product)
88
-
89
- image = default_image_for_product_or_variant(object)
90
- image&.attachment.present? ? main_app.url_for(image.attachment) : asset_path(Spree::Config[:logo])
91
- end
92
-
93
- def meta_image_data_tag
94
- tag('meta', property: 'og:image', content: meta_image_url_path) if meta_image_url_path
104
+ def og_meta_data_tags
105
+ og_meta_data.map do |property, content|
106
+ tag('meta', property: property, content: content) unless property.nil? || content.nil?
107
+ end.join("\n")
95
108
  end
96
109
 
97
110
  def meta_data_tags
@@ -189,5 +202,12 @@ module Spree
189
202
  style if style.in? Spree::Image.styles.with_indifferent_access
190
203
  end
191
204
  end
205
+
206
+ def meta_robots
207
+ return unless current_store.respond_to?(:seo_robots)
208
+ return if current_store.seo_robots.blank?
209
+
210
+ tag('meta', name: 'robots', content: current_store.seo_robots)
211
+ end
192
212
  end
193
213
  end
@@ -0,0 +1,19 @@
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 locale_presentation(locale)
12
+ if defined?(SpreeI18n)
13
+ [Spree.t('i18n.this_file_language', locale: locale), locale]
14
+ else
15
+ locale.to_s == 'en' ? ['English (US)', :en] : [locale, locale]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -11,14 +11,19 @@ module Spree
11
11
  order.name || Spree.t('customer')
12
12
  end
13
13
 
14
+ def store_logo
15
+ @order&.store&.mailer_logo || @order&.store&.logo || current_store.mailer_logo || current_store.logo
16
+ end
17
+
18
+ def default_logo
19
+ Spree::Config.mailer_logo || Spree::Config.logo
20
+ end
21
+
14
22
  def logo_path
15
- if current_store.present? && current_store.logo.attached? && current_store.logo.variable?
16
- main_app.url_for(current_store.logo.variant(resize: '244x104>'))
17
- elsif current_store.present? && current_store.logo.attached? && current_store.logo.image?
18
- main_app.url_for(current_store.logo)
19
- else
20
- Spree::Config.mailer_logo || Spree::Config.logo
21
- end
23
+ return default_logo unless store_logo.attached?
24
+ return main_app.url_for(store_logo.variant(resize: '244x104>')) if store_logo.variable?
25
+
26
+ return main_app.url_for(store_logo) if store_logo.image?
22
27
  end
23
28
  end
24
29
  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
@@ -110,23 +115,44 @@ module Spree
110
115
  variants: @variants,
111
116
  is_product_available_in_currency: is_product_available_in_currency,
112
117
  current_currency: current_currency,
113
- current_price_options: current_price_options
118
+ current_price_options: current_price_options,
119
+ current_store: current_store
114
120
  ).call.to_json
115
121
  end
116
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
+
117
147
  def related_products
118
- return [] unless @product.respond_to?(:has_related_products?) && @product.has_related_products?(:related_products)
119
-
120
- @related_products ||= @product.
121
- related_products.
122
- includes(
123
- :tax_category,
124
- master: [
125
- :prices,
126
- images: { attachment_attachment: :blob },
127
- ]
128
- ).
129
- 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')
130
156
  end
131
157
 
132
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
@@ -8,7 +8,7 @@ module Spree
8
8
  helper_method :current_store
9
9
 
10
10
  def from_address
11
- current_store.mail_from_address
11
+ @order&.store&.mail_from_address || current_store.mail_from_address
12
12
  end
13
13
 
14
14
  def money(amount, currency = nil)
@@ -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