spree_core 2.3.13 → 2.4.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|