spree_core 2.4.0.rc2 → 2.4.0.rc3
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/products_helper.rb +7 -8
- data/app/models/spree/adjustment.rb +7 -2
- data/app/models/spree/classification.rb +1 -1
- data/app/models/spree/exchange.rb +4 -0
- 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 +7 -3
- data/app/models/spree/line_item.rb +5 -0
- data/app/models/spree/order.rb +3 -3
- data/app/models/spree/order_contents.rb +11 -14
- data/app/models/spree/payment.rb +7 -3
- data/app/models/spree/payment_method/check.rb +2 -0
- data/app/models/spree/payment_method.rb +5 -1
- data/app/models/spree/product.rb +11 -8
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +3 -2
- data/app/models/spree/promotion/actions/create_line_items.rb +1 -0
- data/app/models/spree/promotion.rb +2 -2
- data/app/models/spree/promotion_handler/coupon.rb +5 -1
- data/app/models/spree/property.rb +0 -7
- data/app/models/spree/prototype.rb +1 -0
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/reimbursement_tax_calculator.rb +7 -1
- data/app/models/spree/return_authorization.rb +1 -1
- data/app/models/spree/shipping_category.rb +2 -2
- data/app/models/spree/shipping_method_category.rb +1 -1
- data/app/models/spree/stock/package.rb +6 -0
- data/app/models/spree/stock_item.rb +2 -2
- 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/taxon.rb +7 -3
- data/app/models/spree/variant.rb +5 -5
- 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 +1 -0
- data/db/default/spree/countries.rb +18 -231
- data/db/default/spree/states.rb +16 -76
- data/db/development.sqlite +0 -0
- data/db/migrate/20130213191427_create_default_stock.rb +4 -1
- data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +3 -5
- data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +3 -1
- data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +8 -0
- data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +5 -0
- data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +13 -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/controller_helpers/order.rb +5 -6
- 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/migrations.rb +7 -3
- 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/customer_return_factory.rb +1 -1
- data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_factory.rb +6 -0
- data/lib/spree/testing_support/factories/promotion_factory.rb +3 -3
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_factory.rb +3 -3
- data/lib/spree/testing_support/flash.rb +2 -2
- metadata +30 -17
- 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: 3ad557fa8765c3b9bd3d6532c913962d33865e28
|
4
|
+
data.tar.gz: c424bb23636fd0889e52830a5905bb48069e2440
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bc7f1a23e33514c7b732f8c154dad4310c7bf3f2a617eabb5b138d97516d6ea0f67edfca2e4e20fc6d59a4bda1ff0a1d37aab2b1f1888b715a8d31ea617faa81
|
7
|
+
data.tar.gz: f5b67b3fe498f7e92d50cf242df7b9638304563348efd0ff6fbaeedd8bbe653fb971b566224b9d44763c71608d77edecdd652d00728c77face10db1f3aff2d75
|
@@ -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
|
|
@@ -45,7 +47,10 @@ module Spree
|
|
45
47
|
scope :open, -> { where(state: 'open') }
|
46
48
|
scope :closed, -> { where(state: 'closed') }
|
47
49
|
scope :tax, -> { where(source_type: 'Spree::TaxRate') }
|
48
|
-
scope :non_tax, ->
|
50
|
+
scope :non_tax, -> do
|
51
|
+
source_type = arel_table[:source_type]
|
52
|
+
where(source_type.not_eq('Spree::TaxRate').or source_type.eq(nil))
|
53
|
+
end
|
49
54
|
scope :price, -> { where(adjustable_type: 'Spree::LineItem') }
|
50
55
|
scope :shipping, -> { where(adjustable_type: 'Spree::Shipment') }
|
51
56
|
scope :optional, -> { where(mandatory: false) }
|
@@ -103,7 +108,7 @@ module Spree
|
|
103
108
|
|
104
109
|
def update_adjustable_adjustment_total
|
105
110
|
# Cause adjustable's total to be recalculated
|
106
|
-
|
111
|
+
ItemAdjustments.new(adjustable).update
|
107
112
|
end
|
108
113
|
|
109
114
|
end
|
@@ -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
|
|
@@ -1,5 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
class Exchange
|
3
|
+
class UnableToCreateShipments < StandardError; end
|
3
4
|
|
4
5
|
def initialize(order, reimbursement_objects)
|
5
6
|
@order = order
|
@@ -18,6 +19,9 @@ module Spree
|
|
18
19
|
|
19
20
|
def perform!
|
20
21
|
shipments = Spree::Stock::Coordinator.new(@order, @reimbursement_objects.map(&:build_exchange_inventory_unit)).shipments
|
22
|
+
if shipments.flat_map(&:inventory_units).size != @reimbursement_objects.size
|
23
|
+
raise UnableToCreateShipments.new("Could not generate shipments for all items. Out of stock?")
|
24
|
+
end
|
21
25
|
@order.shipments += shipments
|
22
26
|
@order.save!
|
23
27
|
shipments.each do |shipment|
|
@@ -20,8 +20,9 @@ module Spree
|
|
20
20
|
def create_profile(payment)
|
21
21
|
return if payment.source.has_payment_profile?
|
22
22
|
# simulate the storage of credit card profile using remote service
|
23
|
-
success = VALID_CCS.include?
|
24
|
-
|
23
|
+
if success = VALID_CCS.include?(payment.source.number)
|
24
|
+
payment.source.update_attributes(:gateway_customer_profile_id => generate_profile_id(success))
|
25
|
+
end
|
25
26
|
end
|
26
27
|
|
27
28
|
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
|
has_many :return_items, inverse_of: :inventory_unit
|
@@ -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, affecting 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
|
@@ -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
|
@@ -123,6 +124,10 @@ module Spree
|
|
123
124
|
end
|
124
125
|
end
|
125
126
|
|
127
|
+
def destroy_inventory_units
|
128
|
+
inventory_units.destroy_all
|
129
|
+
end
|
130
|
+
|
126
131
|
def update_adjustments
|
127
132
|
if quantity_changed?
|
128
133
|
update_tax_charge # Called to ensure pre_tax_amount is updated.
|
data/app/models/spree/order.rb
CHANGED
@@ -45,9 +45,9 @@ module Spree
|
|
45
45
|
alias_attribute :ship_total, :shipment_total
|
46
46
|
|
47
47
|
has_many :state_changes, as: :stateful
|
48
|
-
has_many :line_items, -> { order(
|
48
|
+
has_many :line_items, -> { order("#{LineItem.table_name}.created_at ASC") }, dependent: :destroy, inverse_of: :order
|
49
49
|
has_many :payments, dependent: :destroy
|
50
|
-
has_many :return_authorizations, dependent: :destroy
|
50
|
+
has_many :return_authorizations, dependent: :destroy, inverse_of: :order
|
51
51
|
has_many :reimbursements, inverse_of: :order
|
52
52
|
has_many :adjustments, -> { order("#{Adjustment.table_name}.created_at ASC") }, as: :adjustable, dependent: :destroy
|
53
53
|
has_many :line_item_adjustments, through: :line_items, source: :adjustments
|
@@ -84,7 +84,7 @@ module Spree
|
|
84
84
|
|
85
85
|
validates :email, presence: true, if: :require_email
|
86
86
|
validates :email, email: true, if: :require_email, allow_blank: true
|
87
|
-
validates :number, uniqueness: true
|
87
|
+
validates :number, presence: true, uniqueness: { allow_blank: true }
|
88
88
|
validate :has_available_shipment
|
89
89
|
|
90
90
|
make_permalink field: :number
|
@@ -8,24 +8,12 @@ module Spree
|
|
8
8
|
|
9
9
|
def add(variant, quantity = 1, options = {})
|
10
10
|
line_item = add_to_line_item(variant, quantity, options)
|
11
|
-
|
12
|
-
shipment = options[:shipment]
|
13
|
-
shipment.present? ? shipment.update_amounts : order.ensure_updated_shipments
|
14
|
-
PromotionHandler::Cart.new(order, line_item).activate
|
15
|
-
ItemAdjustments.new(line_item).update
|
16
|
-
reload_totals
|
17
|
-
line_item
|
11
|
+
after_add_or_remove(line_item, options)
|
18
12
|
end
|
19
13
|
|
20
14
|
def remove(variant, quantity = 1, options = {})
|
21
15
|
line_item = remove_from_line_item(variant, quantity, options)
|
22
|
-
|
23
|
-
shipment = options[:shipment]
|
24
|
-
shipment.present? ? shipment.update_amounts : order.ensure_updated_shipments
|
25
|
-
PromotionHandler::Cart.new(order, line_item).activate
|
26
|
-
ItemAdjustments.new(line_item).update
|
27
|
-
reload_totals
|
28
|
-
line_item
|
16
|
+
after_add_or_remove(line_item, options)
|
29
17
|
end
|
30
18
|
|
31
19
|
def update_cart(params)
|
@@ -45,6 +33,15 @@ module Spree
|
|
45
33
|
end
|
46
34
|
|
47
35
|
private
|
36
|
+
def after_add_or_remove(line_item, options = {})
|
37
|
+
reload_totals
|
38
|
+
shipment = options[:shipment]
|
39
|
+
shipment.present? ? shipment.update_amounts : order.ensure_updated_shipments
|
40
|
+
PromotionHandler::Cart.new(order, line_item).activate
|
41
|
+
ItemAdjustments.new(line_item).update
|
42
|
+
reload_totals
|
43
|
+
line_item
|
44
|
+
end
|
48
45
|
|
49
46
|
def filter_order_items(params)
|
50
47
|
filtered_params = params.symbolize_keys
|
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, -> { offset_payment }, class_name: "Spree::Payment", foreign_key: :source_id
|
14
14
|
has_many :log_entries, as: :source
|
@@ -184,6 +184,8 @@ module Spree
|
|
184
184
|
end
|
185
185
|
|
186
186
|
def create_payment_profile
|
187
|
+
# Don't attempt to create on bad payments.
|
188
|
+
return if %w(invalid failed).include?(state)
|
187
189
|
# Payment profile cannot be created without source
|
188
190
|
return unless source
|
189
191
|
# Imported payments shouldn't create a payment profile.
|
@@ -195,8 +197,10 @@ module Spree
|
|
195
197
|
end
|
196
198
|
|
197
199
|
def invalidate_old_payments
|
198
|
-
|
199
|
-
payment
|
200
|
+
if state != 'invalid' and state != 'failed'
|
201
|
+
order.payments.with_state('checkout').where("id != ?", self.id).each do |payment|
|
202
|
+
payment.invalidate!
|
203
|
+
end
|
200
204
|
end
|
201
205
|
end
|
202
206
|
|
@@ -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
|
@@ -67,5 +67,9 @@ module Spree
|
|
67
67
|
def supports?(source)
|
68
68
|
true
|
69
69
|
end
|
70
|
+
|
71
|
+
def cancel
|
72
|
+
raise NotImplimentedError.new 'You must implement cancel method for this payment method.'
|
73
|
+
end
|
70
74
|
end
|
71
75
|
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
|
|
@@ -66,7 +65,7 @@ module Spree
|
|
66
65
|
delegate_belongs_to :master, :cost_price
|
67
66
|
|
68
67
|
after_create :set_master_variant_defaults
|
69
|
-
after_create :
|
68
|
+
after_create :add_associations_from_prototype
|
70
69
|
after_create :build_variants_from_option_values_hash, if: :option_values_hash
|
71
70
|
|
72
71
|
after_save :save_master
|
@@ -83,7 +82,10 @@ module Spree
|
|
83
82
|
validates :price, presence: true, if: proc { Spree::Config[:require_master_price] }
|
84
83
|
validates :shipping_category_id, presence: true
|
85
84
|
validates :slug, length: { minimum: 3 }
|
86
|
-
|
85
|
+
|
86
|
+
validates :slug, uniqueness: { allow_blank: true }
|
87
|
+
validates :meta_keywords, length: { maximum: 255 }
|
88
|
+
validates :meta_title, length: { maximum: 255 }
|
87
89
|
|
88
90
|
before_validation :normalize_slug, on: :update
|
89
91
|
|
@@ -219,12 +221,13 @@ module Spree
|
|
219
221
|
|
220
222
|
private
|
221
223
|
|
222
|
-
def
|
224
|
+
def add_associations_from_prototype
|
223
225
|
if prototype_id && prototype = Spree::Prototype.find_by(id: prototype_id)
|
224
226
|
prototype.properties.each do |property|
|
225
227
|
product_properties.create(property: property)
|
226
228
|
end
|
227
229
|
self.option_types = prototype.option_types
|
230
|
+
self.taxons = prototype.taxons
|
228
231
|
end
|
229
232
|
end
|
230
233
|
|
@@ -300,8 +303,8 @@ module Spree
|
|
300
303
|
# Try building a slug based on the following fields in increasing order of specificity.
|
301
304
|
def slug_candidates
|
302
305
|
[
|
303
|
-
|
304
|
-
|
306
|
+
:name,
|
307
|
+
[:name, :sku]
|
305
308
|
]
|
306
309
|
end
|
307
310
|
|
@@ -40,9 +40,10 @@ module Spree
|
|
40
40
|
# Ensure a negative amount which does not exceed the sum of the order's
|
41
41
|
# item_total and ship_total
|
42
42
|
def compute_amount(adjustable)
|
43
|
-
|
43
|
+
order = adjustable.is_a?(Order) ? adjustable : adjustable.order
|
44
|
+
return 0 unless promotion.line_item_actionable?(order, adjustable)
|
44
45
|
promotion_amount = self.calculator.compute(adjustable).to_f.abs
|
45
|
-
|
46
|
+
|
46
47
|
[adjustable.amount, promotion_amount].min * -1
|
47
48
|
end
|
48
49
|
|
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
validates_associated :rules
|
21
21
|
|
22
22
|
validates :name, presence: true
|
23
|
-
validates :path, uniqueness:
|
23
|
+
validates :path, uniqueness: { allow_blank: true }
|
24
24
|
validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
|
25
25
|
validates :description, length: { maximum: 255 }
|
26
26
|
|
@@ -37,7 +37,7 @@ module Spree
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def self.with_coupon_code(coupon_code)
|
40
|
-
where("lower(code) = ?", coupon_code.strip.downcase).first
|
40
|
+
where("lower(#{self.table_name}.code) = ?", coupon_code.strip.downcase).first
|
41
41
|
end
|
42
42
|
|
43
43
|
def self.active
|
@@ -85,11 +85,15 @@ module Spree
|
|
85
85
|
end
|
86
86
|
}
|
87
87
|
|
88
|
+
# Check for applied adjustments.
|
88
89
|
discount = order.line_item_adjustments.promotion.detect(&detector)
|
89
90
|
discount ||= order.shipment_adjustments.promotion.detect(&detector)
|
90
91
|
discount ||= order.adjustments.promotion.detect(&detector)
|
91
92
|
|
92
|
-
|
93
|
+
# Check for applied line items.
|
94
|
+
created_line_items = promotion.actions.detect { |a| a.type == 'Spree::Promotion::Actions::CreateLineItems' }
|
95
|
+
|
96
|
+
if (discount && discount.eligible) || created_line_items
|
93
97
|
order.update_totals
|
94
98
|
order.persist_totals
|
95
99
|
set_success_code :coupon_code_applied
|
@@ -11,13 +11,6 @@ module Spree
|
|
11
11
|
|
12
12
|
after_touch :touch_all_products
|
13
13
|
|
14
|
-
def self.find_all_by_prototype(prototype)
|
15
|
-
id = prototype
|
16
|
-
id = prototype.id if prototype.class == Prototype
|
17
|
-
joins("LEFT JOIN properties_prototypes ON property_id = #{self.table_name}.id").
|
18
|
-
where(prototype_id: id)
|
19
|
-
end
|
20
|
-
|
21
14
|
private
|
22
15
|
|
23
16
|
def touch_all_products
|
@@ -2,6 +2,7 @@ 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
|
+
has_and_belongs_to_many :taxons, join_table: :spree_taxons_prototypes
|
5
6
|
|
6
7
|
validates :name, presence: true
|
7
8
|
end
|
@@ -55,7 +55,6 @@ module Spree
|
|
55
55
|
self.reimbursement_failure_hooks = []
|
56
56
|
|
57
57
|
state_machine :reimbursement_status, initial: :pending do
|
58
|
-
after_transition to: :reimbursed, do: :send_reimbursement_email
|
59
58
|
|
60
59
|
event :errored do
|
61
60
|
transition to: :errored, from: :pending
|
@@ -107,6 +106,7 @@ module Spree
|
|
107
106
|
if unpaid_amount.zero?
|
108
107
|
reimbursed!
|
109
108
|
reimbursement_success_hooks.each { |h| h.call self }
|
109
|
+
send_reimbursement_email
|
110
110
|
else
|
111
111
|
errored!
|
112
112
|
reimbursement_failure_hooks.each { |h| h.call self }
|
@@ -21,7 +21,13 @@ module Spree
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def set_tax!(return_item)
|
24
|
-
|
24
|
+
calculated_refund = Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
|
25
|
+
|
26
|
+
percent_of_tax = if return_item.pre_tax_amount <= 0 || calculated_refund <= 0
|
27
|
+
0
|
28
|
+
else
|
29
|
+
return_item.pre_tax_amount / calculated_refund
|
30
|
+
end
|
25
31
|
|
26
32
|
additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
|
27
33
|
included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
class ReturnAuthorization < Spree::Base
|
3
|
-
belongs_to :order, class_name: 'Spree::Order'
|
3
|
+
belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations
|
4
4
|
|
5
5
|
has_many :return_items, inverse_of: :return_authorization, dependent: :destroy
|
6
6
|
has_many :inventory_units, through: :return_items
|
@@ -2,7 +2,7 @@ module Spree
|
|
2
2
|
class ShippingCategory < Spree::Base
|
3
3
|
validates :name, presence: true
|
4
4
|
has_many :products, inverse_of: :shipping_category
|
5
|
-
has_many :shipping_method_categories
|
5
|
+
has_many :shipping_method_categories, inverse_of: :shipping_method
|
6
6
|
has_many :shipping_methods, through: :shipping_method_categories
|
7
7
|
end
|
8
|
-
end
|
8
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Spree
|
2
2
|
class ShippingMethodCategory < Spree::Base
|
3
3
|
belongs_to :shipping_method, class_name: 'Spree::ShippingMethod'
|
4
|
-
belongs_to :shipping_category, class_name: 'Spree::ShippingCategory'
|
4
|
+
belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :shipping_method_categories
|
5
5
|
end
|
6
6
|
end
|
@@ -23,6 +23,12 @@ module Spree
|
|
23
23
|
@contents -= [item] if item
|
24
24
|
end
|
25
25
|
|
26
|
+
# Fix regression that removed package.order.
|
27
|
+
# Find it dynamically through an inventory_unit.
|
28
|
+
def order
|
29
|
+
contents.detect {|item| !!item.try(:inventory_unit).try(:order) }.try(:inventory_unit).try(:order)
|
30
|
+
end
|
31
|
+
|
26
32
|
def weight
|
27
33
|
contents.sum(&:weight)
|
28
34
|
end
|
@@ -2,8 +2,8 @@ module Spree
|
|
2
2
|
class StockItem < Spree::Base
|
3
3
|
acts_as_paranoid
|
4
4
|
|
5
|
-
belongs_to :stock_location, class_name: 'Spree::StockLocation'
|
6
|
-
belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :stock_items
|
5
|
+
belongs_to :stock_location, class_name: 'Spree::StockLocation', inverse_of: :stock_items
|
6
|
+
belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :stock_items, counter_cache: true
|
7
7
|
has_many :stock_movements, inverse_of: :stock_item
|
8
8
|
|
9
9
|
validates_presence_of :stock_location, :variant
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class StockLocation < Spree::Base
|
3
3
|
has_many :shipments
|
4
|
-
has_many :stock_items, dependent: :delete_all
|
4
|
+
has_many :stock_items, dependent: :delete_all, inverse_of: :stock_location
|
5
5
|
has_many :stock_movements, through: :stock_items
|
6
6
|
|
7
7
|
belongs_to :state, class_name: 'Spree::State'
|
data/app/models/spree/store.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class Store < Spree::Base
|
3
3
|
|
4
|
-
validates :code, presence: true, uniqueness: true
|
4
|
+
validates :code, presence: true, uniqueness: { allow_blank: true }
|
5
5
|
validates :name, presence: true
|
6
6
|
validates :url, presence: true
|
7
7
|
validates :mail_from_address, presence: true
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Spree
|
2
2
|
class TaxCategory < Spree::Base
|
3
3
|
acts_as_paranoid
|
4
|
-
validates :name, presence: true, uniqueness: { scope: :deleted_at }
|
4
|
+
validates :name, presence: true, uniqueness: { scope: :deleted_at, allow_blank: true }
|
5
5
|
|
6
|
-
has_many :tax_rates, dependent: :destroy
|
6
|
+
has_many :tax_rates, dependent: :destroy, inverse_of: :tax_category
|
7
7
|
|
8
8
|
before_save :set_default_category
|
9
9
|
|
@@ -11,10 +11,15 @@ end
|
|
11
11
|
module Spree
|
12
12
|
class TaxRate < Spree::Base
|
13
13
|
acts_as_paranoid
|
14
|
+
|
15
|
+
# Need to deal with adjustments before calculator is destroyed.
|
16
|
+
before_destroy :deals_with_adjustments_for_deleted_source
|
17
|
+
|
14
18
|
include Spree::CalculatedAdjustments
|
15
19
|
include Spree::AdjustmentSource
|
16
|
-
|
17
|
-
belongs_to :
|
20
|
+
|
21
|
+
belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates
|
22
|
+
belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rates
|
18
23
|
|
19
24
|
has_many :adjustments, as: :source
|
20
25
|
|
@@ -22,8 +27,6 @@ module Spree
|
|
22
27
|
validates :tax_category_id, presence: true
|
23
28
|
validates_with DefaultTaxZoneValidator
|
24
29
|
|
25
|
-
before_destroy :deals_with_adjustments_for_deleted_source
|
26
|
-
|
27
30
|
scope :by_zone, ->(zone) { where(zone_id: zone) }
|
28
31
|
|
29
32
|
# Gets the array of TaxRates appropriate for the specified order
|
data/app/models/spree/taxon.rb
CHANGED
@@ -6,9 +6,14 @@ 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
|
+
has_and_belongs_to_many :prototypes, join_table: :spree_taxons_prototypes
|
10
|
+
|
9
11
|
before_create :set_permalink
|
10
12
|
|
11
13
|
validates :name, presence: true
|
14
|
+
validates :meta_keywords, length: { maximum: 255 }
|
15
|
+
validates :meta_description, length: { maximum: 255 }
|
16
|
+
validates :meta_title, length: { maximum: 255 }
|
12
17
|
|
13
18
|
after_touch :touch_ancestors_and_taxonomy
|
14
19
|
|
@@ -36,7 +41,7 @@ module Spree
|
|
36
41
|
|
37
42
|
# Return meta_title if set otherwise generates from root name and/or taxon name
|
38
43
|
def seo_title
|
39
|
-
|
44
|
+
unless meta_title.blank?
|
40
45
|
meta_title
|
41
46
|
else
|
42
47
|
root? ? name : "#{root.name} - #{name}"
|
@@ -58,8 +63,7 @@ module Spree
|
|
58
63
|
end
|
59
64
|
|
60
65
|
def active_products
|
61
|
-
|
62
|
-
scope
|
66
|
+
products.active
|
63
67
|
end
|
64
68
|
|
65
69
|
def pretty_name
|