solidus_core 1.1.0.pre1 → 1.1.0.pre2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/app/mailers/spree/carton_mailer.rb +12 -1
- data/app/models/concerns/spree/user_address_book.rb +17 -8
- data/app/models/concerns/spree/user_methods.rb +3 -6
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/adjustment.rb +1 -1
- data/app/models/spree/app_configuration.rb +11 -0
- data/app/models/spree/order.rb +6 -6
- data/app/models/spree/order/checkout.rb +9 -0
- data/app/models/spree/order_capturing.rb +4 -1
- data/app/models/spree/order_contents.rb +5 -0
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/payment.rb +5 -2
- data/app/models/spree/payment/processing.rb +1 -1
- data/app/models/spree/product.rb +1 -1
- data/app/models/spree/promotion.rb +8 -1
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +36 -0
- data/app/models/spree/promotion/rules/product.rb +2 -1
- data/app/models/spree/promotion_handler/cart.rb +1 -14
- data/app/models/spree/prototype.rb +3 -1
- data/app/models/spree/prototype_taxon.rb +6 -0
- data/app/models/spree/taxon.rb +2 -1
- data/app/models/spree/tracker.rb +1 -1
- data/app/models/spree/transfer_item.rb +2 -6
- data/config/locales/en.yml +10 -1
- data/db/default/spree/zones.rb +2 -2
- data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +13 -11
- data/db/migrate/20150128032538_remove_environment_from_tracker.rb +6 -0
- data/db/migrate/20150515211137_fix_adjustment_order_id.rb +80 -0
- data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +16 -0
- data/db/migrate/20150826002555_convert_habtm_to_hmt_for_taxon_prototypes.rb +15 -0
- data/db/migrate/20151010003252_add_foreign_keys_for_taxons_prototypes.rb +6 -0
- data/db/migrate/20151013222921_remove_token_permissions_table.rb +16 -0
- data/db/migrate/20151014213349_rename_identifier_to_number_for_payment.rb +7 -0
- data/db/migrate/20151015203732_add_foreign_keys_for_product_promotion_rules.rb +9 -0
- data/db/migrate/20151021113730_add_sale_to_spree_promotions.rb +6 -0
- data/db/migrate/20151021163309_convert_sale_promotions.rb +28 -0
- data/lib/spree/core.rb +2 -0
- data/lib/spree/core/controller_helpers/strong_parameters.rb +7 -0
- data/lib/spree/core/engine.rb +2 -1
- data/lib/spree/deprecation.rb +3 -0
- data/lib/spree/mailer_previews/carton_preview.rb +1 -1
- data/lib/spree/permission_sets.rb +23 -0
- data/{app/models → lib}/spree/permission_sets/base.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/configuration_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/configuration_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/dashboard_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/default_customer.rb +2 -1
- data/{app/models → lib}/spree/permission_sets/order_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/order_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/product_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/product_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/promotion_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/promotion_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/report_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/restricted_stock_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/restricted_stock_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/restricted_stock_transfer_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/restricted_stock_transfer_management.rb +22 -12
- data/{app/models → lib}/spree/permission_sets/stock_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/stock_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/stock_transfer_display.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/stock_transfer_management.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/super_user.rb +0 -0
- data/{app/models → lib}/spree/permission_sets/user_display.rb +0 -0
- data/lib/spree/permission_sets/user_management.rb +21 -0
- data/lib/spree/permitted_attributes.rb +7 -4
- data/lib/spree/testing_support/factories/order_factory.rb +6 -2
- data/lib/spree/testing_support/factories/tracker_factory.rb +0 -1
- data/lib/spree/testing_support/order_walkthrough.rb +22 -19
- metadata +41 -27
- data/app/models/spree/permission_sets/user_management.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae8ca76f31ff2adc9e441466cdb0612a00327773
|
4
|
+
data.tar.gz: 025e77575cb92628ce8ecc1aceb3834b8e07c475
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2bea81b1bd27228bfacf973daedec5e4db6c0b66758eaaeedd4f4d2fa720435fd9a32b63d857f885bedc103ffadf0ee3e42ddc7f92b6eb34f28517e05f6e9bb7
|
7
|
+
data.tar.gz: f846e9f87d9951c77ab83ae46af5668469d3b1e58f1fe744c40772b988513fb54527d80b8a1e3d1e417a879e190783d436b95efefb4b5083b35c571b3d1965c6
|
@@ -1,7 +1,18 @@
|
|
1
1
|
module Spree
|
2
2
|
class CartonMailer < BaseMailer
|
3
3
|
# Send an email to customers to notify that an individual carton has been
|
4
|
-
# shipped.
|
4
|
+
# shipped. If a carton contains items from multiple orders then this will be
|
5
|
+
# called with that carton one time for each order.
|
6
|
+
#
|
7
|
+
# @param carton [Spree::Carton] the shipped carton
|
8
|
+
# @param order [Spree::Order] one of the orders with items in the carton
|
9
|
+
# @param resend [Boolean] indicates whether the email is a 'resend' (e.g.
|
10
|
+
# triggered by the admin "resend" button)
|
11
|
+
# @return [Mail::Message]
|
12
|
+
#
|
13
|
+
# Note: The signature of this method has changed. The new (non-deprecated)
|
14
|
+
# signature is:
|
15
|
+
# def shipped_email(carton:, order:, resend: false)
|
5
16
|
def shipped_email(options, deprecated_options={})
|
6
17
|
if options.is_a?(Integer)
|
7
18
|
ActiveSupport::Deprecation.warn "Calling shipped_email with a carton_id is DEPRECATED. Instead use CartonMailer.shipped_email(order: order, carton: carton)"
|
@@ -54,19 +54,28 @@ module Spree
|
|
54
54
|
alias_method :ship_address, :default_address
|
55
55
|
alias_method :ship_address_attributes=, :default_address_attributes=
|
56
56
|
|
57
|
+
# saves address in address book
|
58
|
+
# sets address to the default if automatic_default_address is set to true
|
59
|
+
# if address is nil, does nothing and returns nil
|
57
60
|
def ship_address=(address)
|
58
61
|
be_default = Spree::Config.automatic_default_address
|
59
|
-
save_in_address_book(address.attributes, be_default)
|
62
|
+
save_in_address_book(address.attributes, be_default) if address
|
60
63
|
end
|
61
64
|
|
65
|
+
# saves order.ship_address and order.bill_address in address book
|
66
|
+
# sets ship_address to the default if automatic_default_address is set to true
|
67
|
+
# sets bill_address to the default if automatic_default_address is set to true and there is no ship_address
|
68
|
+
# if one address is nil, does not save that address
|
62
69
|
def persist_order_address(order)
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
+
save_in_address_book(
|
71
|
+
order.ship_address.attributes,
|
72
|
+
Spree::Config.automatic_default_address
|
73
|
+
) if order.ship_address
|
74
|
+
|
75
|
+
save_in_address_book(
|
76
|
+
order.bill_address.attributes,
|
77
|
+
order.ship_address.nil? && Spree::Config.automatic_default_address
|
78
|
+
) if order.bill_address
|
70
79
|
end
|
71
80
|
|
72
81
|
# Add an address to the user's list of saved addresses for future autofill
|
@@ -23,13 +23,10 @@ module Spree
|
|
23
23
|
has_many :store_credit_events, through: :store_credits
|
24
24
|
money_methods :total_available_store_credit
|
25
25
|
|
26
|
-
|
27
|
-
%w[addresses]
|
28
|
-
end
|
26
|
+
include Spree::RansackableAttributes unless included_modules.include?(Spree::RansackableAttributes)
|
29
27
|
|
30
|
-
|
31
|
-
|
32
|
-
end
|
28
|
+
self.whitelisted_ransackable_associations = %w[addresses]
|
29
|
+
self.whitelisted_ransackable_attributes = %w[id email]
|
33
30
|
end
|
34
31
|
|
35
32
|
# has_spree_role? simply needs to return true or false whether a user has a role or not.
|
data/app/models/spree/ability.rb
CHANGED
@@ -16,7 +16,7 @@ module Spree
|
|
16
16
|
class Adjustment < Spree::Base
|
17
17
|
belongs_to :adjustable, polymorphic: true, touch: true
|
18
18
|
belongs_to :source, polymorphic: true
|
19
|
-
belongs_to :order, class_name:
|
19
|
+
belongs_to :order, class_name: 'Spree::Order', inverse_of: :all_adjustments
|
20
20
|
belongs_to :promotion_code, :class_name => 'Spree::PromotionCode'
|
21
21
|
belongs_to :adjustment_reason, class_name: 'Spree::AdjustmentReason', inverse_of: :adjustments
|
22
22
|
|
@@ -265,6 +265,17 @@ module Spree
|
|
265
265
|
@promotion_chooser_class ||= Spree::PromotionChooser
|
266
266
|
end
|
267
267
|
|
268
|
+
# Allows providing your own Mailer for shipped cartons.
|
269
|
+
#
|
270
|
+
# @!attribute [rw] carton_shipped_email_class
|
271
|
+
# @return [ActionMailer::Base] an object that responds to "shipped_email"
|
272
|
+
# (e.g. an ActionMailer with a "shipped_email" method) with the same
|
273
|
+
# signature as Spree::CartonMailer.shipped_email.
|
274
|
+
attr_writer :carton_shipped_email_class
|
275
|
+
def carton_shipped_email_class
|
276
|
+
@carton_shipped_email_class ||= Spree::CartonMailer
|
277
|
+
end
|
278
|
+
|
268
279
|
def static_model_preferences
|
269
280
|
@static_model_preferences ||= Spree::Preferences::StaticModelPreferences.new
|
270
281
|
end
|
data/app/models/spree/order.rb
CHANGED
@@ -59,6 +59,11 @@ module Spree
|
|
59
59
|
has_many :products, through: :variants
|
60
60
|
has_many :variants, through: :line_items
|
61
61
|
has_many :refunds, through: :payments
|
62
|
+
has_many :all_adjustments,
|
63
|
+
class_name: 'Spree::Adjustment',
|
64
|
+
foreign_key: :order_id,
|
65
|
+
dependent: :destroy,
|
66
|
+
inverse_of: :order
|
62
67
|
|
63
68
|
has_many :order_stock_locations, class_name: "Spree::OrderStockLocation"
|
64
69
|
has_many :stock_locations, through: :order_stock_locations
|
@@ -145,11 +150,6 @@ module Spree
|
|
145
150
|
self.line_item_comparison_hooks.add(hook)
|
146
151
|
end
|
147
152
|
|
148
|
-
def all_adjustments
|
149
|
-
Adjustment.where("order_id = :order_id OR (adjustable_id = :order_id AND adjustable_type = 'Spree::Order')",
|
150
|
-
order_id: self.id)
|
151
|
-
end
|
152
|
-
|
153
153
|
# For compatiblity with Calculator::PriceSack
|
154
154
|
def amount
|
155
155
|
line_items.inject(0.0) { |sum, li| sum + li.amount }
|
@@ -400,7 +400,7 @@ module Spree
|
|
400
400
|
|
401
401
|
# Helper methods for checkout steps
|
402
402
|
def paid?
|
403
|
-
|
403
|
+
%w(paid credit_owed).include?(payment_state)
|
404
404
|
end
|
405
405
|
|
406
406
|
def available_payment_methods
|
@@ -126,6 +126,15 @@ module Spree
|
|
126
126
|
order.update_totals
|
127
127
|
order.persist_totals
|
128
128
|
end
|
129
|
+
|
130
|
+
after_transition do |order, transition|
|
131
|
+
order.logger.debug "Order #{order.number} transitioned from #{transition.from} to #{transition.to} via #{transition.event}"
|
132
|
+
end
|
133
|
+
|
134
|
+
|
135
|
+
after_failure do |order, transition|
|
136
|
+
order.logger.debug "Order #{order.number} halted transition on event #{transition.event} state #{transition.from}: #{order.errors.full_messages.join}"
|
137
|
+
end
|
129
138
|
end
|
130
139
|
|
131
140
|
alias_method :save_state, :save
|
@@ -33,7 +33,10 @@ class Spree::OrderCapturing
|
|
33
33
|
end
|
34
34
|
end
|
35
35
|
ensure
|
36
|
-
|
36
|
+
# FIXME: Adding the inverse_of on the payments relation for orders -should- fix this,
|
37
|
+
# however it only appears to make it worse (calling with changes three times instead of once.
|
38
|
+
# Warrants an investigation. Reloading for now.
|
39
|
+
@order.reload.update!
|
37
40
|
end
|
38
41
|
end
|
39
42
|
end
|
@@ -16,6 +16,11 @@ module Spree
|
|
16
16
|
after_add_or_remove(line_item, options)
|
17
17
|
end
|
18
18
|
|
19
|
+
def remove_line_item(line_item, options = {})
|
20
|
+
line_item.destroy!
|
21
|
+
after_add_or_remove(line_item, options)
|
22
|
+
end
|
23
|
+
|
19
24
|
def update_cart(params)
|
20
25
|
if order.update_attributes(params)
|
21
26
|
unless order.completed?
|
@@ -87,7 +87,7 @@ class Spree::OrderShipping
|
|
87
87
|
|
88
88
|
def send_shipment_emails(carton)
|
89
89
|
carton.orders.each do |order|
|
90
|
-
Spree::
|
90
|
+
Spree::Config.carton_shipped_email_class.shipped_email(order: order, carton: carton).deliver_later
|
91
91
|
end
|
92
92
|
end
|
93
93
|
end
|
data/app/models/spree/payment.rb
CHANGED
@@ -2,6 +2,9 @@ module Spree
|
|
2
2
|
class Payment < Spree::Base
|
3
3
|
include Spree::Payment::Processing
|
4
4
|
|
5
|
+
alias_attribute :identifier, :number
|
6
|
+
deprecate :identifier, :identifier=, deprecator: Spree::Deprecation
|
7
|
+
|
5
8
|
IDENTIFIER_CHARS = (('A'..'Z').to_a + ('0'..'9').to_a - %w(0 1 I O)).freeze
|
6
9
|
NON_RISKY_AVS_CODES = ['B', 'D', 'H', 'J', 'M', 'Q', 'T', 'V', 'X', 'Y'].freeze
|
7
10
|
RISKY_AVS_CODES = ['A', 'C', 'E', 'F', 'G', 'I', 'K', 'L', 'N', 'O', 'P', 'R', 'S', 'U', 'W', 'Z'].freeze
|
@@ -255,8 +258,8 @@ module Spree
|
|
255
258
|
# See https://github.com/spree/spree/issues/1998#issuecomment-12869105
|
256
259
|
def set_unique_identifier
|
257
260
|
begin
|
258
|
-
self.
|
259
|
-
end while self.class.exists?(
|
261
|
+
self.number = generate_identifier
|
262
|
+
end while self.class.exists?(number: self.number)
|
260
263
|
end
|
261
264
|
|
262
265
|
def generate_identifier
|
data/app/models/spree/product.rb
CHANGED
@@ -25,7 +25,7 @@ module Spree
|
|
25
25
|
has_many :classifications, dependent: :delete_all, inverse_of: :product
|
26
26
|
has_many :taxons, through: :classifications, before_remove: :remove_taxon
|
27
27
|
|
28
|
-
has_many :product_promotion_rules
|
28
|
+
has_many :product_promotion_rules, dependent: :destroy
|
29
29
|
has_many :promotion_rules, through: :product_promotion_rules
|
30
30
|
|
31
31
|
belongs_to :tax_category, class_name: 'Spree::TaxCategory'
|
@@ -16,7 +16,7 @@ module Spree
|
|
16
16
|
has_many :order_promotions, class_name: "Spree::OrderPromotion"
|
17
17
|
has_many :orders, through: :order_promotions
|
18
18
|
|
19
|
-
has_many :codes, class_name: "Spree::PromotionCode", inverse_of: :promotion
|
19
|
+
has_many :codes, class_name: "Spree::PromotionCode", inverse_of: :promotion, dependent: :destroy
|
20
20
|
alias_method :promotion_codes, :codes
|
21
21
|
|
22
22
|
accepts_nested_attributes_for :promotion_actions, :promotion_rules
|
@@ -28,6 +28,7 @@ module Spree
|
|
28
28
|
validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
|
29
29
|
validates :per_code_usage_limit, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
30
30
|
validates :description, length: { maximum: 255 }
|
31
|
+
validate :apply_automatically_disallowed_with_codes_or_paths
|
31
32
|
|
32
33
|
before_save :normalize_blank_values
|
33
34
|
|
@@ -228,5 +229,11 @@ module Spree
|
|
228
229
|
def match_all?
|
229
230
|
match_policy == "all"
|
230
231
|
end
|
232
|
+
|
233
|
+
def apply_automatically_disallowed_with_codes_or_paths
|
234
|
+
return unless apply_automatically
|
235
|
+
errors.add(:apply_automatically, :disallowed_with_code) if codes.any?
|
236
|
+
errors.add(:apply_automatically, :disallowed_with_path) if path.present?
|
237
|
+
end
|
231
238
|
end
|
232
239
|
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Spree
|
2
|
+
class Promotion
|
3
|
+
module Rules
|
4
|
+
class FirstRepeatPurchaseSince < PromotionRule
|
5
|
+
preference :days_ago, :integer, default: 365
|
6
|
+
validates :preferred_days_ago, numericality: { only_integer: true, greater_than: 0 }
|
7
|
+
|
8
|
+
# This promotion is applicable to orders only.
|
9
|
+
def applicable?(promotable)
|
10
|
+
promotable.is_a?(Spree::Order)
|
11
|
+
end
|
12
|
+
|
13
|
+
# This is never eligible if the order does not have a user, and that user does not have any previous completed orders.
|
14
|
+
#
|
15
|
+
# This is eligible if the user's most recently completed order is more than the preferred days ago
|
16
|
+
# @param order [Spree::Order]
|
17
|
+
# @option options
|
18
|
+
def eligible?(order, options = {})
|
19
|
+
return false unless order.user
|
20
|
+
|
21
|
+
last_order = last_completed_order(order.user)
|
22
|
+
return false unless last_order
|
23
|
+
|
24
|
+
last_order.completed_at < preferred_days_ago.days.ago
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def last_completed_order user
|
30
|
+
user.orders.complete.order(:completed_at).last
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
@@ -6,7 +6,8 @@ module Spree
|
|
6
6
|
# either come from assigned product group or are assingned directly to
|
7
7
|
# the rule.
|
8
8
|
class Product < PromotionRule
|
9
|
-
has_many :product_promotion_rules,
|
9
|
+
has_many :product_promotion_rules, dependent: :destroy, foreign_key: :promotion_rule_id,
|
10
|
+
class_name: 'Spree::ProductPromotionRule'
|
10
11
|
has_many :products, class_name: 'Spree::Product', through: :product_promotion_rules
|
11
12
|
|
12
13
|
MATCH_POLICIES = %w(any all none)
|
@@ -40,20 +40,7 @@ module Spree
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def sale_promotions
|
43
|
-
|
44
|
-
code_table = PromotionCode.arel_table
|
45
|
-
|
46
|
-
promotion_code_join = promo_table.join(code_table, Arel::Nodes::OuterJoin).on(
|
47
|
-
promo_table[:id].eq(code_table[:promotion_id])
|
48
|
-
).join_sources
|
49
|
-
|
50
|
-
Promotion.active.includes(:promotion_rules).
|
51
|
-
joins(promotion_code_join).
|
52
|
-
where(
|
53
|
-
code_table[:value].eq(nil).and(
|
54
|
-
promo_table[:path].eq(nil)
|
55
|
-
)
|
56
|
-
).distinct
|
43
|
+
Promotion.where(apply_automatically: true).active.includes(:promotion_rules)
|
57
44
|
end
|
58
45
|
|
59
46
|
def promotion_code(promotion)
|
@@ -2,7 +2,9 @@ module Spree
|
|
2
2
|
class Prototype < Spree::Base
|
3
3
|
has_and_belongs_to_many :properties, join_table: :spree_properties_prototypes
|
4
4
|
has_and_belongs_to_many :option_types, join_table: :spree_option_types_prototypes
|
5
|
-
|
5
|
+
|
6
|
+
has_many :prototype_taxons, dependent: :destroy
|
7
|
+
has_many :taxons, through: :prototype_taxons
|
6
8
|
|
7
9
|
validates :name, presence: true
|
8
10
|
end
|
data/app/models/spree/taxon.rb
CHANGED
@@ -6,7 +6,8 @@ module Spree
|
|
6
6
|
has_many :classifications, -> { order(:position) }, dependent: :delete_all, inverse_of: :taxon
|
7
7
|
has_many :products, through: :classifications
|
8
8
|
|
9
|
-
|
9
|
+
has_many :prototype_taxons, dependent: :destroy
|
10
|
+
has_many :prototypes, through: :prototype_taxons
|
10
11
|
|
11
12
|
before_create :set_permalink
|
12
13
|
|
data/app/models/spree/tracker.rb
CHANGED
@@ -21,7 +21,7 @@ module Spree
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def ensure_stock_transfer_not_closed
|
24
|
-
if
|
24
|
+
if stock_transfer.closed?
|
25
25
|
errors.add(:base, Spree.t('errors.messages.cannot_modify_transfer_item_closed_stock_transfer'))
|
26
26
|
end
|
27
27
|
end
|
@@ -47,12 +47,8 @@ module Spree
|
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
50
|
-
def stock_transfer_closed?
|
51
|
-
stock_transfer.closed?
|
52
|
-
end
|
53
|
-
|
54
50
|
def check_stock?
|
55
|
-
!
|
51
|
+
!stock_transfer.shipped? && stock_transfer.source_location.check_stock_on_transfer?
|
56
52
|
end
|
57
53
|
end
|
58
54
|
end
|
data/config/locales/en.yml
CHANGED
@@ -299,6 +299,11 @@ en:
|
|
299
299
|
attributes:
|
300
300
|
currency:
|
301
301
|
must_match_order_currency: "Must match order currency"
|
302
|
+
spree/promotion:
|
303
|
+
attributes:
|
304
|
+
apply_automatically:
|
305
|
+
disallowed_with_code: Disallowed for promotions with a code
|
306
|
+
disallowed_with_path: Disallowed for promotions with a path
|
302
307
|
spree/refund:
|
303
308
|
attributes:
|
304
309
|
amount:
|
@@ -589,6 +594,7 @@ en:
|
|
589
594
|
cannot_rebuild_shipments_shipments_not_pending: Cannot rebuild shipments for an order with non-pending shipments.
|
590
595
|
cannot_perform_operation: Cannot perform requested operation
|
591
596
|
cannot_set_shipping_method_without_address: Cannot set shipping method until customer details are provided.
|
597
|
+
cannot_update_email: You do not have access to update this user's email address. <br />Please contact a superuser if you need to perform this action.
|
592
598
|
capture: Capture
|
593
599
|
capture_events: Capture events
|
594
600
|
card_code: Card Code
|
@@ -764,7 +770,6 @@ en:
|
|
764
770
|
enable_mail_delivery: Enable Mail Delivery
|
765
771
|
end: End
|
766
772
|
ending_in: Ending in
|
767
|
-
environment: Environment
|
768
773
|
error: error
|
769
774
|
errors:
|
770
775
|
messages:
|
@@ -1228,6 +1233,10 @@ en:
|
|
1228
1233
|
description: Apply a promotion to every nth order a user has completed.
|
1229
1234
|
name: Nth Order
|
1230
1235
|
form_text: "Apply this promotion on the users Nth order: "
|
1236
|
+
first_repeat_purchase_since:
|
1237
|
+
description: Available only to user who have not purchased in a while
|
1238
|
+
name: First Repeat Purchase Since
|
1239
|
+
form_text: "Apply this promotion to users whose last order was more than X days ago: "
|
1231
1240
|
promotions: Promotions
|
1232
1241
|
promotion_successfully_created: Promotion has been successfully created!
|
1233
1242
|
promotion_total_changed_before_complete: "One or more of the promotions on your order have become ineligible and were removed. Please check the new order amounts and try again."
|