spree_core 2.3.4 → 2.3.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/helpers/spree/base_helper.rb +1 -1
- data/app/helpers/spree/products_helper.rb +7 -8
- data/app/models/spree/adjustment.rb +3 -1
- data/app/models/spree/asset.rb +1 -1
- data/app/models/spree/classification.rb +1 -1
- data/app/models/spree/credit_card.rb +2 -2
- data/app/models/spree/gateway/bogus.rb +3 -2
- data/app/models/spree/inventory_unit.rb +1 -1
- data/app/models/spree/item_adjustments.rb +8 -4
- data/app/models/spree/line_item.rb +5 -0
- data/app/models/spree/order.rb +8 -4
- data/app/models/spree/order/checkout.rb +2 -0
- data/app/models/spree/payment.rb +6 -3
- data/app/models/spree/payment_method.rb +7 -3
- data/app/models/spree/payment_method/check.rb +2 -0
- data/app/models/spree/price.rb +1 -13
- data/app/models/spree/product.rb +26 -24
- data/app/models/spree/promotion.rb +2 -2
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -3
- data/app/models/spree/promotion/actions/create_line_items.rb +1 -0
- data/app/models/spree/promotion_handler/coupon.rb +5 -1
- data/app/models/spree/return_authorization.rb +2 -2
- data/app/models/spree/shipping_category.rb +2 -2
- data/app/models/spree/shipping_method_category.rb +1 -1
- data/app/models/spree/stock_item.rb +1 -1
- data/app/models/spree/stock_location.rb +1 -1
- data/app/models/spree/store.rb +1 -1
- data/app/models/spree/tax_category.rb +2 -2
- data/app/models/spree/tax_rate.rb +7 -4
- data/app/models/spree/variant.rb +18 -17
- data/app/models/spree/zone.rb +15 -17
- data/app/models/spree/zone_member.rb +1 -1
- data/config/initializers/user_class_extensions.rb +10 -9
- data/config/locales/en.yml +4 -1
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
- data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +3 -5
- data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
- data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +13 -0
- data/db/migrate/20141105213646_update_classifications_positions.rb +9 -0
- data/lib/generators/spree/install/install_generator.rb +3 -7
- data/lib/spree/core.rb +3 -3
- data/lib/spree/core/controller_helpers/order.rb +8 -7
- data/lib/spree/core/importer/order.rb +16 -3
- data/lib/spree/core/search/base.rb +1 -1
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/localized_number.rb +20 -0
- data/lib/spree/migrations.rb +7 -3
- data/lib/spree/money.rb +2 -2
- data/lib/spree/permitted_attributes.rb +3 -1
- data/lib/spree/testing_support/ability_helpers.rb +25 -25
- data/lib/spree/testing_support/capybara_ext.rb +2 -2
- data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +1 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +4 -4
- data/lib/spree/testing_support/factories/stock_factory.rb +2 -2
- data/lib/spree/testing_support/flash.rb +2 -2
- metadata +16 -19
- data/vendor/assets/javascripts/jquery.validate/localization/messages_et.js +0 -23
- data/vendor/assets/javascripts/jquery.validate/localization/messages_eu.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_hr.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ka.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ko.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_my.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_pt_BR.js +0 -26
- data/vendor/assets/javascripts/jquery.validate/localization/messages_pt_PT.js +0 -26
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sl.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sv.js +0 -23
- data/vendor/assets/javascripts/jquery.validate/localization/messages_uk.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_zh.js +0 -25
- data/vendor/assets/javascripts/jquery.validate/localization/messages_zh_TW.js +0 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2b6ba75da732715ef975c684a089a3586b67cec1
|
4
|
+
data.tar.gz: 4afbf2136510cb63bab7f1b60e2192c03a10a48c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 33a1fe7fdb7080cac31739ec3202a51d3d6e6ffb1da1bf80ea76688ac796b2a545326eba10f6773fcd1d80bbcc57a7abe0353fa610df2daeeab3209bad473f8d
|
7
|
+
data.tar.gz: 2a9c302304140f816e3f1236790b147de50d96b1816e91208a2808b7ad9818ac426d389d53a6b4b978f3d86b888728d2cf7125f46cce75486ce7d7d2c391de46
|
@@ -11,14 +11,13 @@ module Spree
|
|
11
11
|
|
12
12
|
# returns the formatted price for the specified variant as a difference from product price
|
13
13
|
def variant_price_diff(variant)
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
end
|
14
|
+
variant_amount = variant.amount_in(current_currency)
|
15
|
+
product_amount = variant.product.amount_in(current_currency)
|
16
|
+
return if variant_amount == product_amount || product_amount.nil?
|
17
|
+
diff = variant.amount_in(current_currency) - product_amount
|
18
|
+
amount = Spree::Money.new(diff.abs, currency: current_currency).to_html
|
19
|
+
label = diff > 0 ? :add : :subtract
|
20
|
+
"(#{Spree.t(label)}: #{amount})".html_safe
|
22
21
|
end
|
23
22
|
|
24
23
|
# returns the formatted full price for the variant, if at least one variant price differs from product price
|
@@ -26,6 +26,8 @@ module Spree
|
|
26
26
|
belongs_to :source, polymorphic: true
|
27
27
|
belongs_to :order, class_name: "Spree::Order"
|
28
28
|
|
29
|
+
validates :adjustable, presence: true
|
30
|
+
validates :order, presence: true
|
29
31
|
validates :label, presence: true
|
30
32
|
validates :amount, numericality: true
|
31
33
|
|
@@ -101,7 +103,7 @@ module Spree
|
|
101
103
|
|
102
104
|
def update_adjustable_adjustment_total
|
103
105
|
# Cause adjustable's total to be recalculated
|
104
|
-
|
106
|
+
ItemAdjustments.new(adjustable).update
|
105
107
|
end
|
106
108
|
|
107
109
|
end
|
data/app/models/spree/asset.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class Classification < Spree::Base
|
3
3
|
self.table_name = 'spree_products_taxons'
|
4
|
-
acts_as_list
|
4
|
+
acts_as_list scope: :taxon
|
5
5
|
belongs_to :product, class_name: "Spree::Product", inverse_of: :classifications
|
6
6
|
belongs_to :taxon, class_name: "Spree::Taxon", inverse_of: :classifications
|
7
7
|
|
@@ -132,8 +132,8 @@ module Spree
|
|
132
132
|
if month.to_i < 1 || month.to_i > 12
|
133
133
|
errors.add(:base, :expiry_invalid)
|
134
134
|
else
|
135
|
-
|
136
|
-
if
|
135
|
+
current = Time.current
|
136
|
+
if year.to_i < current.year or (year.to_i == current.year and month.to_i < current.month)
|
137
137
|
errors.add(:base, :card_expired)
|
138
138
|
end
|
139
139
|
end
|
@@ -19,8 +19,9 @@ module Spree
|
|
19
19
|
|
20
20
|
def create_profile(payment)
|
21
21
|
# simulate the storage of credit card profile using remote service
|
22
|
-
success = VALID_CCS.include?
|
23
|
-
|
22
|
+
if success = VALID_CCS.include?(payment.source.number)
|
23
|
+
payment.source.update_attributes(:gateway_customer_profile_id => generate_profile_id(success))
|
24
|
+
end
|
24
25
|
end
|
25
26
|
|
26
27
|
def authorize(money, credit_card, options = {})
|
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
belongs_to :variant, class_name: "Spree::Variant", inverse_of: :inventory_units
|
4
4
|
belongs_to :order, class_name: "Spree::Order", inverse_of: :inventory_units
|
5
5
|
belongs_to :shipment, class_name: "Spree::Shipment", touch: true, inverse_of: :inventory_units
|
6
|
-
belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization"
|
6
|
+
belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization", inverse_of: :inventory_units
|
7
7
|
belongs_to :line_item, class_name: "Spree::LineItem", inverse_of: :inventory_units
|
8
8
|
|
9
9
|
scope :backordered, -> { where state: 'backordered' }
|
@@ -9,8 +9,9 @@ module Spree
|
|
9
9
|
|
10
10
|
def initialize(item)
|
11
11
|
@item = item
|
12
|
+
|
12
13
|
# Don't attempt to reload the item from the DB if it's not there
|
13
|
-
@item.reload if @item.persisted?
|
14
|
+
@item.reload if @item.instance_of?(Shipment) && @item.persisted?
|
14
15
|
end
|
15
16
|
|
16
17
|
def update
|
@@ -27,7 +28,7 @@ module Spree
|
|
27
28
|
#
|
28
29
|
# It also fits the criteria for sales tax as outlined here:
|
29
30
|
# http://www.boe.ca.gov/formspubs/pub113/
|
30
|
-
#
|
31
|
+
#
|
31
32
|
# Tax adjustments come in not one but *two* exciting flavours:
|
32
33
|
# Included & additional
|
33
34
|
|
@@ -37,7 +38,10 @@ module Spree
|
|
37
38
|
# Additional tax adjustments are the opposite; effecting the final total.
|
38
39
|
promo_total = 0
|
39
40
|
run_callbacks :promo_adjustments do
|
40
|
-
promotion_total = adjustments.promotion.reload.map
|
41
|
+
promotion_total = adjustments.promotion.reload.map do |adjustment|
|
42
|
+
adjustment.update!(@item)
|
43
|
+
end.compact.sum
|
44
|
+
|
41
45
|
unless promotion_total == 0
|
42
46
|
choose_best_promotion_adjustment
|
43
47
|
end
|
@@ -72,7 +76,7 @@ module Spree
|
|
72
76
|
end
|
73
77
|
|
74
78
|
def best_promotion_adjustment
|
75
|
-
@best_promotion_adjustment ||= adjustments.promotion.eligible.reorder("amount ASC, created_at DESC").first
|
79
|
+
@best_promotion_adjustment ||= adjustments.promotion.eligible.reorder("amount ASC, created_at DESC, id DESC").first
|
76
80
|
end
|
77
81
|
end
|
78
82
|
end
|
@@ -24,6 +24,7 @@ module Spree
|
|
24
24
|
|
25
25
|
validate :ensure_proper_currency
|
26
26
|
before_destroy :update_inventory
|
27
|
+
before_destroy :destroy_inventory_units
|
27
28
|
|
28
29
|
after_save :update_inventory
|
29
30
|
after_save :update_adjustments
|
@@ -102,6 +103,10 @@ module Spree
|
|
102
103
|
end
|
103
104
|
end
|
104
105
|
|
106
|
+
def destroy_inventory_units
|
107
|
+
inventory_units.destroy_all
|
108
|
+
end
|
109
|
+
|
105
110
|
def update_adjustments
|
106
111
|
if quantity_changed?
|
107
112
|
update_tax_charge # Called to ensure pre_tax_amount is updated.
|
data/app/models/spree/order.rb
CHANGED
@@ -37,9 +37,9 @@ module Spree
|
|
37
37
|
alias_attribute :ship_total, :shipment_total
|
38
38
|
|
39
39
|
has_many :state_changes, as: :stateful
|
40
|
-
has_many :line_items, -> { order(
|
40
|
+
has_many :line_items, -> { order("#{LineItem.table_name}.created_at ASC") }, dependent: :destroy, inverse_of: :order
|
41
41
|
has_many :payments, dependent: :destroy
|
42
|
-
has_many :return_authorizations, dependent: :destroy
|
42
|
+
has_many :return_authorizations, dependent: :destroy, inverse_of: :order
|
43
43
|
has_many :adjustments, -> { order("#{Adjustment.table_name}.created_at ASC") }, as: :adjustable, dependent: :destroy
|
44
44
|
has_many :line_item_adjustments, through: :line_items, source: :adjustments
|
45
45
|
has_many :shipment_adjustments, through: :shipments, source: :adjustments
|
@@ -74,7 +74,7 @@ module Spree
|
|
74
74
|
|
75
75
|
validates :email, presence: true, if: :require_email
|
76
76
|
validates :email, email: true, if: :require_email, allow_blank: true
|
77
|
-
validates :number, uniqueness: true
|
77
|
+
validates :number, presence: true, uniqueness: { allow_blank: true }
|
78
78
|
validate :has_available_shipment
|
79
79
|
|
80
80
|
make_permalink field: :number
|
@@ -415,7 +415,11 @@ module Spree
|
|
415
415
|
|
416
416
|
def ensure_line_items_are_in_stock
|
417
417
|
if insufficient_stock_lines.present?
|
418
|
-
errors.add(:base, Spree.t(:insufficient_stock_lines_present))
|
418
|
+
errors.add(:base, Spree.t(:insufficient_stock_lines_present))
|
419
|
+
restart_checkout_flow
|
420
|
+
false
|
421
|
+
else
|
422
|
+
true
|
419
423
|
end
|
420
424
|
end
|
421
425
|
|
@@ -102,6 +102,8 @@ module Spree
|
|
102
102
|
|
103
103
|
before_transition to: :resumed, do: :ensure_line_items_are_in_stock
|
104
104
|
|
105
|
+
before_transition to: :complete, do: :ensure_line_items_are_in_stock
|
106
|
+
|
105
107
|
after_transition to: :complete, do: :finalize!
|
106
108
|
after_transition to: :resumed, do: :after_resume
|
107
109
|
after_transition to: :canceled, do: :after_cancel
|
data/app/models/spree/payment.rb
CHANGED
@@ -8,7 +8,7 @@ module Spree
|
|
8
8
|
|
9
9
|
belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :payments
|
10
10
|
belongs_to :source, polymorphic: true
|
11
|
-
belongs_to :payment_method, class_name: 'Spree::PaymentMethod'
|
11
|
+
belongs_to :payment_method, class_name: 'Spree::PaymentMethod', inverse_of: :payments
|
12
12
|
|
13
13
|
has_many :offsets, -> { where("source_type = 'Spree::Payment' AND amount < 0 AND state = 'completed'") },
|
14
14
|
class_name: "Spree::Payment", foreign_key: :source_id
|
@@ -175,6 +175,7 @@ module Spree
|
|
175
175
|
|
176
176
|
def create_payment_profile
|
177
177
|
return unless source.respond_to?(:has_payment_profile?) && !source.has_payment_profile?
|
178
|
+
return if %w(invalid failed).include?(state)
|
178
179
|
# Imported payments shouldn't create a payment profile.
|
179
180
|
return if source.imported
|
180
181
|
|
@@ -184,8 +185,10 @@ module Spree
|
|
184
185
|
end
|
185
186
|
|
186
187
|
def invalidate_old_payments
|
187
|
-
|
188
|
-
payment
|
188
|
+
if state != 'invalid' and state != 'failed'
|
189
|
+
order.payments.with_state('checkout').where("id != ?", self.id).each do |payment|
|
190
|
+
payment.invalidate!
|
191
|
+
end
|
189
192
|
end
|
190
193
|
end
|
191
194
|
|
@@ -8,7 +8,7 @@ module Spree
|
|
8
8
|
|
9
9
|
validates :name, presence: true
|
10
10
|
|
11
|
-
has_many :payments, class_name: "Spree::Payment"
|
11
|
+
has_many :payments, class_name: "Spree::Payment", inverse_of: :payment_method
|
12
12
|
has_many :credit_cards, class_name: "Spree::CreditCard"
|
13
13
|
|
14
14
|
def self.providers
|
@@ -16,14 +16,14 @@ module Spree
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def provider_class
|
19
|
-
raise 'You must implement provider_class method for this gateway.'
|
19
|
+
raise ::NotImplementedError, 'You must implement provider_class method for this gateway.'
|
20
20
|
end
|
21
21
|
|
22
22
|
# The class that will process payments for this payment type, used for @payment.source
|
23
23
|
# e.g. CreditCard in the case of a the Gateway payment type
|
24
24
|
# nil means the payment method doesn't require a source e.g. check
|
25
25
|
def payment_source_class
|
26
|
-
raise 'You must implement payment_source_class method for this gateway.'
|
26
|
+
raise ::NotImplementedError, 'You must implement payment_source_class method for this gateway.'
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.available(display_on = 'both')
|
@@ -67,5 +67,9 @@ module Spree
|
|
67
67
|
def supports?(source)
|
68
68
|
true
|
69
69
|
end
|
70
|
+
|
71
|
+
def cancel(response)
|
72
|
+
raise ::NotImplementedError, 'You must implement cancel method for this payment method.'
|
73
|
+
end
|
70
74
|
end
|
71
75
|
end
|
data/app/models/spree/price.rb
CHANGED
@@ -21,7 +21,7 @@ module Spree
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def price=(price)
|
24
|
-
self[:amount] =
|
24
|
+
self[:amount] = Spree::LocalizedNumber.parse(price)
|
25
25
|
end
|
26
26
|
|
27
27
|
# Remove variant default_scope `deleted_at: nil`
|
@@ -39,18 +39,6 @@ module Spree
|
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
# strips all non-price-like characters from the price, taking into account locale settings
|
43
|
-
def parse_price(price)
|
44
|
-
return price unless price.is_a?(String)
|
45
|
-
|
46
|
-
separator, delimiter = I18n.t([:'number.currency.format.separator', :'number.currency.format.delimiter'])
|
47
|
-
non_price_characters = /[^0-9\-#{separator}]/
|
48
|
-
price.gsub!(non_price_characters, '') # strip everything else first
|
49
|
-
price.gsub!(separator, '.') unless separator == '.' # then replace the locale-specific decimal separator with the standard separator if necessary
|
50
|
-
|
51
|
-
price.to_d
|
52
|
-
end
|
53
|
-
|
54
42
|
def maximum_amount
|
55
43
|
BigDecimal '999999.99'
|
56
44
|
end
|
data/app/models/spree/product.rb
CHANGED
@@ -40,8 +40,7 @@ module Spree
|
|
40
40
|
has_one :master,
|
41
41
|
-> { where is_master: true },
|
42
42
|
inverse_of: :product,
|
43
|
-
class_name: 'Spree::Variant'
|
44
|
-
dependent: :destroy
|
43
|
+
class_name: 'Spree::Variant'
|
45
44
|
|
46
45
|
has_many :variants,
|
47
46
|
-> { where(is_master: false).order("#{::Spree::Variant.quoted_table_name}.position ASC") },
|
@@ -57,7 +56,7 @@ module Spree
|
|
57
56
|
has_many :prices, -> { order('spree_variants.position, spree_variants.id, currency') }, through: :variants
|
58
57
|
|
59
58
|
has_many :stock_items, through: :variants_including_master
|
60
|
-
|
59
|
+
|
61
60
|
has_many :line_items, through: :variants_including_master
|
62
61
|
has_many :orders, through: :line_items
|
63
62
|
|
@@ -65,29 +64,32 @@ module Spree
|
|
65
64
|
|
66
65
|
delegate_belongs_to :master, :cost_price
|
67
66
|
|
67
|
+
delegate :images, to: :master, prefix: true
|
68
|
+
alias_method :images, :master_images
|
69
|
+
|
70
|
+
has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
|
71
|
+
|
68
72
|
after_create :set_master_variant_defaults
|
69
73
|
after_create :add_properties_and_option_types_from_prototype
|
70
74
|
after_create :build_variants_from_option_values_hash, if: :option_values_hash
|
71
75
|
|
76
|
+
after_destroy :punch_slug
|
77
|
+
|
78
|
+
after_initialize :ensure_master
|
79
|
+
|
72
80
|
after_save :save_master
|
73
81
|
after_save :run_touch_callbacks, if: :anything_changed?
|
74
82
|
after_save :reset_nested_changes
|
75
83
|
after_touch :touch_taxons
|
76
84
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
|
85
|
+
before_validation :normalize_slug, on: :update
|
86
|
+
before_validation :validate_master
|
81
87
|
|
88
|
+
validates :meta_keywords, length: { maximum: 255 }
|
82
89
|
validates :name, presence: true
|
83
90
|
validates :price, presence: true, if: proc { Spree::Config[:require_master_price] }
|
84
91
|
validates :shipping_category_id, presence: true
|
85
|
-
validates :slug, length: { minimum: 3 }
|
86
|
-
validates :slug, uniqueness: true
|
87
|
-
|
88
|
-
before_validation :normalize_slug, on: :update
|
89
|
-
|
90
|
-
after_destroy :punch_slug
|
92
|
+
validates :slug, length: { minimum: 3 }, uniqueness: { allow_blank: true }
|
91
93
|
|
92
94
|
attr_accessor :option_values_hash
|
93
95
|
|
@@ -95,8 +97,6 @@ module Spree
|
|
95
97
|
|
96
98
|
alias :options :product_option_types
|
97
99
|
|
98
|
-
after_initialize :ensure_master
|
99
|
-
|
100
100
|
# the master variant is not a member of the variants array
|
101
101
|
def has_variants?
|
102
102
|
variants.any?
|
@@ -276,19 +276,21 @@ module Spree
|
|
276
276
|
# when saving so we force a save using a hook
|
277
277
|
# Fix for issue #5306
|
278
278
|
def save_master
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
279
|
+
if master && (master.changed? || master.new_record? || (master.default_price && (master.default_price.changed? || master.default_price.new_record?)))
|
280
|
+
master.save!
|
281
|
+
@nested_changes = true
|
282
|
+
end
|
283
|
+
end
|
284
284
|
|
285
|
-
|
286
|
-
|
287
|
-
|
285
|
+
# If the master cannot be saved, the Product object will get its errors
|
286
|
+
# and will be destroyed
|
287
|
+
def validate_master
|
288
|
+
# We call master.default_price here to ensure price is initialized.
|
289
|
+
# Required to avoid Variant#check_price validation failing on create.
|
290
|
+
unless master.default_price && master.valid?
|
288
291
|
master.errors.each do |att, error|
|
289
292
|
self.errors.add(att, error)
|
290
293
|
end
|
291
|
-
raise
|
292
294
|
end
|
293
295
|
end
|
294
296
|
|
@@ -16,7 +16,7 @@ module Spree
|
|
16
16
|
validates_associated :rules
|
17
17
|
|
18
18
|
validates :name, presence: true
|
19
|
-
validates :path, uniqueness:
|
19
|
+
validates :path, uniqueness: { allow_blank: true }
|
20
20
|
validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
|
21
21
|
validates :description, length: { maximum: 255 }
|
22
22
|
|
@@ -30,7 +30,7 @@ module Spree
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.with_coupon_code(coupon_code)
|
33
|
-
where("lower(code) = ?", coupon_code.strip.downcase).first
|
33
|
+
where("lower(#{self.table_name}.code) = ?", coupon_code.strip.downcase).first
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.active
|
@@ -14,10 +14,12 @@ module Spree
|
|
14
14
|
|
15
15
|
def perform(payload = {})
|
16
16
|
order = payload[:order]
|
17
|
-
# Find only the line items which have not already been adjusted by this promotion
|
17
|
+
# Find only the orders' line items which have not already been adjusted by this promotion
|
18
18
|
# HACK: Need to use [0] because `pluck` may return an empty array, which AR helpfully
|
19
19
|
# coverts to meaning NOT IN (NULL) and the DB isn't happy about that.
|
20
|
-
already_adjusted_line_items = [0] + self.adjustments.
|
20
|
+
already_adjusted_line_items = [0] + self.adjustments.
|
21
|
+
where(adjustable_id: order.line_items.pluck(:id), adjustable_type: 'Spree::LineItem').
|
22
|
+
pluck(:adjustable_id)
|
21
23
|
result = false
|
22
24
|
order.line_items.where("id NOT IN (?)", already_adjusted_line_items).find_each do |line_item|
|
23
25
|
current_result = self.create_adjustment(line_item, order)
|
@@ -43,7 +45,7 @@ module Spree
|
|
43
45
|
# item_total and ship_total
|
44
46
|
def compute_amount(adjustable)
|
45
47
|
promotion_amount = self.calculator.compute(adjustable).to_f.abs
|
46
|
-
|
48
|
+
|
47
49
|
[adjustable.amount, promotion_amount].min * -1
|
48
50
|
end
|
49
51
|
|