spree_core 2.3.13 → 2.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/spree.js.coffee.erb +1 -5
- data/app/helpers/spree/base_helper.rb +22 -11
- data/app/helpers/spree/products_helper.rb +8 -7
- data/app/mailers/spree/base_mailer.rb +1 -0
- data/app/mailers/spree/reimbursement_mailer.rb +10 -0
- data/app/mailers/spree/test_mailer.rb +2 -3
- data/app/models/concerns/spree/adjustment_source.rb +24 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +33 -0
- data/app/models/concerns/spree/named_type.rb +12 -0
- data/app/models/concerns/spree/user_address.rb +30 -0
- data/app/models/concerns/spree/user_payment_source.rb +19 -0
- data/app/models/spree/address.rb +13 -6
- data/app/models/spree/adjustment.rb +5 -5
- data/app/models/spree/app_configuration.rb +8 -4
- data/app/models/spree/asset.rb +1 -1
- data/app/models/spree/base.rb +0 -3
- data/app/models/spree/calculator/flat_rate.rb +1 -5
- data/app/models/spree/calculator/returns/default_refund_amount.rb +36 -0
- data/app/models/spree/classification.rb +1 -1
- data/app/models/spree/credit_card.rb +18 -22
- data/app/models/spree/customer_return.rb +70 -0
- data/app/models/spree/exchange.rb +42 -0
- data/app/models/spree/gateway/bogus.rb +3 -3
- data/app/models/spree/image.rb +1 -1
- data/app/models/spree/inventory_unit.rb +32 -8
- data/app/models/spree/item_adjustments.rb +7 -11
- data/app/models/spree/legacy_user.rb +2 -2
- data/app/models/spree/line_item.rb +25 -12
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +1 -8
- data/app/models/spree/order.rb +163 -145
- data/app/models/spree/order/checkout.rb +35 -23
- data/app/models/spree/order/payments.rb +66 -0
- data/app/models/spree/order_contents.rb +34 -24
- data/app/models/spree/order_populator.rb +6 -4
- data/app/models/spree/order_updater.rb +10 -1
- data/app/models/spree/payment.rb +19 -16
- data/app/models/spree/payment/processing.rb +40 -72
- data/app/models/spree/payment_method.rb +1 -1
- data/app/models/spree/payment_method/check.rb +0 -2
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/preferences/preferable.rb +20 -0
- data/app/models/spree/price.rb +13 -3
- data/app/models/spree/product.rb +24 -29
- data/app/models/spree/product_property.rb +0 -2
- data/app/models/spree/promotion.rb +66 -24
- data/app/models/spree/promotion/actions/create_adjustment.rb +2 -2
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +15 -11
- data/app/models/spree/promotion/actions/create_line_items.rb +2 -12
- data/app/models/spree/promotion/rules/first_order.rb +6 -2
- data/app/models/spree/promotion/rules/item_total.rb +42 -4
- data/app/models/spree/promotion/rules/one_use_per_user.rb +24 -0
- data/app/models/spree/promotion/rules/product.rb +13 -11
- data/app/models/spree/promotion/rules/taxon.rb +61 -0
- data/app/models/spree/promotion/rules/user.rb +1 -1
- data/app/models/spree/promotion/rules/user_logged_in.rb +4 -1
- data/app/models/spree/promotion_category.rb +6 -0
- data/app/models/spree/promotion_handler/cart.rb +14 -18
- data/app/models/spree/promotion_handler/coupon.rb +25 -16
- data/app/models/spree/promotion_rule.rb +13 -0
- data/app/models/spree/property.rb +1 -3
- data/app/models/spree/refund.rb +91 -0
- data/app/models/spree/refund_reason.rb +13 -0
- data/app/models/spree/reimbursement.rb +148 -0
- data/app/models/spree/reimbursement/credit.rb +25 -0
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +56 -0
- data/app/models/spree/reimbursement/reimbursement_type_validator.rb +12 -0
- data/app/models/spree/reimbursement_performer.rb +43 -0
- data/app/models/spree/reimbursement_tax_calculator.rb +38 -0
- data/app/models/spree/reimbursement_type.rb +16 -0
- data/app/models/spree/reimbursement_type/credit.rb +13 -0
- data/app/models/spree/reimbursement_type/exchange.rb +9 -0
- data/app/models/spree/reimbursement_type/original_payment.rb +13 -0
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +50 -0
- data/app/models/spree/return_authorization.rb +52 -68
- data/app/models/spree/return_authorization_reason.rb +7 -0
- data/app/models/spree/return_item.rb +230 -0
- data/app/models/spree/return_item/default_eligibility_validator.rb +27 -0
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +24 -0
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +17 -0
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +16 -0
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +34 -0
- data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +10 -0
- data/app/models/spree/returns_calculator.rb +8 -0
- data/app/models/spree/shipment.rb +209 -154
- data/app/models/spree/shipment_handler.rb +43 -0
- data/app/models/spree/shipping_calculator.rb +1 -1
- data/app/models/spree/shipping_category.rb +2 -2
- data/app/models/spree/shipping_method.rb +1 -1
- data/app/models/spree/shipping_method_category.rb +1 -1
- data/app/models/spree/shipping_rate.rb +4 -0
- data/app/models/spree/stock/adjuster.rb +10 -11
- data/app/models/spree/stock/availability_validator.rb +6 -10
- data/app/models/spree/stock/content_item.rb +48 -0
- data/app/models/spree/stock/coordinator.rb +14 -7
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +21 -0
- data/app/models/spree/stock/package.rb +38 -51
- data/app/models/spree/stock/packer.rb +13 -11
- data/app/models/spree/stock/prioritizer.rb +7 -7
- data/app/models/spree/stock/splitter/base.rb +2 -2
- data/app/models/spree/stock_item.rb +6 -9
- data/app/models/spree/stock_location.rb +17 -25
- data/app/models/spree/stock_movement.rb +1 -8
- data/app/models/spree/stock_transfer.rb +0 -2
- data/app/models/spree/store.rb +1 -1
- data/app/models/spree/tax_category.rb +2 -2
- data/app/models/spree/tax_rate.rb +16 -22
- data/app/models/spree/taxon.rb +1 -1
- data/app/models/spree/variant.rb +45 -23
- data/app/models/spree/zone.rb +17 -17
- data/app/models/spree/zone_member.rb +1 -1
- data/app/views/layouts/spree/base_mailer.html.erb +784 -0
- data/app/views/spree/order_mailer/cancel_email.html.erb +45 -0
- data/app/views/spree/order_mailer/cancel_email.text.erb +2 -2
- data/app/views/spree/order_mailer/confirm_email.html.erb +84 -0
- data/app/views/spree/order_mailer/confirm_email.text.erb +2 -2
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +22 -0
- data/app/views/spree/shared/_base_mailer_footer.html.erb +20 -0
- data/app/views/spree/shared/_base_mailer_header.html.erb +31 -0
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +34 -0
- data/app/views/spree/test_mailer/test_email.html.erb +40 -0
- data/app/views/spree/test_mailer/test_email.text.erb +2 -2
- data/config/initializers/friendly_id.rb +88 -0
- data/config/initializers/premailer_assets.rb +1 -0
- data/config/initializers/user_class_extensions.rb +9 -22
- data/config/locales/en.yml +180 -12
- data/db/default/spree/states.rb +73 -55
- data/db/migrate/20130213191427_create_default_stock.rb +1 -0
- data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -5
- data/db/migrate/20140309033438_create_store_from_preferences.rb +0 -7
- data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +8 -0
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
- data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +5 -3
- data/db/migrate/20140625214618_create_spree_refunds.rb +12 -0
- data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +12 -0
- data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +5 -0
- data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +10 -0
- data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +55 -0
- data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +7 -0
- data/db/migrate/20140710190048_drop_return_authorization_amount.rb +5 -0
- data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +28 -0
- data/db/migrate/20140713140527_create_spree_refund_reasons.rb +14 -0
- data/db/migrate/20140713142214_rename_return_authorization_reason.rb +5 -0
- data/db/migrate/20140715182625_create_spree_promotion_categories.rb +11 -0
- data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +9 -0
- data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +6 -0
- data/db/migrate/20140717155155_create_default_refund_reason.rb +9 -0
- data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +5 -0
- data/db/migrate/20140718133010_create_spree_customer_returns.rb +9 -0
- data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +6 -0
- data/db/migrate/20140718195325_create_friendly_id_slugs.rb +15 -0
- data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +5 -0
- data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +13 -0
- data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +15 -0
- data/db/migrate/20140725131539_create_spree_reimbursements.rb +21 -0
- data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +5 -0
- data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +7 -0
- data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +5 -0
- data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +20 -0
- data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +5 -0
- data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +10 -0
- data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +9 -0
- data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +10 -0
- data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +7 -0
- data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +5 -0
- data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +5 -0
- data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +6 -0
- data/db/migrate/20141009204607_add_store_id_to_orders.rb +8 -0
- data/lib/generators/spree/install/install_generator.rb +7 -3
- data/lib/spree/core.rb +11 -10
- data/lib/spree/core/controller_helpers/common.rb +3 -10
- data/lib/spree/core/controller_helpers/order.rb +15 -12
- data/lib/spree/core/controller_helpers/strong_parameters.rb +9 -9
- data/lib/spree/core/engine.rb +8 -1
- data/lib/spree/core/importer/order.rb +5 -17
- 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/instrumentation.rb +41 -0
- data/lib/spree/migrations.rb +3 -7
- data/lib/spree/money.rb +2 -2
- data/lib/spree/permitted_attributes.rb +10 -9
- data/lib/spree/testing_support/ability_helpers.rb +25 -25
- data/lib/spree/testing_support/authorization_helpers.rb +3 -5
- data/lib/spree/testing_support/capybara_ext.rb +2 -2
- data/lib/spree/testing_support/factories/calculator_factory.rb +0 -8
- data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
- data/lib/spree/testing_support/factories/customer_return_factory.rb +31 -0
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -0
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -1
- data/lib/spree/testing_support/factories/order_factory.rb +11 -6
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +6 -0
- data/lib/spree/testing_support/factories/promotion_factory.rb +9 -7
- data/lib/spree/testing_support/factories/refund_factory.rb +14 -0
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +16 -0
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +7 -0
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +9 -3
- data/lib/spree/testing_support/factories/return_item_factory.rb +10 -0
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -0
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -2
- data/lib/spree/testing_support/factories/stock_factory.rb +12 -11
- data/lib/spree/testing_support/flash.rb +2 -2
- data/lib/tasks/email.rake +7 -0
- data/lib/tasks/exchanges.rake +70 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_et.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_eu.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_hr.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ka.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_ko.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_my.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_pt_BR.js +26 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_pt_PT.js +26 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sl.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_sv.js +23 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_uk.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_zh.js +25 -0
- data/vendor/assets/javascripts/jquery.validate/localization/messages_zh_TW.js +26 -0
- metadata +163 -47
- data/app/models/concerns/spree/ransackable_attributes.rb +0 -19
- data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +0 -5
- data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +0 -13
- data/db/migrate/20141105213646_update_classifications_positions.rb +0 -9
- data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +0 -5
- data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -70
- data/lib/spree/core/adjustment_source.rb +0 -26
- data/lib/spree/core/calculated_adjustments.rb +0 -35
- data/lib/spree/core/controller_helpers.rb +0 -20
- data/lib/spree/core/user_address.rb +0 -32
- data/lib/spree/core/user_payment_source.rb +0 -20
- data/lib/spree/localized_number.rb +0 -20
@@ -1,10 +1,10 @@
|
|
1
1
|
module Spree
|
2
2
|
module Stock
|
3
3
|
class Prioritizer
|
4
|
-
attr_reader :packages, :
|
4
|
+
attr_reader :packages, :inventory_units
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(inventory_units, packages, adjuster_class=Adjuster)
|
7
|
+
@inventory_units = inventory_units
|
8
8
|
@packages = packages
|
9
9
|
@adjuster_class = adjuster_class
|
10
10
|
end
|
@@ -18,8 +18,8 @@ module Spree
|
|
18
18
|
|
19
19
|
private
|
20
20
|
def adjust_packages
|
21
|
-
|
22
|
-
adjuster = @adjuster_class.new(
|
21
|
+
inventory_units.each do |inventory_unit|
|
22
|
+
adjuster = @adjuster_class.new(inventory_unit, :on_hand)
|
23
23
|
|
24
24
|
visit_packages(adjuster)
|
25
25
|
|
@@ -30,8 +30,8 @@ module Spree
|
|
30
30
|
|
31
31
|
def visit_packages(adjuster)
|
32
32
|
packages.each do |package|
|
33
|
-
item = package.find_item adjuster.
|
34
|
-
adjuster.adjust(
|
33
|
+
item = package.find_item adjuster.inventory_unit, adjuster.status
|
34
|
+
adjuster.adjust(package) if item
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -8,7 +8,7 @@ module Spree
|
|
8
8
|
@packer = packer
|
9
9
|
@next_splitter = next_splitter
|
10
10
|
end
|
11
|
-
delegate :stock_location,
|
11
|
+
delegate :stock_location, to: :packer
|
12
12
|
|
13
13
|
def split(packages)
|
14
14
|
return_next(packages)
|
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
end
|
21
21
|
|
22
22
|
def build_package(contents=[])
|
23
|
-
Spree::Stock::Package.new(stock_location,
|
23
|
+
Spree::Stock::Package.new(stock_location, contents)
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -2,25 +2,19 @@ module Spree
|
|
2
2
|
class StockItem < Spree::Base
|
3
3
|
acts_as_paranoid
|
4
4
|
|
5
|
-
belongs_to :stock_location, class_name: 'Spree::StockLocation'
|
5
|
+
belongs_to :stock_location, class_name: 'Spree::StockLocation'
|
6
6
|
belongs_to :variant, class_name: 'Spree::Variant', inverse_of: :stock_items
|
7
7
|
has_many :stock_movements, inverse_of: :stock_item
|
8
8
|
|
9
9
|
validates_presence_of :stock_location, :variant
|
10
10
|
validates_uniqueness_of :variant_id, scope: [:stock_location_id, :deleted_at]
|
11
|
-
|
12
|
-
validates_numericality_of :count_on_hand,
|
13
|
-
greater_than_or_equal_to: 0,
|
14
|
-
less_than_or_equal_to: 2**31 - 1,
|
15
|
-
only_integer: true, if: :verify_count_on_hand?
|
11
|
+
validates :count_on_hand, numericality: { greater_than_or_equal_to: 0 }, if: :verify_count_on_hand?
|
16
12
|
|
17
13
|
delegate :weight, :should_track_inventory?, to: :variant
|
18
14
|
|
19
15
|
after_save :conditional_variant_touch, if: :changed?
|
20
16
|
after_touch { variant.touch }
|
21
17
|
|
22
|
-
self.whitelisted_ransackable_attributes = ['count_on_hand', 'stock_location_id']
|
23
|
-
|
24
18
|
def backordered_inventory_units
|
25
19
|
Spree::InventoryUnit.backordered_for_stock_item(self)
|
26
20
|
end
|
@@ -83,7 +77,10 @@ module Spree
|
|
83
77
|
end
|
84
78
|
|
85
79
|
def conditional_variant_touch
|
86
|
-
|
80
|
+
# the variant_id changes from nil when a new stock location is added
|
81
|
+
stock_changed = (count_on_hand_changed? && count_on_hand_change.any?(&:zero?)) || variant_id_changed?
|
82
|
+
|
83
|
+
if !Spree::Config.binary_inventory_cache || stock_changed
|
87
84
|
variant.touch
|
88
85
|
end
|
89
86
|
end
|
@@ -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
|
5
5
|
has_many :stock_movements, through: :stock_items
|
6
6
|
|
7
7
|
belongs_to :state, class_name: 'Spree::State'
|
@@ -10,13 +10,15 @@ module Spree
|
|
10
10
|
validates_presence_of :name
|
11
11
|
|
12
12
|
scope :active, -> { where(active: true) }
|
13
|
+
scope :order_default, -> { order(default: :desc, name: :asc) }
|
13
14
|
|
14
15
|
after_create :create_stock_items, :if => "self.propagate_all_variants?"
|
16
|
+
after_save :ensure_one_default
|
15
17
|
|
16
18
|
def state_text
|
17
19
|
state.try(:abbr) || state.try(:name) || state_name
|
18
20
|
end
|
19
|
-
|
21
|
+
|
20
22
|
# Wrapper for creating a new stock item respecting the backorderable config
|
21
23
|
def propagate_variant(variant)
|
22
24
|
self.stock_items.create!(variant: variant, backorderable: self.backorderable_default)
|
@@ -29,31 +31,12 @@ module Spree
|
|
29
31
|
self.stock_item(variant) || propagate_variant(variant)
|
30
32
|
end
|
31
33
|
|
32
|
-
|
33
|
-
|
34
|
-
# @param variant_id [String] The id of a variant.
|
35
|
-
#
|
36
|
-
# @return [StockItem] Corresponding StockItem for the StockLocation's variant.
|
37
|
-
def stock_item(variant_id)
|
38
|
-
stock_items.where(variant_id: variant_id).order(:id).first
|
34
|
+
def stock_item(variant)
|
35
|
+
stock_items.where(variant_id: variant).order(:id).first
|
39
36
|
end
|
40
37
|
|
41
|
-
|
42
|
-
|
43
|
-
# multiple ways. Other methods in this model attempt to pass a variant,
|
44
|
-
# but controller actions can pass just the variant id as a parameter.
|
45
|
-
#
|
46
|
-
# @param variant_or_id [Variant|String] Variant instance or string id of a variant.
|
47
|
-
#
|
48
|
-
# @return [StockItem] Corresponding StockItem for the StockLocation's variant.
|
49
|
-
def stock_item_or_create(variant_or_id)
|
50
|
-
vid = if variant_or_id.is_a?(Variant)
|
51
|
-
variant_or_id.id
|
52
|
-
else
|
53
|
-
ActiveSupport::Deprecation.warn "Passing a Variant ID is deprecated, and will be removed in Spree 3. Please pass a variant instance instead.", caller
|
54
|
-
variant_or_id
|
55
|
-
end
|
56
|
-
stock_item(vid) || stock_items.create(variant_id: vid)
|
38
|
+
def stock_item_or_create(variant)
|
39
|
+
stock_item(variant) || stock_items.create(variant: variant)
|
57
40
|
end
|
58
41
|
|
59
42
|
def count_on_hand(variant)
|
@@ -107,5 +90,14 @@ module Spree
|
|
107
90
|
def create_stock_items
|
108
91
|
Variant.find_each { |variant| self.propagate_variant(variant) }
|
109
92
|
end
|
93
|
+
|
94
|
+
def ensure_one_default
|
95
|
+
if self.default
|
96
|
+
StockLocation.where(default: true).where.not(id: self.id).each do |stock_location|
|
97
|
+
stock_location.default = false
|
98
|
+
stock_location.save!
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
110
102
|
end
|
111
103
|
end
|
@@ -6,17 +6,10 @@ module Spree
|
|
6
6
|
after_create :update_stock_item_quantity
|
7
7
|
|
8
8
|
validates :stock_item, presence: true
|
9
|
-
validates :quantity, presence: true
|
10
|
-
greater_than_or_equal_to: -2**31,
|
11
|
-
less_than_or_equal_to: 2**31-1,
|
12
|
-
only_integer: true,
|
13
|
-
allow_nil: true
|
14
|
-
}
|
9
|
+
validates :quantity, presence: true
|
15
10
|
|
16
11
|
scope :recent, -> { order('created_at DESC') }
|
17
12
|
|
18
|
-
self.whitelisted_ransackable_attributes = ['quantity']
|
19
|
-
|
20
13
|
def readonly?
|
21
14
|
!new_record?
|
22
15
|
end
|
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:
|
4
|
+
validates :code, presence: true, uniqueness: 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 }
|
5
5
|
|
6
|
-
has_many :tax_rates, dependent: :destroy
|
6
|
+
has_many :tax_rates, dependent: :destroy
|
7
7
|
|
8
8
|
before_save :set_default_category
|
9
9
|
|
@@ -11,15 +11,10 @@ end
|
|
11
11
|
module Spree
|
12
12
|
class TaxRate < Spree::Base
|
13
13
|
acts_as_paranoid
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
include Spree::Core::CalculatedAdjustments
|
19
|
-
include Spree::Core::AdjustmentSource
|
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
|
14
|
+
include Spree::CalculatedAdjustments
|
15
|
+
include Spree::AdjustmentSource
|
16
|
+
belongs_to :zone, class_name: "Spree::Zone"
|
17
|
+
belongs_to :tax_category, class_name: "Spree::TaxCategory"
|
23
18
|
|
24
19
|
has_many :adjustments, as: :source
|
25
20
|
|
@@ -27,6 +22,8 @@ module Spree
|
|
27
22
|
validates :tax_category_id, presence: true
|
28
23
|
validates_with DefaultTaxZoneValidator
|
29
24
|
|
25
|
+
before_destroy :deals_with_adjustments_for_deleted_source
|
26
|
+
|
30
27
|
scope :by_zone, ->(zone) { where(zone_id: zone) }
|
31
28
|
|
32
29
|
# Gets the array of TaxRates appropriate for the specified order
|
@@ -61,16 +58,17 @@ module Spree
|
|
61
58
|
# correct rate amounts in the future. For example:
|
62
59
|
# https://github.com/spree/spree/issues/4318#issuecomment-34723428
|
63
60
|
def self.store_pre_tax_amount(item, rates)
|
64
|
-
|
65
|
-
|
66
|
-
when Spree::
|
67
|
-
item_amount = item.discounted_amount
|
68
|
-
when Spree::Shipment
|
69
|
-
item_amount = item.discounted_cost
|
61
|
+
pre_tax_amount = case item
|
62
|
+
when Spree::LineItem then item.discounted_amount
|
63
|
+
when Spree::Shipment then item.discounted_cost
|
70
64
|
end
|
71
|
-
|
72
|
-
|
65
|
+
|
66
|
+
included_rates = rates.select(&:included_in_price)
|
67
|
+
if included_rates.any?
|
68
|
+
pre_tax_amount /= (1 + included_rates.map(&:amount).sum)
|
73
69
|
end
|
70
|
+
|
71
|
+
item.update_column(:pre_tax_amount, pre_tax_amount)
|
74
72
|
end
|
75
73
|
|
76
74
|
# This method is best described by the documentation on #potentially_applicable?
|
@@ -78,11 +76,7 @@ module Spree
|
|
78
76
|
rates = self.match(order_tax_zone)
|
79
77
|
tax_categories = rates.map(&:tax_category)
|
80
78
|
relevant_items, non_relevant_items = items.partition { |item| tax_categories.include?(item.tax_category) }
|
81
|
-
|
82
|
-
if relevant_items.present?
|
83
|
-
Spree::Adjustment.where(adjustable: relevant_items).tax.destroy_all # using destroy_all to ensure adjustment destroy callback fires.
|
84
|
-
end
|
85
|
-
|
79
|
+
Spree::Adjustment.where(adjustable: relevant_items).tax.destroy_all # using destroy_all to ensure adjustment destroy callback fires.
|
86
80
|
relevant_items.each do |item|
|
87
81
|
relevant_rates = rates.select { |rate| rate.tax_category == item.tax_category }
|
88
82
|
store_pre_tax_amount(item, relevant_rates)
|
data/app/models/spree/taxon.rb
CHANGED
@@ -20,7 +20,7 @@ module Spree
|
|
20
20
|
default_url: '/assets/default_taxon.png'
|
21
21
|
|
22
22
|
validates_attachment :icon,
|
23
|
-
content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"
|
23
|
+
content_type: { content_type: ["image/jpg", "image/jpeg", "image/png"] }
|
24
24
|
|
25
25
|
# indicate which filters should be used for a taxon
|
26
26
|
# this method should be customized to your own site
|
data/app/models/spree/variant.rb
CHANGED
@@ -9,7 +9,7 @@ module Spree
|
|
9
9
|
:shipping_category_id, :meta_description, :meta_keywords,
|
10
10
|
:shipping_category
|
11
11
|
|
12
|
-
has_many :inventory_units
|
12
|
+
has_many :inventory_units
|
13
13
|
has_many :line_items, inverse_of: :variant
|
14
14
|
has_many :orders, through: :line_items
|
15
15
|
|
@@ -23,8 +23,7 @@ module Spree
|
|
23
23
|
has_one :default_price,
|
24
24
|
-> { where currency: Spree::Config[:currency] },
|
25
25
|
class_name: 'Spree::Price',
|
26
|
-
dependent: :destroy
|
27
|
-
inverse_of: :variant
|
26
|
+
dependent: :destroy
|
28
27
|
|
29
28
|
delegate_belongs_to :default_price, :display_price, :display_amount, :price, :price=, :currency
|
30
29
|
|
@@ -33,25 +32,19 @@ module Spree
|
|
33
32
|
dependent: :destroy,
|
34
33
|
inverse_of: :variant
|
35
34
|
|
36
|
-
before_validation :set_cost_currency
|
37
|
-
|
38
35
|
validate :check_price
|
39
|
-
|
40
36
|
validates :cost_price, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
|
41
|
-
validates :price,
|
37
|
+
validates :price, numericality: { greater_than_or_equal_to: 0 }
|
42
38
|
validates_uniqueness_of :sku, allow_blank: true, conditions: -> { where(deleted_at: nil) }
|
43
39
|
|
40
|
+
before_validation :set_cost_currency
|
44
41
|
after_save :save_default_price
|
45
|
-
|
46
42
|
after_create :create_stock_items
|
47
43
|
after_create :set_position
|
48
|
-
after_create :set_master_out_of_stock, unless
|
44
|
+
after_create :set_master_out_of_stock, :unless => :is_master?
|
49
45
|
|
50
46
|
after_touch :clear_in_stock_cache
|
51
47
|
|
52
|
-
self.whitelisted_ransackable_associations = %w[option_values product prices default_price]
|
53
|
-
self.whitelisted_ransackable_attributes = %w[weight sku]
|
54
|
-
|
55
48
|
def self.active(currency = nil)
|
56
49
|
joins(:prices).where(deleted_at: nil).where('spree_prices.currency' => currency || Spree::Config[:currency]).where('spree_prices.amount IS NOT NULL')
|
57
50
|
end
|
@@ -65,11 +58,7 @@ module Spree
|
|
65
58
|
end
|
66
59
|
|
67
60
|
def cost_price=(price)
|
68
|
-
self[:cost_price] =
|
69
|
-
end
|
70
|
-
|
71
|
-
def weight=(weight)
|
72
|
-
self[:weight] = Spree::LocalizedNumber.parse(weight) if weight.present?
|
61
|
+
self[:cost_price] = parse_price(price) if price.present?
|
73
62
|
end
|
74
63
|
|
75
64
|
# returns number of units currently on backorder for this variant.
|
@@ -77,10 +66,6 @@ module Spree
|
|
77
66
|
inventory_units.with_state('backordered').size
|
78
67
|
end
|
79
68
|
|
80
|
-
def is_backorderable?
|
81
|
-
Spree::Stock::Quantifier.new(self).backorderable?
|
82
|
-
end
|
83
|
-
|
84
69
|
def options_text
|
85
70
|
values = self.option_values.sort do |a, b|
|
86
71
|
a.option_type.position <=> b.option_type.position
|
@@ -163,6 +148,32 @@ module Spree
|
|
163
148
|
price_in(currency).try(:amount)
|
164
149
|
end
|
165
150
|
|
151
|
+
def price_modifier_amount_in(currency, options = {})
|
152
|
+
return 0 unless options.present?
|
153
|
+
|
154
|
+
options.keys.map { |key|
|
155
|
+
m = "#{key}_price_modifier_amount_in".to_sym
|
156
|
+
if self.respond_to? m
|
157
|
+
self.send(m, currency, options[key])
|
158
|
+
else
|
159
|
+
0
|
160
|
+
end
|
161
|
+
}.sum
|
162
|
+
end
|
163
|
+
|
164
|
+
def price_modifier_amount(options = {})
|
165
|
+
return 0 unless options.present?
|
166
|
+
|
167
|
+
options.keys.map { |key|
|
168
|
+
m = "#{options[key]}_price_modifier_amount".to_sym
|
169
|
+
if self.respond_to? m
|
170
|
+
self.send(m, options[key])
|
171
|
+
else
|
172
|
+
0
|
173
|
+
end
|
174
|
+
}.sum
|
175
|
+
end
|
176
|
+
|
166
177
|
def name_and_sku
|
167
178
|
"#{name} - #{sku}"
|
168
179
|
end
|
@@ -192,6 +203,17 @@ module Spree
|
|
192
203
|
end
|
193
204
|
|
194
205
|
private
|
206
|
+
# strips all non-price-like characters from the price, taking into account locale settings
|
207
|
+
def parse_price(price)
|
208
|
+
return price unless price.is_a?(String)
|
209
|
+
|
210
|
+
separator, delimiter = I18n.t([:'number.currency.format.separator', :'number.currency.format.delimiter'])
|
211
|
+
non_price_characters = /[^0-9\-#{separator}]/
|
212
|
+
price.gsub!(non_price_characters, '') # strip everything else first
|
213
|
+
price.gsub!(separator, '.') unless separator == '.' # then replace the locale-specific decimal separator with the standard separator if necessary
|
214
|
+
|
215
|
+
price.to_d
|
216
|
+
end
|
195
217
|
|
196
218
|
def set_master_out_of_stock
|
197
219
|
if product.master && product.master.in_stock?
|
@@ -225,8 +247,8 @@ module Spree
|
|
225
247
|
end
|
226
248
|
|
227
249
|
def create_stock_items
|
228
|
-
StockLocation.
|
229
|
-
stock_location.propagate_variant(self)
|
250
|
+
StockLocation.where(propagate_all_variants: true).each do |stock_location|
|
251
|
+
stock_location.propagate_variant(self)
|
230
252
|
end
|
231
253
|
end
|
232
254
|
|
data/app/models/spree/zone.rb
CHANGED
@@ -1,18 +1,16 @@
|
|
1
1
|
module Spree
|
2
2
|
class Zone < Spree::Base
|
3
|
-
has_many :zone_members, dependent: :destroy, class_name: "Spree::ZoneMember"
|
4
|
-
has_many :tax_rates, dependent: :destroy
|
3
|
+
has_many :zone_members, dependent: :destroy, class_name: "Spree::ZoneMember"
|
4
|
+
has_many :tax_rates, dependent: :destroy
|
5
5
|
has_and_belongs_to_many :shipping_methods, :join_table => 'spree_shipping_methods_zones'
|
6
6
|
|
7
|
-
validates :name, presence: true, uniqueness:
|
7
|
+
validates :name, presence: true, uniqueness: true
|
8
8
|
after_save :remove_defunct_members
|
9
9
|
after_save :remove_previous_default
|
10
10
|
|
11
11
|
alias :members :zone_members
|
12
12
|
accepts_nested_attributes_for :zone_members, allow_destroy: true, reject_if: proc { |a| a['zoneable_id'].blank? }
|
13
13
|
|
14
|
-
self.whitelisted_ransackable_attributes = ['description']
|
15
|
-
|
16
14
|
def self.default_tax
|
17
15
|
where(default_tax: true).first
|
18
16
|
end
|
@@ -94,11 +92,23 @@ module Spree
|
|
94
92
|
end
|
95
93
|
|
96
94
|
def country_ids=(ids)
|
97
|
-
|
95
|
+
zone_members.destroy_all
|
96
|
+
ids.reject{ |id| id.blank? }.map do |id|
|
97
|
+
member = ZoneMember.new
|
98
|
+
member.zoneable_type = 'Spree::Country'
|
99
|
+
member.zoneable_id = id
|
100
|
+
members << member
|
101
|
+
end
|
98
102
|
end
|
99
103
|
|
100
104
|
def state_ids=(ids)
|
101
|
-
|
105
|
+
zone_members.destroy_all
|
106
|
+
ids.reject{ |id| id.blank? }.map do |id|
|
107
|
+
member = ZoneMember.new
|
108
|
+
member.zoneable_type = 'Spree::State'
|
109
|
+
member.zoneable_id = id
|
110
|
+
members << member
|
111
|
+
end
|
102
112
|
end
|
103
113
|
|
104
114
|
# Indicates whether the specified zone falls entirely within the zone performing
|
@@ -126,15 +136,5 @@ module Spree
|
|
126
136
|
def remove_previous_default
|
127
137
|
Spree::Zone.where('id != ?', self.id).update_all(default_tax: false) if default_tax
|
128
138
|
end
|
129
|
-
|
130
|
-
def set_zone_members(ids, type)
|
131
|
-
zone_members.destroy_all
|
132
|
-
ids.reject{ |id| id.blank? }.map do |id|
|
133
|
-
member = ZoneMember.new
|
134
|
-
member.zoneable_type = type
|
135
|
-
member.zoneable_id = id
|
136
|
-
members << member
|
137
|
-
end
|
138
|
-
end
|
139
139
|
end
|
140
140
|
end
|